int find_includes(struct filepointer *filep, struct inclist *file, struct inclist *file_red, int recursion, boolean failOK, struct IncludesCollection* incCollection, struct symhash *symbols)
{ char *line; int type;
while ((line = get_line(filep))) {
type = deftype(line, filep, file, TRUE, symbols); switch(type) { caseIF:
doif:
type = find_includes(filep, file,
file_red, recursion+1, failOK, incCollection, symbols); while ((type == ELIF) || (type == ELIFFALSE) ||
(type == ELIFGUESSFALSE))
type = gobble(filep, file, file_red, symbols); break; case IFFALSE:
doiffalse:
type = gobble(filep, file, file_red, symbols); if (type == ELIF) goto doif; elseif ((type == ELIFFALSE) || (type == ELIFGUESSFALSE)) goto doiffalse; break; case ELIFFALSE: case ELIFGUESSFALSE: case ELIF: if (!recursion)
gobble(filep, file, file_red, symbols); if (recursion) return type;
define(line, &symbols); break; case ERROR:
warning("%s: %d: %s\n", file_red->i_file,
filep->f_line, line); break;
case -1:
warning("%s", file_red->i_file); if (file_red != file)
warning1(" (reading %s)", file->i_file);
warning1(", line %d: unknown directive == \"%s\"\n",
filep->f_line, line); break; case -2:
warning("%s", file_red->i_file); if (file_red != file)
warning1(" (reading %s)", file->i_file);
warning1(", line %d: incomplete include == \"%s\"\n",
filep->f_line, line); break;
}
} // coverity[leaked_storage] - on purpose return -1;
}
int gobble(struct filepointer *filep, struct inclist *file, struct inclist *file_red, struct symhash *symbols)
{ char *line; int type;
while ((line = get_line(filep))) {
type = deftype(line, filep, file, FALSE, symbols); switch(type) { caseIF: case IFFALSE:
type = gobble(filep, file, file_red, symbols); while ((type == ELIF) || (type == ELIFFALSE) ||
(type == ELIFGUESSFALSE))
type = gobble(filep, file, file_red, symbols); break; case ERROR: break; case ELIF: case ELIFFALSE: case ELIFGUESSFALSE: return type; case -1:
warning("%s, line %d: unknown directive == \"%s\"\n",
file_red->i_file, filep->f_line, line); break;
}
} return -1;
}
/* *Decidewhattypeof#directivethislineis.
*/ int deftype (char *line, struct filepointer *filep, struct inclist * file, int parse_it, struct symhash *symbols)
{ char *p; char *directive, savechar; int ret;
(void)file; // used in DEBUG mode
(void)filep; /* *Parsethedirective...
*/
directive=line+1; while (*directive == ' ' || *directive == '\t')
directive++;
p = directive; while (*p >= 'a' && *p <= 'z')
p++;
savechar = *p;
*p = '\0';
ret = match(directive, directives);
*p = savechar;
/* If we don't recognize this compiler directive or we happen to just *begobblinguptextwhilewaitingforan#endifor#elifor#else *inthecaseofan#elifwemustcheckthezero_valueandreturnan *ELIForanELIFFALSE.
*/
if (ret == ELIF && !parse_it)
{ while (*p == ' ' || *p == '\t')
p++; /* *parseanexpression.
*/
debug(0,("%s, line %d: #elif %s ",
file->i_file, filep->f_line, p));
ret = zero_value(p, symbols); if (ret != IF)
{
debug(0,("false...\n")); if (ret == IFFALSE) return ELIFFALSE; else return ELIFGUESSFALSE;
} else
{
debug(0,("true...\n")); return ELIF;
}
}
if (ret < 0 || ! parse_it) return ret;
/* *nowdecidehowtoparsethedirective,anddoit.
*/ while (*p == ' ' || *p == '\t')
p++; switch (ret) { caseIF: /* *parseanexpression.
*/
ret = zero_value(p, symbols);
debug(0,("%s, line %d: %s #if %s\n",
file->i_file, filep->f_line, ret?"false":"true", p)); break; case ELIF: case ERROR:
debug(0,("%s, line %d: #%s\n",
file->i_file, filep->f_line, directives[ret])); /* *nothingtodo.
*/ break;
} return ret;
}
/* Separate symbol name and its value */
val = def; while (isalnum((unsignedchar)*val) || *val == '_')
val++; if (*val)
*val++ = '\0'; while (*val == ' ' || *val == '\t')
val++;
if (!*val)
val = "1";
hash_define( def, val, symbols );
}
void hash_free( struct symhash *symbols )
{ int i;
if ( !symbols ) return;
for ( i = 0; i < SYMHASHMEMBERS; ++i )
{ struct pair *it = symbols->s_pairs[ i ]; struct pair *next; while ( it )
{
next = it->p_next;
free( it );
it = next;
}
}
free( symbols->s_pairs );
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.