home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / RCS_SRC.ZIP / RCSCLEAN.C < prev    next >
C/C++ Source or Header  |  1991-01-15  |  7KB  |  209 lines

  1. /*
  2.  *                     RCS rcsclean operation
  3.  */
  4.  
  5. static char rcsid[]=
  6. "$Header $ Purdue CS";
  7. /*****************************************************************************
  8.  *                       remove unneded working files
  9.  *****************************************************************************
  10.  */
  11.  
  12. /* Copyright (C) 1982, 1988, 1989 Walter Tichy
  13.    Distributed under license by the Free Software Foundation, Inc.
  14.  
  15. This file is part of RCS.
  16.  
  17. RCS is free software; you can redistribute it and/or modify
  18. it under the terms of the GNU General Public License as published by
  19. the Free Software Foundation; either version 1, or (at your option)
  20. any later version.
  21.  
  22. RCS is distributed in the hope that it will be useful,
  23. but WITHOUT ANY WARRANTY; without even the implied warranty of
  24. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  25. GNU General Public License for more details.
  26.  
  27. You should have received a copy of the GNU General Public License
  28. along with RCS; see the file COPYING.  If not, write to
  29. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  30.  
  31. Report problems and direct all questions to:
  32.  
  33.     rcs-bugs@cs.purdue.edu
  34.  
  35. */
  36.  
  37.  
  38.  
  39.  
  40. /* $Log:    rcsclean.c,v $
  41.  * Revision 4.4  89/05/01  15:12:21  narten
  42.  * changed copyright header to reflect current distribution rules
  43.  * 
  44.  * Revision 4.3  88/11/08  15:59:54  narten
  45.  * removed reference to TARGETDIR
  46.  * 
  47.  * Revision 4.2  87/10/18  10:30:43  narten
  48.  * Updating version numbers. Changes relative to 1.1 are actually
  49.  * relative to 4.1
  50.  * 
  51.  * Revision 1.2  87/09/24  13:59:13  narten
  52.  * Sources now pass through lint (if you ignore printf/sprintf/fprintf 
  53.  * warnings)
  54.  * 
  55.  * Revision 1.1  84/01/23  14:50:16  kcs
  56.  * Initial revision
  57.  * 
  58.  * Revision 4.1  83/12/15  12:26:18  wft
  59.  * Initial revision.
  60.  * 
  61.  */
  62. #include "rcsbase.h"
  63. #define ERRCODE 2                   /*error code for exit status            */
  64. static char rcsbaseid[] = RCSBASE;
  65.  
  66. extern int    cleanup();            /* cleanup after signals                */
  67. extern char * mktempfile();         /*temporary file name generator         */
  68. extern int    fterror();            /*forward for special fatal error func. */
  69. extern struct hshentry * genrevs(); /*generate delta numbers                */
  70. extern int    nerror;               /*counter for errors                    */
  71. extern int    quietflag;            /*suppresses diagnostics                */
  72. extern FILE * finptr;               /* RCS input file                       */
  73. extern FILE * fopen();
  74.  
  75. char *RCSfilename;
  76. char *workfilename;
  77. char * tempfile;
  78. FILE * file1, * file2;              /*file descriptors for comparison       */
  79.  
  80. main (argc, argv)
  81. int argc; char **argv;
  82. {
  83.         char * cmdusage;
  84.         char command[NCPPN+revlength+40];
  85.     char * rev;                   /* revision number from command line  */
  86.         char numericrev[revlength];   /* holds expanded revision number     */
  87.     int  revnums;                 /* number of -r options               */
  88.         struct hshentry * gendeltas[hshsize];/*stores deltas to be generated*/
  89.         struct hshentry * target;
  90.         int  filecounter;
  91.     register int c1;              /* reading input                      */
  92.     int  result;                  /* result of comparison               */
  93.     int pairresult;               /* reulst of pairfilenames            */
  94.  
  95.         catchints();
  96.     cmdid = "rcsclean";
  97.     cmdusage = "command format:\n    rcsclean [-rrev] file";
  98.         filecounter=revnums=0;
  99.     quietflag=true; /* default no diagnostics */
  100.         while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) {
  101.                 switch ((*argv)[1]) {
  102.                 case 'r':
  103.         revno:  if ((*argv)[2]!='\0') {
  104.                             if (revnums==0) {
  105.                     rev= *argv+2; revnums=1;
  106.                             } else {
  107.                     fterror("too many revision numbers");
  108.                             }
  109.                         } /* do nothing for empty -r */
  110.                         break;
  111.         case 'D': /* debug option */
  112.             quietflag = false;
  113.             break;
  114.  
  115.                 default:
  116.             fterror("unknown option: %s\n%s", *argv,cmdusage);
  117.                 };
  118.         } /* end of option processing */
  119.  
  120.     if (argc<1) fterror("No input file\n%s",cmdusage);
  121.  
  122.         /* now handle all filenames */
  123.         do {
  124.                 finptr=NULL;
  125.         pairresult=pairfilenames(argc,argv,false,false);
  126.  
  127.         if (pairresult==0) continue; /* error */
  128.         if (!(access(workfilename,4)==0)) {
  129.             diagnose("Can't open %s",workfilename);
  130.                         continue;
  131.         } elsif (pairresult == -1) {
  132.             warn("Can't find RCS file for %s",workfilename);
  133.             continue;
  134.         }
  135.                 diagnose("RCS file: %s",RCSfilename);
  136.                 if (!trysema(RCSfilename,false)) continue; /* give up */
  137.  
  138.  
  139.                 gettree(); /* reads in the delta tree */
  140.  
  141.                 if (Head==nil) {
  142.                         error("no revisions present");
  143.                         continue;
  144.                 }
  145.                 if (revnums==0)
  146.             rev=(Dbranch!=nil?Dbranch->num:Head->num); /* default rev1 */
  147.  
  148.         if (!expandsym(rev,numericrev)) continue;
  149.                 if (!(target=genrevs(numericrev,nil,nil,nil,gendeltas))) continue;
  150.  
  151.         tempfile=mktempfile("/tmp/",TMPFILE1);
  152.         diagnose("retrieving revision %s",target->num);
  153.                 VOID sprintf(command,"%s -q -p%s %s > %s\n",
  154.             CO ,target->num,RCSfilename,tempfile);
  155.                 if (system(command)){
  156.                         error("co failed");
  157.                         continue;
  158.                 }
  159.         /* now do comparison */
  160.         if ((file1=fopen(tempfile,"r"))==NULL) {
  161.             error("Can't open checked out file %s",tempfile);
  162.             continue;
  163.         }
  164.         if ((file2=fopen(workfilename,"r"))==NULL) {
  165.             error("Can't open %s",workfilename);
  166.             continue;
  167.         }
  168.         result=1;
  169.         while ((c1=getc(file1))==getc(file2)) {
  170.             if (c1==EOF) {
  171.                 /* identical files; can remove working file */
  172.                 result=0;
  173.                 diagnose("files identical; %s removed",workfilename);
  174.                 if (unlink(workfilename)!=0) {
  175.                     error("Can't unlink %s",workfilename);
  176.                 }
  177.                 break;
  178.             }
  179.         }
  180.         fclose(file1); fclose(file2);
  181.  
  182.         if (result==1) diagnose ("files different");
  183.  
  184.  
  185.         } while (cleanup(),
  186.                  ++argv, --argc >=1);
  187.  
  188.  
  189.     if (nerror>0) {
  190.         exit(ERRCODE);
  191.     } else {
  192.         exit(result);
  193.     }
  194.  
  195. }
  196.  
  197.  
  198. fterror(e, e1, e2)
  199. char * e, * e1, * e2;
  200. /* prints error message and terminates program with ERRCODE */
  201. {       nerror++;
  202.         VOID fprintf(stderr,"%s error: ",cmdid);
  203.     VOID fprintf(stderr,e, e1, e2);
  204.         VOID fprintf(stderr,"\n%s aborted\n",cmdid);
  205.         VOID cleanup();
  206.     exit(ERRCODE);
  207. }
  208.  
  209.