Esempio n. 1
0
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;
}
Esempio n. 2
0
/**
 * "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 ();
}
Esempio n. 3
0
/**
 * "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 ();
}
Esempio n. 4
0
/**
 * 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 ();
}
Esempio n. 5
0
/**
 * 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 ();
}
Esempio n. 6
0
/**
 * "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 ();
}
Esempio n. 7
0
/**
 * "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);
}
Esempio n. 10
0
/**
 * "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 ();
}
Esempio n. 11
0
/**
 * "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 ();
}
Esempio n. 12
0
/**
 * "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");
}
Esempio n. 13
0
/**
 * "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");
}
Esempio n. 14
0
/**
 * "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);
}
Esempio n. 15
0
/**
 * "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 ();
}
Esempio n. 16
0
/**
 * "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;
}
Esempio n. 18
0
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;
}
Esempio n. 19
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;
}
Esempio n. 20
0
void out3(char* p, int lbl)
{
    printf("        %-3s ",p);
    generate_label(lbl);
}