/* * Read the next line from a tsearch data file (expected to be in UTF-8), and * convert it to database encoding if needed. The returned string is palloc'd. * NULL return means EOF. */ char * tsearch_readline(tsearch_readline_state *stp) { char *result; stp->lineno++; stp->curline = NULL; result = t_readline(stp->fp); stp->curline = result; return result; }
/* * Reads a stop-word file. Each word is run through 'wordop' * function, if given. wordop may either modify the input in-place, * or palloc a new version. */ void readstoplist(const char *fname, StopList *s, char *(*wordop) (const char *)) { char **stop = NULL; s->len = 0; if (fname && *fname) { char *filename = get_tsearch_config_filename(fname, "stop"); FILE *hin; char *line; int reallen = 0; if ((hin = AllocateFile(filename, "r")) == NULL) ereport(ERROR, (errcode(ERRCODE_CONFIG_FILE_ERROR), errmsg("could not open stop-word file \"%s\": %m", filename))); while ((line = t_readline(hin)) != NULL) { char *pbuf = line; /* Trim trailing space */ while (*pbuf && !t_isspace(pbuf)) pbuf++; *pbuf = '\0'; /* Skip empty lines */ if (*line == '\0') { pfree(line); continue; } if (s->len >= reallen) { if (reallen == 0) { reallen = 64; stop = (char **) palloc(sizeof(char *) * reallen); } else { reallen *= 2; stop = (char **) repalloc((void *) stop, sizeof(char *) * reallen); } } if (wordop) { stop[s->len] = wordop(line); if (stop[s->len] != line) pfree(line); } else stop[s->len] = line; (s->len)++; } FreeFile(hin); pfree(filename); } s->stop = stop; /* Sort to allow binary searching */ if (s->stop && s->len > 0) qsort(s->stop, s->len, sizeof(char *), comparestr); }