diff options
author | Ash Wolf <ninji@wuffs.org> | 2022-10-19 21:16:13 +0100 |
---|---|---|
committer | Ash Wolf <ninji@wuffs.org> | 2022-10-19 21:16:13 +0100 |
commit | d1f153d34b023d81768f6087f67dbfff714bafc9 (patch) | |
tree | a694d470a60655d0cda15a70791fbdb90a2398cf /Arguments.c | |
parent | 775b6861666af36d317fb577cf489e2c6377f878 (diff) | |
download | MWCC-d1f153d34b023d81768f6087f67dbfff714bafc9.tar.gz MWCC-d1f153d34b023d81768f6087f67dbfff714bafc9.zip |
let's commit all this before my VM blows up and nukes my work
Diffstat (limited to 'Arguments.c')
-rw-r--r-- | Arguments.c | 604 |
1 files changed, 0 insertions, 604 deletions
diff --git a/Arguments.c b/Arguments.c deleted file mode 100644 index 324965a..0000000 --- a/Arguments.c +++ /dev/null @@ -1,604 +0,0 @@ -#include "includes/mwcc_decomp.h" - -char compat; -char *MAINOPTCHAR; -char *FIRSTARGCHAR; -char *SEPOPTSTR; -char SEPOPTCHAR; -char SEP1; -char SEP2; -char SEP3; -char RESPFILECHAR; -char *RESPFILESTR; -static ArgToken *argtoks; -static int numargtoks; -static int maxargtoks; -unsigned char parserDebug; -static unsigned char in_response_file; -static int margc; -static int margind; -static char **margv; -static OSFileHandle respfilehandle; -static char *respfile; -static char *respfilestart; -static unsigned long respfilesize; -static int scantok; -anon0_50 linkargs; -anon0_50 prelinkargs; -anon0_50 postlinkargs; - -// TODO move me -/*extern int OS_MakeFileSpec(const char *name, struct OSSpec *spec); -extern int OS_NewFileHandle(struct OSSpec *spec, int a, int b, OSFileHandle *fh); -extern int OS_AppendHandle(struct OSHandle *h, const void *, long); -extern int OS_LockFileHandle(OSFileHandle *fh, char **h, unsigned long *size); -extern void OS_FreeFileHandle(OSFileHandle *fh); -extern void CLPOSAlert(short code, short code2, ...); -extern void CLPReportError(short code, ...); -extern void CLPReportWarning(short code, ...); -extern void CLPFatalError(const char *format, ...); -extern int ustrncmp(const char *a, const char *b, int len);*/ -// TODO move me - -static void Arg_AddToken(short val, char *text); -static void Arg_Setup(int argc, char **argv); -static void Arg_SkipRespFileWS(); -static unsigned char Arg_OpenRespFile(const char *name); -static void Arg_CloseRespFile(); -static char *Arg_GetRespFileToken(); -static char *Arg_GetNext(unsigned char allow_resp); -static unsigned char Arg_GotMore(); -static void Arg_Parse(); -static void Arg_GrowArgs(anon0_50 *ta); -static void Arg_GrowArg(anon0_50 *ta, char *txt); - -static void Arg_AddToken(short val, char *text) { - ArgToken *cur; - ArgToken *prev; - ArgToken *pprev; - ArgToken *ppprev; - ArgToken *pppprev; - - if (numargtoks > 0) - prev = &argtoks[numargtoks - 1]; - else - prev = 0; - - if (prev && prev->val == ATK_2 && prev->text[0] == 0) { - pppprev = ppprev = pprev = 0; - if (numargtoks > 3) - pppprev = &argtoks[numargtoks - 4]; - if (numargtoks > 2) - ppprev = &argtoks[numargtoks - 3]; - if (numargtoks > 1) - pprev = &argtoks[numargtoks - 2]; - - if (pprev) { - if ((int) val == ATK_1 && (pprev->val == ATK_5 || pprev->val == ATK_4) && (ppprev->val != ATK_2 || pppprev->val != ATK_3)) { - if (parserDebug) - printf("Coalescing args with '%s'\n", Arg_GetTokenName(pprev)); - val = pprev->val; - numargtoks -= 2; - } else if (pprev->val == ATK_1 && ((int) val == ATK_5 || (int) val == ATK_4)) { - if (parserDebug) - printf("Coalescing args, removing '%s'\n", Arg_GetTokenName(pprev)); - numargtoks -= 2; - } - } - } - - if (numargtoks >= maxargtoks) { - argtoks = (ArgToken *) xrealloc("argument list", argtoks, sizeof(ArgToken) * (maxargtoks + 16)); - maxargtoks += 16; - } - - cur = &argtoks[numargtoks]; - cur->val = val; - if (text) - cur->text = xstrdup(text); - else - cur->text = 0; - numargtoks++; -} - -static void Arg_Setup(int argc, char **argv) { - in_response_file = 0; - respfile = 0; - margc = argc; - margv = argv; - margind = 1; -} - -static void Arg_SkipRespFileWS() { -restart: - while (respfile[0] && isspace(respfile[0])) - ++respfile; - - if (respfile[0] == '\\' && respfile[1] == '#') { - ++respfile; - return; - } - - if (respfile[0] == '#') { - if ((respfile > respfilestart) ? (respfile[-1] != '\\') : 1) { - while (respfile[0] && respfile[0] != 10 && respfile[0] != 13) - ++respfile; - - while (respfile[0] == 13 || respfile[0] == 10) - ++respfile; - - goto restart; - } - } -} - -static unsigned char Arg_OpenRespFile(const char *name) { - struct OSSpec spec; - int err; - - if ( - (err = OS_MakeFileSpec(name, &spec)) - || (err = OS_NewFileHandle(&spec, 0, 0, &respfilehandle)) - || (err = OS_AppendHandle(&respfilehandle.hand, "", 1)) - || (err = OS_LockFileHandle(&respfilehandle, &respfile, &respfilesize)) - ) { - CLPOSAlert(74, (short) err, "response ", name); - return 0; - } else { - respfilestart = respfile; - Arg_SkipRespFileWS(); - in_response_file = 1; - return 1; - } -} - -static void Arg_CloseRespFile() { - in_response_file = 0; - OS_FreeFileHandle(&respfilehandle); -} - -static char *Arg_GetRespFileToken() { - char *start; - char *ptr; - int quoting; - - quoting = 0; - if (respfile[0] == 0) - return 0; - - start = ptr = respfile; - while (respfile[0]) { - if (!quoting && isspace(respfile[0])) - break; - - if (respfile[0] == '"') { - quoting = !quoting; - respfile++; - } else if (respfile[0] == '\\' && respfile[1] == '"') { - *ptr = '"'; - respfile += 2; - ptr++; - } else { - *(ptr++) = *(respfile++); - } - } - - if (respfile[0]) - Arg_SkipRespFileWS(); - *ptr = 0; - return start; -} - -static char *Arg_GetNext(unsigned char allow_resp) { - char *ret; - int rfclen; - char *rfcequ; - -restart: - if (!in_response_file) { - rfclen = 1; - ret = margv[margind++]; - if (ret[0] == '\\' && ret[1] == RESPFILECHAR) { - ret++; - } else if (allow_resp) { - if (ret[0] == RESPFILECHAR || (RESPFILESTR[0] && !ustrncmp(ret, RESPFILESTR, rfclen = strlen(RESPFILESTR))) && ret[rfclen]) { - rfcequ = strchr(ret + rfclen, '='); - if (rfcequ) - rfclen = (rfcequ + 1) - ret; - if (Arg_OpenRespFile(ret + rfclen)) - goto restart; - ret = 0; - } - } - } else { - ret = Arg_GetRespFileToken(); - if (!ret) { - Arg_CloseRespFile(); - goto restart; - } - } - - if (parserDebug) - fprintf(stderr, "Got arg = '%s'\n", ret ? ret : "<NULL>"); - - return ret; -} - -static unsigned char Arg_GotMore() { - if (!in_response_file) - return margind < margc; - else if (respfile[0]) - return 1; - else - return margind < margc; -} - -static void Arg_Parse() { - unsigned char isOpt; - unsigned char isList; - char *arg; - char *argstart; - char buffer[4096]; - char *bufptr; - char ch; - - isOpt = 0; - isList = 0; - while (Arg_GotMore()) { - argstart = arg = Arg_GetNext(1); - if (!arg) - break; - - bufptr = buffer; - buffer[0] = 0; - isList = 0; - - if (arg[0] && arg[1] && strchr(MAINOPTCHAR, arg[0])) { - if (isOpt) - Arg_AddToken(ATK_1, 0); - buffer[0] = arg[1]; - buffer[1] = 0; - isOpt = 1; - isList = 0; - bufptr++; - arg += 2; - } else { - isOpt = 0; - } - - while (arg && arg[0]) { - ch = arg[0]; - if (arg[0] == '\\' && (arg[1] == SEP1 || arg[1] == SEP2 || arg[1] == SEP3)) { - ch = 0x80 | *(++arg); - } else if (compat == 1 && arg[0] == ':' && arg[1] == '\\') { - ch |= 0x80; - } - - if (ch != SEP1 && ch != SEP2 && ch != SEP3) { - if ((ch & 0x7F) == SEP1 || (ch & 0x7F) == SEP2 || (ch & 0x7F) == SEP3) - ch &= 0x7F; - *(bufptr++) = ch; - if (bufptr >= &buffer[sizeof(buffer)]) { - CLPReportError(2, argstart, argstart + strlen(argstart) - 15, sizeof(buffer)); - } - *bufptr = 0; - } else { - if (isOpt) { - Arg_AddToken(ATK_3, buffer); - Arg_AddToken(ATK_2, buffer); - } else { - Arg_AddToken(ATK_2, buffer); - } - - Arg_AddToken( - (unsigned char) ((ch == ',') ? ATK_5 : (((ch == '=') || (ch == SEP3)) ? ATK_4 : ATK_0)), - 0 - ); - - bufptr = buffer; - buffer[0] = 0; - - if (ch == SEP1 || ch == SEP2 || ch == SEP3) - isOpt = 0; - isList = 1; - } - - arg++; - } - - // 1799C8 - if (isOpt && bufptr > &buffer[0]) { - Arg_AddToken(ATK_3, buffer + (isList && strchr(MAINOPTCHAR, buffer[0]))); - Arg_AddToken(ATK_2, buffer + (isList && strchr(MAINOPTCHAR, buffer[0])) + 1); - } else { - Arg_AddToken(ATK_2, buffer); - Arg_AddToken(ATK_1, 0); - } - } - - if (isOpt || isList) - Arg_AddToken(ATK_1, 0); - Arg_AddToken(ATK_0, 0); -} - -enum { - COMPAT_0, - COMPAT_1, - COMPAT_2 -}; - -void Arg_Init(int theargc, char **theargv) { - int p; - int x; - - maxargtoks = 0; - numargtoks = 0; - parserDebug = 0; - if (theargc > 1 && !strcmp(theargv[1], "--parser-debug")) { - parserDebug = 1; - memmove(&theargv[1], &theargv[2], sizeof(char *) * (theargc - 1)); - theargc--; - } - - if ((int) compat == COMPAT_0) { - MAINOPTCHAR = "-"; - FIRSTARGCHAR = "="; - SEPOPTSTR = " "; - SEP1 = ','; - SEP2 = '='; - SEP3 = '='; - RESPFILECHAR = '@'; - RESPFILESTR = ""; - } else if ((int) compat == COMPAT_1) { - MAINOPTCHAR = "/-"; - FIRSTARGCHAR = ":"; - SEPOPTSTR = ":"; - SEP1 = ','; - SEP2 = '='; - SEP3 = ':'; - RESPFILECHAR = '@'; - RESPFILESTR = ""; - } else if ((int) compat == COMPAT_2) { - if (!MAINOPTCHAR) - MAINOPTCHAR = "-"; - if (!FIRSTARGCHAR) - FIRSTARGCHAR = "="; - if (!SEPOPTSTR) - SEPOPTSTR = " "; - if (!SEP1) - SEP1 = ','; - if (!SEP2) - SEP2 = '='; - if (!SEP3) - SEP3 = '='; - if (!RESPFILECHAR) - RESPFILECHAR = '@'; - if (!RESPFILESTR) - RESPFILESTR = ""; - } else { - CLPFatalError("Unknown parser compatibility type (%d)\n", (int) compat); - } - - if (parserDebug) { - printf("Incoming arguments: \n"); - for (p = 0; p < theargc; p++) { - printf("[%s] ", theargv[p]); - } - printf("\n"); - } - - Arg_Setup(theargc, theargv); - Arg_Parse(); - Arg_Reset(); - - if (parserDebug) { - for (x = 0; x < numargtoks; x++) { - printf("TOKEN: '%s'\n", Arg_GetTokenName(&argtoks[x])); - } - } -} - -void Arg_Terminate() { - ArgToken *cur; - - while (numargtoks > 0) { - cur = &argtoks[--numargtoks]; - if (cur->text) - free(cur->text); - } - - if (maxargtoks) - free(argtoks); - maxargtoks = 0; -} - -void Arg_Reset() { - scantok = 0; -} - -void Arg_Stop(ArgToken *where) { - ArgToken *cur; - - while (&argtoks[numargtoks] > where) { - cur = &argtoks[--numargtoks]; - if (cur->text) - free(cur->text); - cur->val = ATK_0; - cur->text = 0; - } - - argtoks[numargtoks++].val = ATK_1; - argtoks[numargtoks++].val = ATK_0; - scantok = numargtoks - 2; -} - -ArgToken *Arg_PeekToken() { - if (scantok >= numargtoks) - return 0; - else - return &argtoks[scantok]; -} - -ArgToken *Arg_UsedToken() { - if (scantok < numargtoks) - scantok++; - return Arg_PeekToken(); -} - -int Arg_IsEmpty() { - ArgToken *tok; - - tok = Arg_PeekToken(); - return (tok == 0 || tok->val == ATK_0); -} - -ArgToken *Arg_GetToken() { - ArgToken *ret; - - ret = Arg_PeekToken(); - if (ret) - scantok++; - return ret; -} - -ArgToken *Arg_UndoToken() { - if (scantok > 0) { - scantok--; - return Arg_PeekToken(); - } else { - return 0; - } -} - -const char *Arg_GetTokenName(ArgToken *tok) { - if ((int) tok->val == ATK_2) - return tok->text; - - return - ((int) tok->val == ATK_3) ? "option" : - ((int) tok->val == ATK_5) ? "comma" : - (((int) compat == COMPAT_1 && (int) tok->val == ATK_4)) ? "colon or equals" : - (((int) compat != COMPAT_1 && (int) tok->val == ATK_4)) ? "equals" : - ((int) tok->val == ATK_1) ? "end of argument" : - ((int) tok->val == ATK_0) ? "end of command line" : - "<error>"; -} - -const char *Arg_GetTokenText(ArgToken *tok, char *buffer, int maxlen, unsigned char warn) { - const char *ptr; - char *bptr; - int curlen; - - bptr = buffer; - curlen = 0; - if (tok->val == ATK_2 || tok->val == ATK_3) - ptr = tok->text; - else - ptr = Arg_GetTokenName(tok); - - while (*ptr && curlen++ < maxlen) { - *(bptr++) = *(ptr++); - } - - if (curlen < maxlen) { - bptr[0] = 0; - } else { - bptr[-1] = 0; - if (warn) - CLPReportWarning(56, buffer, ptr + strlen(ptr) - ((maxlen <= 32) ? maxlen : 32), maxlen); - } - - return buffer; -} - -static void Arg_GrowArgs(anon0_50 *ta) { - int len; - - if (!ta->argv || (ta->argc + 1) >= ta->nargv) { - len = ta->nargv; - ta->nargv = len + 16; - ta->argv = xrealloc("argument list", ta->argv, sizeof(char *) * (ta->nargv + 1)); - while (len <= ta->nargv) { - ta->argv[len++] = 0; - } - } - - ta->argc++; -} - -static void Arg_GrowArg(anon0_50 *ta, char *txt) { - char **ptr; - int ptrlen; - - ptr = &ta->argv[ta->argc]; - - if (*ptr == 0) { - *ptr = xstrdup(txt); - } else { - ptrlen = strlen(*ptr); - *ptr = xrealloc("command line", *ptr, ptrlen + strlen(txt) + 1); - strcpy(*ptr + ptrlen, txt); - } -} - -void Arg_InitToolArgs(anon0_50 *ta) { - ta->argc = 0; - ta->nargv = 0; - ta->argv = 0; - Arg_GrowArgs(ta); -} - -void Arg_AddToToolArgs(anon0_50 *ta, short tokval, char *toktxt) { - switch (tokval) { - case ATK_0: - Arg_FinishToolArgs(ta); - break; - case ATK_1: - if (ta->argv && ta->argv[ta->argc]) - Arg_GrowArgs(ta); - break; - case ATK_2: - Arg_GrowArg(ta, toktxt); - break; - case ATK_3: - Arg_GrowArg(ta, "-"); - break; - case ATK_4: - Arg_GrowArg(ta, "="); - break; - case ATK_5: - Arg_GrowArg(ta, ","); - break; - default: -#line 787 - CLPFatalError(__FILE__, __LINE__, "Unknown token (%d)", tokval); - break; - } -} - -void Arg_FinishToolArgs(anon0_50 *ta) { - Arg_GrowArgs(ta); - ta->argv[ta->argc] = 0; -} - -void Arg_ToolArgsForPlugin(anon0_50 *ta, struct CWCommandLineArgs *args) { - args->argc = 1; - args->argv = ta->argv; - - while (args->argv[args->argc]) - args->argc++; - - args->envp = 0; -} - -void Arg_FreeToolArgs(anon0_50 *ta) { - int x; - - if (ta->argv) { - for (x = 1; x < ta->argc; x++) { - if (ta->argv[x]) - free(ta->argv[x]); - } - free(ta->argv); - } -} |