xref: /titanic_51/usr/src/cmd/refer/inv2.c (revision a8ae99647dd4d540346030718e08a083b0fbdf42)
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 #pragma ident	"%Z%%M%	%I%	%E% SMI"
16 
17 #include <stdio.h>
18 #include <assert.h>
19 #define	LINESIZ 1250
20 
21 extern int hash();
22 
23 int
24 newkeys(FILE *outf, FILE *inf, FILE *recf, int nhash, FILE *fd, int *iflong)
25 {
26 	/*
27 	 * reads key lines from inf; hashes and writes on outf;
28 	 * writes orig key on recf, records pointer on outf too.
29 	 * format of outf is : hash code space record pointer
30 	 */
31 
32 	long lp, ftell();
33 	long ld = 0;
34 	int ll = 0, lt = 0;
35 	char line[LINESIZ];
36 	char key[30], bkeys[40];
37 	char *p, *s;
38 	char *keyv[500];
39 	int i, nk, ndoc = 0, more = 0, c;
40 
41 	lp = ftell(recf);
42 	while (fgets(line, LINESIZ, inf)) {
43 		p = line;
44 		while (*p != '\t') p++;
45 		*p++ = 0;
46 		fputs(line, recf);
47 		if (fd) {
48 			sprintf(bkeys, ";%ld", ld);
49 			ll = strlen(p);
50 			lt = strlen(bkeys);
51 			fputs(bkeys, recf);
52 			sprintf(bkeys, ",%d", ll);
53 			lt += strlen(bkeys);
54 			fputs(bkeys, recf);
55 			ld += ll;
56 			fputs(p, fd);
57 		}
58 		putc('\n', recf);
59 		for (s = p; *s; s++)
60 			;
61 		if (*--s == '\n') {
62 			more = 0;
63 			*s = 0;
64 		} else
65 			more = 1;
66 		assert(fd == 0 || more == 0);
67 		nk = getargs(p, keyv);
68 		if (more)
69 			nk--;
70 		for (i = 0; i < nk; i++)
71 			fprintf(outf, "%04d %06ld\n", hash(keyv[i])%nhash, lp);
72 #if D1
73 		for (i = 0; i < nk; i++)
74 			printf("key %s hash %d\n",
75 			    keyv[i], hash(keyv[i])%nhash);
76 #endif
77 		if (more) {	/* allow more than LINESIZ keys */
78 			strcpy(key, keyv[nk]);
79 			for (s = key; *s; s++)
80 				;
81 			while ((c = getc(inf)) != '\n') {
82 				if (c != ' ') {
83 					*s++ = c;
84 					continue;
85 				}
86 				*s = 0;
87 				if (s > key)
88 					fprintf(outf, "%04d %06ld\n",
89 					    hash(key)%nhash, lp);
90 				s = key;
91 			}
92 		}
93 		lp += (strlen(line)+lt+1);
94 		ndoc++;
95 	}
96 	*iflong = (lp >= 65536L);
97 	if (sizeof (int) > 2) *iflong = 1; /* force long on VAX */
98 	fclose(recf);
99 	return (ndoc);
100 }
101 
102 
103 void
104 trimnl(char *p)
105 {
106 	while (*p) p++;
107 	p--;
108 	if (*p == '\n') *p = 0;
109 }
110