added options
This commit is contained in:
parent
e4c36f341b
commit
e69af85e37
|
@ -82,6 +82,8 @@ set_target_properties(tomlc99
|
||||||
OUTPUT_NAME "toml"
|
OUTPUT_NAME "toml"
|
||||||
ARCHIVE_OUTPUT_DIRECTORY ${GEMSTONE_BINARY_DIR}/dep)
|
ARCHIVE_OUTPUT_DIRECTORY ${GEMSTONE_BINARY_DIR}/dep)
|
||||||
|
|
||||||
|
include_directories(${PROJECT_SOURCE_DIR}/dep/tomlc99)
|
||||||
|
|
||||||
# ------------------------------------------------ #
|
# ------------------------------------------------ #
|
||||||
# Source #
|
# Source #
|
||||||
# ------------------------------------------------ #
|
# ------------------------------------------------ #
|
||||||
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
//
|
||||||
|
// Created by servostar on 5/31/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include <cfg/opt.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
TargetConfig default_target_config() {
|
||||||
|
TargetConfig config;
|
||||||
|
|
||||||
|
config.name = "debug";
|
||||||
|
config.print_ast = false;
|
||||||
|
config.print_asm = false;
|
||||||
|
config.print_ir = false;
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
TargetConfig default_target_config_from_args(int argc, char *argv[]) {
|
||||||
|
TargetConfig config = default_target_config();
|
||||||
|
|
||||||
|
for (int i = 0; i < argc; i++) {
|
||||||
|
char *option = argv[i];
|
||||||
|
|
||||||
|
if (strcmp(option, "--print-ast") == 0) {
|
||||||
|
config.print_ast = true;
|
||||||
|
} else if (strcmp(option, "--print-asm") == 0) {
|
||||||
|
config.print_asm = true;
|
||||||
|
} else if (strcmp(option, "--print-ir") == 0) {
|
||||||
|
config.print_ir = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
void print_help(void) {
|
||||||
|
const char *lines[] = {
|
||||||
|
"Gemstone Compiler (C) GPL-2.0\n",
|
||||||
|
"Compile file(s): gsc <options> [files]",
|
||||||
|
"Build project (build.toml): gsc [directory] [target]|all",
|
||||||
|
"Options:",
|
||||||
|
" --print-ast print resulting abstract syntax tree to a file",
|
||||||
|
" --print-asm print resulting assembly language to a file",
|
||||||
|
" --print-ir print resulting LLVM-IR to a file"
|
||||||
|
};
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < sizeof(lines) / sizeof(const char *); i++) {
|
||||||
|
printf("%s\n", lines[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#define PROJECT_OK 0
|
||||||
|
#define PROJECT_TOML_ERR 1
|
||||||
|
#define PROJECT_SEMANTIC_ERR 2
|
||||||
|
|
||||||
|
static int parse_project_table(ProjectConfig *config, toml_table_t *project_table) {
|
||||||
|
// project name
|
||||||
|
toml_datum_t name = toml_string_in(project_table, "name");
|
||||||
|
if (!name.ok) {
|
||||||
|
printf("Invalid project configuration: project must have a name\n\n");
|
||||||
|
return PROJECT_SEMANTIC_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
config->name = name.u.s;
|
||||||
|
|
||||||
|
// project version
|
||||||
|
toml_datum_t version = toml_string_in(project_table, "version");
|
||||||
|
if (version.ok) {
|
||||||
|
config->name = version.u.s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// author names
|
||||||
|
toml_array_t *authors = toml_array_in(project_table, "authors");
|
||||||
|
if (authors) {
|
||||||
|
unsigned int len = 0;
|
||||||
|
config->authors = malloc(sizeof(const char *) * 2);
|
||||||
|
|
||||||
|
for (int i = 0;; i++) {
|
||||||
|
toml_datum_t author = toml_string_at(authors, i);
|
||||||
|
if (!author.ok)
|
||||||
|
break;
|
||||||
|
|
||||||
|
char** new_authors = realloc(config->authors, sizeof(const char *) * ++len);
|
||||||
|
config->authors = new_authors;
|
||||||
|
config->authors[len] = author.u.s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_project_config(ProjectConfig *config) {
|
||||||
|
FILE *config_file = fopen("build.toml", "r");
|
||||||
|
if (config_file == NULL) {
|
||||||
|
return PROJECT_TOML_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
char err_buf[200];
|
||||||
|
|
||||||
|
toml_table_t *conf = toml_parse_file(config_file, err_buf, sizeof(err_buf));
|
||||||
|
fclose(config_file);
|
||||||
|
|
||||||
|
if (!conf) {
|
||||||
|
printf("Invalid project configuration: %s\n\n", err_buf);
|
||||||
|
return PROJECT_SEMANTIC_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
toml_table_t *project = toml_table_in(conf, "project");
|
||||||
|
if (project) {
|
||||||
|
parse_project_table(config, project);
|
||||||
|
|
||||||
|
return PROJECT_OK;
|
||||||
|
}
|
||||||
|
printf("Invalid project configuration: missing project table\n\n");
|
||||||
|
|
||||||
|
toml_free(conf);
|
||||||
|
return PROJECT_SEMANTIC_ERR;
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
//
|
||||||
|
// Created by servostar on 5/31/24.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef GEMSTONE_OPT_H
|
||||||
|
#define GEMSTONE_OPT_H
|
||||||
|
|
||||||
|
#include <toml.h>
|
||||||
|
|
||||||
|
typedef struct TargetConfig_t {
|
||||||
|
char* name;
|
||||||
|
bool print_ast;
|
||||||
|
bool print_asm;
|
||||||
|
bool print_ir;
|
||||||
|
} TargetConfig;
|
||||||
|
|
||||||
|
typedef struct ProjectConfig_t {
|
||||||
|
// name of the project
|
||||||
|
char* name;
|
||||||
|
// description
|
||||||
|
char* desc;
|
||||||
|
// version
|
||||||
|
char* version;
|
||||||
|
// list of authors
|
||||||
|
char** authors;
|
||||||
|
} ProjectConfig;
|
||||||
|
|
||||||
|
TargetConfig default_target_config();
|
||||||
|
|
||||||
|
TargetConfig default_target_config_from_args(int argc, char* argv[]);
|
||||||
|
|
||||||
|
void print_help(void);
|
||||||
|
|
||||||
|
#endif //GEMSTONE_OPT_H
|
44
src/main.c
44
src/main.c
|
@ -9,10 +9,6 @@
|
||||||
|
|
||||||
extern FILE *yyin;
|
extern FILE *yyin;
|
||||||
|
|
||||||
// Global array to store options
|
|
||||||
char options[5][10];
|
|
||||||
int num_options = 0;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Log a debug message to inform about beginning exit procedures
|
* @brief Log a debug message to inform about beginning exit procedures
|
||||||
*
|
*
|
||||||
|
@ -20,34 +16,6 @@ int num_options = 0;
|
||||||
void notify_exit(void) { DEBUG("Exiting gemstone..."); }
|
void notify_exit(void) { DEBUG("Exiting gemstone..."); }
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief add option to global option array
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
void add_option(const char* option) {
|
|
||||||
if (num_options < 5 ) {
|
|
||||||
strcpy(options[num_options], option);
|
|
||||||
num_options++;
|
|
||||||
} else {
|
|
||||||
PANIC("Too Many Options given");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Check if Option is set
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
size_t check_option(const char* name) {
|
|
||||||
for (int i = 0; i < num_options; i++) {
|
|
||||||
if (strcmp(options[i], name) == 0) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Closes File after compiling.
|
* @brief Closes File after compiling.
|
||||||
*
|
*
|
||||||
|
@ -84,18 +52,6 @@ void setup(void) {
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
// Iteration through arguments
|
|
||||||
for (int i = 1; i < argc; i++) {
|
|
||||||
// Check if the argument starts with "--"
|
|
||||||
if (argv[i][0] == '-' && argv[i][1] == '-') {
|
|
||||||
// Extract option name
|
|
||||||
char option[10];
|
|
||||||
strcpy(option, argv[i] + 2);
|
|
||||||
|
|
||||||
// Add option to the global array
|
|
||||||
add_option(option);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setup();
|
setup();
|
||||||
atexit(close_file);
|
atexit(close_file);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue