コード例 #1
0
static char *fread_buffer(FileHandle fh, int size, Mem *mem)
{
    char *p = Mem_get(mem, size);
    if (read_fox(fh, p, size) != size) {
        fatal_errorf("Failed to load file");
    }
    return p;
}
コード例 #2
0
ファイル: c_win_cl_gui.c プロジェクト: x768/fox-lang
static void windows_tz_to_tzid(char *buf, int max, Str name)
{
    Tok tk;
    char *path = path_normalize(NULL, fs->fox_home, "data" SEP_S "windows-tz.txt", -1, NULL);
    char *ini_buf = read_from_file(NULL, path, NULL);

    free(path);
    if (buf == NULL) {
        goto ERROR_END;
    }

    Tok_simple_init(&tk, ini_buf);
    Tok_simple_next(&tk);

    for (;;) {
        switch (tk.v.type) {
        case TL_STR:
            if (str_eq(tk.str_val.p, tk.str_val.size, name.p, name.size)) {
                Tok_simple_next(&tk);
                if (tk.v.type != T_LET) {
                    goto ERROR_END;
                }
                Tok_simple_next(&tk);
                if (tk.v.type != TL_STR) {
                    goto ERROR_END;
                }
                memcpy(buf, tk.str_val.p, tk.str_val.size);
                buf[tk.str_val.size] = '\0';
                free(ini_buf);
                return;
            } else {
                // 行末まで飛ばす
                while (tk.v.type == T_LET || tk.v.type == TL_STR) {
                    Tok_simple_next(&tk);
                }
            }
            break;
        case T_NL:
        case T_SEMICL:
            Tok_simple_next(&tk);
            break;
        case T_EOF:
            goto ERROR_END;
        default:
            fatal_errorf("Parse error at line %d (windows-tz.txt)", tk.v.line);
            break;
        }
    }

ERROR_END:
    strcpy(buf, "Etc/UTC");
    free(ini_buf);
}
コード例 #3
0
ファイル: throw.c プロジェクト: x768/fox-lang
void throw_error_vprintf(RefNode *err_m, const char *err_name, const char *fmt, va_list va)
{
    RefNode *err = Hash_get_p(&err_m->u.m.h, intern(err_name, -1));
    Ref *r;

    if (err == NULL) {
        const RefStr *m = err_m->name;
        fatal_errorf("ClassNotFound:%r.%s", m, err_name);
    }

    if (fg->error != VALUE_NULL) {
        unref(fg->error);
    }
    r = ref_new(err);
    fg->error = vp_Value(r);

    if (fmt != NULL) {
        StrBuf msg;
        StrBuf_init_refstr(&msg, 0);
        StrBuf_vprintf(&msg, fmt, va);
        r->v[1] = StrBuf_str_Value(&msg, fs->cls_str);
    }
}
コード例 #4
0
static void load_tzdata(void)
{
    char *path = str_printf("%r" SEP_S "data" SEP_S "tzdata.dat", fs->fox_home);
    FileHandle fh = open_fox(path, O_RDONLY, DEFAULT_PERMISSION);
    int32_t size;
    char *tzdata_names;
    int i;

    if (fh == -1) {
        fatal_errorf("Cannot load file %q", path);
    }
    free(path);


    tzdata_size = fread_uint32(fh);
    if (tzdata_size <= 0 || tzdata_size > fs->max_alloc / sizeof(TZData)) {
        goto ERROR_END;
    }
    tzdata = Mem_get(&fg->st_mem, tzdata_size * sizeof(TZData));
    for (i = 0; i < tzdata_size; i++) {
        TZData *p = &tzdata[i];
        p->u1.index = fread_uint32(fh);
        p->u2.index = fread_uint32(fh);
    }

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc) {
        goto ERROR_END;
    }
    tzdata_names = fread_buffer(fh, size, &fg->st_mem);

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc / sizeof(TZDataAlias)) {
        goto ERROR_END;
    }
    tzdata_alias = Mem_get(&fg->st_mem, size * sizeof(TZDataAlias));
    for (i = 0; i < size; i++) {
        TZDataAlias *p = &tzdata_alias[i];
        p->tz = NULL;
        p->index = fread_uint32(fh);
    }

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc) {
        goto ERROR_END;
    }
    tzdata_abbr = fread_buffer(fh, size, &fg->st_mem);

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc) {
        goto ERROR_END;
    }
    tzdata_line = fread_buffer(fh, size * 4, &fg->st_mem);

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc) {
        goto ERROR_END;
    }
    tzdata_data = fread_buffer(fh, size, &fg->st_mem);

    for (i = 0; i < tzdata_size; i++) {
        TZData *p = &tzdata[i];
        p->u1.name = tzdata_names + p->u1.index;
        p->u2.alias = tzdata_alias + p->u2.index;
    }
    close_fox(fh);
    return;

ERROR_END:
    fatal_errorf("Failed to load tzdata");
}
コード例 #5
0
ファイル: throw.c プロジェクト: x768/fox-lang
void throw_error_select(int err_type, ...)
{
    RefNode *err_m = NULL;
    const char *err_name = NULL;
    const char *fmt = NULL;

    switch (err_type) {
    case THROW_NOT_DEFINED__REFSTR:
        err_m = fs->mod_lang;
        err_name = "DefineError";
        fmt = "%r is not defined";
        break;
    case THROW_MAX_ALLOC_OVER__INT:
        err_m = fs->mod_lang;
        err_name = "MemoryError";
        fmt = "Allocated size is greater than MAX_ALLOC (%d)";
        break;
    case THROW_ARGMENT_TYPE__NODE_NODE_INT:
        err_m = fs->mod_lang;
        err_name = "TypeError";
        fmt = "%n required but %n (argument #%d)";
        break;
    case THROW_ARGMENT_TYPE2__NODE_NODE_NODE_INT:
        err_m = fs->mod_lang;
        err_name = "TypeError";
        fmt = "%n or %n required but %n (argument #%d)";
        break;
    case THROW_RETURN_TYPE__NODE_NODE:
        err_m = fs->mod_lang;
        err_name = "TypeError";
        fmt = "Return type %n required but %n";
        break;
    case THROW_INVALID_UTF8:
        err_m = fs->mod_lang;
        err_name = "CharsetError";
        fmt = "Invalid UTF-8 sequence";
        break;
    case THROW_LOOP_REFERENCE:
        err_m = fs->mod_lang;
        err_name = "LoopReferenceError";
        fmt = "Loop reference detected";
        break;
    case THROW_CANNOT_OPEN_FILE__STR:
        err_m = fs->mod_file;
        err_name = "FileOpenError";
        fmt = "Cannot open file %Q";
        break;
    case THROW_FLOAT_DOMAIN_ERROR:
        err_m = fs->mod_lang;
        err_name = "FloatError";
        fmt = "Float domain error";
        break;
    case THROW_NOT_OPENED_FOR_READ:
        err_m = fs->mod_io;
        err_name = "ReadError";
        fmt = "Not opened for read";
        break;
    case THROW_NOT_OPENED_FOR_WRITE:
        err_m = fs->mod_io;
        err_name = "WriteError";
        fmt = "Not opened for write";
        break;
    case THROW_NO_MEMBER_EXISTS__NODE_REFSTR:
        err_m = fs->mod_lang;
        err_name = "NameError";
        fmt = "%n has no member named %r";
        break;
    case THROW_CANNOT_MODIFY_ON_ITERATION:
        err_m = fs->mod_lang;
        err_name = "IlligalOperationError";
        fmt = "Cannot modify any elements on iteration";
        break;
    case THROW_INVALID_INDEX__VAL_INT:
        err_m = fs->mod_lang;
        err_name = "IndexError";
        fmt = "Invalid index number (%v of %d)";
        break;
    default:
        fatal_errorf("Unknown error code %d (throw_error_select)", err_type);
        break;
    }

    va_list va;
    va_start(va, err_type);
    throw_error_vprintf(err_m, err_name, fmt, va);
    va_end(va);
}