Ejemplo n.º 1
0
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
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
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;
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
/**
 * 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;
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
// 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;
    }
}
Ejemplo n.º 8
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");
}