home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / CMDS / rcs4.lha / rcsclean.c < prev    next >
Text File  |  1993-03-03  |  6KB  |  194 lines

  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. char    tmpdir[80];
  57.  
  58. main (argc, argv)
  59. int argc; char **argv;
  60. {
  61.         char * cmdusage;
  62.         char command[NCPPN+revlength+40];
  63.     char * rev;                   /* revision number from command line  */
  64.         char numericrev[revlength];   /* holds expanded revision number     */
  65.     int  revnums;                 /* number of -r options               */
  66.         struct hshentry * gendeltas[hshsize];/*stores deltas to be generated*/
  67.         struct hshentry * target;
  68.         int  filecounter;
  69.     register int c1;              /* reading input                      */
  70.     int  result;                  /* result of comparison               */
  71.     int pairresult;               /* reulst of pairfilenames            */
  72.  
  73.     cmdusage = getenv("TMPDIR");
  74.     if (cmdusage == NULL) {
  75.         cmdusage = "/dd/tmp";
  76.     }
  77.     strcpy(tmpdir,cmdusage);
  78.     strcat(tmpdir,"/");
  79.  
  80.         catchints();
  81.     cmdid = "rcsclean";
  82.     cmdusage = "command format:\n    rcsclean [-rrev] file";
  83.         filecounter=revnums=0;
  84.     quietflag=true; /* default no diagnostics */
  85.         while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) {
  86.                 switch ((*argv)[1]) {
  87.                 case 'r':
  88.         revno:  if ((*argv)[2]!='\0') {
  89.                             if (revnums==0) {
  90.                     rev= *argv+2; revnums=1;
  91.                             } else {
  92.                     fterror("too many revision numbers");
  93.                             }
  94.                         } /* do nothing for empty -r */
  95.                         break;
  96.         case 'D': /* debug option */
  97.             quietflag = false;
  98.             break;
  99.  
  100.                 default:
  101.             fterror("unknown option: %s\n%s", *argv,cmdusage);
  102.                 };
  103.         } /* end of option processing */
  104.  
  105.     if (argc<1) fterror("No input file\n%s",cmdusage);
  106.  
  107.         /* now handle all filenames */
  108.         do {
  109.                 finptr=NULL;
  110.         pairresult=pairfilenames(argc,argv,false,false);
  111.  
  112.         if (pairresult==0) continue; /* error */
  113.         if (!(access(workfilename,1)==0)) {
  114.             diagnose("Can't open %s",workfilename);
  115.                         continue;
  116.         } elsif (pairresult == -1) {
  117.             warn("Can't find RCS file for %s",workfilename);
  118.             continue;
  119.         }
  120.                 diagnose("RCS file: %s",RCSfilename);
  121.                 if (!trysema(RCSfilename,false)) continue; /* give up */
  122.  
  123.  
  124.                 gettree(); /* reads in the delta tree */
  125.  
  126.                 if (Head==nil) {
  127.                         error("no revisions present");
  128.                         continue;
  129.                 }
  130.                 if (revnums==0)
  131.             rev=(Dbranch!=nil?Dbranch->num:Head->num); /* default rev1 */
  132.  
  133.         if (!expandsym(rev,numericrev)) continue;
  134.                 if (!(target=genrevs(numericrev,nil,nil,nil,gendeltas))) continue;
  135.  
  136.         tempfile=mktempfile(tmpdir,TMPFILE1);
  137.         diagnose("retrieving revision %s",target->num);
  138.                 sprintf(command,"%s/co -q -p%s %s >-%s\n",
  139.             TARGETDIR,target->num,RCSfilename,tempfile);
  140.                 if (system(command)){
  141.                         error("co failed");
  142.                         continue;
  143.                 }
  144.         /* now do comparison */
  145.         if ((file1=fopen(tempfile,"r"))==NULL) {
  146.             error("Can't open checked out file %s",tempfile);
  147.             continue;
  148.         }
  149.         if ((file2=fopen(workfilename,"r"))==NULL) {
  150.             error("Can't open %s",workfilename);
  151.             continue;
  152.         }
  153.         result=1;
  154.         while ((c1=getc(file1))==getc(file2)) {
  155.             if (c1==EOF) {
  156.                 /* identical files; can remove working file */
  157.                 result=0;
  158.                 diagnose("files identical; %s removed",workfilename);
  159.                 if (unlink(workfilename)!=0) {
  160.                     error("Can't unlink %s",workfilename);
  161.                 }
  162.                 break;
  163.             }
  164.         }
  165.         fclose(file1); fclose(file2);
  166.  
  167.         if (result==1) diagnose ("files different");
  168.  
  169.  
  170.         } while (cleanup(),
  171.                  ++argv, --argc >=1);
  172.  
  173.  
  174.     if (nerror>0) {
  175.         exit(ERRCODE);
  176.     } else {
  177.         exit(result);
  178.     }
  179.  
  180. }
  181.  
  182.  
  183. fterror(e, e1, e2)
  184. char * e, * e1, * e2;
  185. /* prints error message and terminates program with ERRCODE */
  186. {       nerror++;
  187.         VOID fprintf(stderr,"%s error: ",cmdid);
  188.     VOID fprintf(stderr,e, e1, e2);
  189.         VOID fprintf(stderr,"\n%s aborted\n",cmdid);
  190.         VOID cleanup();
  191.     exit(ERRCODE);
  192. }
  193.  
  194.