1 /* 2 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 7 /* All Rights Reserved */ 8 9 /* 10 * Copyright (c) 1980 Regents of the University of California. 11 * All rights reserved. The Berkeley software License Agreement 12 * specifies the terms and conditions for redistribution. 13 */ 14 15 #include <stdio.h> 16 #include <assert.h> 17 #define LINESIZ 1250 18 19 extern int hash(); 20 21 int 22 newkeys(FILE *outf, FILE *inf, FILE *recf, int nhash, FILE *fd, int *iflong) 23 { 24 /* 25 * reads key lines from inf; hashes and writes on outf; 26 * writes orig key on recf, records pointer on outf too. 27 * format of outf is : hash code space record pointer 28 */ 29 30 long lp, ftell(); 31 long ld = 0; 32 int ll = 0, lt = 0; 33 char line[LINESIZ]; 34 char key[30], bkeys[40]; 35 char *p, *s; 36 char *keyv[500]; 37 int i, nk, ndoc = 0, more = 0, c; 38 39 lp = ftell(recf); 40 while (fgets(line, LINESIZ, inf)) { 41 p = line; 42 while (*p != '\t') p++; 43 *p++ = 0; 44 fputs(line, recf); 45 if (fd) { 46 sprintf(bkeys, ";%ld", ld); 47 ll = strlen(p); 48 lt = strlen(bkeys); 49 fputs(bkeys, recf); 50 sprintf(bkeys, ",%d", ll); 51 lt += strlen(bkeys); 52 fputs(bkeys, recf); 53 ld += ll; 54 fputs(p, fd); 55 } 56 putc('\n', recf); 57 for (s = p; *s; s++) 58 ; 59 if (*--s == '\n') { 60 more = 0; 61 *s = 0; 62 } else 63 more = 1; 64 assert(fd == 0 || more == 0); 65 nk = getargs(p, keyv); 66 if (more) 67 nk--; 68 for (i = 0; i < nk; i++) 69 fprintf(outf, "%04d %06ld\n", hash(keyv[i])%nhash, lp); 70 #if D1 71 for (i = 0; i < nk; i++) 72 printf("key %s hash %d\n", 73 keyv[i], hash(keyv[i])%nhash); 74 #endif 75 if (more) { /* allow more than LINESIZ keys */ 76 strcpy(key, keyv[nk]); 77 for (s = key; *s; s++) 78 ; 79 while ((c = getc(inf)) != '\n') { 80 if (c != ' ') { 81 *s++ = c; 82 continue; 83 } 84 *s = 0; 85 if (s > key) 86 fprintf(outf, "%04d %06ld\n", 87 hash(key)%nhash, lp); 88 s = key; 89 } 90 } 91 lp += (strlen(line)+lt+1); 92 ndoc++; 93 } 94 *iflong = (lp >= 65536L); 95 if (sizeof (int) > 2) *iflong = 1; /* force long on VAX */ 96 fclose(recf); 97 return (ndoc); 98 } 99 100 101 void 102 trimnl(char *p) 103 { 104 while (*p) p++; 105 p--; 106 if (*p == '\n') *p = 0; 107 } 108