diff --git a/source/compiler/sc1.c b/source/compiler/sc1.c index e77b64c..7cd9ba5 100644 --- a/source/compiler/sc1.c +++ b/source/compiler/sc1.c @@ -1085,7 +1085,8 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam } /* switch */ break; case 'e': - strlcpy(ename,option_value(ptr),_MAX_PATH); /* set name of error file */ + if (ename) + strlcpy(ename,option_value(ptr),_MAX_PATH); /* set name of error file */ break; #if defined __WIN32__ || defined _WIN32 || defined _Windows case 'H': @@ -1111,7 +1112,8 @@ 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 */ + if (oname) + strlcpy(oname,option_value(ptr),_MAX_PATH); /* set name of (binary) output file */ break; case 'O': pc_optimize=*option_value(ptr) - '0'; @@ -1119,13 +1121,16 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam about(); break; case 'p': - strlcpy(pname,option_value(ptr),_MAX_PATH); /* set name of implicit include file */ + if (pname) + strlcpy(pname,option_value(ptr),_MAX_PATH); /* set name of implicit include file */ break; case 'R': pc_recursion=toggle_option(ptr,pc_recursion); break; #if !defined SC_LIGHT case 'r': + if (!rname) + break; strlcpy(rname,option_value(ptr),_MAX_PATH); /* set name of report file */ sc_makereport=TRUE; if (strlen(rname)>0) { @@ -1233,7 +1238,7 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam strlcpy(str,argv[arg],i+1); /* str holds symbol name */ i=atoi(ptr+1); add_builtin_constant(str,i,sGLOBAL,0); - } else { + } else if (oname) { strlcpy(str,argv[arg],sizeof(str)-2); /* -2 because default extension is ".p" */ set_extension(str,".p",FALSE); insert_sourcefile(str); @@ -1264,6 +1269,18 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam } /* for */ } +void parsesingleoption(char *argv) +{ + /* argv[0] is the program, which we don't need here */ + char *args[2] = { 0, argv }; + char codepage[MAXCODEPAGE+1] = { 0 }; + codepage[0] = '\0'; + parseoptions(2, args, NULL, NULL, NULL, NULL, codepage); + /* need explicit support for codepages */ + if (codepage[0] && !cp_set(codepage)) + error(108); /* codepage mapping file not found */ +} + #if !defined SC_LIGHT static void parserespf(char *filename,char *oname,char *ename,char *pname, char *rname,char *codepage) diff --git a/source/compiler/sc2.c b/source/compiler/sc2.c index 04f746b..b99f4c2 100644 --- a/source/compiler/sc2.c +++ b/source/compiler/sc2.c @@ -942,6 +942,8 @@ enum { * Global variables: iflevel, ifstack (altered) * lptr (altered) */ +void parsesingleoption(char *argv); + static int command(void) { int tok,ret; @@ -1265,6 +1267,16 @@ static int command(void) sym=findconst("__compat",NULL); assert(sym!=NULL); sym->addr=pc_compat; + } else if (strcmp(str,"option")==0) { + char name[sNAMEMAX+1]; + int i; + /* first gather all information, start with the tag name */ + while (*lptr<=' ' && *lptr!='\0') + lptr++; + for (i=0; i' '; i++,lptr++) + name[i]=*lptr; + name[i]='\0'; + parsesingleoption(name); } else { error(207); /* unknown #pragma */ } /* if */