00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 # include "lclintMacros.nf"
00033 # include "llbasic.h"
00034
00035 lsymbolSet lsymbolSet_new ()
00036 {
00037 lsymbolSet s = (lsymbolSet) dmalloc (sizeof (*s));
00038
00039 s->entries = 0;
00040 s->nspace = lsymbolSetBASESIZE;
00041 s->elements = (lsymbol *) dmalloc (sizeof (*s->elements) * lsymbolSetBASESIZE);
00042
00043 return (s);
00044 }
00045
00046 static void
00047 lsymbolSet_grow (lsymbolSet s)
00048 {
00049 int i;
00050 lsymbol *newelements;
00051
00052 llassert (lsymbolSet_isDefined (s));
00053
00054 s->nspace = lsymbolSetBASESIZE;
00055 newelements = (lsymbol *) dmalloc (sizeof (*newelements)
00056 * (s->entries + s->nspace));
00057
00058 if (newelements == (lsymbol *) 0)
00059 {
00060 llfatalerror (cstring_makeLiteral ("lsymbolSet_grow: out of memory!"));
00061 }
00062
00063 for (i = 0; i < s->entries; i++)
00064 {
00065 newelements[i] = s->elements[i];
00066 }
00067
00068 sfree (s->elements);
00069 s->elements = newelements;
00070 }
00071
00072
00073
00074
00075
00076
00077
00078
00079 bool
00080 lsymbolSet_insert (lsymbolSet s, lsymbol el)
00081 {
00082 llassert (lsymbolSet_isDefined (s));
00083
00084 if (lsymbolSet_member (s, el))
00085 {
00086 return FALSE;
00087 }
00088 else
00089 {
00090 if (s->nspace <= 0)
00091 lsymbolSet_grow (s);
00092 s->nspace--;
00093 s->elements[s->entries] = el;
00094 s->entries++;
00095 return TRUE;
00096 }
00097 }
00098
00099 bool
00100 lsymbolSet_member (lsymbolSet s, lsymbol el)
00101 {
00102 if (lsymbolSet_isDefined (s))
00103 {
00104 int i;
00105
00106 for (i = 0; i < s->entries; i++)
00107 {
00108
00109
00110 if (lsymbol_equal (el, s->elements[i]))
00111 {
00112 return TRUE;
00113 }
00114 }
00115 }
00116
00117 return FALSE;
00118 }
00119
00120 cstring
00121 lsymbolSet_unparse (lsymbolSet s)
00122 {
00123 if (lsymbolSet_isDefined (s))
00124 {
00125 int i;
00126 cstring st = cstring_makeLiteral ("{");
00127
00128 for (i = 0; i < s->entries; i++)
00129 {
00130 if (i == 0)
00131 {
00132 st = message ("%q %s", st,
00133 cstring_fromChars (lsymbol_toChars (s->elements[i])));
00134 }
00135 else
00136 st = message ("%q, %s", st,
00137 cstring_fromChars (lsymbol_toChars (s->elements[i])));
00138 }
00139
00140 st = message ("%q }", st);
00141 return st;
00142 }
00143 else
00144 {
00145 return (cstring_makeLiteral ("{ }"));
00146 }
00147 }
00148
00149 void
00150 lsymbolSet_free ( lsymbolSet s)
00151 {
00152 if (lsymbolSet_isDefined (s))
00153 {
00154 sfree (s->elements);
00155 sfree (s);
00156 }
00157 }