Misc. minor fixes (#423)

* Misc. minor fixes

* Fix OOB array access in encode_cell()

* Fix memory leaks in plungequalifiedfile()

* Remove redundant NULL pointer checks

* Fix invalid uses of realloc()

* Remove 'do_switch()'

* Don't use 'strlen()' to identify empty strings

* Other minor fixes

* Fix incorrect error message when compression is ineffective

* Add macro 'strempty' to identify empty strings
This commit is contained in:
Stanislav Gromov 2019-06-17 00:57:49 +00:00 committed by Y-Less
parent e645ffceef
commit 0cb9fb3ff6
11 changed files with 90 additions and 111 deletions

View File

@ -90,14 +90,11 @@ int memfile_write(memfile_t *mf, const void *buffer, size_t size)
assert(buffer != NULL);
if (mf->offs + size > mf->size)
{
char *orgbase = mf->base; /* save, in case realloc() fails */
size_t newsize = (mf->size + size) * 2;
mf->base = (char *)realloc(mf->base, newsize);
if (!mf->base)
{
mf->base = orgbase; /* restore old pointer to avoid a memory leak */
char *newbase = (char *)realloc(mf->base, newsize);
if (!newbase)
return 0;
}
mf->base = newbase;
mf->size = newsize;
}
memcpy(mf->base + mf->offs, buffer, size);

View File

@ -59,6 +59,10 @@
#define SC_FASTCALL
#endif
#if !defined strempty
#define strempty(str) ((str)[0]=='\0')
#endif
/* Note: the "cell" and "ucell" types are defined in AMX.H */
#define PUBLIC_CHAR '@' /* character that defines a function "public" */

View File

@ -509,7 +509,7 @@ int pc_compile(int argc, char *argv[])
set_extension(outfname,".lst",TRUE);
else
set_extension(outfname,".asm",TRUE);
if (strlen(errfname)!=0)
if (!strempty(errfname))
remove(errfname); /* delete file on startup */
else if (verbosity>0)
setcaption();
@ -600,7 +600,7 @@ int pc_compile(int argc, char *argv[])
sc_status=statFIRST; /* resetglobals() resets it to IDLE */
setstringconstants();
setfileconst(inpfname);
if (strlen(incfname)>0) {
if (!strempty(incfname)) {
if (strcmp(incfname,sDEF_PREFIX)==0) {
plungefile(incfname,FALSE,TRUE); /* parse "default.inc" */
} else {
@ -624,11 +624,11 @@ int pc_compile(int argc, char *argv[])
#if !defined SC_LIGHT
if (sc_makereport) {
FILE *frep=stdout;
if (strlen(reportname)>0)
if (!strempty(reportname))
frep=fopen(reportname,"wb"); /* avoid translation of \n to \r\n in DOS/Windows */
if (frep!=NULL) {
make_report(&glbtab,frep,get_sourcefile(0));
if (strlen(reportname)>0)
if (!strempty(reportname))
fclose(frep);
} /* if */
if (sc_documentation!=NULL) {
@ -689,7 +689,7 @@ int pc_compile(int argc, char *argv[])
writeleader(&glbtab);
setfileconst(inpfname);
insert_dbgfile(inpfname);
if (strlen(incfname)>0) {
if (!strempty(incfname)) {
if (strcmp(incfname,sDEF_PREFIX)==0)
plungefile(incfname,FALSE,TRUE); /* parse "default.inc" (again) */
else
@ -731,7 +731,7 @@ cleanup:
} /* if */
#if !defined SC_LIGHT
if (errnum==0 && strlen(errfname)==0) {
if (errnum==0 && strempty(errfname)) {
int recursion;
long stacksize=max_stacksize(&glbtab,&recursion);
int flag_exceed=0;
@ -767,10 +767,8 @@ cleanup:
remove(tname); /* the "input file" was in fact a temporary file */
free(tname);
} /* if */
if (inpfname!=NULL)
free(inpfname);
if (litq!=NULL)
free(litq);
free(inpfname);
free(litq);
stgbuffer_cleanup();
clearstk();
assert(jmpcode!=0 || loctab.next==NULL);/* on normal flow, local symbols
@ -794,17 +792,16 @@ cleanup:
#endif
#if !defined SC_LIGHT
delete_docstringtable();
if (sc_documentation!=NULL)
free(sc_documentation);
free(sc_documentation);
#endif
delete_autolisttable();
delete_heaplisttable();
if (errnum!=0) {
if (strlen(errfname)==0)
if (strempty(errfname))
pc_printf("\n%d Error%s.\n",errnum,(errnum>1) ? "s" : "");
retcode=1;
} else if (warnnum!=0){
if (strlen(errfname)==0)
if (strempty(errfname))
pc_printf("\n%d Warning%s.\n",warnnum,(warnnum>1) ? "s" : "");
retcode=0; /* use "0", so that MAKE and similar tools continue */
} else {
@ -1152,10 +1149,10 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam
break;
strlcpy(rname,option_value(ptr),_MAX_PATH); /* set name of report file */
sc_makereport=TRUE;
if (strlen(rname)>0) {
if (!strempty(rname)) {
set_extension(rname,".xml",FALSE);
} else if ((name=get_sourcefile(0))!=NULL) {
assert(strlen(rname)==0);
assert(strempty(rname));
assert(strlen(name)<_MAX_PATH);
if ((ptr=strrchr(name,DIRSEP_CHAR))!=NULL)
ptr++; /* strip path */
@ -1271,7 +1268,7 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam
/* The output name is the first input name with a different extension,
* but it is stored in a different directory
*/
if (strlen(oname)==0) {
if (strempty(oname)) {
if ((ptr=strrchr(str,DIRSEP_CHAR))!=NULL)
ptr++; /* strip path */
else
@ -1281,7 +1278,7 @@ static void parseoptions(int argc,char **argv,char *oname,char *ename,char *pnam
} /* if */
set_extension(oname,".asm",TRUE);
#if !defined SC_LIGHT
if (sc_makereport && strlen(rname)==0) {
if (sc_makereport && strempty(rname)) {
if ((ptr=strrchr(str,DIRSEP_CHAR))!=NULL)
ptr++; /* strip path */
else
@ -1452,13 +1449,15 @@ static void setconfig(char *root)
insert_path(path);
/* same for the codepage root */
#if !defined NO_CODEPAGE
*ptr='\0';
if (ptr!=NULL)
*ptr='\0';
if (!cp_path(path,"codepage"))
error(109,path); /* codepage path */
#endif
/* also copy the root path (for the XML documentation) */
#if !defined SC_LIGHT
*ptr='\0';
if (ptr!=NULL)
*ptr='\0';
strcpy(sc_rootpath,path);
#endif
} /* if */
@ -1472,7 +1471,7 @@ static void setcaption(void)
static void about(void)
{
if (strlen(errfname)==0) {
if (strempty(errfname)) {
setcaption();
pc_printf("Usage: pawncc <filename> [filename...] [options]\n\n");
pc_printf("Options:\n");
@ -1921,8 +1920,7 @@ void sc_attachdocumentation(symbol *sym)
assert(sym->documentation==NULL);
sym->documentation=doc;
} else {
if (sc_documentation!=NULL)
free(sc_documentation);
free(sc_documentation);
sc_documentation=doc;
} /* if */
} /* if */
@ -2942,7 +2940,7 @@ static void decl_enum(int vclass,int fstatic)
needtoken(')');
} /* if */
if (strlen(enumname)>0) {
if (!strempty(enumname)) {
/* already create the root symbol, so the fields can have it as their "parent" */
enumsym=add_constant(enumname,0,vclass,tag);
if (enumsym!=NULL) {
@ -3086,8 +3084,7 @@ static int getstates(const char *funcname)
/* error is already given */
state_id=0;
} /* if */
if (list!=NULL)
free(list);
free(list);
return state_id;
}
@ -3313,7 +3310,7 @@ static int operatoradjust(int opertok,symbol *sym,char *opername,int resulttag)
error(64); /* cannot change predefined operators */
/* change the operator name */
assert(strlen(opername)>0);
assert(!strempty(opername));
operator_symname(tmpname,opername,tags[0],tags[1],count,resulttag);
if ((oldsym=findglb(tmpname,sGLOBAL))!=NULL) {
int i;
@ -3339,7 +3336,7 @@ static int operatoradjust(int opertok,symbol *sym,char *opername,int resulttag)
static int check_operatortag(int opertok,int resulttag,char *opername)
{
assert(opername!=NULL && strlen(opername)>0);
assert(opername!=NULL && !strempty(opername));
switch (opertok) {
case '!':
case '<':
@ -3614,7 +3611,7 @@ static void funcstub(int fnative)
if (sym==NULL)
return;
if (fnative) {
sym->usage=(char)(uNATIVE | uRETVALUE | uDEFINE | (sym->usage & uPROTOTYPED));
sym->usage=(short)(uNATIVE | uRETVALUE | uDEFINE | (sym->usage & uPROTOTYPED));
sym->x.lib=curlibrary;
} else if (fpublic) {
sym->usage|=uPUBLIC;
@ -3802,7 +3799,7 @@ static int newfunc(char *firstname,int firsttag,int fpublic,int fstatic,int stoc
if (state_id!=0) {
constvalue *ptr=sym->states->first;
while (ptr!=NULL) {
assert(sc_status!=statWRITE || strlen(ptr->name)>0);
assert(sc_status!=statWRITE || !strempty(ptr->name));
if (ptr->index==state_id) {
setlabel((int)strtol(ptr->name,NULL,16));
break;
@ -4016,9 +4013,10 @@ static int declargs(symbol *sym,int chkshadow)
error(59,name); /* arguments of a public function may not have a default value */
if ((sym->usage & uPROTOTYPED)==0) {
/* redimension the argument list, add the entry */
sym->dim.arglist=(arginfo*)realloc(sym->dim.arglist,(argcnt+2)*sizeof(arginfo));
if (sym->dim.arglist==0)
arginfo* new_arglist=(arginfo*)realloc(sym->dim.arglist,(argcnt+2)*sizeof(arginfo));
if (new_arglist==NULL)
error(103); /* insufficient memory */
sym->dim.arglist=new_arglist;
memset(&sym->dim.arglist[argcnt+1],0,sizeof(arginfo)); /* keep the list terminated */
sym->dim.arglist[argcnt]=arg;
} else {
@ -4047,9 +4045,10 @@ static int declargs(symbol *sym,int chkshadow)
tags[numtags++]=0; /* default tag */
if ((sym->usage & uPROTOTYPED)==0) {
/* redimension the argument list, add the entry iVARARGS */
sym->dim.arglist=(arginfo*)realloc(sym->dim.arglist,(argcnt+2)*sizeof(arginfo));
if (sym->dim.arglist==0)
arginfo* new_arglist=(arginfo*)realloc(sym->dim.arglist,(argcnt+2)*sizeof(arginfo));
if (new_arglist==NULL)
error(103); /* insufficient memory */
sym->dim.arglist=new_arglist;
memset(&sym->dim.arglist[argcnt+1],0,sizeof(arginfo)); /* keep the list terminated */
sym->dim.arglist[argcnt].ident=iVARARGS;
sym->dim.arglist[argcnt].hasdefault=FALSE;
@ -4586,7 +4585,7 @@ static void make_report(symbol *root,FILE *log,char *sourcefile)
assert(i>=0); /* automaton 0 exists */
stlist=automaton_findid(i);
assert(stlist!=NULL); /* automaton should be found */
fprintf(log,"\t\t\t<automaton name=\"%s\"/>\n", strlen(stlist->name)>0 ? stlist->name : "(anonymous)");
fprintf(log,"\t\t\t<automaton name=\"%s\"/>\n", !strempty(stlist->name) ? stlist->name : "(anonymous)");
//??? dump state decision table
} /* if */
assert(sym->refer!=NULL);
@ -4890,7 +4889,7 @@ static int testsymbols(symbol *root,int level,int testlabs,int testconst)
case iFUNCTN:
if ((sym->usage & (uDEFINE | uREAD | uNATIVE | uSTOCK | uPUBLIC))==uDEFINE) {
funcdisplayname(symname,sym->name);
if (strlen(symname)>0)
if (!strempty(symname))
error(203,symname); /* symbol isn't used ... (and not public/native/stock) */
} /* if */
if ((sym->usage & uPUBLIC)!=0 || strcmp(sym->name,uMAINFUNC)==0)
@ -7535,6 +7534,7 @@ static void doreturn(void)
ident=doexpr(TRUE,FALSE,TRUE,FALSE,&tag,&sym,TRUE);
needtoken(tTERM);
/* see if this function already has a sub type (an array attached) */
assert(curfunc!=NULL);
sub=finddepend(curfunc);
assert(sub==NULL || sub->ident==iREFARRAY);
if ((rettype & uRETVALUE)!=0) {
@ -7547,7 +7547,6 @@ static void doreturn(void)
} /* if */
rettype|=uRETVALUE; /* function returns a value */
/* check tagname with function tagname */
assert(curfunc!=NULL);
check_tagmismatch(curfunc->tag,tag,TRUE,-1);
if (ident==iARRAY || ident==iREFARRAY) {
int dim[sDIMEN_MAX],numdim=0;
@ -7617,8 +7616,7 @@ static void doreturn(void)
sub=addvariable(curfunc->name,(argcount+3)*sizeof(cell),iREFARRAY,sGLOBAL,
curfunc->tag,dim,numdim,idxtag,0);
sub->parent=curfunc;
if (curfunc)
curfunc->child=sub;
curfunc->child=sub;
} /* if */
/* get the hidden parameter, copy the array (the array is on the heap;
* it stays on the heap for the moment, and it is removed -usually- at
@ -7774,7 +7772,7 @@ static void dostate(void)
sym=findglb(uENTRYFUNC,sGLOBAL);
if (sc_status==statWRITE && sym!=NULL && sym->ident==iFUNCTN && sym->states!=NULL) {
for (stlist=sym->states->first; stlist!=NULL; stlist=stlist->next) {
assert(strlen(stlist->name)!=0);
assert(!strempty(stlist->name));
if (state_getfsa(stlist->index)==automaton->index && state_inlist(stlist->index,(int)state->value))
break; /* found! */
} /* for */

View File

@ -92,13 +92,9 @@ SC_FUNC void pushstk(stkitem val)
int newsize= (stktop==0) ? 16 : 2*stktop;
/* try to resize the stack */
assert(newsize>stktop);
newstack=(stkitem*)malloc(newsize*sizeof(stkitem));
newstack=(stkitem*)realloc(stack,newsize*sizeof(stkitem));
if (newstack==NULL)
error(102,"parser stack"); /* stack overflow (recursive include?) */
/* swap the stacks */
memcpy(newstack,stack,stkidx*sizeof(stkitem));
if (stack!=NULL)
free(stack);
stack=newstack;
stktop=newsize;
} /* if */
@ -148,8 +144,10 @@ static char extensions[][6] = { "", ".inc", ".p", ".pawn" };
error(103); /* insufficient memory */
strcpy(path,name);
real_path=(char *)malloc(strlen(name)+sizeof(extensions[0]));
if (real_path==NULL)
if (real_path==NULL) {
free(path);
error(103); /* insufficient memory */
} /* if */
do {
found=TRUE;
ext=strchr(path,'\0'); /* save position */
@ -172,11 +170,13 @@ static char extensions[][6] = { "", ".inc", ".p", ".pawn" };
if (fp==NULL) {
*ext='\0'; /* on failure, restore filename */
found=FALSE;
}
} /* if */
ext_idx++;
} while (!found && ext_idx<(sizeof extensions / sizeof extensions[0]));
if (!found) {
*ext='\0'; /* restore filename */
free(path);
free(real_path);
return FALSE;
} /* if */
PUSHSTK_P(inpf);
@ -469,7 +469,7 @@ static void stripcomment(unsigned char *line)
if (icomment==2) {
assert(commentidx<COMMENT_LIMIT+COMMENT_MARGIN);
comment[commentidx]='\0';
if (strlen(comment)>0)
if (!strempty(comment))
insert_docstring(comment);
} /* if */
#endif
@ -576,7 +576,7 @@ static void stripcomment(unsigned char *line)
if (icomment==2) {
assert(commentidx<COMMENT_LIMIT+COMMENT_MARGIN);
comment[commentidx]='\0';
if (strlen(comment)>0)
if (!strempty(comment))
insert_docstring(comment);
} /* if */
#endif
@ -1092,7 +1092,7 @@ static int command(void)
if (!SKIPPING) {
char pathname[_MAX_PATH];
lptr=getstring((unsigned char*)pathname,sizeof pathname,lptr);
if (strlen(pathname)>0) {
if (!strempty(pathname)) {
free(inpfname);
inpfname=duplicatestring(pathname);
if (inpfname==NULL)
@ -1183,7 +1183,7 @@ static int command(void)
name[i]=*lptr;
name[i]='\0';
} /* if */
if (strlen(name)==0) {
if (strempty(name)) {
curlibrary=NULL;
} else if (strcmp(name,"-")==0) {
pc_addlibtable=FALSE;
@ -1508,7 +1508,7 @@ static int command(void)
delete_subst(pattern,prefixlen);
} /* if */
/* add the pattern/substitution pair to the list */
assert(strlen(pattern)>0);
assert(!strempty(pattern));
insert_subst(pattern,substitution,prefixlen);
free(pattern);
free(substitution);
@ -1712,8 +1712,7 @@ static int substpattern(unsigned char *line,size_t buffersize,char *pattern,char
* a string, or the closing paranthese of a group) */
} /* while */
/* store the parameter (overrule any earlier) */
if (args[arg]!=NULL)
free(args[arg]);
free(args[arg]);
len=(int)(e-s);
args[arg]=(unsigned char*)malloc(len+1);
if (args[arg]==NULL)
@ -1815,8 +1814,7 @@ static int substpattern(unsigned char *line,size_t buffersize,char *pattern,char
} /* if */
for (arg=0; arg<10; arg++)
if (args[arg]!=NULL)
free(args[arg]);
free(args[arg]);
return match;
}
@ -2905,8 +2903,7 @@ static void free_symbol(symbol *sym)
} /* if */
assert(sym->refer!=NULL);
free(sym->refer);
if (sym->documentation!=NULL)
free(sym->documentation);
free(sym->documentation);
if (sym->vclass==sGLOBAL)
symbol_cache_remove(sym);
free(sym);

View File

@ -1673,7 +1673,7 @@ restart:
cell2addr(); /* normal array index */
} else {
if (sym->dim.array.length!=0)
ffbounds(sym->dim.array.length*(32/sCHARBITS)-1);
ffbounds(sym->dim.array.length*((sizeof(cell)*8)/sCHARBITS)-1);
char2addr(); /* character array index */
} /* if */
popreg(sALT);

View File

@ -79,7 +79,7 @@ SC_FUNC void writeleader(symbol *root)
for (fsa=sc_automaton_tab.first; fsa!=NULL; fsa=fsa->next) {
defstorage();
stgwrite("0\t; automaton ");
if (strlen(fsa->name)==0)
if (strempty(fsa->name))
stgwrite("(anonymous)");
else
stgwrite(fsa->name);
@ -111,7 +111,7 @@ SC_FUNC void writeleader(symbol *root)
} /* if */
/* generate label numbers for all statelist ids */
for (stlist=sym->states->first; stlist!=NULL; stlist=stlist->next) {
assert(strlen(stlist->name)==0);
assert(strempty(stlist->name));
strcpy(stlist->name,itoh(getlabel()));
} /* for */
if (strcmp(sym->name,uENTRYFUNC)==0)

View File

@ -259,13 +259,15 @@ static unsigned char *encode_cell(ucell c,int *len)
c>>=7;
} while (index>=0);
/* skip leading zeros */
while (index<ENC_MAX-1 && buffer[index]==0 && (buffer[index+1] & 0x40)==0)
while (index<ENC_MAX-2 && buffer[index+1]==0 && (buffer[index+2] & 0x40)==0)
index++;
/* skip leading -1s */
if (index==0 && buffer[index]==ENC_MASK && (buffer[index+1] & 0x40)!=0)
if (index==-1 && buffer[index+1]==ENC_MASK && (buffer[index+2] & 0x40)!=0)
index++;
while (index<ENC_MAX-1 && buffer[index]==0x7f && (buffer[index+1] & 0x40)!=0)
while (index<ENC_MAX-2 && buffer[index+1]==0x7f && (buffer[index+2] & 0x40)!=0)
index++;
assert(index<ENC_MAX-1);
++index;
*len=ENC_MAX-index;
ptr=&buffer[index];
while (index<ENC_MAX-1)
@ -286,7 +288,7 @@ static void write_encoded(FILE *fbin,ucell *c,int num)
writeerror |= !pc_writebin(fbin,bytes,len);
bytes_out+=len;
bytes_in+=sizeof *c;
assert(AMX_COMPACTMARGIN>2);
assert_static(AMX_COMPACTMARGIN>2);
if (bytes_out-bytes_in>=AMX_COMPACTMARGIN-2)
longjmp(compact_err,1);
} else {
@ -308,6 +310,7 @@ static void write_encoded_n(FILE *fbin,ucell c,int num)
assert(len>0);
bytes_in += num*sizeof c;
bytes_out += num*len;
assert_static(AMX_COMPACTMARGIN>2);
if (bytes_out-bytes_in>=AMX_COMPACTMARGIN-2)
longjmp(compact_err,1);
while (num-->0)
@ -507,23 +510,6 @@ static cell SC_FASTCALL do_jump(FILE *fbin,char *params,cell opcode)
return opcodes(1)+opargs(1);
}
static cell SC_FASTCALL do_switch(FILE *fbin,char *params,cell opcode)
{
int i;
ucell p;
i=(int)hex2long(params,NULL);
assert(i>=0 && i<sc_labnum);
if (fbin!=NULL) {
assert(lbltab!=NULL);
p=lbltab[i];
write_encoded(fbin,(ucell*)&opcode,1);
write_encoded(fbin,&p,1);
} /* if */
return opcodes(1)+opargs(1);
}
#if defined __BORLANDC__ || defined __WATCOMC__
#pragma argsused
#endif
@ -697,7 +683,7 @@ static OPCODE opcodelist[] = {
{ 80, "sub.alt", sIN_CSEG, parm0 },
{132, "swap.alt", sIN_CSEG, parm0 }, /* version 4 */
{131, "swap.pri", sIN_CSEG, parm0 }, /* version 4 */
{129, "switch", sIN_CSEG, do_switch }, /* version 1 */
{129, "switch", sIN_CSEG, do_jump }, /* version 1 */
/*{126, "symbol", sIN_CSEG, do_symbol }, */
/*{136, "symtag", sIN_CSEG, parm1 }, -- version 7 */
{123, "sysreq.c", sIN_CSEG, parm1 },
@ -822,7 +808,7 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
if (pc_addlibtable) {
for (constptr=libname_tab.first; constptr!=NULL; constptr=constptr->next) {
if (constptr->value>0) {
assert(strlen(constptr->name)>0);
assert(!strempty(constptr->name));
numlibraries++;
nametablesize+=strlen(constptr->name)+1;
} /* if */
@ -833,7 +819,7 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
numtags=0;
for (constptr=tagname_tab.first; constptr!=NULL; constptr=constptr->next) {
if ((constptr->value & PUBLICTAG)!=0) {
assert(strlen(constptr->name)>0);
assert(!strempty(constptr->name));
numtags++;
nametablesize+=strlen(constptr->name)+1;
} /* if */
@ -959,7 +945,7 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
count=0;
for (constptr=libname_tab.first; constptr!=NULL; constptr=constptr->next) {
if (constptr->value>0) {
assert(strlen(constptr->name)>0);
assert(!strempty(constptr->name));
func.address=0;
func.nameofs=nameofs;
#if BYTE_ORDER==BIG_ENDIAN
@ -1003,7 +989,7 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
count=0;
for (constptr=tagname_tab.first; constptr!=NULL; constptr=constptr->next) {
if ((constptr->value & PUBLICTAG)!=0) {
assert(strlen(constptr->name)>0);
assert(!strempty(constptr->name));
func.address=constptr->value & TAGMASK;
func.nameofs=nameofs;
#if BYTE_ORDER==BIG_ENDIAN
@ -1097,7 +1083,7 @@ SC_FUNC int assemble(FILE *fout,FILE *fin)
} /* while */
} /* for */
if (bytes_out-bytes_in>0)
error(106); /* compression buffer overflow */
longjmp(compact_err,1);
if (lbltab!=NULL) {
free(lbltab);
@ -1222,21 +1208,21 @@ static void append_dbginfo(FILE *fout)
/* tag table */
for (constptr=tagname_tab.first; constptr!=NULL; constptr=constptr->next) {
assert(strlen(constptr->name)>0);
assert(!strempty(constptr->name));
dbghdr.tags++;
dbghdr.size+=sizeof(AMX_DBG_TAG)+strlen(constptr->name);
} /* for */
/* automaton table */
for (constptr=sc_automaton_tab.first; constptr!=NULL; constptr=constptr->next) {
assert(constptr->index==0 && strlen(constptr->name)==0 || strlen(constptr->name)>0);
assert(constptr->index==0 && strempty(constptr->name) || !strempty(constptr->name));
dbghdr.automatons++;
dbghdr.size+=sizeof(AMX_DBG_MACHINE)+strlen(constptr->name);
} /* for */
/* state table */
for (constptr=sc_state_tab.first; constptr!=NULL; constptr=constptr->next) {
assert(strlen(constptr->name)>0);
assert(!strempty(constptr->name));
dbghdr.states++;
dbghdr.size+=sizeof(AMX_DBG_STATE)+strlen(constptr->name);
} /* for */
@ -1355,7 +1341,7 @@ static void append_dbginfo(FILE *fout)
/* tag table */
for (constptr=tagname_tab.first; constptr!=NULL; constptr=constptr->next) {
assert(strlen(constptr->name)>0);
assert(!strempty(constptr->name));
id1=(int16_t)(constptr->value & TAGMASK);
#if BYTE_ORDER==BIG_ENDIAN
align16(&id1);
@ -1366,7 +1352,7 @@ static void append_dbginfo(FILE *fout)
/* automaton table */
for (constptr=sc_automaton_tab.first; constptr!=NULL; constptr=constptr->next) {
assert(constptr->index==0 && strlen(constptr->name)==0 || strlen(constptr->name)>0);
assert(constptr->index==0 && strempty(constptr->name) || !strempty(constptr->name));
id1=(int16_t)constptr->index;
address=(ucell)constptr->value;
#if BYTE_ORDER==BIG_ENDIAN
@ -1380,7 +1366,7 @@ static void append_dbginfo(FILE *fout)
/* state table */
for (constptr=sc_state_tab.first; constptr!=NULL; constptr=constptr->next) {
assert(strlen(constptr->name)>0);
assert(!strempty(constptr->name));
id1=(int16_t)constptr->value;
id2=(int16_t)constptr->index;
address=(ucell)constptr->value;

View File

@ -1276,10 +1276,7 @@ static void grow_stgbuffer(char **buffer, int *curmax, int requiredsize)
if (requiredsize>sSTG_MAX)
error(102,"staging buffer"); /* staging buffer overflow (fatal error) */
*curmax=requiredsize+sSTG_GROW;
if (*buffer!=NULL)
p=(char *)realloc(*buffer,*curmax*sizeof(char));
else
p=(char *)malloc(*curmax*sizeof(char));
p=(char *)realloc(*buffer,*curmax*sizeof(char));
if (p==NULL)
error(102,"staging buffer"); /* staging buffer overflow (fatal error) */
*buffer=p;

View File

@ -122,7 +122,7 @@ SC_FUNC int cp_path(const char *root, const char *directory)
len1= (root!=NULL) ? strlen(root) : 0;
add_slash1= (len1==0 || root[len1-1]!=DIRSEP_CHAR);
len2= (directory!=NULL) ? strlen(directory) : 0;
add_slash2= (len2>0 && root[len2-1]!=DIRSEP_CHAR);
add_slash2= (len2>0 && directory[len2-1]!=DIRSEP_CHAR);
if (len1+add_slash1+len2+add_slash2>=(_MAX_PATH-MAXCODEPAGE))
return FALSE; /* full filename may not fit */
if (root!=NULL)

View File

@ -63,10 +63,8 @@ static stringpair *insert_stringpair(stringpair *root,char *first,char *second,i
cur->second=duplicatestring(second);
cur->matchlength=matchlength;
if (cur->first==NULL || cur->second==NULL) {
if (cur->first!=NULL)
free(cur->first);
if (cur->second!=NULL)
free(cur->second);
free(cur->first);
free(cur->second);
free(cur);
return NULL;
} /* if */

View File

@ -179,10 +179,12 @@ SC_FUNC void state_buildlist(int **list,int *listsize,int *count,int stateid)
/* To avoid constantly calling malloc(), the list is grown by 4 states at
* a time.
*/
int *newlist;
*listsize+=4;
*list=(int*)realloc(*list,*listsize*sizeof(int));
if (*list==NULL)
newlist=(int*)realloc(*list,*listsize*sizeof(int));
if (newlist==NULL)
error(103); /* insufficient memory */
*list=newlist;
} /* if */
/* find the insertion point (the list has to stay sorted) */