static void handle_type(char *s) { char *name; symbol *sym; if(!(name=parse_identifier(&s))){ syntax_error(10); /* identifier expected */ return; } sym=new_import(name); myfree(name); s=skip(s); if(*s==',') s=skip(s+1); else syntax_error(9); if(!strncmp(s,"@object",7)){ sym->flags|=TYPE_OBJECT; s=skip(s+7); }else if(!strncmp(s,"@function",9)){ sym->flags|=TYPE_FUNCTION; s=skip(s+9); }else sym->flags|=parse_constexpr(&s); eol(s); }
static void handle_globl(char *s) { char *name; symbol *sym; for (;;) { if (!(name = parse_identifier(&s))) { syntax_error(10); /* identifier expected */ return; } sym = new_import(name); myfree(name); if (sym->flags & EXPORT) general_error(62,sym->name,get_bind_name(sym)); /* binding already set */ sym->flags |= EXPORT; s = skip(s); if (*s == ',') s = skip(s+1); else break; } eol(s); }
static void handle_global(char *s) { symbol *sym; char *name; name=s; if(!(name=parse_identifier(&s))){ syntax_error(10); return; } sym=new_import(name); sym->flags|=EXPORT; myfree(name); eol(s); }
static void handle_size(char *s) { char *name; symbol *sym; if(!(name=parse_identifier(&s))){ syntax_error(10); /* identifier expected */ return; } sym=new_import(name); myfree(name); s=skip(s); if(*s==',') s=skip(s+1); else syntax_error(9); sym->size=parse_expr_tmplab(&s); eol(s); }
static void handle_comm(char *s) { char *name; symbol *sym; if (alloccommon){ new_bss(s,1); return; } if(!(name=parse_identifier(&s))){ syntax_error(10); /* identifier expected */ return; } sym=new_import(name); myfree(name); s=skip(s); if(*s==',') s=skip(s+1); else syntax_error(9); if (!(sym->size=parse_expr(&s))) return; simplify_expr(sym->size); if(sym->size->type!=NUM){ syntax_error(12); return; } sym->flags|=COMMON|TYPE_OBJECT; s=skip(s); if(*s==','){ s=skip(s+1); sym->align=parse_constexpr(&s); } else sym->align=(sym->size->c.val>=8)?8:4; eol(s); }
static void do_binding(char *s,int bind) { symbol *sym; char *name; while(1){ if(!(name=parse_identifier(&s))){ syntax_error(10); /* identifier expected */ return; } sym=new_import(name); myfree(name); if(sym->flags&(EXPORT|WEAK|LOCAL)!=0 && sym->flags&(EXPORT|WEAK|LOCAL)!=bind) syntax_error(20,sym->name,get_bind_name(sym)); /* binding already set */ else sym->flags|=bind; s=skip(s); if(*s!=',') break; s=skip(s+1); } eol(s); }