Annotation of 43BSDTahoe/new/rcs/src/rcsclean.c, revision 1.1.1.1

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: 

unix.superglobalmegacorp.com

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