Annotation of 41BSD/cmd/error/errorsubr.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.