expr *create_cell(expr *head, expr *tail) { expr *e = make_expr(); e->type = CELL_EXPR; e->head = head; e->tail = tail; return e; }
ExprType *make_expr() { MathType top = terms[--termtop]; ExprType *result = NULL; if (top.kind == Op) { result = (ExprType *) malloc(sizeof (ExprType)); result->number = False; result->op = top.operation; result->op2 = make_expr(); result->op1 = make_expr(); } else if (top.kind == Value) { result = (ExprType *) malloc(sizeof (ExprType)); result->number = True; result->value = top.value; } return result; }
expr *create_func(expr *arguments, struct scope *closure, expr *body, bool ismacro) { expr *e = make_expr(); e->type = FUNC_EXPR; e->arguments = arguments; e->closure = closure; e->body = body; e->ismacro = ismacro; return e; }
static void handle_data_offset(char *s,int size,int offset) { for (;;) { char *opstart = s; operand *op; dblock *db = NULL; if (size==8 && (*s=='\"' || *s=='\'')) { if (db = parse_string(&opstart,*s,8)) { if (offset != 0) { int i; for (i=0; i<db->size; i++) db->data[i] = db->data[i] + offset; } add_atom(0,new_data_atom(db,1)); s = opstart; } } if (!db) { op = new_operand(); s = skip_operand(s); if (parse_operand(opstart,s-opstart,op,DATA_OPERAND(size))) { atom *a; if (offset != 0) op->value = make_expr(ADD,number_expr(offset),op->value); a = new_datadef_atom(abs(size),op); a->align = 1; add_atom(0,a); } else syntax_error(8); /* invalid data operand */ } s = skip(s); if (*s == ',') { s = skip(s+1); } else if (*s == commentchar) { break; } else if (*s) { syntax_error(9); /* , expected */ return; } else break; } eol(s); }
int main(int argc, char** argv) { struct timeval t; for(int i=0; i<1000; i++) { gettimeofday(&t, NULL); long start_time = t.tv_usec; terms = make_terms(argc, argv); termtop = argc - 1; ExprType *expr = make_expr(); long result = calculate(expr); gettimeofday(&t, NULL); long end_time = t.tv_usec; printf("C\ttime = %ld\tresult = %ld\n", end_time - start_time, result); } return 0; }
static void handle_assert(char *s) { char *expstr = s; expr *aexp = NULL; do { s = skip(s); if (aexp) /* concat. expressions with log. AND */ aexp = make_expr(LAND,aexp,parse_expr(&s)); else aexp = parse_expr(&s); simplify_expr(aexp); s = skip(s); } while (*s++ == ','); /* another assertion, separated by comma? */ s--; add_atom(0,new_assert_atom(aexp,cnvstr(expstr,s-expstr),NULL)); eol(s); }
expr *create_builtin(builtin func_ptr) { expr *e = make_expr(); e->type = BUILTIN_EXPR; e->func_ptr = func_ptr; return e; }
expr *create_symbol(const char *value) { expr *e = make_expr(); e->type = SYMBOL_EXPR; e->string_value = value; return e; }
expr *create_string(const char *value) { expr *e = make_expr(); e->type = STRING_EXPR; e->string_value = value; return e; }
expr *create_bool(bool value) { expr *e = make_expr(); e->type = BOOL_EXPR; e->boolean_value = value; return e; }
expr *create_int(int value) { expr *e = make_expr(); e->type = INT_EXPR; e->int_value = value; return e; }