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 "basic.h"
00034 # include "sRefTable.h"
00035
00036 static sRefTable
00037 sRefTable_new (void)
00038 {
00039 sRefTable s = (sRefTable) dmalloc (sizeof (*s));
00040
00041 s->entries = 0;
00042 s->nspace = sRefTableBASESIZE;
00043 s->elements = (sRef *) dmalloc (sizeof (*s->elements) * sRefTableBASESIZE);
00044
00045 return (s);
00046 }
00047
00048 static void
00049 sRefTable_grow ( sRefTable s)
00050 {
00051 int i;
00052 sRef *newelements;
00053
00054 s->nspace = sRefTableBASESIZE;
00055 newelements = (sRef *) dmalloc (sizeof (*newelements) * (s->entries + s->nspace));
00056
00057 for (i = 0; i < s->entries; i++)
00058 {
00059 newelements[i] = s->elements[i];
00060 }
00061
00062 sfree (s->elements);
00063 s->elements = newelements;
00064 }
00065
00066 sRefTable
00067 sRefTable_add (sRefTable s, sRef el)
00068 {
00069 if (sRefTable_isNull (s))
00070 {
00071 s = sRefTable_new ();
00072 }
00073
00074 if (s->nspace <= 0)
00075 {
00076 sRefTable_grow (s);
00077 }
00078
00079 s->nspace--;
00080
00081 llassert (s->elements != NULL);
00082 s->elements[s->entries] = el;
00083
00084 s->entries++;
00085
00086 return s;
00087 }
00088
00089 void
00090 sRefTable_clear (sRefTable s)
00091 {
00092 if (sRefTable_isDefined (s))
00093 {
00094 int i;
00095
00096 for (i = 0; i < s->entries; i++)
00097 {
00098 sRef_free (s->elements[i]);
00099 }
00100
00101 s->nspace += s->entries;
00102 s->entries = 0;
00103 }
00104 }
00105
00106 static int sRefTable_size (sRefTable s)
00107 {
00108 if (sRefTable_isNull (s)) return 0;
00109 return s->entries;
00110 }
00111
00112 cstring
00113 sRefTable_unparse (sRefTable s)
00114 {
00115 int i;
00116 cstring st = cstring_undefined;
00117
00118 if (sRefTable_isDefined (s))
00119 {
00120 for (i = 0; i < sRefTable_size (s); i++)
00121 {
00122 if (i == 0)
00123 st = message ("%4d. %q\n", i, sRef_unparse (s->elements[i]));
00124 else
00125 st = message ("%q%4d. %q\n", st, i, sRef_unparse (s->elements[i]));
00126 }
00127 }
00128 return st;
00129 }
00130
00131 void
00132 sRefTable_free ( sRefTable s)
00133 {
00134 if (sRefTable_isDefined (s))
00135 {
00136 int i;
00137
00138 for (i = 0; i < s->entries; i++)
00139 {
00140 sRef_free (s->elements[i]);
00141 }
00142
00143 sfree (s->elements);
00144 sfree (s);
00145 }
00146 }
00147