Annotation of 43BSD/contrib/rcs/src/rcskeep.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  *                     RCS keyword extraction
                      3:  */
                      4:  static char rcsid[]=
                      5:  "$Header: /usr/wft/RCS/SRC/RCS/rcskeep.c,v 3.2 82/12/24 12:08:26 wft Exp $ Purdue CS";
                      6: /*****************************************************************************
                      7:  *                       main routine: getoldkeys()
                      8:  *                       Testprogram: define GETOLDTEST
                      9:  *****************************************************************************
                     10:  *
                     11:  * Copyright (C) 1982 by Walter F. Tichy
                     12:  *                       Purdue University
                     13:  *                       Computer Science Department
                     14:  *                       West Lafayette, IN 47907
                     15:  *
                     16:  * All rights reserved. No part of this software may be sold or distributed
                     17:  * in any form or by any means without the prior written permission of the
                     18:  * author.
                     19:  * Report problems and direct all inquiries to Tichy@purdue (ARPA net).
                     20:  */
                     21: 
                     22: 
                     23: 
                     24: /* $Log:       rcskeep.c,v $
                     25:  * Revision 3.2  82/12/24  12:08:26  wft
                     26:  * added missing #endif.
                     27:  * 
                     28:  * Revision 3.1  82/12/04  13:22:41  wft
                     29:  * Initial revision.
                     30:  *
                     31:  */
                     32: 
                     33: /*
                     34: #define GETOLDTEST
                     35: /* Testprogram; prints out the keyword values found. */
                     36: 
                     37: #include  "rcsbase.h"
                     38: extern char * checkid();
                     39: extern FILE * fopen();
                     40: 
                     41: FILE * fp;
                     42: #define IDLENGTH 30
                     43: char prevauthor[IDLENGTH];
                     44: char prevdate[datelength];
                     45: char prevrev[revlength];
                     46: char prevsource[NCPPN];
                     47: char prevstate [IDLENGTH];
                     48: char prevlocker[IDLENGTH];
                     49: 
                     50: getoldkeys(fname)
                     51: /* Function: Tries to read keyword values for author, date,
                     52:  * revision number, RCS file, and state out of the file fname.
                     53:  * The results are placed into
                     54:  * prevauthor, prevdate, prevrev, prevsource, and prevstate.
                     55:  * Aborts immediately if it finds an error and returns false.
                     56:  * If it returns true, it doesn't mean that any of the
                     57:  * values were found; instead, check to see whether the corresponding arrays
                     58:  * contain the empty string.
                     59:  */
                     60: {
                     61:     register int c;
                     62:     char keyword[keylength+2];
                     63:     register char * tp;
                     64: 
                     65:     /* initialize to empty */
                     66:     prevauthor[0]=prevsource[0]=prevstate[0]=prevdate[0]=prevrev[0]= '\0';
                     67: 
                     68:     if ( (fp = fopen(fname, "r") ) == NULL ) {
                     69:        error("Can't open %s\n", fname);
                     70:        return false;
                     71:     }
                     72:     while( (c=getc(fp)) != EOF) {
                     73:         if ( c==KDELIM) {
                     74:             /* try to get keyword */
                     75:             tp = keyword;
                     76:             while( ctab[(c=getc(fp))]==LETTER && tp< keyword+keylength)
                     77:                 *tp++ = c;
                     78:             if (c==KDELIM) {ungetc(c,fp);continue;}
                     79:             if (c!=VDELIM) continue;
                     80:             *tp='\0';
                     81:             while ((c=getc(fp))==' '||c=='\t'); /* skip blanks */
                     82:             ungetc(c,fp); /* needed for getval */
                     83:             if (strcmp(keyword, AUTHOR)==0 ) {
                     84:                 if (getval(prevauthor,IDLENGTH,true))
                     85:                     if (!checkid(prevauthor)) goto errexit;
                     86:             } elsif ( strcmp(keyword,DATE)==0 ) {
                     87:                 if (!getprevdate(true)) goto errexit;
                     88:             } elsif ( strcmp(keyword, HEADER)==0 ) {
                     89:                 if (getval(prevsource,NCPPN,true)) {
                     90:                     if (!getval(prevrev,revlength,false)) goto errexit;
                     91:                     if (!checknum(prevrev,-1)) {
                     92:                         error("Bad revision number");
                     93:                         goto errexit;
                     94:                     }
                     95:                     if (!getprevdate(false)) goto errexit;
                     96:                     if (!getval(prevauthor,IDLENGTH,false)) goto errexit;
                     97:                     if (!checkid(prevauthor)) goto errexit;
                     98:                     if (!getval(prevstate,IDLENGTH,false)) goto errexit;
                     99:                     if (!checkid(prevstate)) goto errexit;
                    100:                 }
                    101:             } elsif ( strcmp(keyword, LOCKER)==0 ) {
                    102:                 getval(prevlocker,IDLENGTH,true);
                    103:             } elsif ( strcmp(keyword, LOG)==0 ) {
                    104:                 getval(prevsource,NCPPN,true);
                    105:             } elsif (strcmp(keyword, REVISION)==0 ) {
                    106:                 if (getval(prevrev,revlength,true))
                    107:                     if (!checknum(prevrev,-1)) {
                    108:                         error("Bad revision number");
                    109:                         goto errexit;
                    110:                     }
                    111:             } elsif (strcmp(keyword, SOURCE)==0 ) {
                    112:                 getval(prevsource,NCPPN,true);
                    113:             } elsif ( strcmp(keyword, STATE)==0 ) {
                    114:                 if (getval(prevstate,IDLENGTH,true))
                    115:                     if (!checkid(prevstate)) goto errexit;
                    116:             } else {
                    117:                continue;
                    118:             }
                    119:             if (getc(fp)!=KDELIM)
                    120:                 warn("Closing %c missing on keyword",KDELIM);
                    121:             if (prevauthor[0]!='\0'&&prevrev[0]!='\0'&&prevstate[0]!='\0'&&
                    122:                 prevdate[0]!='\0' && prevsource[0]!='\0') {
                    123:                 /* done; prevlocker is irrelevant */
                    124:                 break;
                    125:            }
                    126:         }
                    127:     }
                    128:     fclose(fp);
                    129:     return true;
                    130: 
                    131: errexit:
                    132:     prevauthor[0]=prevsource[0]=prevstate[0]=prevdate[0]=prevrev[0]= '\0';
                    133:     fclose(fp); return false;
                    134: }
                    135: 
                    136: 
                    137: getval(target,maxchars,optional)
                    138: char * target; int maxchars, optional;
                    139: /* Function: Places a keyword value into target, but not more
                    140:  * than maxchars characters. Prints an error if optiona==false
                    141:  * and there is no keyword. Returns true if one is found, false otherwise.
                    142:  */
                    143: {   register char * tp;
                    144:     register int c;
                    145: 
                    146:     tp=target;
                    147:     c=getc(fp);
                    148:     if (c==KDELIM) {
                    149:         if (!optional)
                    150:             error("Missing keyword value");
                    151:         ungetc(c,fp);
                    152:         return false;
                    153:     } else {
                    154:         while (!(c==' '||c=='\n'||c=='\t'||c==KDELIM||c==EOF)) {
                    155:             if (tp-target>=maxchars-1) {
                    156:                 error("keyword value too long");
                    157:                 return false;
                    158:             } else {
                    159:                 *tp++ =c;
                    160:                 c=getc(fp);
                    161:             }
                    162:         }
                    163:         *tp= '\0';
                    164: #       ifdef GETOLDTEST
                    165:         printf("getval: %s\n",target);
                    166: #       endif
                    167:         while(c==' '||c=='\t') c=getc(fp); /* skip trailing blanks */
                    168:     }
                    169:     ungetc(c,fp);
                    170:     return true;
                    171: }
                    172: 
                    173: 
                    174: int getprevdate(optional)
                    175: int optional;
                    176: /* Function: reads a date prevdate; checks format 
                    177:  * If there is not date and optional==false, an error is printed.
                    178:  * Returns false on error, true otherwise.
                    179:  */
                    180: {   char prevday[10];
                    181:     char prevtime[10];
                    182: 
                    183:     prevday[0]=prevtime[0]='\0';
                    184:     if (!getval(prevday,9,optional)) return optional;
                    185:     if (!getval(prevtime,9,false)) return false;
                    186:     /*process date */
                    187:     prevday[2]=prevday[5]=prevday[8]=prevtime[2]=prevtime[5]='.';
                    188:     prevday[9]='\0';
                    189:     strcpy(prevdate,prevday);
                    190:     strcat(prevdate,prevtime);
                    191:     if (!checknum(prevdate,5)) {
                    192:             error("Bad date: %s",prevdate);
                    193:             prevdate[0]='\0';
                    194:             return false;
                    195:     }
                    196:     return true;
                    197: }
                    198: 
                    199: int checknum(sp,fields)
                    200: register char * sp; int fields;
                    201: {    register int dotcount;
                    202:      if (sp==nil||*sp=='\0') return true;
                    203:      dotcount=0;
                    204:      while(*sp) {
                    205:         if (*sp=='.') dotcount++;
                    206:         elsif (ctab[*sp]!=DIGIT) return false;
                    207:         sp++;
                    208:      }
                    209:      if (fields >= 0 && dotcount!=fields) return false;
                    210:      return true;
                    211: }
                    212: 
                    213: 
                    214: 
                    215: #ifdef GETOLDTEST
                    216: cleanup(){} /* dummy */
                    217: 
                    218: main(argc, argv)
                    219: int  argc; char  *argv[];
                    220: {
                    221:         cmdid="getoldkeys";
                    222:         while (*(++argv)) {
                    223:                 if (getoldkeys(*argv))
                    224:                 printf("%s:  revision: %s, date: %s, author: %s, state: %s\n",
                    225:                         *argv, prevrev, prevdate, prevauthor,prevstate);
                    226:         }
                    227: }
                    228: #endif

unix.superglobalmegacorp.com

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