file_contents parse(parse_source source) { file_contents contents; contents.imports = ll_new(); contents.enums = ll_new(); contents.unions = ll_new(); contents.structs = ll_new(); contents.functions = ll_new(); optional op = get_token(&source); while(op_has(op)) { parse_token current = *((parse_token*)op_get(op)); if(equals(current.data, new_slice("struct"))) { struct_declaration *dec = analyze_struct(&source); ll_add_last(contents.structs, dec); } else if(equals(current.data, new_slice("union"))) { struct_declaration *dec = analyze_struct(&source); ll_add_last(contents.unions, dec); } else if(equals(current.data, new_slice("func"))) { func_declaration *func = analyze_func(&source); ll_add_last(contents.functions, func); } else if(equals(current.data, new_slice("import"))) { import_declaration *imp = parse_import(&source); ll_add_last(contents.imports, imp); } else if(equals(current.data, new_slice("enum"))) { enum_declaration *enm = parse_enum(&source); ll_add_last(contents.enums, enm); }//TODO: Throw an error for an unexpected token op = get_token(&source); } return contents; }
void print_tokens(parse_source source) { optional op = get_token(&source); while(op_has(op)) { parse_token *token = op_get(op); print_token(token); op = get_token(&source); } }
int brainfuck_make_asm(FILE *_output, FILE *_input, output_t _type, size_t stacksize) { output = _output; input = _input; type = _type; assert(type != NONE); assert(stacksize > 0); /* Create header */ session_start(); define_put(); define_get(); define_start(stacksize); /* Transpile brainfuck to asm */ memset(stack, 0, TRANSPILER_STACK_SIZE); ptr = 0; int queued_op = 0; int num_queued = 0; int op; while ((op = fgetc(input)) != EOF) { if (strchr(".,+-><[]", op) == NULL) continue; if (queued_op != 0) { if (queued_op == op) { ++num_queued; continue; } handle_queued_ops(queued_op, num_queued); queued_op = 0; num_queued = 0; } switch (op) { case '.': op_put(); break; case ',': op_get(); break; case '+': /* FALLTHROUGH */ case '-': /* FALLTHROUGH */ case '>': /* FALLTHROUGH */ case '<': queued_op = op; num_queued = 1; break; case '[': op_tag(stack, ptr); break; case ']': op_jmp(stack, ptr); break; } } handle_queued_ops(queued_op, num_queued); /* Create clean exit */ define_exit(); return 0; }
void db_op(struct mg_connection *nc, const struct http_message *hm, const struct mg_str *key, void *db, int op) { switch (op) { case API_OP_GET: op_get(nc, hm, key, db); break; case API_OP_SET: op_set(nc, hm, key, db); break; case API_OP_DEL: op_del(nc, hm, key, db); break; default: mg_printf(nc, "%s", "HTTP/1.0 501 Not Implemented\r\n" "Content-Length: 0\r\n\r\n"); break; } }
int main(int argc, char** argv) { socksserver srv; static const char defaultip[] = "127.0.0.1"; op_state opt_storage, *opt = &opt_storage; op_init(opt, argc, argv); SPDECLAREC(o_port, op_get(opt, SPL("port"))); SPDECLAREC(o_listenip, op_get(opt, SPL("listenip"))); int log; if(CONFIG_LOG) { SPDECLAREC(o_log, op_get(opt, SPL("log"))); log = o_log->size ? strtoint(o_log->ptr, o_log->size) : 1; } else log = 0; int uid, gid; if(CONFIG_IDSWITCH) { SPDECLAREC(o_uid, op_get(opt, SPL("uid"))); SPDECLAREC(o_gid, op_get(opt, SPL("gid"))); uid = o_uid->size ? strtoint(o_uid->ptr, o_uid->size) : -1; gid = o_gid->size ? strtoint(o_gid->ptr, o_gid->size) : -1; } else { uid = -1; gid = -1; } SPDECLAREC(o_user, op_get(opt, SPL("user"))); SPDECLAREC(o_pass, op_get(opt, SPL("pass"))); char* ip = o_listenip->size ? o_listenip->ptr : (char*) defaultip; int port = o_port->size ? strtoint(o_port->ptr, o_port->size) : 1080; if(CONFIG_LOG && op_hasflag(opt, SPLITERAL("-help"))) syntax(opt); if((o_user->size && (!o_pass->size || o_user->size > 255)) || (o_pass->size && (!o_user->size || o_pass->size > 255))) { LOGPUTS(1, SPL("fatal: username or password exceeding 255 chars, or only one of both set\n")); return 1; } if(CONFIG_DAEMONIZE && op_hasflag(opt, SPL("d"))) daemonize(); socksserver_init(&srv, ip, port, log, o_user, o_pass, uid, gid); return 0; }
/* (fget in) returns the next UTF-8 character from the file, or void if none. */ value type_fget(value f) { return op_get(f,type_file,(input)fgetc); }