static int dump_db(struct src_head *sh, struct _region *r) { struct _db_factory *df; struct src_entry *se; struct _region subr; void *ptr; size_t size; int ret; ret = _db_factory_create(&df, &_db_hash_std, NULL); if (ret) return (ret); STAILQ_FOREACH(se, sh, se_entry) { size = _db_factory_calc_size(se->se_df); ptr = malloc(size); if (ptr == NULL) goto quit; _region_init(&subr, ptr, size); ret = _db_factory_serialize(se->se_df, _CITRUS_PIVOT_SUB_MAGIC, &subr); if (ret) goto quit; ret = _db_factory_add_by_s(df, se->se_name, &subr, 1); if (ret) goto quit; }
static int find_src(struct src_head *sh, struct src_entry **rse, const char *name) { int ret; struct src_entry *se; STAILQ_FOREACH(se, sh, se_entry) { if (_bcs_strcasecmp(se->se_name, name) == 0) { *rse = se; return (0); } } se = malloc(sizeof(*se)); if (se == NULL) return (errno); se->se_name = strdup(name); if (se->se_name == NULL) { ret = errno; free(se); return (ret); } ret = _db_factory_create(&se->se_df, &_db_hash_std, NULL); if (ret) { free(se->se_name); free(se); return (ret); } STAILQ_INSERT_TAIL(sh, se, se_entry); *rse = se; return (0); }
int _citrus_lookup_factory_convert(FILE *out, FILE *in) { struct _citrus_db_factory *df; struct _region r; char *line; size_t size; int ret; ret = _db_factory_create(&df, &_db_hash_std, NULL); if (ret) return (ret); while ((line = fgetln(in, &size)) != NULL) if ((ret = convert_line(df, line, size))) { _db_factory_free(df); return (ret); } ret = dump_db(df, &r); _db_factory_free(df); if (ret) return (ret); if (fwrite(_region_head(&r), _region_size(&r), 1, out) != 1) return (errno); return (0); }