Add Command line Arguments
This commit is contained in:
parent
3ad00c45dc
commit
2368a92f58
3 changed files with 88 additions and 15 deletions
14
header/argp_commons.h
Normal file
14
header/argp_commons.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef _ARGP_COMMONS_H_
|
||||||
|
#define _ARGP_COMMONS_H_
|
||||||
|
|
||||||
|
#define ARGUMENT_DOC "INPUT_FILE"
|
||||||
|
#define LONG_DOC "Argp test"
|
||||||
|
#define DEFAULT_OUT_FILE "a.eipaimg"
|
||||||
|
|
||||||
|
// Gets declared in the main function dynamically
|
||||||
|
const char *argp_program_version =
|
||||||
|
VER_MAJOR "." VER_MINOR "." VER_PATCH " || " TAG;
|
||||||
|
|
||||||
|
const char *argp_program_bug_address = "eipabugs@outlook.com";
|
||||||
|
|
||||||
|
#endif
|
|
@ -4,14 +4,10 @@
|
||||||
#define MAX_MEMORY 1000000
|
#define MAX_MEMORY 1000000
|
||||||
#define MAX_TOKEN_SIZE 10
|
#define MAX_TOKEN_SIZE 10
|
||||||
|
|
||||||
#define ALPHA 0
|
#define VER_MAJOR "0"
|
||||||
#define BETA 1
|
#define VER_MINOR "1"
|
||||||
#define STABLE 2
|
#define VER_PATCH "0"
|
||||||
|
#define TAG "alpha"
|
||||||
#define VER_MAJOR 0
|
|
||||||
#define VER_MINOR 1
|
|
||||||
#define VER_PATCH 0
|
|
||||||
#define TAG ALPHA
|
|
||||||
|
|
||||||
#define ASCII_TAB 9
|
#define ASCII_TAB 9
|
||||||
#define ASCII_SPACE 32
|
#define ASCII_SPACE 32
|
||||||
|
@ -19,4 +15,4 @@
|
||||||
|
|
||||||
#define PREFGETC(file) *file->_IO_read_ptr
|
#define PREFGETC(file) *file->_IO_read_ptr
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
75
src/main.c
75
src/main.c
|
@ -1,19 +1,82 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <argp.h>
|
||||||
|
|
||||||
#include "../header/common.h"
|
#include "../header/common.h"
|
||||||
#include "../header/lexer.h"
|
#include "../header/lexer.h"
|
||||||
#include "../header/target_code_generator.h"
|
#include "../header/target_code_generator.h"
|
||||||
#include "../header/image_saver.h"
|
#include "../header/image_saver.h"
|
||||||
|
#include "../header/argp_commons.h"
|
||||||
|
|
||||||
int main(int argc, char const *argv[])
|
//Here, the argumets get stored by the parser, so acess them from here
|
||||||
|
struct cmd_arguments
|
||||||
{
|
{
|
||||||
printf("-----------------\nEIPA Assembler\nVersion: %d.%d.%d\n-----------------\n", VER_MAJOR, VER_MINOR, VER_PATCH);
|
char *input_file;
|
||||||
|
char *output_file;
|
||||||
|
};
|
||||||
|
|
||||||
char assembly_path[] = "test/test.eipa";
|
error_t parser_function(int key, char *arg, struct argp_state *state)
|
||||||
char image_path[] = "a.eipaimg";
|
{
|
||||||
FILE *assembly_file = fopen(assembly_path, "r");
|
struct cmd_arguments *save_arguments = state->input;
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case 'o':
|
||||||
|
save_arguments->output_file = arg;
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_ARG:
|
||||||
|
// If we got more than one non-option argument
|
||||||
|
if (state->arg_num >= 1)
|
||||||
|
{
|
||||||
|
argp_usage(state);
|
||||||
|
}
|
||||||
|
save_arguments->input_file = arg;
|
||||||
|
break;
|
||||||
|
case ARGP_KEY_END:
|
||||||
|
//If we didn't receive 1 Argument yet
|
||||||
|
if (state->arg_num < 1)
|
||||||
|
{
|
||||||
|
argp_usage(state);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ARGP_ERR_UNKNOWN;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This array stores structs containing information about the cli options
|
||||||
|
struct argp_option argp_options[] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
.name = "output",
|
||||||
|
.key = 'o',
|
||||||
|
.arg = "FILE",
|
||||||
|
.flags = 0,
|
||||||
|
.doc = "Output file",
|
||||||
|
.group = 0
|
||||||
|
},
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct argp argument_parser =
|
||||||
|
{
|
||||||
|
.options = argp_options,
|
||||||
|
.parser = parser_function,
|
||||||
|
.args_doc = ARGUMENT_DOC,
|
||||||
|
.doc = LONG_DOC
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct cmd_arguments arguments;
|
||||||
|
arguments.output_file = DEFAULT_OUT_FILE;
|
||||||
|
arguments.input_file = "";
|
||||||
|
argp_parse(&argument_parser, argc, argv, 0, 0, &arguments);
|
||||||
|
|
||||||
|
|
||||||
|
FILE *assembly_file = fopen(arguments.input_file, "r");
|
||||||
if (assembly_file == NULL) return 0;
|
if (assembly_file == NULL) return 0;
|
||||||
|
|
||||||
char(*tokens)[MAX_TOKEN_SIZE] = malloc(sizeof(*tokens) * MAX_MEMORY);
|
char(*tokens)[MAX_TOKEN_SIZE] = malloc(sizeof(*tokens) * MAX_MEMORY);
|
||||||
|
@ -25,7 +88,7 @@ int main(int argc, char const *argv[])
|
||||||
__uint32_t *target_code = malloc(MAX_MEMORY * sizeof(target_code));
|
__uint32_t *target_code = malloc(MAX_MEMORY * sizeof(target_code));
|
||||||
gen_target_code(tokens, target_code);
|
gen_target_code(tokens, target_code);
|
||||||
print_target_code(target_code);
|
print_target_code(target_code);
|
||||||
save_img(image_path, target_code);
|
save_img(arguments.output_file, target_code);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
Loading…
Reference in a new issue