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

Defined functions

arrayify defined in line 17; used 1 times
error defined in line 43; used 2 times
firstchar defined in line 122; used 9 times
persperdexplode defined in line 157; used 5 times
plural defined in line 384; used 3 times
position defined in line 78; used 1 times
printerrors defined in line 255; used 2 times
qpersperdexplode defined in line 188; never used
strsave defined in line 66; used 20 times
verbform defined in line 389; used 2 times
wordvbuild defined in line 296; used 1 times
wordvcmp defined in line 341; used 17 times
wordvprint defined in line 277; used 4 times

Defined variables

N defined in line 383; used 2 times
S defined in line 382; used 2 times
cincomment defined in line 216; used 7 times
coutcomment defined in line 217; used 7 times
fincomment defined in line 218; used 2 times
foutcomment defined in line 219; used 2 times
lang_table defined in line 231; used 6 times
lispincomment defined in line 223; used 3 times
mod2incomment defined in line 228; used 1 times
mod2outcomment defined in line 229; used 1 times
newline defined in line 220; used 6 times
piincomment defined in line 221; used 2 times
pioutcomment defined in line 222; used 2 times
riincomment defined in line 224; used 1 times
rioutcomment defined in line 225; used 1 times
sccsid defined in line 8; never used
troffincomment defined in line 226; used 1 times
troffoutcomment defined in line 227; used 1 times
Last modified: 1987-02-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2177
Valid CSS Valid XHTML 1.0 Strict