/* * stopword library * Teodor Sigaev */ #include #include #include #include #include "postgres.h" #include "common.h" #include "dict.h" #define STOPBUFLEN 4096 char* lowerstr(char *str) { char *ptr=str; while(*ptr) { *ptr = tolower(*(unsigned char*)ptr); ptr++; } return str; } void freestoplist(StopList *s) { char **ptr=s->stop; if ( ptr ) while( *ptr && s->len >0 ) { free(*ptr); ptr++; s->len--; free(s->stop); } memset(s,0,sizeof(StopList)); } void readstoplist(text *in, StopList *s) { char **stop=NULL; s->len=0; if ( in && VARSIZE(in) - VARHDRSZ > 0 ) { char *filename=text2char(in); FILE *hin=NULL; char buf[STOPBUFLEN]; int reallen=0; if ( (hin=fopen(filename,"r")) == NULL ) ereport(ERROR, (errcode(ERRCODE_CONFIG_FILE_ERROR), errmsg("could not open file \"%s\": %m", filename))); while( fgets(buf,STOPBUFLEN,hin) ) { buf[strlen(buf)-1] = '\0'; if ( *buf=='\0' ) continue; if ( s->len>= reallen ) { char **tmp; reallen=(reallen) ? reallen*2 : 16; tmp=(char**)realloc((void*)stop, sizeof(char*)*reallen); if (!tmp) { freestoplist(s); fclose(hin); ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of memory"))); } stop=tmp; } stop[s->len]=strdup(buf); if ( !stop[s->len] ) { freestoplist(s); fclose(hin); ereport(ERROR, (errcode(ERRCODE_OUT_OF_MEMORY), errmsg("out of memory"))); } if ( s->wordop ) stop[s->len]=(s->wordop)(stop[s->len]); (s->len)++; } fclose(hin); pfree(filename); } s->stop=stop; } static int comparestr(const void *a, const void *b) { return strcmp( *(char**)a, *(char**)b ); } void sortstoplist(StopList *s) { if (s->stop && s->len>0) qsort(s->stop, s->len, sizeof(char*), comparestr); } bool searchstoplist(StopList *s, char *key) { if ( s->wordop ) key=(*(s->wordop))(key); return ( s->stop && s->len>0 && bsearch(&key, s->stop, s->len, sizeof(char*), comparestr) ) ? true : false; }