}
}
-
-
static long align_item(long offset, long size)
{
offset--;
return (size * type->size);
}
+Field* add_field(Parser* p, Type* type, char* name, bool export)
+{
+ Field* prev = NULL;
+ Field* curr = type->fields;
+
+ while (curr)
+ {
+ if (curr->name && !strcmp(curr->name, name))
+ {
+ error(p, "multiple definitions of '%s' in record", name);
+ }
+ prev = curr;
+ curr = curr->next;
+ }
+
+ Field* field = calloc(1, sizeof(Field));
+ field->name = name;
+ field->export = export;
+ if (prev)
+ {
+ prev->next = field;
+ }
+ else
+ {
+ type->fields = field;
+ }
+
+ return field;
+}
+
/* Grammar Definition
*****************************************************************************/
static void expression(Parser* p, Item* item);
long offset = 0;
item->type = calloc(1, sizeof(Type));
item->type->form = FORM_RECORD;
- Field **field = &(item->type->fields);
while (peek(p)->type != END)
{
/* parse the field name list */
- int nfields = 0;
Field* first = NULL;
+ int nfields = 0;
do
{
char* name = expect_text(p, IDENT);
bool export = accept(p, '*');
- *field = calloc(1, sizeof(Field));
- (*field)->name = name;
- (*field)->export = export;
+ Field* f = add_field(p, item->type, name, export);
+ nfields++;
if (!first)
{
- first = *field;
+ first = f;
}
- field = &((*field)->next);
- nfields++;
}
while (accept(p, ','));