/* * SList.C * * SOFTWARE RIGHTS * * We reserve no LEGAL rights to SORCERER -- SORCERER is in the public * domain. An individual or company may do whatever they wish with * source code distributed with SORCERER or the code generated by * SORCERER, including the incorporation of SORCERER, or its output, into * commerical software. * * We encourage users to develop software with SORCERER. However, we do * ask that credit is given to us for developing SORCERER. By "credit", * we mean that if you incorporate our source code into one of your * programs (commercial product, research project, or otherwise) that you * acknowledge this fact somewhere in the documentation, research report, * etc... If you like SORCERER and have developed a nice tool with the * output, please mention that you developed it using SORCERER. In * addition, we ask that this header remain intact in our source code. * As long as these guidelines are kept, we expect to continue enhancing * this system and expect to make other tools available as they are * completed. * * PCCTS 1.33 * Terence Parr * Parr Research Corporation * with Purdue University and AHPCRC, University of Minnesota * 1992-1995 */ #define ANTLR_SUPPORT_CODE #include "SList.h" /* Iterate over a list of elements; returns ptr to a new element * in list upon every call and NULL when no more are left. * Very useful like this: * * cursor = mylist; * while ( (p=mylist->iterate(&cursor)) ) { * // place with element p * } * * The cursor must be initialized to point to the list to iterate over. */ void *SList:: iterate(SListNode **cursor) { void *e; if ( cursor == NULL || *cursor==NULL ) return NULL; if ( head == *cursor ) { *cursor = (*cursor)->next(); } e = (*cursor)->elem(); (*cursor) = (*cursor)->next(); return e; } /* add an element to end of list. */ void SList:: add(void *e) { SListNode *p, *tail; require(e!=NULL, "slist_add: attempting to add NULL list element"); p = new SListNode; require(p!=NULL, "add: cannot alloc new list node"); p->setElem(e); if ( head == NULL ) { head = tail = p; } else /* find end of list */ { tail->setNext(p); tail = p; } } void SList:: lfree() { SListNode *p,*q; if ( head==NULL ) return; /* empty list */ for (p = head; p!=NULL; p=q) { q = p->next(); free(p); } } PCCTS_AST *SList:: to_ast(SList list) { PCCTS_AST *t=NULL, *last=NULL; SListNode *p; for (p = head; p!=NULL; p=p->next()) { PCCTS_AST *u = (PCCTS_AST *)p->elem(); if ( last==NULL ) last = t = u; else { last->setRight(u); last = u; } } return t; }