BOOL niche_read_index () { FILE *file = NULL; Niche *niche; Niche *parent; BOOL retval = TRUE; char *filename = STRDUP (gift_conf ("niches")); char *name; char *parent_name; char line[128]; char *tag; int i, j; int num_dead_keywords; int num_keywords; int num_niches; if (!(file = file_open (filename, "ra"))) goto niche_parse_fail; if (!read_line (line, sizeof (line), file))) goto niche_parse_fail; num_niches = ATOI (line); for (i = 0; i < num_niches; i++) { if (!read_line (line, sizeof (line), file)) goto niche_parse_fail; name = STRDUP (line); if (!read_line (line, sizeof (line), file)) { free (name); goto niche_parse_fail; } tag = line; niche = niche_new (name, tag); free (name); /* not sure what would cause this ... but just in case */ if (!niche) goto niche_parse_fail; if (!read_line (line, sizeof (line), file)) goto niche_parse_fail; parent_name = line; /* set a parent for this niche, if the index was written correctly, * the parent will already have been read because it was written to * the index first */ if (STRCMP (parent, NULL_STR) != 0) { parent = niche_find (parent_name); /* no niche by given name, should never happen */ if (!parent) goto niche_parse_fail; niche_add_child (parent, niche); } if (!read_line (line, sizeof (line), file)) goto niche_parse_fail; num_keywords = ATOI (line); /* read in all keywords */ for (j = 0; j < num_keywords; j++) { if (!read_line (line, sizeof (line), file)) goto niche_parse_fail; niche_add_keyword (niche, line); } num_dead_keywords = ATOI (line); /* read in all dead keywords */ for (j = 0; j < num_dead_keywords; j++) { if (!read_line (line, sizeof (line), file)) goto niche_parse_fail; niche_remove_keyword (niche, line); } } /* success! skip fail section */ goto niche_parse_success; /* this is why exceptions were invented kids */ niche_parse_fail: GT->dbg (GT, "failed to parse niche index for reading: %s", filename); retval = FALSE; niche_parse_success: if (file) fclose (file); free (filename); return retval; }