/* * Copyright 1993, 1995 Christopher Seiwald. * * This file is part of Jam - see jam.c for Copyright information. */ # include "jam.h" # include "lists.h" # include "parse.h" # include "scan.h" # include "newstr.h" #ifdef APPLE_EXTENSIONS # include "timingdata.h" #endif /* * parse.c - make and destroy parse trees as driven by the parser */ static PARSE *yypsave; void parse_file( f ) char *f; { /* Suspend scan of current file */ /* and push this new file in the stream */ yyfparse(f); /* Now parse each block of rules and execute it. */ /* Execute it outside of the parser so that recursive */ /* calls to yyrun() work (no recursive yyparse's). */ for(;;) { LOL l; PARSE *p; lol_init( &l ); yypsave = 0; if( yyparse() || !( p = yypsave ) ) break; (*(p->func))( p, &l ); parse_free( p ); } #ifdef APPLE_EXTENSIONS if( globs.enable_timings ) { char *jamfile_name; if ( strcmp( f, "-" ) == 0 ) { jamfile_name = "stdin"; } else if ( strcmp( f, "+" ) == 0 ) { jamfile_name = "top-level internal"; } else { jamfile_name = f; } append_timing_entry( globs.timing_entry, 0, "jam internals: parsing of jamfile", NULL, jamfile_name ); globs.timing_entry = create_timing_entry(); } #endif } void parse_save( p ) PARSE *p; { yypsave = p; } PARSE * parse_make( func, left, right, string, string1, llist, rlist, num ) void (*func)(); PARSE *left; PARSE *right; char *string; char *string1; LIST *llist; LIST *rlist; int num; { PARSE *p = (PARSE *)malloc( sizeof( PARSE ) ); p->func = func; p->left = left; p->right = right; p->string = string; p->string1 = string1; p->llist = llist; p->rlist = rlist; p->num = num; return p; } void parse_free( p ) PARSE *p; { if( p->string ) freestr( p->string ); if( p->string1 ) freestr( p->string1 ); if( p->llist ) list_free( p->llist ); if( p->rlist ) list_free( p->rlist ); if( p->left ) parse_free( p->left ); if( p->right ) parse_free( p->right ); free( (char *)p ); }