parse.c #7

  • //
  • guest/
  • matt_armstrong/
  • jam/
  • patched_version/
  • parse.c
  • View
  • Commits
  • Open Download .zip Download (3 KB)
/*
 * 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