From b7692fda79e5770e93647e2350e736eaa8f38245 Mon Sep 17 00:00:00 2001 From: Y_Less Date: Thu, 26 Oct 2017 11:41:33 +0200 Subject: [PATCH] #pragma option --- source/compiler/sc1.c | 21 ++++++++++++++++----- source/compiler/sc2.c | 12 ++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/source/compiler/sc1.c b/source/compiler/sc1.c index d61d29a..3117d6a 100644 --- a/source/compiler/sc1.c +++ b/source/compiler/sc1.c @@ -1050,7 +1050,8 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam #endif break; case 'c': - strlcpy(codepage,option_value(ptr),MAXCODEPAGE); /* set name of codepage */ + if (codepage) + strlcpy(codepage,option_value(ptr),MAXCODEPAGE); /* set name of codepage */ break; case 'D': /* set active directory */ ptr=option_value(ptr); @@ -1082,7 +1083,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': @@ -1108,7 +1110,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'; @@ -1116,13 +1119,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) { @@ -1230,7 +1236,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); @@ -1261,6 +1267,11 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam } /* for */ } +void parsesingleoption(char *argv) +{ + parseoptions(1, &argv, NULL, NULL, NULL, NULL, NULL); +} + #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 2c9fd1a..9a7a4c0 100644 --- a/source/compiler/sc2.c +++ b/source/compiler/sc2.c @@ -945,6 +945,8 @@ enum { * Global variables: iflevel, ifstack (altered) * lptr (altered) */ +void parsesingleoption(char *argv); + static int command(void) { int tok,ret; @@ -1268,6 +1270,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 */