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

unix.superglobalmegacorp.com

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