int assemble(uint32_t *out_buf, char *asm_buf) { char asm_line[COL_MAX]; char term0[COL_MAX]; output_alias = out_buf; while (mygets(asm_line, asm_buf, COL_MAX) != NULL) { if (set_term0(asm_line, term0) == 1) { if (is_comment(asm_line, term0)) { // blank(comment) } else if (is_directive(asm_line, term0)) { exec_directive(asm_line, term0); } else if (is_label(asm_line, term0)) { register_label(asm_line, term0); } else { encode_and_output(asm_line, term0); } } else { // blank(empty line) } input_line_cnt++; } resolve_label(); return output_cnt; }
bool token::is_directive(directives directive) const { if (is_directive()) { return get_directive() == directive; } return false; }
/* * Parse file, calling action specific functions for: * 1) Lines containing !E * 2) Lines containing !I * 3) Lines containing !D * 4) Lines containing !F * 5) Lines containing !P * 6) Lines containing !C * 7) Default lines - lines not matching the above */ static void parse_file(FILE *infile) { char line[MAXLINESZ]; char *p, *s; while (fgets(line, MAXLINESZ, infile)) { p = is_directive(line); if (!p) { defaultline(line); continue; } switch (*p++) { case 'E': chomp(p); externalfunctions(p); break; case 'I': chomp(p); internalfunctions(p); break; case 'D': chomp(p); symbolsonly(p); break; case 'F': /* filename */ s = chomp(p); /* function names */ while (isspace(*s)) s++; singlefunctions(p, s); break; case 'P': /* filename */ s = chomp(p); /* DOC: section name */ while (isspace(*s)) s++; docsection(p, s); break; case 'C': chomp(p); if (findall) findall(p); break; default: defaultline(line); } } fflush(stdout); }