|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.