diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2016-09-23 00:27:43 -0400 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2016-09-23 00:27:43 -0400 |
commit | 8576341df3c7b1c285ef87c9cc06a5c7bf3cd74e (patch) | |
tree | 5eec19da3cc8c305c067b81ec77f9e89b7d372ab | |
parent | 1c1a63786eebd509674e445a0db3307ffa3e284c (diff) | |
download | lighttpd-git-8576341df3c7b1c285ef87c9cc06a5c7bf3cd74e.tar.gz |
silence warnings from clang ccc-analyzer
rewrite some (generally correct) code for clang ccc-analyzer to be
able to recognize the patterns instead of issuing spurious warnings.
-rw-r--r-- | src/lemon.c | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/src/lemon.c b/src/lemon.c index 0b8d40a3..0c580dff 100644 --- a/src/lemon.c +++ b/src/lemon.c @@ -331,6 +331,7 @@ int Symbol_insert(/* struct symbol *, char * */); struct symbol *Symbol_find(/* char * */); struct symbol *Symbol_Nth(/* int */); int Symbol_count(/* */); +int State_count(void); struct symbol **Symbol_arrayof(/* */); /* Routines to manage the state table */ @@ -881,12 +882,14 @@ struct lemon *lemp; { int i; struct config *cfp; + struct state *stp; struct plink *plp; int progress; int change; for(i=0; i<lemp->nstate; i++){ - for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){ + stp = lemp->sorted[i]; + for(cfp=stp->cfp; cfp; cfp=cfp->next){ cfp->status = INCOMPLETE; } } @@ -894,7 +897,8 @@ struct lemon *lemp; do{ progress = 0; for(i=0; i<lemp->nstate; i++){ - for(cfp=lemp->sorted[i]->cfp; cfp; cfp=cfp->next){ + stp = lemp->sorted[i]; + for(cfp=stp->cfp; cfp; cfp=cfp->next){ if( cfp->status==COMPLETE ) continue; for(plp=cfp->fplp; plp; plp=plp->next){ change = SetUnion(plp->cfp->fws,cfp->fws); @@ -951,7 +955,11 @@ struct lemon *lemp; /* Add to the first state (which is always the starting state of the ** finite state machine) an action to ACCEPT if the lookahead is the ** start nonterminal. */ - Action_add(&lemp->sorted[0]->ap,ACCEPT,sp,0); + if (lemp->nstate) { /*(should always be true)*/ + struct state *stp; + stp = lemp->sorted[0]; + Action_add(&stp->ap,ACCEPT,sp,0); + } /* Resolve conflicts */ for(i=0; i<lemp->nstate; i++){ @@ -1410,14 +1418,15 @@ char **argv; } /* Count and index the symbols of the grammar */ - lem.nsymbol = Symbol_count(); Symbol_new("{default}"); + lem.nsymbol = Symbol_count(); lem.symbols = Symbol_arrayof(); - for(i=0; i<=lem.nsymbol; i++) lem.symbols[i]->index = i; - qsort(lem.symbols,lem.nsymbol+1,sizeof(struct symbol*), + for(i=0; i<lem.nsymbol; i++) lem.symbols[i]->index = i; + qsort(lem.symbols,lem.nsymbol,sizeof(struct symbol*), (int(*)())Symbolcmpp); - for(i=0; i<=lem.nsymbol; i++) lem.symbols[i]->index = i; - for(i=1; isupper(lem.symbols[i]->name[0]); i++); + for(i=0; i<lem.nsymbol; i++) lem.symbols[i]->index = i; + for(i=1; i<lem.nsymbol && isupper(lem.symbols[i]->name[0]); i++); + lem.nsymbol--; /*(do not count "{default}")*/ lem.nterminal = i; /* Generate a reprint of the grammar, if requested on the command line */ @@ -1438,6 +1447,7 @@ char **argv; ** links so that the follow-set can be computed later */ lem.nstate = 0; FindStates(&lem); + lem.nstate = State_count(); lem.sorted = State_arrayof(); /* Tie up loose ends on the propagation links */ @@ -2851,6 +2861,7 @@ struct lemon *lemp; char buf[1000]; FILE *in; char *tpltname; + char *tpltname_alloc = NULL; char *cp; cp = strrchr(lemp->filename,'.'); @@ -2864,7 +2875,7 @@ struct lemon *lemp; }else if( access(lemp->tmplname,004)==0 ){ tpltname = lemp->tmplname; }else{ - tpltname = pathsearch(lemp->argv0,lemp->tmplname,0); + tpltname = tpltname_alloc = pathsearch(lemp->argv0,lemp->tmplname,0); } if( tpltname==0 ){ fprintf(stderr,"Can't find the parser driver template file \"%s\".\n", @@ -2874,10 +2885,10 @@ struct lemon *lemp; } in = fopen(tpltname,"r"); if( in==0 ){ - fprintf(stderr,"Can't open the template file \"%s\".\n",lemp->tmplname); + fprintf(stderr,"Can't open the template file \"%s\".\n",tpltname); lemp->errorcnt++; - return 0; } + if (tpltname_alloc) free(tpltname_alloc); return in; } @@ -3861,7 +3872,8 @@ char *data; array.ht[h] = newnp; } free(x1a->tbl); - *x1a = array; + /* *x1a = array; *//* copy 'array' */ + memcpy(x1a, &array, sizeof(array)); } /* Insert the new data */ h = ph & (x1a->size-1); @@ -4025,7 +4037,8 @@ char *key; array.ht[h] = newnp; } free(x2a->tbl); - *x2a = array; + /* *x2a = array; *//* copy 'array' */ + memcpy(x2a, &array, sizeof(array)); } /* Insert the new data */ h = ph & (x2a->size-1); @@ -4231,7 +4244,8 @@ struct config *key; array.ht[h] = newnp; } free(x3a->tbl); - *x3a = array; + /* *x3a = array; *//* copy 'array' */ + memcpy(x3a, &array, sizeof(array)); } /* Insert the new data */ h = ph & (x3a->size-1); @@ -4263,6 +4277,12 @@ struct config *key; return np ? np->data : 0; } +/* Return the size of the array */ +int State_count(void) +{ + return x3a ? x3a->count : 0; +} + /* Return an array of pointers to all data in the table. ** The array is obtained from malloc. Return NULL if memory allocation ** problems, or if the array is empty. */ @@ -4375,7 +4395,8 @@ struct config *data; array.ht[h] = newnp; } free(x4a->tbl); - *x4a = array; + /* *x4a = array; *//* copy 'array' */ + memcpy(x4a, &array, sizeof(array)); } /* Insert the new data */ h = ph & (x4a->size-1); |