Пример #1
0
Файл: parser.c Проект: fwum/fwum
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;
}
Пример #2
0
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);
    }
}
Пример #3
0
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;
}
Пример #4
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;
  }
}
Пример #5
0
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;
}
Пример #6
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);
	}