/*
* Copyright 1993, 2000 Christopher Seiwald.
*
* This file is part of Jam - see jam.c for Copyright information.
*/
/*
* parse.c - make and destroy parse trees as driven by the parser
*
* 09/07/00 (seiwald) - ref count on PARSE to avoid freeing when used,
* as per Matt Armstrong.
* 09/11/00 (seiwald) - structure reworked to reflect that (*func)()
* returns a LIST *.
* 10/22/02 (seiwald) - working return/break/continue statements
* 11/04/02 (seiwald) - const-ing for string literals
*/
# include "jam.h"
# include "lists.h"
# include "parse.h"
# include "scan.h"
# include "newstr.h"
static PARSE *yypsave;
#ifdef OPT_IMPROVED_MEMUSE_EXT
#include "mempool.h"
static MEMPOOL* parse_pool = NULL;
#endif
void
parse_file( const 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;
int jmp = 0; /* JMP_NONE */
/* $(<) and $(>) empty in outer scope. */
lol_init( &l );
/* Filled by yyparse() calling parse_save() */
yypsave = 0;
/* If parse error or empty parse, outta here */
if( yyparse() || !( p = yypsave ) )
break;
/* Run the parse tree. */
list_free( (*(p->func))( p, &l, &jmp ) );
parse_free( p );
}
}
void
parse_save( PARSE *p )
{
yypsave = p;
}
PARSE *
parse_make(
LIST *(*func)( PARSE *p, LOL *args, int *jmp ),
PARSE *left,
PARSE *right,
PARSE *third,
const char *string,
const char *string1,
int num )
{
#ifdef OPT_IMPROVED_MEMUSE_EXT
PARSE *p;
if (!parse_pool) {
parse_pool = mempool_create("PARSE", sizeof(PARSE));
}
p = mempool_alloc(parse_pool);
#else
PARSE *p = (PARSE *)malloc( sizeof( PARSE ) );
#endif
p->func = func;
p->left = left;
p->right = right;
p->third = third;
p->string = string;
p->string1 = string1;
p->num = num;
p->refs = 1;
return p;
}
void
parse_refer( PARSE *p )
{
++p->refs;
}
void
parse_free( PARSE *p )
{
if( --p->refs )
return;
if( p->string )
freestr( p->string );
if( p->string1 )
freestr( p->string1 );
if( p->left )
parse_free( p->left );
if( p->right )
parse_free( p->right );
if( p->third )
parse_free( p->third );
#ifdef OPT_IMPROVED_MEMUSE_EXT
mempool_free(parse_pool, p);
#else
free( (char *)p );
#endif
}
#ifdef OPT_DEBUG_MEM_TOTALS_EXT
void
parse_done(void)
{
mempool_done(parse_pool);
}
#endif /* OPT_DEBUG_MEM_TOTALS_EXT */
| # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #7 | 4047 | Matt Armstrong | 20% reduction in memory use. | ||
| #6 | 3969 | Matt Armstrong |
Integrate from //guest/matt_armstrong/jam/fix/2/...@3963 -- no real changes. |
||
| #5 | 3950 | Matt Armstrong |
Integrate from //guest/matt_armstrong/jam/fix/1/... thru change 3948 and make no changes. |
||
| #4 | 3683 | Matt Armstrong | Checkpoint improved memory use canges. | ||
| #3 | 3656 | Matt Armstrong |
Partial support for a -T flag that prints out more detailed memory usage statistics. |
||
| #2 | 2507 | Matt Armstrong | update from the mainline | ||
| #1 | 1270 | Matt Armstrong | In prep for publishing all my patches to jam. | ||
| //guest/perforce_software/jam/src/parse.c | |||||
| #2 | 486 | Perforce staff |
Jam 2.3. See RELNOTES for a list of changes from 2.2.x. Just about every source file was touched when jam got ANSI-fied. |
||
| #1 | 2 | laura | Add Jam/MR 2.2 source | ||