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