mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-27 14:12:36 +00:00
command line argument parsing.
This commit is contained in:
parent
857cb72a94
commit
03295d7adc
4 changed files with 93 additions and 25 deletions
|
@ -45,12 +45,6 @@ static char *const asm_getline(size_t *byte, FILE *fp) {
|
||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define asm_rmnewline(L,S) *((L)+*(S)-1) = '\0'
|
|
||||||
#define asm_skipwhite(L) \
|
|
||||||
while((*(L)==' '||*(L)=='\t')) { \
|
|
||||||
(L)++; \
|
|
||||||
}
|
|
||||||
|
|
||||||
void asm_init(const char *file, FILE **fp) {
|
void asm_init(const char *file, FILE **fp) {
|
||||||
*fp = fopen(file, "r");
|
*fp = fopen(file, "r");
|
||||||
code_init();
|
code_init();
|
||||||
|
|
5
gmqcc.h
5
gmqcc.h
|
@ -471,4 +471,9 @@ static const struct {
|
||||||
void asm_init (const char *, FILE **);
|
void asm_init (const char *, FILE **);
|
||||||
void asm_close(FILE *);
|
void asm_close(FILE *);
|
||||||
void asm_parse(FILE *);
|
void asm_parse(FILE *);
|
||||||
|
//======================================================================
|
||||||
|
//============================= main.c =================================
|
||||||
|
//======================================================================
|
||||||
|
extern int opts_debug;
|
||||||
|
extern int opts_memchk;
|
||||||
#endif
|
#endif
|
||||||
|
|
85
main.c
85
main.c
|
@ -21,18 +21,81 @@
|
||||||
* SOFTWARE.
|
* SOFTWARE.
|
||||||
*/
|
*/
|
||||||
#include "gmqcc.h"
|
#include "gmqcc.h"
|
||||||
|
// todo CLEANUP this argitem thing
|
||||||
|
typedef struct { char *name, type; } argitem;
|
||||||
|
VECTOR_MAKE(argitem, items);
|
||||||
|
|
||||||
|
/* global options */
|
||||||
|
int opts_debug = 0;
|
||||||
|
int opts_memchk = 0;
|
||||||
|
|
||||||
|
static const int usage(const char *const app) {
|
||||||
|
printf("usage:\n");
|
||||||
|
printf(" %s -c<file> -- compile file\n" , app);
|
||||||
|
printf(" %s -a<file> -- assemble file\n", app);
|
||||||
|
printf(" additional flags:\n");
|
||||||
|
printf(" -debug -- turns on compiler debug messages\n");
|
||||||
|
printf(" -memchk -- turns on compiler memory leak check\n");
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
argc--;
|
size_t itr = 0;
|
||||||
argv++;
|
char *app = &argv[0][0];
|
||||||
|
FILE *fpp = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse all command line arguments. This is rather annoying to do
|
||||||
|
* because of all tiny corner cases.
|
||||||
|
*/
|
||||||
|
if (argc <= 1 || (argv[1][0] != '-'))
|
||||||
|
return usage(app);
|
||||||
|
|
||||||
|
while ((argc > 1) && argv[1][0] == '-') {
|
||||||
|
switch (argv[1][1]) {
|
||||||
|
case 'c': items_add((argitem){util_strdup(&argv[1][2]), 0}); break; /* compile */
|
||||||
|
case 'a': items_add((argitem){util_strdup(&argv[1][2]), 1}); break; /* assemble */
|
||||||
|
default:
|
||||||
|
if (!strncmp(&argv[1][1], "debug" , 5)) { opts_debug = 1; break; }
|
||||||
|
if (!strncmp(&argv[1][1], "memchk", 6)) { opts_memchk = 1; break; }
|
||||||
|
return usage(app);
|
||||||
|
|
||||||
|
}
|
||||||
|
++argv;
|
||||||
|
--argc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* options could depend on another option, this is where option
|
||||||
|
* validity checking like that would take place.
|
||||||
|
*/
|
||||||
|
if (opts_memchk && !opts_debug)
|
||||||
|
printf("Warning: cannot enable -memchk, without -debug.\n");
|
||||||
|
|
||||||
|
/* multi file multi path compilation system */
|
||||||
|
for (; itr < items_elements; itr++) {
|
||||||
|
switch (items_data[itr].type) {
|
||||||
|
case 0:
|
||||||
|
fpp = fopen(items_data[itr].name, "r");
|
||||||
|
struct lex_file *lex = lex_open(fpp);
|
||||||
|
parse_gen(lex);
|
||||||
|
lex_close(lex);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
asm_init (items_data[itr].name, &fpp);
|
||||||
|
asm_parse(fpp);
|
||||||
|
asm_close(fpp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//const char *ifile = argv[0];
|
/* clean list */
|
||||||
FILE *fp;
|
for (itr = 0; itr < items_elements; itr++)
|
||||||
|
mem_d(items_data[itr].name);
|
||||||
/*TODO: proper interface swith switches*/
|
mem_d(items_data);
|
||||||
|
|
||||||
asm_init ("test.qs", &fp);
|
if (opts_memchk)
|
||||||
asm_parse(fp);
|
util_meminfo();
|
||||||
asm_close(fp);
|
|
||||||
util_meminfo();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
22
util.c
22
util.c
|
@ -61,14 +61,17 @@ void util_memory_d(void *ptrn, unsigned int line, const char *file) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void util_meminfo() {
|
void util_meminfo() {
|
||||||
util_debug("MEM", "Memory information:\n\
|
if (!opts_memchk)
|
||||||
Total allocations: %llu\n\
|
return;
|
||||||
Total deallocations: %llu\n\
|
|
||||||
Total allocated: %llu (bytes)\n\
|
util_debug("MEM", "Memory information:\n\
|
||||||
Total deallocated: %llu (bytes)\n",
|
Total allocations: %llu\n\
|
||||||
mem_at, mem_dt,
|
Total deallocations: %llu\n\
|
||||||
mem_ab, mem_db
|
Total allocated: %llu (bytes)\n\
|
||||||
);
|
Total deallocated: %llu (bytes)\n",
|
||||||
|
mem_at, mem_dt,
|
||||||
|
mem_ab, mem_db
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
//#ifndef mem_d
|
//#ifndef mem_d
|
||||||
|
@ -134,6 +137,9 @@ char *util_strrnl(char *src) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void util_debug(const char *area, const char *ms, ...) {
|
void util_debug(const char *area, const char *ms, ...) {
|
||||||
|
if (!opts_debug)
|
||||||
|
return;
|
||||||
|
|
||||||
va_list va;
|
va_list va;
|
||||||
va_start(va, ms);
|
va_start(va, ms);
|
||||||
fprintf (stdout, "DEBUG: ");
|
fprintf (stdout, "DEBUG: ");
|
||||||
|
|
Loading…
Reference in a new issue