diff --git a/sourcepawn/compiler/AMBuilder b/sourcepawn/compiler/AMBuilder index 021f26b8..0fe0afbe 100644 --- a/sourcepawn/compiler/AMBuilder +++ b/sourcepawn/compiler/AMBuilder @@ -82,7 +82,7 @@ binary.sources += [ 'lstring.cpp', 'memfile.cpp', 'pawncc.cpp', - 'sc1.c', + 'sc1.cpp', 'sc2.cpp', 'sc3.cpp', 'sc4.cpp', diff --git a/sourcepawn/compiler/sc.h b/sourcepawn/compiler/sc.h index 1d9fc118..1f1505a0 100644 --- a/sourcepawn/compiler/sc.h +++ b/sourcepawn/compiler/sc.h @@ -546,7 +546,7 @@ typedef enum s_optmark { * Functions you call from the "driver" program */ int pc_compile(int argc, char **argv); -int pc_addconstant(char *name,cell value,int tag); +int pc_addconstant(const char *name,cell value,int tag); int pc_addtag(const char *name); int pc_addtag_flags(const char *name, int flags); int pc_findtag(const char *name); @@ -616,15 +616,15 @@ SC_FUNC void sp_fdbg_ntv_start(int num_natives); SC_FUNC void sp_fdbg_ntv_hook(int index, symbol *sym); /* function prototypes in SC1.C */ -SC_FUNC void set_extension(char *filename,char *extension,int force); +SC_FUNC void set_extension(char *filename,const char *extension,int force); SC_FUNC symbol *fetchfunc(char *name); -SC_FUNC char *operator_symname(char *symname,char *opername,int tag1,int tag2,int numtags,int resulttag); +SC_FUNC char *operator_symname(char *symname,const char *opername,int tag1,int tag2,int numtags,int resulttag); SC_FUNC char *funcdisplayname(char *dest,char *funcname); SC_FUNC int exprconst(cell *val,int *tag,symbol **symptr); SC_FUNC constvalue *append_constval(constvalue *table,const char *name,cell val,int index); SC_FUNC constvalue *find_constval(constvalue *table,char *name,int index); SC_FUNC void delete_consttable(constvalue *table); -SC_FUNC symbol *add_constant(char *name,cell val,int vclass,int tag); +SC_FUNC symbol *add_constant(const char *name,cell val,int vclass,int tag); SC_FUNC void exporttag(int tag); SC_FUNC void sc_attachdocumentation(symbol *sym); SC_FUNC constvalue *find_tag_byval(int tag); @@ -794,7 +794,7 @@ SC_FUNC int error(int number,...); SC_FUNC void errorset(int code,int line); /* function prototypes in SC6.C */ -SC_FUNC int assemble(FILE *fout,FILE *fin); +SC_FUNC int assemble(void *fout,void *fin); /* function prototypes in SC7.C */ SC_FUNC void stgbuffer_cleanup(void); @@ -816,7 +816,7 @@ SC_FUNC void delete_aliastable(void); SC_FUNC stringlist *insert_path(char *path); SC_FUNC char *get_path(int index); SC_FUNC void delete_pathtable(void); -SC_FUNC stringpair *insert_subst(char *pattern,char *substitution,int prefixlen); +SC_FUNC stringpair *insert_subst(const char *pattern,const char *substitution,int prefixlen); SC_FUNC int get_subst(int index,char **pattern,char **substitution); SC_FUNC stringpair *find_subst(char *name,int length); SC_FUNC int delete_subst(char *name,int length); diff --git a/sourcepawn/compiler/sc1.c b/sourcepawn/compiler/sc1.cpp similarity index 96% rename from sourcepawn/compiler/sc1.c rename to sourcepawn/compiler/sc1.cpp index 341e0685..5fb12501 100644 --- a/sourcepawn/compiler/sc1.c +++ b/sourcepawn/compiler/sc1.cpp @@ -585,7 +585,7 @@ cleanup: #if defined __cplusplus extern "C" #endif -int pc_addconstant(char *name,cell value,int tag) +int pc_addconstant(const char *name,cell value,int tag) { errorset(sFORCESET,0); /* make sure error engine is silenced */ sc_status=statIDLE; @@ -833,7 +833,7 @@ static char *get_extension(char *filename) * Set the default extension, or force an extension. To erase the * extension of a filename, set "extension" to an empty string. */ -SC_FUNC void set_extension(char *filename,char *extension,int force) +SC_FUNC void set_extension(char *filename,const char *extension,int force) { char *ptr; @@ -1364,35 +1364,14 @@ static void setconstants(void) add_constant("false",0,sGLOBAL,1); add_constant("EOS",0,sGLOBAL,0); /* End Of String, or '\0' */ add_constant("INVALID_FUNCTION", -1, sGLOBAL, pc_tag_nullfunc_t); - #if PAWN_CELL_SIZE==16 - add_constant("cellbits",16,sGLOBAL,0); - #if defined _I16_MAX - add_constant("cellmax",_I16_MAX,sGLOBAL,0); - add_constant("cellmin",_I16_MIN,sGLOBAL,0); - #else - add_constant("cellmax",SHRT_MAX,sGLOBAL,0); - add_constant("cellmin",SHRT_MIN,sGLOBAL,0); - #endif - #elif PAWN_CELL_SIZE==32 - add_constant("cellbits",32,sGLOBAL,0); - #if defined _I32_MAX - add_constant("cellmax",_I32_MAX,sGLOBAL,0); - add_constant("cellmin",_I32_MIN,sGLOBAL,0); - #else - add_constant("cellmax",LONG_MAX,sGLOBAL,0); - add_constant("cellmin",LONG_MIN,sGLOBAL,0); - #endif - #elif PAWN_CELL_SIZE==64 - #if !defined _I64_MIN - #define _I64_MIN (-9223372036854775807ULL - 1) - #define _I64_MAX 9223372036854775807ULL - #endif - add_constant("cellbits",64,sGLOBAL,0); - add_constant("cellmax",_I64_MAX,sGLOBAL,0); - add_constant("cellmin",_I64_MIN,sGLOBAL,0); - #else - #error Unsupported cell size - #endif + add_constant("cellbits",32,sGLOBAL,0); +#if defined _I32_MAX + add_constant("cellmax",_I32_MAX,sGLOBAL,0); + add_constant("cellmin",_I32_MIN,sGLOBAL,0); +#else + add_constant("cellmax",LONG_MAX,sGLOBAL,0); + add_constant("cellmin",LONG_MIN,sGLOBAL,0); +#endif add_constant("charbits",sCHARBITS,sGLOBAL,0); add_constant("charmin",0,sGLOBAL,0); add_constant("charmax",~(-1 << sCHARBITS) - 1,sGLOBAL,0); @@ -4061,19 +4040,36 @@ static void domethodmap(LayoutSpec spec) require_newline(TRUE); } +class AutoStage +{ + public: + AutoStage() : lcl_staging_(FALSE) + { + if (!staging) { + stgset(TRUE); + lcl_staging_ = TRUE; + lcl_stgidx_ = stgidx; + assert(stgidx == 0); + } + } + ~AutoStage() { + if (lcl_staging_) { + stgout(lcl_stgidx_); + stgset(FALSE); + } + } + + private: + int lcl_staging_; + int lcl_stgidx_; +}; + // delete ::= "delete" expr static void dodelete() { + AutoStage staging_on; + svalue sval; - - int lcl_staging = FALSE; - if (!staging) { - stgset(TRUE); - lcl_staging = TRUE; - assert(stgidx == 0); - } - int lcl_stgidx = stgidx; - int ident = lvalexpr(&sval); needtoken(tTERM); @@ -4081,7 +4077,7 @@ static void dodelete() case iFUNCTN: case iREFFUNC: error(115, "functions"); - goto cleanup; + return; case iARRAY: case iREFARRAY: @@ -4091,7 +4087,7 @@ static void dodelete() symbol *sym = sval.val.sym; if (!sym || sym->dim.array.level > 0) { error(115, "arrays"); - goto cleanup; + return; } break; } @@ -4099,13 +4095,13 @@ static void dodelete() if (sval.val.tag == 0) { error(115, "primitive types or enums"); - goto cleanup; + return; } methodmap_t *map = methodmap_find_by_tag(sval.val.tag); if (!map) { error(115, pc_tagname(sval.val.tag)); - goto cleanup; + return; } { @@ -4121,7 +4117,7 @@ static void dodelete() if (!map || !map->dtor) { error(115, layout_spec_name(map->spec), map->name); - goto cleanup; + return; } // Only zap non-const lvalues. @@ -4182,12 +4178,6 @@ static void dodelete() } markexpr(sEXPR, NULL, 0); - -cleanup: - if (lcl_staging) { - stgout(lcl_stgidx); - stgset(FALSE); - } } /** @@ -4965,7 +4955,7 @@ static char *tag2str(char *dest,int tag) return isdigit(dest[1]) ? &dest[1] : dest; } -SC_FUNC char *operator_symname(char *symname,char *opername,int tag1,int tag2,int numtags,int resulttag) +SC_FUNC char *operator_symname(char *symname,const char *opername,int tag1,int tag2,int numtags,int resulttag) { char tagstr1[10], tagstr2[10]; int opertok; @@ -5281,7 +5271,7 @@ static int newfunc(declinfo_t *decl, const int *thistag, int fpublic, int fstati } /* if */ if ((sym->flags & flgDEPRECATED) != 0 && (sym->usage & uSTOCK) == 0) { - char *ptr= (sym->documentation!=NULL) ? sym->documentation : ""; + const char *ptr= (sym->documentation!=NULL) ? sym->documentation : ""; error(234, decl->name, ptr); /* deprecated (probably a public function) */ } /* if */ begcseg(); @@ -5472,7 +5462,7 @@ static int declargs(symbol *sym, int chkshadow, const int *thistag) memset(argptr, 0, sizeof(*argptr)); strcpy(argptr->name, "this"); argptr->ident = iVARIABLE; - argptr->tags = malloc(sizeof(int)); + argptr->tags = (int *)malloc(sizeof(int)); argptr->tags[0] = *thistag; argptr->numtags = 1; } else { @@ -5775,11 +5765,12 @@ static int count_referrers(symbol *entry) } #if !defined SC_LIGHT -static int find_xmltag(char *source,char *xmltag,char *xmlparam,char *xmlvalue, +static int find_xmltag(char *source, const char *xmltag, const char *xmlparam, const char *xmlvalue, char **outer_start,int *outer_length, - char **inner_start,int *inner_length) + const char **inner_start,int *inner_length) { - char *ptr,*inner_end; + char *ptr; + const char *inner_end; int xmltag_len,xmlparam_len,xmlvalue_len; int match; @@ -6122,7 +6113,8 @@ static void make_report(symbol *root,FILE *log,char *sourcefile) assert(sym->dim.arglist!=NULL); for (arg=0; sym->dim.arglist[arg].ident!=0; arg++) { int dim,paraminfo; - char *outer_start,*inner_start; + char *outer_start; + const char *inner_start; int outer_length,inner_length; if (sym->dim.arglist[arg].ident==iVARARGS) fprintf(log,"\t\t\t\n"); @@ -6175,10 +6167,9 @@ static void make_report(symbol *root,FILE *log,char *sourcefile) && find_xmltag(sym->documentation, "param", "name", sym->dim.arglist[arg].name, &outer_start, &outer_length, &inner_start, &inner_length)) { - char *tail; fprintf(log,"\t\t\t\t%.*s\n",inner_length,inner_start); /* delete from documentation string */ - tail=outer_start+outer_length; + char *tail=outer_start+outer_length; memmove(outer_start,tail,strlen(tail)+1); } /* if */ fprintf(log,"\t\t\t\n"); @@ -6571,7 +6562,7 @@ SC_FUNC void delete_consttable(constvalue *table) * * Adds a symbol to the symbol table. Returns NULL on failure. */ -SC_FUNC symbol *add_constant(char *name,cell val,int vclass,int tag) +SC_FUNC symbol *add_constant(const char *name,cell val,int vclass,int tag) { symbol *sym; @@ -6980,7 +6971,7 @@ static int test(int label,int parens,int invert) if (endtok!=0) needtoken(endtok); if (ident==iARRAY || ident==iREFARRAY) { - char *ptr=(sym->name!=NULL) ? sym->name : "-unknown-"; + const char *ptr=(sym->name!=NULL) ? sym->name : "-unknown-"; error(33,ptr); /* array must be indexed */ } /* if */ if (ident==iCONSTEXPR) { /* constant expression */ diff --git a/sourcepawn/compiler/sc6.cpp b/sourcepawn/compiler/sc6.cpp index d6e190ae..b78ebd2c 100644 --- a/sourcepawn/compiler/sc6.cpp +++ b/sourcepawn/compiler/sc6.cpp @@ -37,10 +37,10 @@ #endif -static void append_dbginfo(FILE *fout); +static void append_dbginfo(void *fout); -typedef cell (*OPCODE_PROC)(FILE *fbin,char *params,cell opcode); +typedef cell (*OPCODE_PROC)(void *fbin,char *params,cell opcode); typedef struct { cell opcode; @@ -192,7 +192,7 @@ static char *stripcomment(char *str) return str; } -static void write_encoded(FILE *fbin,ucell *c,int num) +static void write_encoded(void *fbin,ucell *c,int num) { #if PAWN_CELL_SIZE == 16 #define ENC_MAX 3 /* a 16-bit cell is encoded in max. 3 bytes */ @@ -246,7 +246,7 @@ static void write_encoded(FILE *fbin,ucell *c,int num) #if defined __BORLANDC__ || defined __WATCOMC__ #pragma argsused #endif -static cell noop(FILE *fbin,char *params,cell opcode) +static cell noop(void *fbin,char *params,cell opcode) { return 0; } @@ -254,7 +254,7 @@ static cell noop(FILE *fbin,char *params,cell opcode) #if defined __BORLANDC__ || defined __WATCOMC__ #pragma argsused #endif -static cell set_currentfile(FILE *fbin,char *params,cell opcode) +static cell set_currentfile(void *fbin,char *params,cell opcode) { fcurrent=(short)getparam(params,NULL); return 0; @@ -263,14 +263,14 @@ static cell set_currentfile(FILE *fbin,char *params,cell opcode) #if defined __BORLANDC__ || defined __WATCOMC__ #pragma argsused #endif -static cell parm0(FILE *fbin,char *params,cell opcode) +static cell parm0(void *fbin,char *params,cell opcode) { if (fbin!=NULL) write_encoded(fbin,(ucell*)&opcode,1); return opcodes(1); } -static cell parm1(FILE *fbin,char *params,cell opcode) +static cell parm1(void *fbin,char *params,cell opcode) { ucell p=getparam(params,NULL); if (fbin!=NULL) { @@ -280,7 +280,7 @@ static cell parm1(FILE *fbin,char *params,cell opcode) return opcodes(1)+opargs(1); } -static cell parm2(FILE *fbin,char *params,cell opcode) +static cell parm2(void *fbin,char *params,cell opcode) { ucell p1=getparam(params,¶ms); ucell p2=getparam(params,NULL); @@ -292,7 +292,7 @@ static cell parm2(FILE *fbin,char *params,cell opcode) return opcodes(1)+opargs(2); } -static cell parm3(FILE *fbin,char *params,cell opcode) +static cell parm3(void *fbin,char *params,cell opcode) { ucell p1=getparam(params,¶ms); ucell p2=getparam(params,¶ms); @@ -306,7 +306,7 @@ static cell parm3(FILE *fbin,char *params,cell opcode) return opcodes(1)+opargs(3); } -static cell parm4(FILE *fbin,char *params,cell opcode) +static cell parm4(void *fbin,char *params,cell opcode) { ucell p1=getparam(params,¶ms); ucell p2=getparam(params,¶ms); @@ -322,7 +322,7 @@ static cell parm4(FILE *fbin,char *params,cell opcode) return opcodes(1)+opargs(4); } -static cell parm5(FILE *fbin,char *params,cell opcode) +static cell parm5(void *fbin,char *params,cell opcode) { ucell p1=getparam(params,¶ms); ucell p2=getparam(params,¶ms); @@ -343,7 +343,7 @@ static cell parm5(FILE *fbin,char *params,cell opcode) #if defined __BORLANDC__ || defined __WATCOMC__ #pragma argsused #endif -static cell do_dump(FILE *fbin,char *params,cell opcode) +static cell do_dump(void *fbin,char *params,cell opcode) { ucell p; int num = 0; @@ -359,7 +359,7 @@ static cell do_dump(FILE *fbin,char *params,cell opcode) return num*sizeof(cell); } -static cell do_call(FILE *fbin,char *params,cell opcode) +static cell do_call(void *fbin,char *params,cell opcode) { char name[sNAMEMAX+1]; int i; @@ -399,7 +399,7 @@ static cell do_call(FILE *fbin,char *params,cell opcode) return opcodes(1)+opargs(1); } -static cell do_jump(FILE *fbin,char *params,cell opcode) +static cell do_jump(void *fbin,char *params,cell opcode) { int i; ucell p; @@ -416,7 +416,7 @@ static cell do_jump(FILE *fbin,char *params,cell opcode) return opcodes(1)+opargs(1); } -static cell do_switch(FILE *fbin,char *params,cell opcode) +static cell do_switch(void *fbin,char *params,cell opcode) { int i; ucell p; @@ -436,7 +436,7 @@ static cell do_switch(FILE *fbin,char *params,cell opcode) #if defined __BORLANDC__ || defined __WATCOMC__ #pragma argsused #endif -static cell do_case(FILE *fbin,char *params,cell opcode) +static cell do_case(void *fbin,char *params,cell opcode) { int i; ucell p,v; @@ -659,7 +659,7 @@ static int findopcode(char *instr,int maxlen) return 0; /* not found, return special index */ } -SC_FUNC int assemble(FILE *fout,FILE *fin) +SC_FUNC int assemble(void *fout, void *fin) { AMX_HEADER hdr; AMX_FUNCSTUBNT func; @@ -1058,7 +1058,7 @@ SC_FUNC int assemble(FILE *fout,FILE *fin) return size; } -static void append_dbginfo(FILE *fout) +static void append_dbginfo(void *fout) { AMX_DBG_HDR dbghdr; AMX_DBG_LINE dbgline; diff --git a/sourcepawn/compiler/sclist.cpp b/sourcepawn/compiler/sclist.cpp index 8f9f374a..1a830044 100644 --- a/sourcepawn/compiler/sclist.cpp +++ b/sourcepawn/compiler/sclist.cpp @@ -49,7 +49,7 @@ SC_FUNC char* duplicatestring(const char* sourcestring) } -static stringpair *insert_stringpair(stringpair *root,char *first,char *second,int matchlength) +static stringpair *insert_stringpair(stringpair *root,const char *first,const char *second,int matchlength) { stringpair *cur,*pred; @@ -275,7 +275,7 @@ static void adjustindex(char c) substindex[(int)c-PUBLIC_CHAR]=cur; } -SC_FUNC stringpair *insert_subst(char *pattern,char *substitution,int prefixlen) +SC_FUNC stringpair *insert_subst(const char *pattern,const char *substitution,int prefixlen) { stringpair *cur;