int ex2(struct parser* p) { int label_1 = label_count++; int stop = 0; if (ex3(p)) { out3("BF", label_1); } else if (output(p)) { } else { stop = 1; } if (stop) return 0; while (!stop) { if (ex3(p)) { out1("BE"); } else if (output(p)) { } else { stop = 1; } } generate_label(label_1); return 1; }
/** * "switch" statement */ doswitch() { loop_t loop; loop_t *ptr; loop.symbol_idx = local_table_index; loop.stack_pointer = stkp; loop.type = WSSWITCH; loop.test_label = swstp; loop.body_label = getlabel (); loop.cont_label = loop.exit_label = getlabel (); addloop (&loop); gen_immediate_a (); print_label (loop.body_label); newline (); gen_push (); needbrack ("("); expression (YES); needbrack (")"); stkp = stkp + INTSIZE; // '?case' will adjust the stack gen_jump_case (); statement (NO); ptr = readswitch (); gen_jump (ptr->exit_label); dumpsw (ptr); generate_label (ptr->exit_label); local_table_index = ptr->symbol_idx; stkp = gen_modify_stack (ptr->stack_pointer); swstp = ptr->test_label; delloop (); }
/** * "switch" statement */ void doswitch(void) { WHILE ws; WHILE *ptr; ws.symbol_idx = local_table_index; ws.stack_pointer = stkp; ws.type = WSSWITCH; ws.case_test = swstp; ws.body_tab = getlabel (); ws.incr_def = ws.while_exit = getlabel (); addwhile (&ws); gen_immediate (); print_label (ws.body_tab); newline (); gen_push (HL_REG); needbrack ("("); expression (YES); needbrack (")"); stkp = stkp + INTSIZE; // '?case' will adjust the stack gen_jump_case (); statement (NO); ptr = readswitch (); gen_jump (ptr->while_exit); dumpsw (ptr); generate_label (ptr->while_exit); local_table_index = ptr->symbol_idx; stkp = gen_modify_stack (ptr->stack_pointer); swstp = ptr->case_test; delwhile (); }
/** * dump switch table */ dumpsw(loop_t *loop) { int i,j; data_segment_gdata (); generate_label (loop->body_label); if (loop->test_label != swstp) { j = loop->test_label; while (j < swstp) { gen_def_word (); i = 4; while (i--) { output_number (swstcase[j]); output_byte (','); print_label (swstlab[j++]); if ((i == 0) | (j >= swstp)) { newline (); break; } output_byte (','); } } } gen_def_word (); print_label (loop->cont_label); output_string (",0"); newline (); code_segment_gtext (); }
/** * dump switch table */ void dumpsw(WHILE *ws) { int i,j; data_segment_gdata (); generate_label (ws->body_tab); if (ws->case_test != swstp) { j = ws->case_test; while (j < swstp) { gen_def_word (); i = 4; while (i--) { output_number (swstcase[j]); output_byte (','); print_label (swstlab[j++]); if ((i == 0) | (j >= swstp)) { newline (); break; } output_byte (','); } } } gen_def_word (); print_label (ws->incr_def); output_string (",0"); newline (); code_segment_gtext (); }
/** * "while" statement */ void dowhile(void) { WHILE ws; ws.symbol_idx = local_table_index; ws.stack_pointer = stkp; ws.type = WSWHILE; ws.case_test = getlabel (); ws.while_exit = getlabel (); addwhile (&ws); generate_label (ws.case_test); test (ws.while_exit, FALSE); statement (NO); gen_jump (ws.case_test); generate_label (ws.while_exit); local_table_index = ws.symbol_idx; stkp = gen_modify_stack (ws.stack_pointer); delwhile (); }
/** * "while" statement */ dowhile() { loop_t loop; loop.symbol_idx = local_table_index; loop.stack_pointer = stkp; loop.type = WSWHILE; loop.test_label = getlabel (); loop.exit_label = getlabel (); addloop (&loop); generate_label (loop.test_label); test (loop.exit_label, FALSE); statement (NO); gen_jump (loop.test_label); generate_label (loop.exit_label); local_table_index = loop.symbol_idx; stkp = gen_modify_stack (loop.stack_pointer); delloop (); }
int provenance_label_file(const char path[PATH_MAX], const char *label){ union prov_elt prov; uint64_t taint = generate_label(label); int rc; rc = provenance_read_file(path, &prov); if(rc<0) return rc; prov_bloom_add(prov_taint(&prov), taint); return __provenance_write_file(path, &prov); }
int fprovenance_label_file(int fd, const char *label){ union prov_elt prov; uint64_t taint = generate_label(label); int rc; rc = fprovenance_read_file(fd, &prov); if(rc<0) return rc; prov_bloom_add(prov_taint(&prov), taint); return __fprovenance_write_file(fd, &prov); }
/** * "for" statement */ void dofor(void) { WHILE ws; WHILE *pws; ws.symbol_idx = local_table_index; ws.stack_pointer = stkp; ws.type = WSFOR; ws.case_test = getlabel (); ws.incr_def = getlabel (); ws.body_tab = getlabel (); ws.while_exit = getlabel (); addwhile (&ws); pws = readwhile (); needbrack ("("); if (!match (";")) { expression (YES); need_semicolon (); } generate_label (pws->case_test); if (!match (";")) { expression (YES); gen_test_jump (pws->body_tab, TRUE); gen_jump (pws->while_exit); need_semicolon (); } else pws->case_test = pws->body_tab; generate_label (pws->incr_def); if (!match (")")) { expression (YES); needbrack (")"); gen_jump (pws->case_test); } else pws->incr_def = pws->case_test; generate_label (pws->body_tab); statement (NO); gen_jump (pws->incr_def); generate_label (pws->while_exit); local_table_index = pws->symbol_idx; stkp = gen_modify_stack (pws->stack_pointer); delwhile (); }
/** * "for" statement */ dofor() { loop_t loop; loop_t *p; loop.symbol_idx = local_table_index; loop.stack_pointer = stkp; loop.type = WSFOR; loop.test_label = getlabel (); loop.cont_label = getlabel (); loop.body_label = getlabel (); loop.exit_label = getlabel (); addloop (&loop); p = readloop (); needbrack ("("); if (!match (";")) { expression (YES); need_semicolon (); } generate_label (p->test_label); if (!match (";")) { expression (YES); gen_test_jump (p->body_label, TRUE); gen_jump (p->exit_label); need_semicolon (); } else p->test_label = p->body_label; generate_label (p->cont_label); if (!match (")")) { expression (YES); needbrack (")"); gen_jump (p->test_label); } else p->cont_label = p->test_label; generate_label (p->body_label); statement (NO); gen_jump (p->cont_label); generate_label (p->exit_label); local_table_index = p->symbol_idx; stkp = gen_modify_stack (p->stack_pointer); delloop (); }
/** * "default" label */ void dodefault(void) { WHILE *ptr; int lab; if ((ptr = readswitch ()) != 0) { ptr->incr_def = lab = getlabel (); generate_label (lab); if (!match (":")) error ("missing colon"); } else error ("no active switch"); }
/** * "default" label */ dodefault() { loop_t *ptr; int lab; if (ptr = readswitch ()) { ptr->cont_label = lab = getlabel (); generate_label (lab); if (!match (":")) error ("missing colon"); } else error ("no active switch"); }
/** * "if" statement */ void doif(void) { int fstkp, flab1, flab2; int flev; flev = local_table_index; fstkp = stkp; flab1 = getlabel (); test (flab1, FALSE); statement (NO); stkp = gen_modify_stack (fstkp); local_table_index = flev; if (!amatch ("else", 4)) { generate_label (flab1); return; } gen_jump (flab2 = getlabel ()); generate_label (flab1); statement (NO); stkp = gen_modify_stack (fstkp); local_table_index = flev; generate_label (flab2); }
/** * "do" statement */ void dodo(void) { WHILE ws; ws.symbol_idx = local_table_index; ws.stack_pointer = stkp; ws.type = WSDO; ws.body_tab = getlabel (); ws.case_test = getlabel (); ws.while_exit = getlabel (); addwhile (&ws); generate_label (ws.body_tab); statement (NO); if (!match ("while")) { error ("missing while"); return; } generate_label (ws.case_test); test (ws.body_tab, TRUE); generate_label (ws.while_exit); local_table_index = ws.symbol_idx; stkp = gen_modify_stack (ws.stack_pointer); delwhile (); }
/** * "do" statement */ dodo() { loop_t loop; loop.symbol_idx = local_table_index; loop.stack_pointer = stkp; loop.type = WSDO; loop.body_label = getlabel (); loop.test_label = getlabel (); loop.exit_label = getlabel (); addloop (&loop); generate_label (loop.body_label); statement (NO); if (!match ("while")) { error ("missing while"); return; } generate_label (loop.test_label); test (loop.body_label, TRUE); generate_label (loop.exit_label); local_table_index = loop.symbol_idx; stkp = gen_modify_stack (loop.stack_pointer); delloop (); }
int provenance_label(const char *label){ struct prov_process_config cfg; uint64_t taint = generate_label(label); int rc; int fd = open(PROV_SELF_FILE, O_WRONLY); if( fd < 0 ) return fd; memset(&cfg, 0, sizeof(struct prov_process_config)); cfg.op=PROV_SET_TAINT; prov_bloom_add(prov_taint(&(cfg.prov)), taint); rc = write(fd, &cfg, sizeof(struct prov_process_config)); close(fd); return rc; }
int ex3(struct parser* p) { int label_1 = label_count++; whitespace(p); if (lstring(p, ".ID")) { out1("ID"); return 1; } else if (lstring(p, ".NUMBER")) { out1("NUM"); return 1; } else if (lstring(p, ".STRING")) { out1("SR"); return 1; } else if (lstring(p, ".EMPTY")) { out1("SET"); return 1; } else if (lstring(p, "(")) { ex1(p); lstring(p, ")"); return 1; } else if (*(p->buf->begin) == '$') { p->buf->begin++; generate_label(label_1); ex3(p); out3("BT", label_1); out1("SET"); return 1; } else if (identifier(p)) { out2("CLL", p->id); return 1; } else if (string(p)) { out2("TST", p->id); return 1; } return 0; }
int ex1(struct parser* p) { int alt_count=1; int label_1 = label_count++; printf(" ; alternation %d\n", alt_count); ex2(p); while (lstring(p, "/")) { alt_count++; printf(" ; alternation %d\n", alt_count); out3("BT", label_1); if (!ex2(p)) break; } generate_label(label_1); return 1; }
void out3(char* p, int lbl) { printf(" %-3s ",p); generate_label(lbl); }