diff options
| author | Adam Weinberger <adamw@FreeBSD.org> | 2014-07-29 15:20:01 +0000 |
|---|---|---|
| committer | Adam Weinberger <adamw@FreeBSD.org> | 2014-07-29 15:20:01 +0000 |
| commit | 0438fc26f0d6919bbce73c2edd0403bc86de4371 (patch) | |
| tree | 2150fb848141aac7ed7a5aa3efcb9d9faa7d5fa2 /textproc/wordnet/files/patch-lib__binsrch.c | |
| parent | Rename sysutils/ patch-xy patches to reflect the files they modify. (diff) | |
Rename textproc/ patch-xy patches to reflect the files they modify.
Diffstat (limited to 'textproc/wordnet/files/patch-lib__binsrch.c')
| -rw-r--r-- | textproc/wordnet/files/patch-lib__binsrch.c | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/textproc/wordnet/files/patch-lib__binsrch.c b/textproc/wordnet/files/patch-lib__binsrch.c new file mode 100644 index 000000000000..f63e294a6cd8 --- /dev/null +++ b/textproc/wordnet/files/patch-lib__binsrch.c @@ -0,0 +1,268 @@ +Clean out the unused functions. Improve and const-ify, what remains. +--- lib/binsrch.c Fri May 6 13:17:38 2005 ++++ lib/binsrch.c Sun Jan 15 11:43:36 2006 +@@ -5,8 +5,9 @@ + */ + ++#include "wn.h" + #include <stdio.h> + #include <string.h> + +-static char *Id = "$Id: binsrch.c,v 1.15 2005/02/01 16:46:43 wn Rel $"; ++__FBSDID("$Id: binsrch.c,v 1.15 2005/02/01 16:46:43 wn Rel $"); + + /* Binary search - looks for the key passed at the start of a line +@@ -14,5 +15,4 @@ + a buffer containing the line in the file. */ + +-#define KEY_LEN (1024) + #define LINE_LEN (1024*25) + +@@ -25,201 +25,61 @@ + #undef getc + +-char *read_index(long offset, FILE *fp) { +- char *linep; ++const char * ++read_index(long offset, FILE *fp) { + +- linep = line; + line[0] = '0'; + +- fseek( fp, offset, SEEK_SET ); +- fgets(linep, LINE_LEN, fp); ++ fseek(fp, offset, SEEK_SET); ++ fgets(line, LINE_LEN, fp); + return(line); + } + +-char *bin_search(char *searchkey, FILE *fp) ++static int ++sign(int number) + { +- int c; +- long top, mid, bot, diff; +- char *linep, key[KEY_LEN]; +- int length; +- +- diff=666; +- linep = line; +- line[0] = '\0'; +- +- fseek(fp, 0L, 2); +- top = 0; +- bot = ftell(fp); +- mid = (bot - top) / 2; +- +- do { +- fseek(fp, mid - 1, 0); +- if(mid != 1) +- while((c = getc(fp)) != '\n' && c != EOF); +- last_bin_search_offset = ftell( fp ); +- fgets(linep, LINE_LEN, fp); +- length = (int)(strchr(linep, ' ') - linep); +- strncpy(key, linep, length); +- key[length] = '\0'; +- if(strcmp(key, searchkey) < 0) { +- top = mid; +- diff = (bot - top) / 2; +- mid = top + diff; +- } +- if(strcmp(key, searchkey) > 0) { +- bot = mid; +- diff = (bot - top) / 2; +- mid = top + diff; +- } +- } while((strcmp(key, searchkey)) && (diff != 0)); +- +- if(!strcmp(key, searchkey)) +- return(line); +- else +- return(NULL); ++ if (number > 0) ++ return 1; ++ if (number < 0) ++ return -1; ++ return 0; + } +- +-static long offset; + +-static int bin_search_key(char *searchkey, FILE *fp) ++const char * ++bin_search(const char *searchkey, FILE *fp) + { +- int c; +- long top, mid, bot, diff; +- char *linep, key[KEY_LEN]; +- int length, offset1, offset2; +- +- /* do binary search to find correct place in file to insert line */ +- +- diff=666; +- linep = line; +- line[0] = '\0'; +- +- fseek(fp, 0L, 2); +- top = 0; +- bot = ftell(fp); +- if (bot == 0) { +- offset = 0; +- return(0); /* empty file */ +- } +- mid = (bot - top) / 2; +- +- /* If only one line in file, don't work through loop */ +- +- length = 0; +- rewind(fp); +- while((c = getc(fp)) != '\n' && c != EOF) +- line[length++] = c; +- if (getc(fp) == EOF) { /* only 1 line in file */ +- length = (int)(strchr(linep, ' ') - linep); +- strncpy(key, linep, length); +- key[length] = '\0'; +- if(strcmp(key, searchkey) > 0) { +- offset = 0; +- return(0); /* line with key is not found */ +- } else if (strcmp(key, searchkey) < 0) { +- offset = ftell(fp); +- return(0); /* line with key is not found */ +- } else { +- offset = 0; +- return(1); /* line with key is found */ ++ int c; ++ long top, mid, bot; /* should be off_t */ ++ int length, keylen; ++ ++ fseek(fp, 0L, 2); ++ bot = ftell(fp); ++ mid = bot / 2; ++ keylen = strlen(searchkey); ++ ++ for (top = 0; bot - top >= 2; mid = (top + bot) / 2) { ++ fseek(fp, mid - 1, 0); ++ if(mid != 1) ++ while((c = getc(fp)) != '\n' && c != EOF); ++ last_bin_search_offset = ftell(fp); ++ if (fgets(line, LINE_LEN, fp) == NULL) ++ return(NULL); ++ length = strchr(line, ' ') - line; ++ switch (sign(strncmp(line, searchkey, length))) { ++ case 0: ++ /* a match up to the length! */ ++ if (length == keylen) ++ return(line); ++ if (length > keylen) ++ /* the word read is longer than ours */ ++ goto up; ++ /* FALLTHROUGH */ ++ case -1: ++ top = mid; ++ continue; ++ case 1: ++ up: ++ bot = mid; ++ } + } +- } +- +- do { +- fseek(fp, mid - 1, 0); +- if(mid != 1) +- while((c = getc(fp)) != '\n' && c != EOF); +- offset1 = ftell(fp); /* offset at start of line */ +- if (fgets(linep, LINE_LEN, fp) != NULL) { +- offset2 = ftell(fp); /* offset at start of next line */ +- length = (int)(strchr(linep, ' ') - linep); +- strncpy(key, linep, length); +- key[length] = '\0'; +- if(strcmp(key, searchkey) < 0) { /* further in file */ +- top = mid; +- diff = (bot - top) / 2; +- mid = top + diff; +- offset = offset2; +- } +- if(strcmp(key, searchkey) > 0) { /* earlier in file */ +- bot = mid; +- diff = (bot - top) / 2; +- mid = top + diff; +- offset = offset1; +- } +- } else { +- bot = mid; +- diff = (bot - top) / 2; +- mid = top + diff; +- } +- } while((strcmp(key, searchkey)) && (diff != 0)); +- +- if(!strcmp(key, searchkey)) { +- offset = offset1; /* get to start of current line */ +- return(1); /* line with key is found */ +- } else +- return(0); /* line with key is not found */ +-} +- +-/* Copy contents from one file to another. */ +- +-void copyfile(FILE *fromfp, FILE *tofp) +-{ +- int c; +- +- while ((c = getc(fromfp)) != EOF) +- putc(c, tofp); +-} +- +-/* Function to replace a line in a file. Returns the original line, +- or NULL in case of error. */ +- +-char *replace_line(char *new_line, char *searchkey, FILE *fp) +-{ +- FILE *tfp; /* temporary file pointer */ +- +- if (!bin_search_key(searchkey, fp)) +- return(NULL); /* line with key not found */ +- +- if ((tfp = tmpfile()) == NULL) +- return(NULL); /* could not create temp file */ +- fseek(fp, offset, 0); +- fgets(line, LINE_LEN, fp); /* read original */ +- copyfile(fp, tfp); +- if (fseek(fp, offset, 0) == -1) +- return(NULL); /* could not seek to offset */ +- fprintf(fp, new_line); /* write line */ +- rewind(tfp); +- copyfile(tfp, fp); +- +- fclose(tfp); +- fflush(fp); +- +- return(line); +-} +- +-/* Find location to insert line at in file. If line with this +- key is already in file, return NULL. */ +- +-char *insert_line(char *new_line, char *searchkey, FILE *fp) +-{ +- FILE *tfp; +- +- if (bin_search_key(searchkey, fp)) + return(NULL); +- +- if ((tfp = tmpfile()) == NULL) +- return(NULL); /* could not create temp file */ +- if (fseek(fp, offset, 0) == -1) +- return(NULL); /* could not seek to offset */ +- copyfile(fp, tfp); +- if (fseek(fp, offset, 0) == -1) +- return(NULL); /* could not seek to offset */ +- fprintf(fp, new_line); /* write line */ +- rewind(tfp); +- copyfile(tfp, fp); +- +- fclose(tfp); +- fflush(fp); +- +- return(new_line); + } |
