- assert(p);
- assert(name);
- assert(namelen > 0 && namelen < p->name_size);
- assert(contents);
-
- unsigned start = name2pos(p, name, namelen);
- unsigned pos = start;
-
- do {
- char *s = getsym(p, pos);
- if (!*s) {
- memcpy(s, name, namelen + 1);
- s[namelen] = '\0';
- memcpy(s + p->name_size, contents, p->elem_size);
- return s + p->name_size;
- }
- if (!memcmp(name, s, namelen) && s[namelen] == '\0') {
- /* TODO!! report error */
- return NULL; /* ..already added */
- }
- if (++pos >= p->elems_count)
- pos = 0;
- } while(pos != start);
-
- /* TODO!! report overflow */
- return NULL;
- /* TODO!!! */
+ assert (p);
+ assert (name);
+ assert (namelen > 0 && namelen < p->name_size);
+ assert (value);
+
+ unsigned start = name2pos (p, name, namelen);
+ unsigned pos = start;
+
+ do
+ {
+ SymtableElem *elem = getsym (p, pos);
+ if (!elem->name)
+ {
+ elem->name = (char *) malloc (namelen + 1);
+ memcpy (elem->name, name, namelen + 1);
+ elem->name[namelen] = '\0';
+ elem->value = malloc (p->elem_size);
+ memcpy (elem->value, value, p->elem_size);
+ return elem;
+ }
+ if (!memcmp (name, elem->name, namelen) && elem->name[namelen] == '\0')
+ {
+ /* TODO!! report error */
+ return NULL; /* ..already added */
+ }
+ if (++pos >= p->elems_count)
+ pos = 0;
+ }
+ while (pos != start);
+
+ /* TODO!! report overflow */
+ return NULL;
+ /* TODO!!! */