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