|
|
1.1 ! root 1: /* ! 2: * RCS rcsclean operation ! 3: */ ! 4: static char rcsid[]= ! 5: "$Header $ Purdue CS"; ! 6: /***************************************************************************** ! 7: * remove unneded working files ! 8: ***************************************************************************** ! 9: * ! 10: * Copyright (C) 1982 by Walter F. Tichy ! 11: * Purdue University ! 12: * Computer Science Department ! 13: * West Lafayette, IN 47907 ! 14: * ! 15: * All rights reserved. No part of this software may be sold or distributed ! 16: * in any form or by any means without the prior written permission of the ! 17: * author. ! 18: * Report problems and direct all inquiries to Tichy@purdue (ARPA net). ! 19: */ ! 20: ! 21: ! 22: /* $Log: rcsclean.c,v $ ! 23: * Revision 4.2 87/10/18 10:30:43 narten ! 24: * Updating version numbers. Changes relative to 1.1 are actually ! 25: * relative to 4.1 ! 26: * ! 27: * Revision 1.2 87/09/24 13:59:13 narten ! 28: * Sources now pass through lint (if you ignore printf/sprintf/fprintf ! 29: * warnings) ! 30: * ! 31: * Revision 1.1 84/01/23 14:50:16 kcs ! 32: * Initial revision ! 33: * ! 34: * Revision 4.1 83/12/15 12:26:18 wft ! 35: * Initial revision. ! 36: * ! 37: */ ! 38: #include "rcsbase.h" ! 39: #define ERRCODE 2 /*error code for exit status */ ! 40: static char rcsbaseid[] = RCSBASE; ! 41: ! 42: extern int cleanup(); /* cleanup after signals */ ! 43: extern char * mktempfile(); /*temporary file name generator */ ! 44: extern int fterror(); /*forward for special fatal error func. */ ! 45: extern struct hshentry * genrevs(); /*generate delta numbers */ ! 46: extern int nerror; /*counter for errors */ ! 47: extern int quietflag; /*suppresses diagnostics */ ! 48: extern FILE * finptr; /* RCS input file */ ! 49: extern FILE * fopen(); ! 50: ! 51: char *RCSfilename; ! 52: char *workfilename; ! 53: char * tempfile; ! 54: FILE * file1, * file2; /*file descriptors for comparison */ ! 55: ! 56: main (argc, argv) ! 57: int argc; char **argv; ! 58: { ! 59: char * cmdusage; ! 60: char command[NCPPN+revlength+40]; ! 61: char * rev; /* revision number from command line */ ! 62: char numericrev[revlength]; /* holds expanded revision number */ ! 63: int revnums; /* number of -r options */ ! 64: struct hshentry * gendeltas[hshsize];/*stores deltas to be generated*/ ! 65: struct hshentry * target; ! 66: int filecounter; ! 67: register int c1; /* reading input */ ! 68: int result; /* result of comparison */ ! 69: int pairresult; /* reulst of pairfilenames */ ! 70: ! 71: catchints(); ! 72: cmdid = "rcsclean"; ! 73: cmdusage = "command format:\n rcsclean [-rrev] file"; ! 74: filecounter=revnums=0; ! 75: quietflag=true; /* default no diagnostics */ ! 76: while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) { ! 77: switch ((*argv)[1]) { ! 78: case 'r': ! 79: revno: if ((*argv)[2]!='\0') { ! 80: if (revnums==0) { ! 81: rev= *argv+2; revnums=1; ! 82: } else { ! 83: fterror("too many revision numbers"); ! 84: } ! 85: } /* do nothing for empty -r */ ! 86: break; ! 87: case 'D': /* debug option */ ! 88: quietflag = false; ! 89: break; ! 90: ! 91: default: ! 92: fterror("unknown option: %s\n%s", *argv,cmdusage); ! 93: }; ! 94: } /* end of option processing */ ! 95: ! 96: if (argc<1) fterror("No input file\n%s",cmdusage); ! 97: ! 98: /* now handle all filenames */ ! 99: do { ! 100: finptr=NULL; ! 101: pairresult=pairfilenames(argc,argv,false,false); ! 102: ! 103: if (pairresult==0) continue; /* error */ ! 104: if (!(access(workfilename,4)==0)) { ! 105: diagnose("Can't open %s",workfilename); ! 106: continue; ! 107: } elsif (pairresult == -1) { ! 108: warn("Can't find RCS file for %s",workfilename); ! 109: continue; ! 110: } ! 111: diagnose("RCS file: %s",RCSfilename); ! 112: if (!trysema(RCSfilename,false)) continue; /* give up */ ! 113: ! 114: ! 115: gettree(); /* reads in the delta tree */ ! 116: ! 117: if (Head==nil) { ! 118: error("no revisions present"); ! 119: continue; ! 120: } ! 121: if (revnums==0) ! 122: rev=(Dbranch!=nil?Dbranch->num:Head->num); /* default rev1 */ ! 123: ! 124: if (!expandsym(rev,numericrev)) continue; ! 125: if (!(target=genrevs(numericrev,nil,nil,nil,gendeltas))) continue; ! 126: ! 127: tempfile=mktempfile("/tmp/",TMPFILE1); ! 128: diagnose("retrieving revision %s",target->num); ! 129: sprintf(command,"%s/co -q -p%s %s > %s\n", ! 130: TARGETDIR,target->num,RCSfilename,tempfile); ! 131: if (system(command)){ ! 132: error("co failed"); ! 133: continue; ! 134: } ! 135: /* now do comparison */ ! 136: if ((file1=fopen(tempfile,"r"))==NULL) { ! 137: error("Can't open checked out file %s",tempfile); ! 138: continue; ! 139: } ! 140: if ((file2=fopen(workfilename,"r"))==NULL) { ! 141: error("Can't open %s",workfilename); ! 142: continue; ! 143: } ! 144: result=1; ! 145: while ((c1=getc(file1))==getc(file2)) { ! 146: if (c1==EOF) { ! 147: /* identical files; can remove working file */ ! 148: result=0; ! 149: diagnose("files identical; %s removed",workfilename); ! 150: if (unlink(workfilename)!=0) { ! 151: error("Can't unlink %s",workfilename); ! 152: } ! 153: break; ! 154: } ! 155: } ! 156: fclose(file1); fclose(file2); ! 157: ! 158: if (result==1) diagnose ("files different"); ! 159: ! 160: ! 161: } while (cleanup(), ! 162: ++argv, --argc >=1); ! 163: ! 164: ! 165: if (nerror>0) { ! 166: exit(ERRCODE); ! 167: } else { ! 168: exit(result); ! 169: } ! 170: ! 171: } ! 172: ! 173: ! 174: fterror(e, e1, e2) ! 175: char * e, * e1, * e2; ! 176: /* prints error message and terminates program with ERRCODE */ ! 177: { nerror++; ! 178: VOID fprintf(stderr,"%s error: ",cmdid); ! 179: VOID fprintf(stderr,e, e1, e2); ! 180: VOID fprintf(stderr,"\n%s aborted\n",cmdid); ! 181: VOID cleanup(); ! 182: exit(ERRCODE); ! 183: } ! 184:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.