blob: a0d48f0bf97bead8351185e0131a7e17913bb8ba [file] [log] [blame]
/*
* context.c - Create or destroy "treecc" parsing contexts.
*
* Copyright (C) 2001 Southern Storm Software, Pty Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "system.h"
#include "input.h"
#include "info.h"
#include "errors.h"
#ifdef __cplusplus
extern "C" {
#endif
TreeCCContext *TreeCCContextCreate(TreeCCInput *input)
{
TreeCCContext *context;
/* Allocate space for the context */
if((context = (TreeCCContext *)calloc(1, sizeof(TreeCCContext))) == 0)
{
TreeCCOutOfMemory(input);
}
/* Initialize and return the context */
context->input = input;
context->debugMode = 0;
context->track_lines = 1;
context->no_singletons = 0;
context->reentrant = 0;
context->force = 0;
context->virtual_factory = 0;
context->abstract_factory = 0;
context->kind_in_vtable = 0;
context->strip_filenames = 0;
context->print_lines = 1;
context->internal_access = 0;
context->use_allocator = 1;
context->use_gc_allocator = 0;
context->yy_replacement = "yy";
context->state_type = "YYNODESTATE";
context->namespace = 0;
context->language = TREECC_LANG_C;
context->block_size = 0;
context->nodeNumber = 1;
context->baseType = 0;
return context;
}
void TreeCCContextDestroy(TreeCCContext *context)
{
unsigned int hash;
TreeCCNode *node, *nextNode;
TreeCCOperation *oper, *nextOper;
TreeCCStream *stream, *nextStream;
/* Close the source streams */
stream = context->streamList;
while(stream != 0)
{
nextStream = stream->nextStream;
TreeCCStreamDestroy(stream);
stream = nextStream;
}
/* Free the contents of the node hash */
for(hash = 0; hash < TREECC_HASH_SIZE; ++hash)
{
node = context->nodeHash[hash];
while(node != 0)
{
nextNode = node->nextHash;
TreeCCNodeFree(node);
node = nextNode;
}
}
/* Free the contents of the operation hash */
for(hash = 0; hash < TREECC_HASH_SIZE; ++hash)
{
oper = context->operHash[hash];
while(oper != 0)
{
nextOper = oper->nextHash;
TreeCCOperationFree(oper);
oper = nextOper;
}
}
/* Free the context block itself */
free(context);
}
#ifdef __cplusplus
};
#endif