hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 * 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-2000
 */
 
#define ANTLR_SUPPORT_CODE
 
#include "SList.h"
#include "pccts_stdarg.h" // MR23
 
/* 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=NULL;
   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;
}
 
// MR23
int SList::printMessage(FILE* pFile, const char* pFormat, ...)
{
   va_list marker;
   va_start( marker, pFormat );
      int iRet = vfprintf(pFile, pFormat, marker);
   va_end( marker );
   return iRet;
}