Annotation of 43BSDReno/contrib/rcs/src/rcskeep.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *                     RCS keyword extraction
        !             3:  */
        !             4: #ifndef lint
        !             5: static char rcsid[]= "$Id: rcskeep.c,v 4.6 89/05/01 15:12:56 narten Exp $ Purdue CS";
        !             6: #endif
        !             7: /*****************************************************************************
        !             8:  *                       main routine: getoldkeys()
        !             9:  *                       Testprogram: define KEEPTEST
        !            10:  *****************************************************************************
        !            11:  */
        !            12: 
        !            13: /* Copyright (C) 1982, 1988, 1989 Walter Tichy
        !            14:  * All rights reserved.
        !            15:  *
        !            16:  * Redistribution and use in source and binary forms are permitted
        !            17:  * provided that the above copyright notice and this paragraph are
        !            18:  * duplicated in all such forms and that any documentation,
        !            19:  * advertising materials, and other materials related to such
        !            20:  * distribution and use acknowledge that the software was developed
        !            21:  * by Walter Tichy.
        !            22:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            23:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            24:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            25:  *
        !            26:  * Report all problems and direct all questions to:
        !            27:  *   [email protected]
        !            28:  * 
        !            29: 
        !            30: 
        !            31: 
        !            32: 
        !            33: 
        !            34: 
        !            35: 
        !            36: */
        !            37: 
        !            38: 
        !            39: 
        !            40: /* $Log:       rcskeep.c,v $
        !            41:  * Revision 4.6  89/05/01  15:12:56  narten
        !            42:  * changed copyright header to reflect current distribution rules
        !            43:  * 
        !            44:  * Revision 4.5  88/11/08  12:01:05  narten
        !            45:  * changes from  [email protected] (Paul Eggert)
        !            46:  * 
        !            47:  * Revision 4.5  88/08/09  19:13:03  eggert
        !            48:  * Remove lint and speed up by making FILE *fp local, not global.
        !            49:  * 
        !            50:  * Revision 4.4  87/12/18  11:44:21  narten
        !            51:  * more lint cleanups (Guy Harris)
        !            52:  * 
        !            53:  * Revision 4.3  87/10/18  10:35:50  narten
        !            54:  * Updating version numbers. Changes relative to 1.1 actually relative
        !            55:  * to 4.1
        !            56:  * 
        !            57:  * Revision 1.3  87/09/24  14:00:00  narten
        !            58:  * Sources now pass through lint (if you ignore printf/sprintf/fprintf 
        !            59:  * warnings)
        !            60:  * 
        !            61:  * Revision 1.2  87/03/27  14:22:29  jenkins
        !            62:  * Port to suns
        !            63:  * 
        !            64:  * Revision 1.1  84/01/23  14:50:30  kcs
        !            65:  * Initial revision
        !            66:  * 
        !            67:  * Revision 4.1  83/05/10  16:26:44  wft
        !            68:  * Added new markers Id and RCSfile; extraction added.
        !            69:  * Marker matching with trymatch().
        !            70:  * 
        !            71:  * Revision 3.2  82/12/24  12:08:26  wft
        !            72:  * added missing #endif.
        !            73:  *
        !            74:  * Revision 3.1  82/12/04  13:22:41  wft
        !            75:  * Initial revision.
        !            76:  *
        !            77:  */
        !            78: 
        !            79: /*
        !            80: #define KEEPTEST
        !            81: /* Testprogram; prints out the keyword values found. */
        !            82: 
        !            83: #include  "rcsbase.h"
        !            84: extern char * checkid();
        !            85: extern FILE * fopen();
        !            86: static int getval();
        !            87: extern enum markers trymatch();
        !            88: 
        !            89: #define IDLENGTH 30
        !            90: char prevauthor[IDLENGTH];
        !            91: char prevdate[datelength];
        !            92: char prevRCS[NCPFN];
        !            93: char prevrev[revlength];
        !            94: char prevsource[NCPPN];
        !            95: char prevstate [IDLENGTH];
        !            96: char prevlocker[IDLENGTH];
        !            97: char dummy[IDLENGTH];
        !            98: 
        !            99: getoldkeys(fname)
        !           100: char * fname;
        !           101: /* Function: Tries to read keyword values for author, date,
        !           102:  * revision number, RCS file, (both with and without path),
        !           103:  * state, and workfilename out of the file fname.
        !           104:  * The results are placed into
        !           105:  * prevauthor, prevdate, prevRCS, prevrev, prevsource, prevstate.
        !           106:  * Aborts immediately if it finds an error and returns false.
        !           107:  * If it returns true, it doesn't mean that any of the
        !           108:  * values were found; instead, check to see whether the corresponding arrays
        !           109:  * contain the empty string.
        !           110:  */
        !           111: {
        !           112:     register FILE *fp;
        !           113:     register int c;
        !           114:     char keyword[keylength+2];
        !           115:     register char * tp;
        !           116:     enum markers mresult;
        !           117: 
        !           118:     /* initialize to empty */
        !           119:     prevauthor[0]=prevsource[0]=prevstate[0]=prevdate[0]=prevrev[0]= '\0';
        !           120: 
        !           121:     if ( (fp = fopen(fname, "r") ) == NULL ) {
        !           122:        error("Can't open %s\n", fname);
        !           123:        return false;
        !           124:     }
        !           125:     while( (c=getc(fp)) != EOF) {
        !           126:         if ( c==KDELIM) {
        !           127:             /* try to get keyword */
        !           128:             tp = keyword;
        !           129:            while( (c=getc(fp))!=EOF && (tp< keyword+keylength) && (c!='\n')
        !           130:                   && (c!=KDELIM) && (c!=VDELIM))
        !           131:                  *tp++ = c;
        !           132: 
        !           133:             if (c==KDELIM) {VOID ungetc(c,fp);continue;}
        !           134:             if (c!=VDELIM) continue;
        !           135:            *tp++ = c;
        !           136:             *tp='\0';
        !           137:             while ((c=getc(fp))==' '||c=='\t'); /* skip blanks */
        !           138:             VOID ungetc(c,fp); /* needed for getval */
        !           139: 
        !           140:            switch (mresult=trymatch(keyword,true)) {
        !           141:             case Author:
        !           142:                if (getval(fp,prevauthor,IDLENGTH,true))
        !           143:                     if (!checkid(prevauthor, '\0')) goto errexit;
        !           144:                 break;
        !           145:             case Date:
        !           146:                if (!getprevdate(fp,true)) goto errexit;
        !           147:                 break;
        !           148:             case Header:
        !           149:             case Id:
        !           150:                if (mresult==Header) {
        !           151:                    if (!getval(fp,prevsource,NCPPN,true)) break; /*unexpanded*/
        !           152:                } else {
        !           153:                    if (!getval(fp,prevRCS,NCPFN,true))    break; /*unexpanded*/
        !           154:                }
        !           155:                if (!getval(fp,prevrev,revlength,false)) goto errexit;
        !           156:                if (!checknum(prevrev,-1)) {
        !           157:                    error("Bad revision number");
        !           158:                    goto errexit;
        !           159:                }
        !           160:                if (!getprevdate(fp,false)) goto errexit;
        !           161:                if (!getval(fp,prevauthor,IDLENGTH,false)) goto errexit;
        !           162:                if (!checkid(prevauthor, '\0')) goto errexit;
        !           163:                if (!getval(fp,prevstate,IDLENGTH,false)) goto errexit;
        !           164:                if (!checkid(prevstate, '\0')) goto errexit;
        !           165:                VOID getval(fp, dummy, IDLENGTH, true);    /* optional locker*/
        !           166:                VOID getval(fp, prevlocker,IDLENGTH,true); /* optional locker*/
        !           167:                 break;
        !           168:             case Locker:
        !           169:                 VOID getval(fp,prevlocker,IDLENGTH,true);
        !           170:                if (!checkid(prevlocker, '\0')) goto errexit;
        !           171:                 break;
        !           172:             case Log:
        !           173:                VOID getval(fp,prevRCS,NCPPN,true);
        !           174:                 break;
        !           175:             case RCSfile:
        !           176:                 VOID getval(fp,prevRCS,NCPFN,true);
        !           177:                 break;
        !           178:             case Revision:
        !           179:                 if (getval(fp,prevrev,revlength,true))
        !           180:                     if (!checknum(prevrev,-1)) {
        !           181:                         error("Bad revision number");
        !           182:                         goto errexit;
        !           183:                     }
        !           184:                 break;
        !           185:             case Source:
        !           186:                 VOID getval(fp,prevsource,NCPPN,true);
        !           187:                 break;
        !           188:             case State:
        !           189:                 if (getval(fp,prevstate,IDLENGTH,true))
        !           190:                     if (!checkid(prevstate, '\0')) goto errexit;
        !           191:                 break;
        !           192:             default:
        !           193:                continue;
        !           194:             }
        !           195:             if (getc(fp)!=KDELIM)
        !           196:                 warn("Closing %c missing on keyword",KDELIM);
        !           197:             if (prevauthor[0]!='\0'&&prevrev[0]!='\0'&&prevstate[0]!='\0'&&
        !           198:                 prevdate[0]!='\0' &&
        !           199:                 ((prevsource[0]!='\0')||(prevRCS[0]!='\0'))){
        !           200:                 /* done; prevlocker is irrelevant */
        !           201:                 break;
        !           202:            }
        !           203:         }
        !           204:     }
        !           205:     VOID fclose(fp);
        !           206:     return true;
        !           207: 
        !           208: errexit:
        !           209:     prevauthor[0]=prevsource[0]=prevstate[0]=prevdate[0]=prevrev[0]= '\0';
        !           210:     VOID fclose(fp); return false;
        !           211: }
        !           212: 
        !           213: 
        !           214: static int getval(fp,target,maxchars,optional)
        !           215: register FILE *fp;
        !           216: char * target; int maxchars, optional;
        !           217: /* Function: Places a keyword value into target, but not more
        !           218:  * than maxchars characters. Prints an error if optional==false
        !           219:  * and there is no keyword. Returns true if one is found, false otherwise.
        !           220:  */
        !           221: {   register char * tp;
        !           222:     register int c;
        !           223: 
        !           224:     tp=target;
        !           225:     c=getc(fp);
        !           226:     if (c==KDELIM) {
        !           227:         if (!optional)
        !           228:             error("Missing keyword value");
        !           229:         VOID ungetc(c,fp);
        !           230:         return false;
        !           231:     } else {
        !           232:         while (!(c==' '||c=='\n'||c=='\t'||c==KDELIM||c==EOF)) {
        !           233:             if (tp-target>=maxchars-1) {
        !           234:                 error("keyword value too long");
        !           235:                 return false;
        !           236:             } else {
        !           237:                 *tp++ =c;
        !           238:                 c=getc(fp);
        !           239:             }
        !           240:         }
        !           241:         *tp= '\0';
        !           242: #       ifdef KEEPTEST
        !           243:         VOID printf("getval: %s\n",target);
        !           244: #       endif
        !           245:         while(c==' '||c=='\t') c=getc(fp); /* skip trailing blanks */
        !           246:     }
        !           247:     VOID ungetc(c,fp);
        !           248:     return true;
        !           249: }
        !           250: 
        !           251: 
        !           252: int getprevdate(fp,optional)
        !           253: FILE *fp;
        !           254: int optional;
        !           255: /* Function: reads a date prevdate; checks format
        !           256:  * If there is not date and optional==false, an error is printed.
        !           257:  * Returns false on error, true otherwise.
        !           258:  */
        !           259: {   char prevday[10];
        !           260:     char prevtime[10];
        !           261: 
        !           262:     prevday[0]=prevtime[0]='\0';
        !           263:     if (!getval(fp,prevday,9,optional)) return optional;
        !           264:     if (!getval(fp,prevtime,9,false)) return false;
        !           265:     /*process date */
        !           266:     prevday[2]=prevday[5]=prevday[8]=prevtime[2]=prevtime[5]='.';
        !           267:     prevday[9]='\0';
        !           268:     VOID strcpy(prevdate,prevday);
        !           269:     VOID strcat(prevdate,prevtime);
        !           270:     if (!checknum(prevdate,5)) {
        !           271:             error("Bad date: %s",prevdate);
        !           272:             prevdate[0]='\0';
        !           273:             return false;
        !           274:     }
        !           275:     return true;
        !           276: }
        !           277: 
        !           278: int checknum(sp,fields)
        !           279: register char * sp; int fields;
        !           280: {    register int dotcount;
        !           281:      if (sp==nil||*sp=='\0') return true;
        !           282:      dotcount=0;
        !           283:      while(*sp) {
        !           284:         if (*sp=='.') dotcount++;
        !           285:         elsif (ctab[*sp]!=DIGIT) return false;
        !           286:         sp++;
        !           287:      }
        !           288:      if (fields >= 0 && dotcount!=fields) return false;
        !           289:      return true;
        !           290: }
        !           291: 
        !           292: 
        !           293: 
        !           294: #ifdef KEEPTEST
        !           295: char * RCSfilename, * workfilename;
        !           296: 
        !           297: main(argc, argv)
        !           298: int  argc; char  *argv[];
        !           299: {
        !           300:        cmdid="keeptest";
        !           301:         while (*(++argv)) {
        !           302:                 if (getoldkeys(*argv))
        !           303:                 VOID printf("%s:  revision: %s, date: %s, author: %s, state: %s\n",
        !           304:                         *argv, prevrev, prevdate, prevauthor,prevstate);
        !           305:                VOID printf("Source: %s, RCSfile: %s\n",prevsource,prevRCS);
        !           306:        }
        !           307:        exit(0);
        !           308: }
        !           309: #endif

unix.superglobalmegacorp.com

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