annotate man/texindex.c @ 9:6f2bbbbbe05a

Added tag r19-15b5 for changeset 4b173ad71786
author cvs
date Mon, 13 Aug 2007 08:47:36 +0200
parents 376386a54a3c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 /* Prepare TeX index dribble output into an actual index.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 Version 1.45
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 Copyright (C) 1987, 1991, 1992 Free Software Foundation, Inc.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 This program is free software; you can redistribute it and/or modify
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 the Free Software Foundation; either version 2, or (at your option)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 any later version.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 This program is distributed in the hope that it will be useful,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 GNU General Public License for more details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 along with this program; if not, write to the Free Software
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 #if defined (HAVE_CONFIG_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 #include "config.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26 #include <stdio.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 #include <ctype.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 #include <errno.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29 #include "getopt.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 #define TEXINDEX_VERSION_STRING "GNU Texindex 2.0 for Texinfo release 3.4"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 #if defined (emacs)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 # include "../src/config.h"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 /* Some s/os.h files redefine these. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 # undef read
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 # undef close
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 # undef write
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 # undef open
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42 #if defined (STDC_HEADERS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 # include <stdlib.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 # undef HAVE_MEMSET
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 # define HAVE_MEMSET
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 # undef HAVE_STRCHR
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 # define HAVE_STRCHR
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 #else /* !STDC_HEADERS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 char *getenv (), *malloc (), *realloc ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 #endif /* !STDC_HEADERS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 #if defined (HAVE_STRING_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 # include <string.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 #endif /* HAVE_STRING_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 #if !defined (HAVE_STRCHR)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 char *strrchr ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 #endif /* !HAVE_STRCHR */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 #if defined (HAVE_UNISTD_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 # include <unistd.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 #else /* !HAVE_UNISTD_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 off_t lseek ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 #endif /* !HAVE_UNISTD_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 #if !defined (HAVE_MEMSET)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 #undef memset
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 #define memset(ptr, ignore, count) bzero (ptr, count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 char *mktemp ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 #if defined (VMS)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 # include <file.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 # define TI_NO_ERROR ((1 << 28) | 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 # define TI_FATAL_ERROR ((1 << 28) | 4)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 # define unlink delete
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 #else /* !VMS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 # if defined (HAVE_SYS_FCNTL_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 # include <sys/types.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 # include <sys/fcntl.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 # endif /* HAVE_SYS_FCNTL_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 # if defined (_AIX) || !defined (_POSIX_VERSION)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 # include <sys/file.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 # else /* !AIX && _POSIX_VERSION */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 # if !defined (HAVE_SYS_FCNTL_H)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 # include <fcntl.h>
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 # endif /* !HAVE_FCNTL_H */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 # endif /* !_AIX && _POSIX_VERSION */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 # define TI_NO_ERROR 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 # define TI_FATAL_ERROR 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 #endif /* !VMS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 #if !defined (SEEK_SET)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 # define SEEK_SET 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 # define SEEK_CUR 1
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 # define SEEK_END 2
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 #endif /* !SEEK_SET */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 #if !defined (errno)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 extern int errno;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 char *strerror ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 /* When sorting in core, this structure describes one line
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 and the position and length of its first keyfield. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 struct lineinfo
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 char *text; /* The actual text of the line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 union {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 char *text; /* The start of the key (for textual comparison). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 long number; /* The numeric value (for numeric comparison). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 } key;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 long keylen; /* Length of KEY field. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 /* This structure describes a field to use as a sort key. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 struct keyfield
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 int startwords; /* Number of words to skip. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 int startchars; /* Number of additional chars to skip. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 int endwords; /* Number of words to ignore at end. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 int endchars; /* Ditto for characters of last word. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 char ignore_blanks; /* Non-zero means ignore spaces and tabs. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 char fold_case; /* Non-zero means case doesn't matter. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 char reverse; /* Non-zero means compare in reverse order. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 char numeric; /* Non-zeros means field is ASCII numeric. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 char positional; /* Sort according to file position. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 char braced; /* Count balanced-braced groupings as fields. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 /* Vector of keyfields to use. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 struct keyfield keyfields[3];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 /* Number of keyfields stored in that vector. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 int num_keyfields = 3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 /* Vector of input file names, terminated with a null pointer. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 char **infiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 /* Vector of corresponding output file names, or NULL, meaning default it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 (add an `s' to the end). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 char **outfiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 /* Length of `infiles'. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 int num_infiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 /* Pointer to the array of pointers to lines being sorted. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 char **linearray;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 /* The allocated length of `linearray'. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 long nlines;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 /* Directory to use for temporary files. On Unix, it ends with a slash. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 char *tempdir;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 /* Start of filename to use for temporary files. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 char *tempbase;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 /* Number of last temporary file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 int tempcount;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 /* Number of last temporary file already deleted.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 Temporary files are deleted by `flush_tempfiles' in order of creation. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 int last_deleted_tempcount;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 /* During in-core sort, this points to the base of the data block
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 which contains all the lines of data. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 char *text_base;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 /* Additional command switches .*/
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176 /* Nonzero means do not delete tempfiles -- for debugging. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 int keep_tempfiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 /* The name this program was run with. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 char *program_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 /* Forward declarations of functions in this file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 struct linebuffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 void decode_command (int, char **);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 void sort_in_core (char *, long, char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 void sort_offline (char *, int, long, char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 char **parsefile (char *, char **, char *, long);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 char *find_field (struct keyfield *, char *, long *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 char *find_pos (char *, int, int, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 long find_value (char *, long);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192 char *find_braced_pos (char *, int, int, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 char *find_braced_end (char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 void writelines (char **, int, FILE *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 int compare_field (struct keyfield *, char *, long, long, char *, long, long);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 int compare_full (const void *, const void *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 long readline (struct linebuffer *, FILE *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 int merge_files (char **, int, char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 int merge_direct (char **, int, char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 void pfatal_with_name (char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 void fatal (char *, char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 void error (char *, char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 void *xmalloc (int), *xrealloc (void *, int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 char *concat (char *, char *, char *);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 char *maketempname (int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 void flush_tempfiles (int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 char *tempcopy (int);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 static void memory_error (char *callers_name, int bytes_wanted);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 #define MAX_IN_CORE_SORT 500000
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 main (argc, argv)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 int argc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 char **argv;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 tempcount = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 last_deleted_tempcount = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 program_name = strrchr (argv[0], '/');
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 if (program_name != (char *)NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 program_name++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226 program_name = argv[0];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 /* Describe the kind of sorting to do. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 /* The first keyfield uses the first braced field and folds case. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 keyfields[0].braced = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 keyfields[0].fold_case = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 keyfields[0].endwords = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 keyfields[0].endchars = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 /* The second keyfield uses the second braced field, numerically. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 keyfields[1].braced = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 keyfields[1].numeric = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 keyfields[1].startwords = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 keyfields[1].endwords = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 keyfields[1].endchars = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 /* The third keyfield (which is ignored while discarding duplicates)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 compares the whole line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 keyfields[2].endwords = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 keyfields[2].endchars = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 decode_command (argc, argv);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 tempbase = mktemp (concat ("txiXXXXXX", "", ""));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 /* Process input files completely, one by one. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 for (i = 0; i < num_infiles; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 int desc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 long ptr;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 char *outfile;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 desc = open (infiles[i], O_RDONLY, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 if (desc < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 pfatal_with_name (infiles[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 lseek (desc, (off_t) 0, SEEK_END);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263 ptr = (long) lseek (desc, (off_t) 0, SEEK_CUR);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 close (desc);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 outfile = outfiles[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 if (!outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 outfile = concat (infiles[i], "s", "");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 if (ptr < MAX_IN_CORE_SORT)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 /* Sort a small amount of data. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 sort_in_core (infiles[i], ptr, outfile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 sort_offline (infiles[i], 1, ptr, outfile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280 flush_tempfiles (tempcount);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 exit (TI_NO_ERROR);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
282 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
283
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 typedef struct
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 char *long_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287 char *short_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 int *variable_ref;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289 int variable_value;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290 char *arg_name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 char *doc_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 } TEXINDEX_OPTION;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
293
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 TEXINDEX_OPTION texindex_options[] = {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295 { "--keep", "-k", &keep_tempfiles, 1, (char *)NULL,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 "Keep temporary files around after processing" },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297 { "--no-keep", 0, &keep_tempfiles, 0, (char *)NULL,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298 "Do not keep temporary files around after processing (default)" },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299 { "--output", "-o", (int *)NULL, 0, "FILE",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
300 "Send output to FILE" },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
301 { "--version", (char *)NULL, (int *)NULL, 0, (char *)NULL,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
302 "Show version information" },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
303 { "--help", "-h", (int *)NULL, 0, (char *)NULL, "Produce this listing" },
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304 { (char *)NULL, (char *)NULL, (int *)NULL, 0, (char *)NULL }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308 usage (int result_value)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312 fprintf (stderr, "Usage: %s [OPTIONS] FILE...\n", program_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
313 fprintf (stderr, " Generate a permuted index for the TeX files given.\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
314 fprintf (stderr, " Usually FILE... is `foo.\?\?' for the source file `foo.tex'.\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
315 fprintf (stderr, " The OPTIONS are:\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317 for (i = 0; texindex_options[i].long_name; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319 fprintf (stderr, " %s %s",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320 texindex_options[i].long_name,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
321 texindex_options[i].arg_name ?
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 texindex_options[i].arg_name : "");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324 if (texindex_options[i].short_name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325 fprintf (stderr, " \n or %s %s",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326 texindex_options[i].short_name,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
327 texindex_options[i].arg_name ?
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328 texindex_options[i].arg_name : "");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329 fprintf (stderr, "\t%s\n", texindex_options[i].doc_string);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331 exit (result_value);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
333
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334 /* Decode the command line arguments to set the parameter variables
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335 and set up the vector of keyfields and the vector of input files. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
336
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
337 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
338 decode_command (argc, argv)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
339 int argc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
340 char **argv;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342 int arg_index = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343 char **ip;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 char **op;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 /* Store default values into parameter variables. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
347
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 tempdir = getenv ("TMPDIR");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349 #ifdef VMS
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350 if (tempdir == NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 tempdir = "sys$scratch:";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 #else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353 if (tempdir == NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 tempdir = "/tmp/";
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356 tempdir = concat (tempdir, "/", "");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359 keep_tempfiles = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361 /* Allocate ARGC input files, which must be enough. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363 infiles = (char **) xmalloc (argc * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364 outfiles = (char **) xmalloc (argc * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 ip = infiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366 op = outfiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
368 while (arg_index < argc)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
369 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
370 char *arg = argv[arg_index++];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
371
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
372 if (*arg == '-')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
373 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
374 if (strcmp (arg, "--version") == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
375 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
376 fprintf (stderr, "%s\n", TEXINDEX_VERSION_STRING);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
377 exit (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
378 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
379 else if ((strcmp (arg, "--keep") == 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
380 (strcmp (arg, "-k") == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
381 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
382 keep_tempfiles = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
383 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
384 else if ((strcmp (arg, "--help") == 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
385 (strcmp (arg, "-h") == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
386 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
387 usage (0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
388 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
389 else if ((strcmp (arg, "--output") == 0) ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
390 (strcmp (arg, "-o") == 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
391 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
392 if (argv[arg_index] != (char *)NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
393 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
394 arg_index++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
395 if (op > outfiles)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
396 *(op - 1) = argv[arg_index];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
397 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
398 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
399 usage (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
400 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
401 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
402 usage (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
403 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
404 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
405 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
406 *ip++ = arg;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
407 *op++ = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
408 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
409 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
410 for ( ; optind < argc; optind++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
411 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
412 *ip++ = argv[optind];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
413 *op++ = NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
414 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
415
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
416 /* Record number of keyfields and terminate list of filenames. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
417 num_infiles = ip - infiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
418 *ip = (char *)NULL;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
419 if (num_infiles == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
420 usage (1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
421 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
422
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
423 /* Return a name for a temporary file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
424
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
425 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
426 maketempname (count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
427 int count;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
428 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
429 char tempsuffix[10];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
430 sprintf (tempsuffix, "%d", count);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
431 return concat (tempdir, tempbase, tempsuffix);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
432 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
433
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
434 /* Delete all temporary files up to TO_COUNT. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
435
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
436 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
437 flush_tempfiles (to_count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
438 int to_count;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
439 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
440 if (keep_tempfiles)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
441 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
442 while (last_deleted_tempcount < to_count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
443 unlink (maketempname (++last_deleted_tempcount));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
444 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
445
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
446 /* Copy the input file open on IDESC into a temporary file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
447 and return the temporary file name. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
448
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
449 #define BUFSIZE 1024
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
450
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
451 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
452 tempcopy (idesc)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
453 int idesc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
454 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
455 char *outfile = maketempname (++tempcount);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
456 int odesc;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
457 char buffer[BUFSIZE];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
458
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
459 odesc = open (outfile, O_WRONLY | O_CREAT, 0666);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
460
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
461 if (odesc < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
462 pfatal_with_name (outfile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
463
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
464 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
465 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
466 int nread = read (idesc, buffer, BUFSIZE);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
467 write (odesc, buffer, nread);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
468 if (!nread)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
469 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
470 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
471
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
472 close (odesc);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
473
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
474 return outfile;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
475 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
476
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
477 /* Compare LINE1 and LINE2 according to the specified set of keyfields. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
478
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
479 int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
480 compare_full (const void *arg1, const void *arg2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
481 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
482 char **line1, **line2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
483 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
484
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
485 line1 = (char **) arg1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
486 line2 = (char **) arg2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
487
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
488 /* Compare using the first keyfield;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
489 if that does not distinguish the lines, try the second keyfield;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
490 and so on. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
491
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
492 for (i = 0; i < num_keyfields; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
493 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
494 long length1, length2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
495 char *start1 = find_field (&keyfields[i], *line1, &length1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
496 char *start2 = find_field (&keyfields[i], *line2, &length2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
497 int tem = compare_field (&keyfields[i], start1, length1, *line1 - text_base,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
498 start2, length2, *line2 - text_base);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
499 if (tem)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
500 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
501 if (keyfields[i].reverse)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
502 return -tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
503 return tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
504 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
505 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
506
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
507 return 0; /* Lines match exactly. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
508 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
509
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
510 /* Compare LINE1 and LINE2, described by structures
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
511 in which the first keyfield is identified in advance.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
512 For positional sorting, assumes that the order of the lines in core
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
513 reflects their nominal order. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
514
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
515 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
516 compare_prepared (const void *arg1, const void *arg2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
517 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
518 struct lineinfo *line1, *line2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
519 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
520 int tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
521 char *text1, *text2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
522
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
523 line1 = (struct lineinfo *) arg1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
524 line2 = (struct lineinfo *) arg2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
525
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
526 /* Compare using the first keyfield, which has been found for us already. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
527 if (keyfields->positional)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
528 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
529 if (line1->text - text_base > line2->text - text_base)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
530 tem = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
531 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
532 tem = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
533 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
534 else if (keyfields->numeric)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
535 tem = line1->key.number - line2->key.number;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
536 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
537 tem = compare_field (keyfields, line1->key.text, line1->keylen, 0,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
538 line2->key.text, line2->keylen, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
539 if (tem)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
540 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
541 if (keyfields->reverse)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
542 return -tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
543 return tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
544 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
545
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
546 text1 = line1->text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
547 text2 = line2->text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
548
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
549 /* Compare using the second keyfield;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
550 if that does not distinguish the lines, try the third keyfield;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
551 and so on. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
552
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
553 for (i = 1; i < num_keyfields; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
554 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
555 long length1, length2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
556 char *start1 = find_field (&keyfields[i], text1, &length1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
557 char *start2 = find_field (&keyfields[i], text2, &length2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
558 int tem = compare_field (&keyfields[i], start1, length1, text1 - text_base,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
559 start2, length2, text2 - text_base);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
560 if (tem)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
561 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
562 if (keyfields[i].reverse)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
563 return -tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
564 return tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
565 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
566 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
567
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
568 return 0; /* Lines match exactly. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
569 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
570
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
571 /* Like compare_full but more general.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
572 You can pass any strings, and you can say how many keyfields to use.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
573 POS1 and POS2 should indicate the nominal positional ordering of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
574 the two lines in the input. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
575
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
576 static int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
577 compare_general (char *str1, char *str2, long pos1, long pos2,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
578 int use_keyfields)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
579 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
580 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
581
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
582 /* Compare using the first keyfield;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
583 if that does not distinguish the lines, try the second keyfield;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
584 and so on. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
585
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
586 for (i = 0; i < use_keyfields; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
587 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
588 long length1, length2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
589 char *start1 = find_field (&keyfields[i], str1, &length1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
590 char *start2 = find_field (&keyfields[i], str2, &length2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
591 int tem = compare_field (&keyfields[i], start1, length1, pos1,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
592 start2, length2, pos2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
593 if (tem)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
594 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
595 if (keyfields[i].reverse)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
596 return -tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
597 return tem;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
598 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
599 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
600
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
601 return 0; /* Lines match exactly. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
602 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
603
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
604 /* Find the start and length of a field in STR according to KEYFIELD.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
605 A pointer to the starting character is returned, and the length
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
606 is stored into the int that LENGTHPTR points to. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
607
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
608 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
609 find_field (keyfield, str, lengthptr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
610 struct keyfield *keyfield;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
611 char *str;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
612 long *lengthptr;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
613 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
614 char *start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
615 char *end;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
616 char *(*fun) ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
617
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
618 if (keyfield->braced)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
619 fun = find_braced_pos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
620 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
621 fun = find_pos;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
622
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
623 start = (*fun) (str, keyfield->startwords, keyfield->startchars,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
624 keyfield->ignore_blanks);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
625 if (keyfield->endwords < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
626 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
627 if (keyfield->braced)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
628 end = find_braced_end (start);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
629 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
630 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
631 end = start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
632 while (*end && *end != '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
633 end++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
634 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
635 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
636 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
637 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
638 end = (*fun) (str, keyfield->endwords, keyfield->endchars, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
639 if (end - str < start - str)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
640 end = start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
641 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
642 *lengthptr = end - start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
643 return start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
644 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
645
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
646 /* Return a pointer to a specified place within STR,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
647 skipping (from the beginning) WORDS words and then CHARS chars.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
648 If IGNORE_BLANKS is nonzero, we skip all blanks
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
649 after finding the specified word. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
650
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
651 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
652 find_pos (str, words, chars, ignore_blanks)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
653 char *str;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
654 int words, chars;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
655 int ignore_blanks;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
656 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
657 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
658 char *p = str;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
659
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
660 for (i = 0; i < words; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
661 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
662 char c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
663 /* Find next bunch of nonblanks and skip them. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
664 while ((c = *p) == ' ' || c == '\t')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
665 p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
666 while ((c = *p) && c != '\n' && !(c == ' ' || c == '\t'))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
667 p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
668 if (!*p || *p == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
669 return p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
670 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
671
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
672 while (*p == ' ' || *p == '\t')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
673 p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
674
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
675 for (i = 0; i < chars; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
676 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
677 if (!*p || *p == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
678 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
679 p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
680 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
681 return p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
682 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
683
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
684 /* Like find_pos but assumes that each field is surrounded by braces
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
685 and that braces within fields are balanced. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
686
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
687 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
688 find_braced_pos (str, words, chars, ignore_blanks)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
689 char *str;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
690 int words, chars;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
691 int ignore_blanks;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
692 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
693 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
694 int bracelevel;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
695 char *p = str;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
696 char c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
697
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
698 for (i = 0; i < words; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
699 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
700 bracelevel = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
701 while ((c = *p++) != '{' && c != '\n' && c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
702 /* Do nothing. */ ;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
703 if (c != '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
704 return p - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
705 while (bracelevel)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
706 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
707 c = *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
708 if (c == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
709 bracelevel++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
710 if (c == '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
711 bracelevel--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
712 if (c == 0 || c == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
713 return p - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
714 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
715 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
716
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
717 while ((c = *p++) != '{' && c != '\n' && c)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
718 /* Do nothing. */ ;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
719
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
720 if (c != '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
721 return p - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
722
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
723 if (ignore_blanks)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
724 while ((c = *p) == ' ' || c == '\t')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
725 p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
726
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
727 for (i = 0; i < chars; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
728 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
729 if (!*p || *p == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
730 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
731 p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
732 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
733 return p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
734 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
735
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
736 /* Find the end of the balanced-brace field which starts at STR.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
737 The position returned is just before the closing brace. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
738
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
739 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
740 find_braced_end (str)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
741 char *str;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
742 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
743 int bracelevel;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
744 char *p = str;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
745 char c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
746
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
747 bracelevel = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
748 while (bracelevel)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
749 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
750 c = *p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
751 if (c == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
752 bracelevel++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
753 if (c == '}')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
754 bracelevel--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
755 if (c == 0 || c == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
756 return p - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
757 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
758 return p - 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
759 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
760
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
761 long
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
762 find_value (start, length)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
763 char *start;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
764 long length;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
765 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
766 while (length != 0L)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
767 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
768 if (isdigit (*start))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
769 return atol (start);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
770 length--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
771 start++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
772 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
773 return 0l;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
774 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
775
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
776 /* Vector used to translate characters for comparison.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
777 This is how we make all alphanumerics follow all else,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
778 and ignore case in the first sorting. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
779 int char_order[256];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
780
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
781 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
782 init_char_order (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
783 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
784 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
785 for (i = 1; i < 256; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
786 char_order[i] = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
787
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
788 for (i = '0'; i <= '9'; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
789 char_order[i] += 512;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
790
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
791 for (i = 'a'; i <= 'z'; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
792 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
793 char_order[i] = 512 + i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
794 char_order[i + 'A' - 'a'] = 512 + i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
795 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
796 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
797
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
798 /* Compare two fields (each specified as a start pointer and a character count)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
799 according to KEYFIELD.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
800 The sign of the value reports the relation between the fields. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
801
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
802 int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
803 compare_field (keyfield, start1, length1, pos1, start2, length2, pos2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
804 struct keyfield *keyfield;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
805 char *start1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
806 long length1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
807 long pos1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
808 char *start2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
809 long length2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
810 long pos2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
811 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
812 if (keyfields->positional)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
813 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
814 if (pos1 > pos2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
815 return 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
816 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
817 return -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
818 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
819 if (keyfield->numeric)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
820 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
821 long value = find_value (start1, length1) - find_value (start2, length2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
822 if (value > 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
823 return 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
824 if (value < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
825 return -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
826 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
827 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
828 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
829 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
830 char *p1 = start1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
831 char *p2 = start2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
832 char *e1 = start1 + length1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
833 char *e2 = start2 + length2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
834
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
835 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
836 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
837 int c1, c2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
838
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
839 if (p1 == e1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
840 c1 = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
841 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
842 c1 = *p1++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
843 if (p2 == e2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
844 c2 = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
845 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
846 c2 = *p2++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
847
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
848 if (char_order[c1] != char_order[c2])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
849 return char_order[c1] - char_order[c2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
850 if (!c1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
851 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
852 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
853
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
854 /* Strings are equal except possibly for case. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
855 p1 = start1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
856 p2 = start2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
857 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
858 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
859 int c1, c2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
860
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
861 if (p1 == e1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
862 c1 = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
863 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
864 c1 = *p1++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
865 if (p2 == e2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
866 c2 = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
867 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
868 c2 = *p2++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
869
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
870 if (c1 != c2)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
871 /* Reverse sign here so upper case comes out last. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
872 return c2 - c1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
873 if (!c1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
874 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
875 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
876
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
877 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
878 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
879 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
880
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
881 /* A `struct linebuffer' is a structure which holds a line of text.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
882 `readline' reads a line from a stream into a linebuffer
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
883 and works regardless of the length of the line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
884
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
885 struct linebuffer
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
886 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
887 long size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
888 char *buffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
889 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
890
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
891 /* Initialize LINEBUFFER for use. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
892
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
893 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
894 initbuffer (struct linebuffer *linebuffer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
895 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
896 linebuffer->size = 200;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
897 linebuffer->buffer = (char *) xmalloc (200);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
898 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
899
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
900 /* Read a line of text from STREAM into LINEBUFFER.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
901 Return the length of the line. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
902
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
903 long
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
904 readline (linebuffer, stream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
905 struct linebuffer *linebuffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
906 FILE *stream;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
907 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
908 char *buffer = linebuffer->buffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
909 char *p = linebuffer->buffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
910 char *end = p + linebuffer->size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
911
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
912 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
913 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
914 int c = getc (stream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
915 if (p == end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
916 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
917 buffer = (char *) xrealloc (buffer, linebuffer->size *= 2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
918 p += buffer - linebuffer->buffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
919 end += buffer - linebuffer->buffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
920 linebuffer->buffer = buffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
921 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
922 if (c < 0 || c == '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
923 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
924 *p = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
925 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
926 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
927 *p++ = c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
928 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
929
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
930 return p - buffer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
931 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
932
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
933 /* Sort an input file too big to sort in core. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
934
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
935 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
936 sort_offline (infile, nfiles, total, outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
937 char *infile;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
938 int nfiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
939 long total;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
940 char *outfile;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
941 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
942 /* More than enough. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
943 int ntemps = 2 * (total + MAX_IN_CORE_SORT - 1) / MAX_IN_CORE_SORT;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
944 char **tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
945 FILE *istream = fopen (infile, "r");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
946 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
947 struct linebuffer lb;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
948 long linelength;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
949 int failure = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
950
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
951 initbuffer (&lb);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
952
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
953 /* Read in one line of input data. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
954
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
955 linelength = readline (&lb, istream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
956
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
957 if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
958 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
959 error ("%s: not a texinfo index file", infile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
960 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
961 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
962
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
963 /* Split up the input into `ntemps' temporary files, or maybe fewer,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
964 and put the new files' names into `tempfiles' */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
965
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
966 for (i = 0; i < ntemps; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
967 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
968 char *outname = maketempname (++tempcount);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
969 FILE *ostream = fopen (outname, "w");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
970 long tempsize = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
971
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
972 if (!ostream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
973 pfatal_with_name (outname);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
974 tempfiles[i] = outname;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
975
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
976 /* Copy lines into this temp file as long as it does not make file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
977 "too big" or until there are no more lines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
978
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
979 while (tempsize + linelength + 1 <= MAX_IN_CORE_SORT)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
980 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
981 tempsize += linelength + 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
982 fputs (lb.buffer, ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
983 putc ('\n', ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
984
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
985 /* Read another line of input data. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
986
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
987 linelength = readline (&lb, istream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
988 if (!linelength && feof (istream))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
989 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
990
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
991 if (lb.buffer[0] != '\\' && lb.buffer[0] != '@')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
992 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
993 error ("%s: not a texinfo index file", infile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
994 failure = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
995 goto fail;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
996 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
997 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
998 fclose (ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
999 if (feof (istream))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1000 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1001 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1002
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1003 free (lb.buffer);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1004
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1005 fail:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1006 /* Record number of temp files we actually needed. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1007
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1008 ntemps = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1009
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1010 /* Sort each tempfile into another tempfile.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1011 Delete the first set of tempfiles and put the names of the second
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1012 into `tempfiles'. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1013
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1014 for (i = 0; i < ntemps; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1015 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1016 char *newtemp = maketempname (++tempcount);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1017 sort_in_core (tempfiles[i], MAX_IN_CORE_SORT, newtemp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1018 if (!keep_tempfiles)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1019 unlink (tempfiles[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1020 tempfiles[i] = newtemp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1021 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1022
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1023 if (failure)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1024 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1025
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1026 /* Merge the tempfiles together and indexify. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1027
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1028 merge_files (tempfiles, ntemps, outfile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1029 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1030
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1031 /* Sort INFILE, whose size is TOTAL,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1032 assuming that is small enough to be done in-core,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1033 then indexify it and send the output to OUTFILE (or to stdout). */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1034
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1035 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1036 sort_in_core (infile, total, outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1037 char *infile;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1038 long total;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1039 char *outfile;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1040 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1041 char **nextline;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1042 char *data = (char *) xmalloc (total + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1043 char *file_data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1044 long file_size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1045 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1046 FILE *ostream = stdout;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1047 struct lineinfo *lineinfo;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1048
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1049 /* Read the contents of the file into the moby array `data'. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1050
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1051 int desc = open (infile, O_RDONLY, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1052
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1053 if (desc < 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1054 fatal ("failure reopening %s", infile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1055 for (file_size = 0;;)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1056 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1057 i = read (desc, data + file_size, total - file_size);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1058 if (i <= 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1059 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1060 file_size += i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1061 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1062 file_data = data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1063 data[file_size] = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1064
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1065 close (desc);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1066
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1067 if (file_size > 0 && data[0] != '\\' && data[0] != '@')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1068 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1069 error ("%s: not a texinfo index file", infile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1070 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1071 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1072
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1073 init_char_order ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1074
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1075 /* Sort routines want to know this address. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1076
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1077 text_base = data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1078
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1079 /* Create the array of pointers to lines, with a default size
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1080 frequently enough. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1081
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1082 nlines = total / 50;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1083 if (!nlines)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1084 nlines = 2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1085 linearray = (char **) xmalloc (nlines * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1086
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1087 /* `nextline' points to the next free slot in this array.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1088 `nlines' is the allocated size. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1089
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1090 nextline = linearray;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1091
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1092 /* Parse the input file's data, and make entries for the lines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1093
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1094 nextline = parsefile (infile, nextline, file_data, file_size);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1095 if (nextline == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1096 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1097 error ("%s: not a texinfo index file", infile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1098 return;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1099 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1100
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1101 /* Sort the lines. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1102
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1103 /* If we have enough space, find the first keyfield of each line in advance.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1104 Make a `struct lineinfo' for each line, which records the keyfield
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1105 as well as the line, and sort them. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1106
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1107 lineinfo = (struct lineinfo *) malloc ((nextline - linearray) * sizeof (struct lineinfo));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1108
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1109 if (lineinfo)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1110 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1111 struct lineinfo *lp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1112 char **p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1113
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1114 for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1115 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1116 lp->text = *p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1117 lp->key.text = find_field (keyfields, *p, &lp->keylen);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1118 if (keyfields->numeric)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1119 lp->key.number = find_value (lp->key.text, lp->keylen);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1120 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1121
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1122 qsort (lineinfo, nextline - linearray, sizeof (struct lineinfo),
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1123 compare_prepared);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1124
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1125 for (lp = lineinfo, p = linearray; p != nextline; lp++, p++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1126 *p = lp->text;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1127
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1128 free (lineinfo);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1129 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1130 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1131 qsort (linearray, nextline - linearray, sizeof (char *), compare_full);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1132
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1133 /* Open the output file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1134
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1135 if (outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1136 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1137 ostream = fopen (outfile, "w");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1138 if (!ostream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1139 pfatal_with_name (outfile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1140 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1141
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1142 writelines (linearray, nextline - linearray, ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1143 if (outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1144 fclose (ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1145
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1146 free (linearray);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1147 free (data);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1148 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1149
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1150 /* Parse an input string in core into lines.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1151 DATA is the input string, and SIZE is its length.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1152 Data goes in LINEARRAY starting at NEXTLINE.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1153 The value returned is the first entry in LINEARRAY still unused.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1154 Value 0 means input file contents are invalid. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1155
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1156 char **
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1157 parsefile (filename, nextline, data, size)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1158 char *filename;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1159 char **nextline;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1160 char *data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1161 long size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1162 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1163 char *p, *end;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1164 char **line = nextline;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1165
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1166 p = data;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1167 end = p + size;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1168 *end = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1169
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1170 while (p != end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1171 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1172 if (p[0] != '\\' && p[0] != '@')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1173 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1174
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1175 *line = p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1176 while (*p && *p != '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1177 p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1178 if (p != end)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1179 p++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1180
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1181 line++;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1182 if (line == linearray + nlines)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1183 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1184 char **old = linearray;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1185 linearray = (char **) xrealloc (linearray, sizeof (char *) * (nlines *= 4));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1186 line += linearray - old;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1187 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1188 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1189
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1190 return line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1191 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1192
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1193 /* Indexification is a filter applied to the sorted lines
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1194 as they are being written to the output file.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1195 Multiple entries for the same name, with different page numbers,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1196 get combined into a single entry with multiple page numbers.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1197 The first braced field, which is used for sorting, is discarded.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1198 However, its first character is examined, folded to lower case,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1199 and if it is different from that in the previous line fed to us
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1200 a \initial line is written with one argument, the new initial.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1201
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1202 If an entry has four braced fields, then the second and third
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1203 constitute primary and secondary names.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1204 In this case, each change of primary name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1205 generates a \primary line which contains only the primary name,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1206 and in between these are \secondary lines which contain
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1207 just a secondary name and page numbers. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1208
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1209 /* The last primary name we wrote a \primary entry for.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1210 If only one level of indexing is being done, this is the last name seen. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1211 char *lastprimary;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1212 /* Length of storage allocated for lastprimary. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1213 int lastprimarylength;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1214
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1215 /* Similar, for the secondary name. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1216 char *lastsecondary;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1217 int lastsecondarylength;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1218
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1219 /* Zero if we are not in the middle of writing an entry.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1220 One if we have written the beginning of an entry but have not
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1221 yet written any page numbers into it.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1222 Greater than one if we have written the beginning of an entry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1223 plus at least one page number. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1224 int pending;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1225
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1226 /* The initial (for sorting purposes) of the last primary entry written.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1227 When this changes, a \initial {c} line is written */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1228
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1229 char *lastinitial;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1230
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1231 int lastinitiallength;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1232
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1233 /* When we need a string of length 1 for the value of lastinitial,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1234 store it here. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1235
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1236 char lastinitial1[2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1237
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1238 /* Initialize static storage for writing an index. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1239
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1240 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1241 init_index (void)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1242 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1243 pending = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1244 lastinitial = lastinitial1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1245 lastinitial1[0] = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1246 lastinitial1[1] = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1247 lastinitiallength = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1248 lastprimarylength = 100;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1249 lastprimary = (char *) xmalloc (lastprimarylength + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1250 memset (lastprimary, '\0', lastprimarylength + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1251 lastsecondarylength = 100;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1252 lastsecondary = (char *) xmalloc (lastsecondarylength + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1253 memset (lastsecondary, '\0', lastsecondarylength + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1254 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1255
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1256 /* Indexify. Merge entries for the same name,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1257 insert headers for each initial character, etc. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1258
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1259 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1260 indexify (char *line, FILE *ostream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1261 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1262 char *primary, *secondary, *pagenumber;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1263 int primarylength, secondarylength = 0, pagelength;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1264 int nosecondary;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1265 int initiallength;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1266 char *initial;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1267 char initial1[2];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1268 register char *p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1269
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1270 /* First, analyze the parts of the entry fed to us this time. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1271
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1272 p = find_braced_pos (line, 0, 0, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1273 if (*p == '{')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1274 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1275 initial = p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1276 /* Get length of inner pair of braces starting at `p',
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1277 including that inner pair of braces. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1278 initiallength = find_braced_end (p + 1) + 1 - p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1279 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1280 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1281 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1282 initial = initial1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1283 initial1[0] = *p;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1284 initial1[1] = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1285 initiallength = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1286
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1287 if (initial1[0] >= 'a' && initial1[0] <= 'z')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1288 initial1[0] -= 040;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1289 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1290
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1291 pagenumber = find_braced_pos (line, 1, 0, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1292 pagelength = find_braced_end (pagenumber) - pagenumber;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1293 if (pagelength == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1294 abort ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1295
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1296 primary = find_braced_pos (line, 2, 0, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1297 primarylength = find_braced_end (primary) - primary;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1298
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1299 secondary = find_braced_pos (line, 3, 0, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1300 nosecondary = !*secondary;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1301 if (!nosecondary)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1302 secondarylength = find_braced_end (secondary) - secondary;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1303
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1304 /* If the primary is different from before, make a new primary entry. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1305 if (strncmp (primary, lastprimary, primarylength))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1306 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1307 /* Close off current secondary entry first, if one is open. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1308 if (pending)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1309 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1310 fputs ("}\n", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1311 pending = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1312 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1313
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1314 /* If this primary has a different initial, include an entry for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1315 the initial. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1316 if (initiallength != lastinitiallength ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1317 strncmp (initial, lastinitial, initiallength))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1318 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1319 fprintf (ostream, "\\initial {");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1320 fwrite (initial, 1, initiallength, ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1321 fputs ("}\n", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1322 if (initial == initial1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1323 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1324 lastinitial = lastinitial1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1325 *lastinitial1 = *initial1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1326 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1327 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1328 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1329 lastinitial = initial;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1330 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1331 lastinitiallength = initiallength;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1332 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1333
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1334 /* Make the entry for the primary. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1335 if (nosecondary)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1336 fputs ("\\entry {", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1337 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1338 fputs ("\\primary {", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1339 fwrite (primary, primarylength, 1, ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1340 if (nosecondary)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1341 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1342 fputs ("}{", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1343 pending = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1344 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1345 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1346 fputs ("}\n", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1347
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1348 /* Record name of most recent primary. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1349 if (lastprimarylength < primarylength)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1350 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1351 lastprimarylength = primarylength + 100;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1352 lastprimary = (char *) xrealloc (lastprimary,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1353 1 + lastprimarylength);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1354 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1355 strncpy (lastprimary, primary, primarylength);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1356 lastprimary[primarylength] = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1357
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1358 /* There is no current secondary within this primary, now. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1359 lastsecondary[0] = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1360 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1361
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1362 /* Should not have an entry with no subtopic following one with a subtopic. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1363
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1364 if (nosecondary && *lastsecondary)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1365 error ("entry %s follows an entry with a secondary name", line);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1366
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1367 /* Start a new secondary entry if necessary. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1368 if (!nosecondary && strncmp (secondary, lastsecondary, secondarylength))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1369 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1370 if (pending)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1371 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1372 fputs ("}\n", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1373 pending = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1374 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1375
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1376 /* Write the entry for the secondary. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1377 fputs ("\\secondary {", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1378 fwrite (secondary, secondarylength, 1, ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1379 fputs ("}{", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1380 pending = 1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1381
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1382 /* Record name of most recent secondary. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1383 if (lastsecondarylength < secondarylength)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1384 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1385 lastsecondarylength = secondarylength + 100;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1386 lastsecondary = (char *) xrealloc (lastsecondary,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1387 1 + lastsecondarylength);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1388 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1389 strncpy (lastsecondary, secondary, secondarylength);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1390 lastsecondary[secondarylength] = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1391 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1392
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1393 /* Here to add one more page number to the current entry. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1394 if (pending++ != 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1395 fputs (", ", ostream); /* Punctuate first, if this is not the first. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1396 fwrite (pagenumber, pagelength, 1, ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1397 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1398
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1399 /* Close out any unfinished output entry. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1400
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1401 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1402 finish_index (FILE *ostream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1403 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1404 if (pending)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1405 fputs ("}\n", ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1406 free (lastprimary);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1407 free (lastsecondary);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1408 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1409
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1410 /* Copy the lines in the sorted order.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1411 Each line is copied out of the input file it was found in. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1412
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1413 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1414 writelines (linearray, nlines, ostream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1415 char **linearray;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1416 int nlines;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1417 FILE *ostream;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1418 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1419 char **stop_line = linearray + nlines;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1420 char **next_line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1421
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1422 init_index ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1423
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1424 /* Output the text of the lines, and free the buffer space. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1425
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1426 for (next_line = linearray; next_line != stop_line; next_line++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1427 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1428 /* If -u was specified, output the line only if distinct from previous one. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1429 if (next_line == linearray
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1430 /* Compare previous line with this one, using only the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1431 explicitly specd keyfields. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1432 || compare_general (*(next_line - 1), *next_line, 0L, 0L, num_keyfields - 1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1433 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1434 char *p = *next_line;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1435 char c;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1436
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1437 while ((c = *p++) && c != '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1438 /* Do nothing. */ ;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1439 *(p - 1) = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1440 indexify (*next_line, ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1441 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1442 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1443
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1444 finish_index (ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1445 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1446
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1447 /* Assume (and optionally verify) that each input file is sorted;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1448 merge them and output the result.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1449 Returns nonzero if any input file fails to be sorted.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1450
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1451 This is the high-level interface that can handle an unlimited
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1452 number of files. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1453
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1454 #define MAX_DIRECT_MERGE 10
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1455
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1456 int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1457 merge_files (infiles, nfiles, outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1458 char **infiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1459 int nfiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1460 char *outfile;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1461 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1462 char **tempfiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1463 int ntemps;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1464 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1465 int value = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1466 int start_tempcount = tempcount;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1467
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1468 if (nfiles <= MAX_DIRECT_MERGE)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1469 return merge_direct (infiles, nfiles, outfile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1470
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1471 /* Merge groups of MAX_DIRECT_MERGE input files at a time,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1472 making a temporary file to hold each group's result. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1473
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1474 ntemps = (nfiles + MAX_DIRECT_MERGE - 1) / MAX_DIRECT_MERGE;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1475 tempfiles = (char **) xmalloc (ntemps * sizeof (char *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1476 for (i = 0; i < ntemps; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1477 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1478 int nf = MAX_DIRECT_MERGE;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1479 if (i + 1 == ntemps)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1480 nf = nfiles - i * MAX_DIRECT_MERGE;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1481 tempfiles[i] = maketempname (++tempcount);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1482 value |= merge_direct (&infiles[i * MAX_DIRECT_MERGE], nf, tempfiles[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1483 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1484
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1485 /* All temporary files that existed before are no longer needed
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1486 since their contents have been merged into our new tempfiles.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1487 So delete them. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1488 flush_tempfiles (start_tempcount);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1489
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1490 /* Now merge the temporary files we created. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1491
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1492 merge_files (tempfiles, ntemps, outfile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1493
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1494 free (tempfiles);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1495
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1496 return value;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1497 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1498
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1499 /* Assume (and optionally verify) that each input file is sorted;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1500 merge them and output the result.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1501 Returns nonzero if any input file fails to be sorted.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1502
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1503 This version of merging will not work if the number of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1504 input files gets too high. Higher level functions
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1505 use it only with a bounded number of input files. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1506
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1507 int
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1508 merge_direct (infiles, nfiles, outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1509 char **infiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1510 int nfiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1511 char *outfile;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1512 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1513 struct linebuffer *lb1, *lb2;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1514 struct linebuffer **thisline, **prevline;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1515 FILE **streams;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1516 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1517 int nleft;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1518 int lossage = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1519 int *file_lossage;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1520 struct linebuffer *prev_out = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1521 FILE *ostream = stdout;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1522
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1523 if (outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1524 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1525 ostream = fopen (outfile, "w");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1526 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1527 if (!ostream)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1528 pfatal_with_name (outfile);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1529
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1530 init_index ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1531
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1532 if (nfiles == 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1533 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1534 if (outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1535 fclose (ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1536 return 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1537 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1538
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1539 /* For each file, make two line buffers.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1540 Also, for each file, there is an element of `thisline'
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1541 which points at any time to one of the file's two buffers,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1542 and an element of `prevline' which points to the other buffer.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1543 `thisline' is supposed to point to the next available line from the file,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1544 while `prevline' holds the last file line used,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1545 which is remembered so that we can verify that the file is properly sorted. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1546
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1547 /* lb1 and lb2 contain one buffer each per file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1548 lb1 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1549 lb2 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1550
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1551 /* thisline[i] points to the linebuffer holding the next available line in file i,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1552 or is zero if there are no lines left in that file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1553 thisline = (struct linebuffer **)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1554 xmalloc (nfiles * sizeof (struct linebuffer *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1555 /* prevline[i] points to the linebuffer holding the last used line
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1556 from file i. This is just for verifying that file i is properly
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1557 sorted. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1558 prevline = (struct linebuffer **)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1559 xmalloc (nfiles * sizeof (struct linebuffer *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1560 /* streams[i] holds the input stream for file i. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1561 streams = (FILE **) xmalloc (nfiles * sizeof (FILE *));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1562 /* file_lossage[i] is nonzero if we already know file i is not
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1563 properly sorted. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1564 file_lossage = (int *) xmalloc (nfiles * sizeof (int));
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1565
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1566 /* Allocate and initialize all that storage. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1567
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1568 for (i = 0; i < nfiles; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1569 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1570 initbuffer (&lb1[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1571 initbuffer (&lb2[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1572 thisline[i] = &lb1[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1573 prevline[i] = &lb2[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1574 file_lossage[i] = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1575 streams[i] = fopen (infiles[i], "r");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1576 if (!streams[i])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1577 pfatal_with_name (infiles[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1578
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1579 readline (thisline[i], streams[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1580 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1581
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1582 /* Keep count of number of files not at eof. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1583 nleft = nfiles;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1584
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1585 while (nleft)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1586 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1587 struct linebuffer *best = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1588 struct linebuffer *exch;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1589 int bestfile = -1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1590 int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1591
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1592 /* Look at the next avail line of each file; choose the least one. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1593
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1594 for (i = 0; i < nfiles; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1595 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1596 if (thisline[i] &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1597 (!best ||
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1598 0 < compare_general (best->buffer, thisline[i]->buffer,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1599 (long) bestfile, (long) i, num_keyfields)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1600 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1601 best = thisline[i];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1602 bestfile = i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1603 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1604 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1605
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1606 /* Output that line, unless it matches the previous one and we
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1607 don't want duplicates. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1608
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1609 if (!(prev_out &&
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1610 !compare_general (prev_out->buffer,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1611 best->buffer, 0L, 1L, num_keyfields - 1)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1612 indexify (best->buffer, ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1613 prev_out = best;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1614
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1615 /* Now make the line the previous of its file, and fetch a new
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1616 line from that file. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1617
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1618 exch = prevline[bestfile];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1619 prevline[bestfile] = thisline[bestfile];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1620 thisline[bestfile] = exch;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1621
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1622 while (1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1623 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1624 /* If the file has no more, mark it empty. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1625
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1626 if (feof (streams[bestfile]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1627 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1628 thisline[bestfile] = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1629 /* Update the number of files still not empty. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1630 nleft--;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1631 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1632 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1633 readline (thisline[bestfile], streams[bestfile]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1634 if (thisline[bestfile]->buffer[0] || !feof (streams[bestfile]))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1635 break;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1636 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1637 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1638
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1639 finish_index (ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1640
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1641 /* Free all storage and close all input streams. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1642
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1643 for (i = 0; i < nfiles; i++)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1644 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1645 fclose (streams[i]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1646 free (lb1[i].buffer);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1647 free (lb2[i].buffer);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1648 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1649 free (file_lossage);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1650 free (lb1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1651 free (lb2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1652 free (thisline);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1653 free (prevline);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1654 free (streams);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1655
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1656 if (outfile)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1657 fclose (ostream);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1658
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1659 return lossage;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1660 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1661
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1662 /* Print error message and exit. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1663
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1664 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1665 fatal (format, arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1666 char *format, *arg;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1667 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1668 error (format, arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1669 exit (TI_FATAL_ERROR);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1670 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1671
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1672 /* Print error message. FORMAT is printf control string, ARG is arg for it. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1673 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1674 error (format, arg)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1675 char *format, *arg;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1676 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1677 printf ("%s: ", program_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1678 printf (format, arg);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1679 if (format[strlen (format) -1] != '\n')
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1680 printf ("\n");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1681 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1682
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1683 /* unused */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1684 #if 0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1685 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1686 perror_with_name (char *name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1687 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1688 char *s;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1689
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1690 s = strerror (errno);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1691 printf ("%s: ", program_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1692 printf ("%s; for file `%s'.\n", s, name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1693 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1694 #endif
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1695
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1696 void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1697 pfatal_with_name (name)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1698 char *name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1699 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1700 char *s;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1701
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1702 s = strerror (errno);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1703 printf ("%s: ", program_name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1704 printf ("%s; for file `%s'.\n", s, name);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1705 exit (TI_FATAL_ERROR);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1706 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1707
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1708 /* Return a newly-allocated string whose contents concatenate those of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1709 S1, S2, S3. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1710
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1711 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1712 concat (s1, s2, s3)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1713 char *s1, *s2, *s3;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1714 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1715 int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1716 char *result = (char *) xmalloc (len1 + len2 + len3 + 1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1717
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1718 strcpy (result, s1);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1719 strcpy (result + len1, s2);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1720 strcpy (result + len1 + len2, s3);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1721 *(result + len1 + len2 + len3) = 0;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1722
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1723 return result;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1724 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1725
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1726 #if !defined (HAVE_STRERROR)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1727 extern char *sys_errlist[];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1728 extern int sys_nerr;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1729
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1730 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1731 strerror (num)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1732 int num;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1733 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1734 if (num >= sys_nerr)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1735 return ("");
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1736 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1737 return (sys_errlist[num]);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1738 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1739 #endif /* !HAVE_STRERROR */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1740
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1741 #if !defined (HAVE_STRCHR)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1742 char *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1743 strrchr (string, character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1744 char *string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1745 int character;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1746 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1747 register int i;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1748
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1749 for (i = strlen (string) - 1; i > -1; i--)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1750 if (string[i] == character)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1751 return (string + i);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1752
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1753 return ((char *)NULL);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1754 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1755 #endif /* HAVE_STRCHR */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1756
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1757 /* Just like malloc, but kills the program in case of fatal error. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1758 void *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1759 xmalloc (nbytes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1760 int nbytes;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1761 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1762 void *temp = (void *) malloc (nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1763
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1764 if (nbytes && temp == (void *)NULL)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1765 memory_error ("xmalloc", nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1766
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1767 return (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1768 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1769
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1770 /* Like realloc (), but barfs if there isn't enough memory. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1771 void *
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1772 xrealloc (pointer, nbytes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1773 void *pointer;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1774 int nbytes;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1775 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1776 void *temp;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1777
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1778 if (!pointer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1779 temp = (void *)xmalloc (nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1780 else
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1781 temp = (void *)realloc (pointer, nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1782
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1783 if (nbytes && !temp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1784 memory_error ("xrealloc", nbytes);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1785
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1786 return (temp);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1787 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1788
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1789 static void
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1790 memory_error (char *callers_name, int bytes_wanted)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1791 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1792 char printable_string[80];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1793
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1794 sprintf (printable_string,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1795 "Virtual memory exhausted in %s ()! Needed %d bytes.",
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1796 callers_name, bytes_wanted);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1797
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1798 error (printable_string, 0);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1799 abort ();
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1800 }
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1801