Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b06fcd6c authored by Michal Marek's avatar Michal Marek
Browse files

genksyms: Minor parser cleanup

Move the identical logic for recording a struct/union/enum definition to
a function.
parent cd96ea3a
Loading
Loading
Loading
Loading
+15 −18
Original line number Diff line number Diff line
@@ -51,6 +51,18 @@ remove_list(struct string_list **pb, struct string_list **pe)
  free_list(b, e);
}

/* Record definition of a struct/union/enum */
static void record_compound(struct string_list **keyw,
		       struct string_list **ident,
		       struct string_list **body,
		       enum symbol_type type)
{
	struct string_list *b = *body, *i = *ident, *r;
	r = copy_node(i); r->tag = type;
	r->next = (*keyw)->next; *body = r; (*keyw)->next = NULL;
	add_symbol(i->string, type, b, is_extern);
}

%}

%token ASM_KEYW
@@ -215,26 +227,11 @@ type_specifier:

	/* Full definitions of an s/u/e.  Record it.  */
	| STRUCT_KEYW IDENT class_body
		{ struct string_list *s = *$3, *i = *$2, *r;
		  r = copy_node(i); r->tag = SYM_STRUCT;
		  r->next = (*$1)->next; *$3 = r; (*$1)->next = NULL;
		  add_symbol(i->string, SYM_STRUCT, s, is_extern);
		  $$ = $3;
		}
		{ record_compound($1, $2, $3, SYM_STRUCT); $$ = $3; }
	| UNION_KEYW IDENT class_body
		{ struct string_list *s = *$3, *i = *$2, *r;
		  r = copy_node(i); r->tag = SYM_UNION;
		  r->next = (*$1)->next; *$3 = r; (*$1)->next = NULL;
		  add_symbol(i->string, SYM_UNION, s, is_extern);
		  $$ = $3;
		}
		{ record_compound($1, $2, $3, SYM_UNION); $$ = $3; }
	| ENUM_KEYW IDENT enum_body
		{ struct string_list *s = *$3, *i = *$2, *r;
		  r = copy_node(i); r->tag = SYM_ENUM;
		  r->next = (*$1)->next; *$3 = r; (*$1)->next = NULL;
		  add_symbol(i->string, SYM_ENUM, s, is_extern);
		  $$ = $3;
		}
		{ record_compound($1, $2, $3, SYM_ENUM); $$ = $3; }
	/*
	 * Anonymous enum definition. Tell add_symbol() to restart its counter.
	 */