|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: */
17:
18: #ifndef lint
19: static char sccsid[] = "@(#)errorsubr.c 5.3 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include <stdio.h>
23: #include <ctype.h>
24: #include "error.h"
25: /*
26: * Arrayify a list of rules
27: */
28: arrayify(e_length, e_array, header)
29: int *e_length;
30: Eptr **e_array;
31: Eptr header;
32: {
33: reg Eptr errorp;
34: reg Eptr *array;
35: reg int listlength;
36: reg int listindex;
37:
38: for (errorp = header, listlength = 0;
39: errorp; errorp = errorp->error_next, listlength++)
40: continue;
41: array = (Eptr*)Calloc(listlength+1, sizeof (Eptr));
42: for(listindex = 0, errorp = header;
43: listindex < listlength;
44: listindex++, errorp = errorp->error_next){
45: array[listindex] = errorp;
46: errorp->error_position = listindex;
47: }
48: array[listindex] = (Eptr)0;
49: *e_length = listlength;
50: *e_array = array;
51: }
52:
53: /*VARARGS1*/
54: error(msg, a1, a2, a3)
55: char *msg;
56: {
57: fprintf(stderr, "Error: ");
58: fprintf(stderr, msg, a1, a2, a3);
59: fprintf(stderr, "\n");
60: fflush(stdout);
61: fflush(stderr);
62: exit(6);
63: }
64: /*ARGSUSED*/
65: char *Calloc(nelements, size)
66: int nelements;
67: int size;
68: {
69: char *back;
70: if ( (back = (char *)calloc(nelements, size)) == (char *)NULL){
71: error("Ran out of memory.\n");
72: exit(1);
73: }
74: return(back);
75: }
76:
77: char *strsave(instring)
78: char *instring;
79: {
80: char *outstring;
81: (void)strcpy(outstring = (char *)Calloc(1, strlen(instring) + 1),
82: instring);
83: return(outstring);
84: }
85: /*
86: * find the position of a given character in a string
87: * (one based)
88: */
89: int position(string, ch)
90: reg char *string;
91: reg char ch;
92: {
93: reg int i;
94: if (string)
95: for (i=1; *string; string++, i++){
96: if (*string == ch)
97: return(i);
98: }
99: return(-1);
100: }
101: /*
102: * clobber the first occurance of ch in string by the new character
103: */
104: char *substitute(string, chold, chnew)
105: char *string;
106: char chold, chnew;
107: {
108: reg char *cp = string;
109:
110: if (cp)
111: while (*cp){
112: if (*cp == chold){
113: *cp = chnew;
114: break;
115: }
116: cp++;
117: }
118: return(string);
119: }
120:
121: char lastchar(string)
122: char *string;
123: {
124: int length;
125: if (string == 0) return('\0');
126: length = strlen(string);
127: if (length >= 1)
128: return(string[length-1]);
129: else
130: return('\0');
131: }
132:
133: char firstchar(string)
134: char *string;
135: {
136: if (string)
137: return(string[0]);
138: else
139: return('\0');
140: }
141:
142: char next_lastchar(string)
143: char *string;
144: {
145: int length;
146: if (string == 0) return('\0');
147: length = strlen(string);
148: if (length >= 2)
149: return(string[length - 2]);
150: else
151: return('\0');
152: }
153:
154: clob_last(string, newstuff)
155: char *string, newstuff;
156: {
157: int length = 0;
158: if (string)
159: length = strlen(string);
160: if (length >= 1)
161: string[length - 1] = newstuff;
162: }
163:
164: /*
165: * parse a string that is the result of a format %s(%d)
166: * return TRUE if this is of the proper format
167: */
168: boolean persperdexplode(string, r_perd, r_pers)
169: char *string;
170: char **r_perd, **r_pers;
171: {
172: reg char *cp;
173: int length = 0;
174:
175: if (string)
176: length = strlen(string);
177: if ( (length >= 4)
178: && (string[length - 1] == ')' ) ){
179: for (cp = &string[length - 2];
180: (isdigit(*cp)) && (*cp != '(');
181: --cp)
182: continue;
183: if (*cp == '('){
184: string[length - 1] = '\0'; /* clobber the ) */
185: *r_perd = strsave(cp+1);
186: string[length - 1] = ')';
187: *cp = '\0'; /* clobber the ( */
188: *r_pers = strsave(string);
189: *cp = '(';
190: return(TRUE);
191: }
192: }
193: return(FALSE);
194: }
195: /*
196: * parse a quoted string that is the result of a format \"%s\"(%d)
197: * return TRUE if this is of the proper format
198: */
199: boolean qpersperdexplode(string, r_perd, r_pers)
200: char *string;
201: char **r_perd, **r_pers;
202: {
203: reg char *cp;
204: int length = 0;
205:
206: if (string)
207: length = strlen(string);
208: if ( (length >= 4)
209: && (string[length - 1] == ')' ) ){
210: for (cp = &string[length - 2];
211: (isdigit(*cp)) && (*cp != '(');
212: --cp)
213: continue;
214: if (*cp == '(' && *(cp - 1) == '"'){
215: string[length - 1] = '\0';
216: *r_perd = strsave(cp+1);
217: string[length - 1] = ')';
218: *(cp - 1) = '\0'; /* clobber the " */
219: *r_pers = strsave(string + 1);
220: *(cp - 1) = '"';
221: return(TRUE);
222: }
223: }
224: return(FALSE);
225: }
226:
227: static char cincomment[] = CINCOMMENT;
228: static char coutcomment[] = COUTCOMMENT;
229: static char fincomment[] = FINCOMMENT;
230: static char foutcomment[] = FOUTCOMMENT;
231: static char newline[] = NEWLINE;
232: static char piincomment[] = PIINCOMMENT;
233: static char pioutcomment[] = PIOUTCOMMENT;
234: static char lispincomment[] = LISPINCOMMENT;
235: static char riincomment[] = RIINCOMMENT;
236: static char rioutcomment[] = RIOUTCOMMENT;
237: static char troffincomment[] = TROFFINCOMMENT;
238: static char troffoutcomment[] = TROFFOUTCOMMENT;
239: static char mod2incomment[] = MOD2INCOMMENT;
240: static char mod2outcomment[] = MOD2OUTCOMMENT;
241:
242: struct lang_desc lang_table[] = {
243: /*INUNKNOWN 0*/ "unknown", cincomment, coutcomment,
244: /*INCPP 1*/ "cpp", cincomment, coutcomment,
245: /*INCC 2*/ "cc", cincomment, coutcomment,
246: /*INAS 3*/ "as", ASINCOMMENT, newline,
247: /*INLD 4*/ "ld", cincomment, coutcomment,
248: /*INLINT 5*/ "lint", cincomment, coutcomment,
249: /*INF77 6*/ "f77", fincomment, foutcomment,
250: /*INPI 7*/ "pi", piincomment, pioutcomment,
251: /*INPC 8*/ "pc", piincomment, pioutcomment,
252: /*INFRANZ 9*/ "franz",lispincomment, newline,
253: /*INLISP 10*/ "lisp", lispincomment, newline,
254: /*INVAXIMA 11*/ "vaxima",lispincomment,newline,
255: /*INRATFOR 12*/ "ratfor",fincomment, foutcomment,
256: /*INLEX 13*/ "lex", cincomment, coutcomment,
257: /*INYACC 14*/ "yacc", cincomment, coutcomment,
258: /*INAPL 15*/ "apl", ".lm", newline,
259: /*INMAKE 16*/ "make", ASINCOMMENT, newline,
260: /*INRI 17*/ "ri", riincomment, rioutcomment,
261: /*INTROFF 18*/ "troff",troffincomment,troffoutcomment,
262: /*INMOD2 19*/ "mod2", mod2incomment, mod2outcomment,
263: 0, 0, 0
264: };
265:
266: printerrors(look_at_subclass, errorc, errorv)
267: boolean look_at_subclass;
268: int errorc;
269: Eptr errorv[];
270: {
271: reg int i;
272: reg Eptr errorp;
273:
274: for (errorp = errorv[i = 0]; i < errorc; errorp = errorv[++i]){
275: if (errorp->error_e_class == C_IGNORE)
276: continue;
277: if (look_at_subclass && errorp->error_s_class == C_DUPL)
278: continue;
279: printf("Error %d, (%s error) [%s], text = \"",
280: i,
281: class_table[errorp->error_e_class],
282: lang_table[errorp->error_language].lang_name);
283: wordvprint(stdout,errorp->error_lgtext,errorp->error_text);
284: printf("\"\n");
285: }
286: }
287:
288: wordvprint(fyle, wordc, wordv)
289: FILE *fyle;
290: int wordc;
291: char *wordv[];
292: {
293: int i;
294: char *sep = "";
295:
296: for(i = 0; i < wordc; i++)
297: if (wordv[i]) {
298: fprintf(fyle, "%s%s",sep,wordv[i]);
299: sep = " ";
300: }
301: }
302:
303: /*
304: * Given a string, parse it into a number of words, and build
305: * a wordc wordv combination pointing into it.
306: */
307: wordvbuild(string, r_wordc, r_wordv)
308: char *string;
309: int *r_wordc;
310: char ***r_wordv;
311: {
312: reg char *cp;
313: char *saltedbuffer;
314: char **wordv;
315: int wordcount;
316: int wordindex;
317:
318: saltedbuffer = strsave(string);
319: for (wordcount = 0, cp = saltedbuffer; *cp; wordcount++){
320: while (*cp && isspace(*cp))
321: cp++;
322: if (*cp == 0)
323: break;
324: while (!isspace(*cp))
325: cp++;
326: }
327: wordv = (char **)Calloc(wordcount + 1, sizeof (char *));
328: for (cp=saltedbuffer,wordindex=0; wordcount; wordindex++,--wordcount){
329: while (*cp && isspace(*cp))
330: cp++;
331: if (*cp == 0)
332: break;
333: wordv[wordindex] = cp;
334: while(!isspace(*cp))
335: cp++;
336: *cp++ = '\0';
337: }
338: if (wordcount != 0)
339: error("Initial miscount of the number of words in a line\n");
340: wordv[wordindex] = (char *)0;
341: #ifdef FULLDEBUG
342: for (wordcount = 0; wordcount < wordindex; wordcount++)
343: printf("Word %d = \"%s\"\n", wordcount, wordv[wordcount]);
344: printf("\n");
345: #endif
346: *r_wordc = wordindex;
347: *r_wordv = wordv;
348: }
349: /*
350: * Compare two 0 based wordvectors
351: */
352: int wordvcmp(wordv1, wordc, wordv2)
353: char **wordv1;
354: int wordc;
355: char **wordv2;
356: {
357: reg int i;
358: int back;
359: for (i = 0; i < wordc; i++){
360: if (wordv1[i] == 0 || wordv2[i] == 0)
361: return(-1);
362: if (back = strcmp(wordv1[i], wordv2[i])){
363: return(back);
364: }
365: }
366: return(0); /* they are equal */
367: }
368:
369: /*
370: * splice a 0 basedword vector onto the tail of a
371: * new wordv, allowing the first emptyhead slots to be empty
372: */
373: char **wordvsplice(emptyhead, wordc, wordv)
374: int emptyhead;
375: int wordc;
376: char **wordv;
377: {
378: reg char **nwordv;
379: int nwordc = emptyhead + wordc;
380: reg int i;
381:
382: nwordv = (char **)Calloc(nwordc, sizeof (char *));
383: for (i = 0; i < emptyhead; i++)
384: nwordv[i] = 0;
385: for(i = emptyhead; i < nwordc; i++){
386: nwordv[i] = wordv[i-emptyhead];
387: }
388: return(nwordv);
389: }
390: /*
391: * plural'ize and verb forms
392: */
393: static char *S = "s";
394: static char *N = "";
395: char *plural(n)
396: int n;
397: {
398: return( n > 1 ? S : N);
399: }
400: char *verbform(n)
401: int n;
402: {
403: return( n > 1 ? N : S);
404: }
405:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.