From dd8fa985c17ec305915221d588f57485d57760b1 Mon Sep 17 00:00:00 2001 From: Fyren Date: Fri, 6 Mar 2015 09:08:24 +0000 Subject: [PATCH] Reapply ancient patch to allow space in spcomp options. --- sourcepawn/compiler/sc1.cpp | 71 +++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/sourcepawn/compiler/sc1.cpp b/sourcepawn/compiler/sc1.cpp index 6fa858d4..ff6cd857 100644 --- a/sourcepawn/compiler/sc1.cpp +++ b/sourcepawn/compiler/sc1.cpp @@ -818,17 +818,24 @@ void set_extension(char *filename,const char *extension,int force) strcat(filename,extension); } -static const char *option_value(const char *optptr) +static const char *option_value(const char *optptr,char **argv,int argc,int *arg) { - return (*(optptr+1)=='=' || *(optptr+1)==':') ? optptr+2 : optptr+1; + const char *ptr; + + if (*(optptr+1)=='=' || *(optptr+1)==':') + ptr=optptr+2; + else + ptr=optptr+1; + + if (strlen(ptr)==0 && *arg!=argc-1) + ptr=argv[++*arg]; + + return ptr; } -static int toggle_option(const char *optptr, int option) +static int toggle_option(const char *optptr,int option) { - switch (*option_value(optptr)) { - case '\0': - option=!option; - break; + switch ((*(optptr+1)=='=' || *(optptr+1)==':') ? *(optptr+2) : *(optptr+1)) { case '-': option=FALSE; break; @@ -866,7 +873,7 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam ptr=&argv[arg][1]; switch (*ptr) { case 'A': - i=atoi(option_value(ptr)); + i=atoi(option_value(ptr,argv,argc,&arg)); if ((i % sizeof(cell))==0) sc_dataalign=i; else @@ -889,11 +896,11 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam break; #endif case 'c': - strlcpy(codepage,option_value(ptr),MAXCODEPAGE); /* set name of codepage */ + strlcpy(codepage,option_value(ptr,argv,argc,&arg),MAXCODEPAGE); /* set name of codepage */ break; #if defined dos_setdrive case 'D': /* set active directory */ - ptr=option_value(ptr); + ptr=option_value(ptr,argv,argc,&arg); if (ptr[1]==':') dos_setdrive(toupper(*ptr)-'A'+1); /* set active drive */ chdir(ptr); @@ -901,7 +908,7 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam #endif #if 0 /* not allowed to change for SourceMod */ case 'd': - switch (*option_value(ptr)) { + switch (*option_value(ptr,argv,argc,&arg)) { case '0': sc_debug=0; break; @@ -922,14 +929,14 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam break; #endif case 'e': - strlcpy(ename,option_value(ptr),_MAX_PATH); /* set name of error file */ + strlcpy(ename,option_value(ptr,argv,argc,&arg),_MAX_PATH); /* set name of error file */ break; case 'E': sc_warnings_are_errors = true; break; #if defined __WIN32__ || defined _WIN32 || defined _Windows case 'H': - hwndFinish=(HWND)atoi(option_value(ptr)); + hwndFinish=(HWND)atoi(option_value(ptr,argv,argc,&arg)); if (!IsWindow(hwndFinish)) hwndFinish=(HWND)0; break; @@ -938,7 +945,7 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam sc_showincludes = 1; break; case 'i': - strlcpy(str,option_value(ptr),sizeof str); /* set name of include directory */ + strlcpy(str,option_value(ptr,argv,argc,&arg),sizeof str); /* set name of include directory */ i=strlen(str); if (i>0) { if (str[i-1]!=DIRSEP_CHAR) { @@ -954,21 +961,22 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam sc_listing=TRUE; /* skip second pass & code generation */ break; case 'o': - strlcpy(oname,option_value(ptr),_MAX_PATH); /* set name of (binary) output file */ + strlcpy(oname,option_value(ptr,argv,argc,&arg),_MAX_PATH); /* set name of (binary) output file */ break; case 'O': - pc_optimize=*option_value(ptr) - '0'; + pc_optimize=*option_value(ptr,argv,argc,&arg) - '0'; if (pc_optimize=sOPTIMIZE_NUMBER || pc_optimize==sOPTIMIZE_NOMACRO) about(); break; case 'p': - strlcpy(pname,option_value(ptr),_MAX_PATH); /* set name of implicit include file */ + strlcpy(pname,option_value(ptr,argv,argc,&arg),_MAX_PATH); /* set name of implicit include file */ break; #if !defined SC_LIGHT case 'r': - strlcpy(rname,option_value(ptr),_MAX_PATH); /* set name of report file */ + strlcpy(rname,option_value(ptr,argv,argc,&arg),_MAX_PATH); /* set name of report file */ sc_makereport=TRUE; - if (strlen(rname)>0) { +#if 0 /* dead code due to option_value change to allow spaces between option and value */ + if (strlen(rname)>0) { set_extension(rname,".xml",FALSE); } else if ((name=get_sourcefile(0))!=NULL) { assert(strlen(rname)==0); @@ -981,28 +989,29 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam strcpy(rname,ptr); set_extension(rname,".xml",TRUE); } /* if */ +#endif break; #endif case 'S': - i=atoi(option_value(ptr)); + i=atoi(option_value(ptr,argv,argc,&arg)); if (i>32) pc_stksize=(cell)i; /* stack size has minimum size */ else about(); break; case 's': - skipinput=atoi(option_value(ptr)); + skipinput=atoi(option_value(ptr,argv,argc,&arg)); break; case 't': - sc_tabsize=atoi(option_value(ptr)); + sc_tabsize=atoi(option_value(ptr,argv,argc,&arg)); break; case 'v': - verbosity= isdigit(*option_value(ptr)) ? atoi(option_value(ptr)) : 2; + verbosity= isdigit(*option_value(ptr,argv,argc,&arg)) ? atoi(option_value(ptr,argv,argc,&arg)) : 2; if (sc_asmfile && verbosity>1) verbosity=1; break; case 'w': - i=(int)strtol(option_value(ptr),(char **)&ptr,10); + i=(int)strtol(option_value(ptr,argv,argc,&arg),(char **)&ptr,10); if (*ptr=='-') pc_enablewarning(i,0); else if (*ptr=='+') @@ -1012,13 +1021,13 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam break; case 'X': if (*(ptr+1)=='D') { - i=atoi(option_value(ptr+1)); + i=atoi(option_value(ptr+1,argv,argc,&arg)); if (i>64) pc_amxram=(cell)i; /* abstract machine data/stack has minimum size */ else about(); } else { - i=atoi(option_value(ptr)); + i=atoi(option_value(ptr,argv,argc,&arg)); if (i>64) pc_amxlimit=(cell)i;/* abstract machine has minimum size */ else @@ -1247,7 +1256,7 @@ static void setcaption(void) { pc_printf("SourcePawn Compiler %s\n", SOURCEMOD_VERSION); pc_printf("Copyright (c) 1997-2006 ITB CompuPhase\n"); - pc_printf("Copyright (c) 2004-2014 AlliedModders LLC\n\n"); + pc_printf("Copyright (c) 2004-2015 AlliedModders LLC\n\n"); } static void about(void) @@ -1288,7 +1297,7 @@ static void about(void) pc_printf(" 2 full optimizations\n"); pc_printf(" -p set name of \"prefix\" file\n"); #if !defined SC_LIGHT - pc_printf(" -r[name] write cross reference report to console or to specified file\n"); + pc_printf(" -r write cross reference report to console or to specified file\n"); #endif pc_printf(" -S stack/heap size in cells (default=%d)\n",(int)pc_stksize); pc_printf(" -s skip lines from the input file\n"); @@ -1300,7 +1309,7 @@ static void about(void) pc_printf(" -XD abstract machine data/stack size limit in bytes\n"); pc_printf(" -\\ use '\\' for escape characters\n"); pc_printf(" -^ use '^' for escape characters\n"); - pc_printf(" -;[+/-] require a semicolon to end each statement (default=%c)\n", sc_needsemicolon ? '+' : '-'); + pc_printf(" -;<+/-> require a semicolon to end each statement (default=%c)\n", sc_needsemicolon ? '+' : '-'); #if 0 /* not allowed in SourceMod */ pc_printf(" -([+/-] require parantheses for function invocation (default=%c)\n", optproccall ? '-' : '+'); #endif @@ -1311,8 +1320,8 @@ static void about(void) pc_printf("equivalent.\n"); #endif pc_printf("\nOptions with a value may optionally separate the value from the option letter\n"); - pc_printf("with a colon (\":\") or an equal sign (\"=\"). That is, the options \"-d0\", \"-d=0\"\n"); - pc_printf("and \"-d:0\" are all equivalent.\n"); + pc_printf("with a colon (\":\"), an equal sign (\"=\"), or a space (\" \"). That is, the options \"-d0\", \"-d=0\",\n"); + pc_printf("\"-d:0\", and \"-d 0\" are all equivalent. \"-;\" is an exception to this and cannot use a space.\n"); } /* if */ norun = 1; longjmp(errbuf,3); /* user abort */