Beispiel #1
0
int
_citrus_db_open(struct _citrus_db **rdb, struct _region *r, const char *magic,
                _citrus_db_hash_func_t hashfunc, void *hashfunc_closure)
{
    struct _citrus_db *db;
    struct _citrus_db_header_x *dhx;
    struct _memstream ms;

    _memstream_bind(&ms, r);

    /* sanity check */
    dhx = _memstream_getregion(&ms, NULL, sizeof(*dhx));
    if (dhx == NULL)
        return (EFTYPE);
    if (strncmp(dhx->dhx_magic, magic, _CITRUS_DB_MAGIC_SIZE) != 0)
        return (EFTYPE);
    if (_memstream_seek(&ms, be32toh(dhx->dhx_entry_offset), SEEK_SET))
        return (EFTYPE);

    if (be32toh(dhx->dhx_num_entries)*_CITRUS_DB_ENTRY_SIZE >
            _memstream_remainder(&ms))
        return (EFTYPE);

    db = malloc(sizeof(*db));
    if (db == NULL)
        return (errno);
    db->db_region = *r;
    db->db_hashfunc = hashfunc;
    db->db_hashfunc_closure = hashfunc_closure;
    *rdb = db;

    return (0);
}
static int
parse_var(struct _citrus_mapper_646 *m6, struct _memstream *ms,
    const char *dir)
{
	struct _region r;
	char path[PATH_MAX];

	m6->m6_forward = 1;
	_memstream_skip_ws(ms);
	/* whether backward */
	if (_memstream_peek(ms) == '!') {
		_memstream_getc(ms);
		m6->m6_forward = 0;
	}
	/* get description file path */
	_memstream_getregion(ms, &r, _memstream_remainder(ms));
	snprintf(path, sizeof(path), "%s/%.*s",
		 dir, (int)_region_size(&r), (char *)_region_head(&r));
	/* remove trailing white spaces */
	path[_bcs_skip_nonws(path)-path] = '\0';
	return (parse_file(m6, path));
}