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 sortSet sortSet_new ()
00036 {
00037 sortSet s = (sortSet) dmalloc (sizeof (*s));
00038
00039 s->entries = 0;
00040 s->nspace = sortSetBASESIZE;
00041 s->elements = (sort *) dmalloc (sizeof (*s->elements) * sortSetBASESIZE);
00042
00043 return (s);
00044 }
00045
00046 static sortSet
00047 sortSet_predict (int size)
00048 {
00049 sortSet s = (sortSet) dmalloc (sizeof (*s));
00050
00051 s->entries = 0;
00052
00053 if (size > 0)
00054 {
00055 s->nspace = size;
00056 s->elements = (sort *) dmalloc (sizeof (*s->elements) * size);
00057 }
00058 else
00059 {
00060 s->nspace = 0;
00061 s->elements = NULL;
00062 }
00063
00064 return (s);
00065 }
00066
00067 static void
00068 sortSet_grow ( sortSet s)
00069 {
00070 int i;
00071 sort *newelements;
00072
00073 s->nspace = sortSetBASESIZE;
00074 newelements = (sort *) dmalloc (sizeof (*newelements) * (s->entries + s->nspace));
00075
00076 if (newelements == (sort *) 0)
00077 {
00078 llfatalerror (cstring_makeLiteral ("sortSet_grow: out of memory!"));
00079 }
00080
00081 for (i = 0; i < s->entries; i++)
00082 {
00083 newelements[i] = s->elements[i];
00084 }
00085
00086 sfree (s->elements);
00087 s->elements = newelements;
00088 }
00089
00090
00091
00092
00093
00094
00095
00096
00097 bool
00098 sortSet_insert (sortSet s, sort el)
00099 {
00100 llassert (sortSet_isDefined (s));
00101
00102 if (sortSet_member (s, el))
00103 {
00104 return FALSE;
00105 }
00106 else
00107 {
00108 if (s->nspace <= 0)
00109 sortSet_grow (s);
00110 s->nspace--;
00111 s->elements[s->entries] = el;
00112 s->entries++;
00113 return TRUE;
00114 }
00115 }
00116
00117 sort
00118 sortSet_choose (sortSet s)
00119 {
00120 llassert (sortSet_isDefined (s) && s->entries > 0);
00121 return (s->elements[0]);
00122 }
00123
00124 bool
00125 sortSet_member (sortSet s, sort el)
00126 {
00127 if (sortSet_isDefined (s))
00128 {
00129 int i;
00130
00131 for (i = 0; i < s->entries; i++)
00132 {
00133 if (sort_equal (&el, &(s->elements[i])))
00134 {
00135 return TRUE;
00136 }
00137 }
00138 }
00139
00140 return FALSE;
00141 }
00142
00143 cstring
00144 sortSet_unparse (sortSet s)
00145 {
00146 return (message ("{ %q }", sortSet_unparseClean (s)));
00147 }
00148
00149 cstring
00150 sortSet_unparseClean (sortSet s)
00151 {
00152 cstring st = cstring_undefined;
00153
00154 if (sortSet_isDefined (s))
00155 {
00156 int i;
00157
00158 for (i = 0; i < s->entries; i++)
00159 {
00160 if (i == 0)
00161 {
00162 st = message ("%q%s", st, sort_unparseName (s->elements[i]));
00163 }
00164 else
00165 {
00166 st = message ("%q, %s", st, sort_unparseName (s->elements[i]));
00167 }
00168 }
00169 }
00170
00171 return st;
00172 }
00173
00174 cstring
00175 sortSet_unparseOr (sortSet s)
00176 {
00177 cstring st = cstring_undefined;
00178
00179 if (sortSet_isDefined (s))
00180 {
00181 int i;
00182 int last = s->entries - 1;
00183
00184 for (i = 0; i < s->entries; i++)
00185 {
00186 if (i == 0)
00187 {
00188 st = cstring_concatFree (st, sort_unparse (s->elements[i]));
00189 }
00190 else
00191 {
00192 if (i == last)
00193 {
00194
00195 st = message ("%q or %q", st, sort_unparse (s->elements[i]));
00196 }
00197 else
00198 {
00199 st = message ("%q, %q", st, sort_unparse (s->elements[i]));
00200 }
00201 }
00202 }
00203 }
00204
00205 return st;
00206 }
00207
00208 void
00209 sortSet_free (sortSet s)
00210 {
00211 if (sortSet_isDefined (s))
00212 {
00213 sfree (s->elements);
00214 sfree (s);
00215 }
00216 }
00217
00218 sortSet
00219 sortSet_copy (sortSet s)
00220 {
00221 sortSet t = sortSet_predict (sortSet_size (s));
00222 int i;
00223
00224 if (sortSet_isDefined (s))
00225 {
00226 for (i = 0; i < sortSet_size (s); i++)
00227 {
00228 (void) sortSet_insert (t, s->elements[i]);
00229 }
00230 }
00231
00232 return t;
00233 }
00234
00235
00236