const char *get_fox_home() { #ifdef FOX_HOME return FOX_HOME; #elif defined(BSD) enum { FOX_PATH_MAX = 512, }; // FreeBSD int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; char *path = Mem_get(&st_mem, FOX_PATH_MAX); size_t cb = FOX_PATH_MAX; sysctl(mib, 4, path, &cb, NULL, 0); return path; #else enum { FOX_PATH_MAX = 512, }; char *path = Mem_get(&fg->st_mem, FOX_PATH_MAX); char *p; int n = 2; int len; memset(path, 0, FOX_PATH_MAX); if (readlink("/proc/self/exe", path, FOX_PATH_MAX - 1) != -1) { } else if (readlink("/proc/curproc/file", path, FOX_PATH_MAX - 1) != -1) { } else { return "./"; } len = strlen(path); len = make_path_regularize(path, len); p = path + len; while (p > path) { p--; if (*p == '/') { *p = '\0'; n--; if (n <= 0) { break; } } } return path; #endif }
static void Hash2_grow(Hash2 *hash, Mem *mem) { int n = hash->entry_num; int i; HashEntry2 *e = Mem_get(mem, sizeof(HashEntry2) * n * 2); memset(e, 0, sizeof(HashEntry2) * n * 2); hash->entry_num *= 2; for (i = 0; i < n; i++){ HashEntry2 *he2 = &hash->entry[i]; uint32_t idx = HASH_INDEX(he2->key, hash); while (e[idx].key != NULL) { idx++; if (idx > hash->entry_num) { idx = 0; } } e[idx] = *he2; } if (mem == NULL) { free(hash->entry); } hash->entry = e; }
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; }
void Hash2_init(Hash2 *hash, Mem *mem, int init_size) { hash->count = 0; init_size = align_pow2(init_size, 16); hash->entry_num = init_size; hash->entry = Mem_get(mem, sizeof(HashEntry2) * init_size); memset(hash->entry, 0, sizeof(HashEntry2) * init_size); }
/** * count: TimeZoneの要素数 * name: TimeZone#name */ static RefTimeZone *RefTimeZone_new(int count, const char *name) { RefTimeZone *ptz = Mem_get(&fg->st_mem, sizeof(RefTimeZone) + sizeof(TimeOffset) * count); ptz->rh.type = fs->cls_timezone; ptz->rh.nref = -1; ptz->rh.n_memb = 0; ptz->rh.weak_ref = NULL; ptz->name = name; ptz->count = count; return ptz; }
void init_io_text_module_1() { RefTextIO *tio = Mem_get(&fg->st_mem, sizeof(RefTextIO)); RefNode *m = fs->mod_io; tio->rh.type = NULL; tio->rh.nref = -1; tio->rh.n_memb = 0; tio->rh.weak_ref = NULL; tio->cs = fs->cs_utf8; tio->in.ic = (void*)-1; tio->out.ic = (void*)-1; tio->trans = TRUE; fv->ref_textio_utf8 = &tio->rh; define_io_text_class(m); define_io_text_func(m); m->u.m.loaded = TRUE; }
// UTF-8 -> ISO-8859-1 // コード範囲外の値は、下8ビッドだけ取る static const char *utf8_to_8bit(const char *src) { if (src != NULL) { int len = strlen(src); const char *p = src; const char *end = p + len; char *c_buf = Mem_get(&fg->st_mem, len + 1); int i = 0; while (p < end) { int ch = utf8_codepoint_at(p); c_buf[i++] = ch & 0xFF; utf8_next(&p, end); } c_buf[i] = '\0'; return c_buf; } else { return NULL; } }
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"); }