268 lines
6.4 KiB
C
268 lines
6.4 KiB
C
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);
|
||
}
|