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; }
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); }
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); } }
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"); }
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); }