Annotation of 43BSD/contrib/rcs/src/rcsdiff.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *                     RCS rcsdiff operation
        !             3:  */
        !             4:  static char rcsid[]=
        !             5:  "$Header: rcsdiff.c,v 3.7 86/05/19 02:36:16 lepreau Exp $ Purdue CS";
        !             6: /*****************************************************************************
        !             7:  *                       generate difference between RCS revisions
        !             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:       rcsdiff.c,v $
        !            23:  * Revision 3.7  86/05/19  02:36:16  lepreau
        !            24:  * Pass on new diff options, and allow them to be clustered.
        !            25:  * 
        !            26:  * Revision 3.6  83/01/15  17:52:40  wft
        !            27:  * Expanded mainprogram to handle multiple RCS files.
        !            28:  * 
        !            29:  * Revision 3.5  83/01/06  09:33:45  wft
        !            30:  * Fixed passing of -c (context) option to diff.
        !            31:  *
        !            32:  * Revision 3.4  82/12/24  15:28:38  wft
        !            33:  * Added call to catchsig().
        !            34:  *
        !            35:  * Revision 3.3  82/12/10  16:08:17  wft
        !            36:  * Corrected checking of return code from diff; improved error msgs.
        !            37:  *
        !            38:  * Revision 3.2  82/12/04  13:20:09  wft
        !            39:  * replaced getdelta() with gettree(). Changed diagnostics.
        !            40:  *
        !            41:  * Revision 3.1  82/11/28  19:25:04  wft
        !            42:  * Initial revision.
        !            43:  *
        !            44:  */
        !            45: #include "rcsbase.h"
        !            46: static char rcsbaseid[] = RCSBASE;
        !            47: 
        !            48: extern int    cleanup();            /* cleanup after signals                */
        !            49: extern char * mktempfile();         /*temporary file name generator         */
        !            50: extern struct hshentry * genrevs(); /*generate delta numbers                */
        !            51: extern int    nerror;               /*counter for errors                    */
        !            52: extern FILE * finptr;               /* RCS input file                       */
        !            53: 
        !            54: char *RCSfilename;
        !            55: char *workfilename;
        !            56: char * temp1file, * temp2file;
        !            57: 
        !            58: char bops[10] = "-";
        !            59: 
        !            60: main (argc, argv)
        !            61: int argc; char **argv;
        !            62: {
        !            63:         char * cmdusage;
        !            64:         char command[NCPPN+revlength+40];
        !            65:         int  revnums;                 /* counter for revision numbers given */
        !            66:         char * rev1, * rev2;          /* revision numbers from command line */
        !            67:         char numericrev[revlength];   /* holds expanded revision number     */
        !            68:         char * xrev1, * xrev2;        /* expanded revision numbers          */
        !            69:         struct hshentry * gendeltas[hshsize];/*stores deltas to be generated*/
        !            70:         struct hshentry * target;
        !            71:         char * boption, * otheroption;
        !            72:         int  exit_stats;
        !            73:         int  filecounter;
        !            74:        char *argp;
        !            75:        register c;
        !            76: 
        !            77:         catchints();
        !            78:         otheroption="";
        !            79:        boption = bops + 1;
        !            80:         cmdid = "rcsdiff";
        !            81:         cmdusage = "command format:\n    rcsdiff [-biwt] [-cefhn] [-rrev1] [-rrev2] file";
        !            82:         filecounter=revnums=0;
        !            83:         while (--argc,++argv, argc>=1 && argv[0][0] == '-') {
        !            84:            argp = &argv[0][1];
        !            85:            while (c = *argp++) switch (c) {
        !            86:                 case 'r':
        !            87:                         if (*argp != '\0') {
        !            88:                             if (revnums==0) {
        !            89:                                     rev1= argp; revnums=1;
        !            90:                             } elif (revnums==1) {
        !            91:                                     rev2= argp; revnums=2;
        !            92:                             } else {
        !            93:                                     faterror("too many revision numbers");
        !            94:                             }
        !            95:                         } /* do nothing for empty -r */
        !            96:                        argp += strlen(argp);
        !            97:                         break;
        !            98:                 case 'b':
        !            99:                 case 'i':
        !           100:                 case 'w':
        !           101:                 case 't':
        !           102:                        *boption++ = c;
        !           103:                         break;
        !           104:                 case 'c':
        !           105:                 case 'e':
        !           106:                 case 'f':
        !           107:                 case 'h':
        !           108:                 case 'n':
        !           109:                         if (*otheroption=='\0') {
        !           110:                                 otheroption= argp-2;
        !           111:                         } else {
        !           112:                                 faterror("Options c,e,f,h,n are mutually exclusive");
        !           113:                         }
        !           114:                         break;
        !           115:                 default:
        !           116:                         faterror("unknown option: %s\n%s", *argv,cmdusage);
        !           117:                 };
        !           118:         } /* end of option processing */
        !           119:        if (boption != bops + 1) {
        !           120:            *boption = ' ';
        !           121:            boption = bops;
        !           122:        }
        !           123:         if (argc<1) faterror("No input file\n%s",cmdusage);
        !           124: 
        !           125:         /* now handle all filenames */
        !           126:         do {
        !           127:                 finptr=NULL;
        !           128: 
        !           129:                 if (pairfilenames(argc,argv,true,false)!=1) continue;
        !           130:                 if (++filecounter>1)
        !           131:                         diagnose("===================================================================");
        !           132:                 diagnose("RCS file: %s",RCSfilename);
        !           133:                 if (revnums<2 && !(access(workfilename,4)==0)) {
        !           134:                         error("Can't open %s",workfilename);
        !           135:                         continue;
        !           136:                 }
        !           137:                 if (!trysema(RCSfilename,false)) continue; /* give up */
        !           138: 
        !           139: 
        !           140:                 gettree(); /* reads in the delta tree */
        !           141: 
        !           142:                 if (Head==nil) {
        !           143:                         error("no revisions present");
        !           144:                         continue;
        !           145:                 }
        !           146:                 if (revnums==0) rev1=Head->num; /* default rev1 */
        !           147: 
        !           148:                 if (!expandsym(rev1,numericrev)) continue;
        !           149:                 if (!(target=genrevs(numericrev,nil,nil,nil,gendeltas))) continue;
        !           150:                 xrev1=target->num;
        !           151: 
        !           152:                 if (revnums==2) {
        !           153:                         if (!expandsym(rev2,numericrev)) continue;
        !           154:                         if (!(target=genrevs(numericrev,nil,nil,nil,gendeltas))) continue;
        !           155:                         xrev2=target->num;
        !           156:                 }
        !           157: 
        !           158: 
        !           159:                 temp1file=mktempfile("/tmp/",TMPFILE1);
        !           160:                 diagnose("retrieving revision %s",xrev1);
        !           161:                 sprintf(command,"%s/co -q -p%s %s > %s\n",
        !           162:                         TARGETDIR,xrev1,RCSfilename,temp1file);
        !           163:                 if (system(command)){
        !           164:                         error("co failed");
        !           165:                         continue;
        !           166:                 }
        !           167:                 if (revnums<=1) {
        !           168:                         temp2file=workfilename;
        !           169:                         diagnose("diff %s%s -r%s %s",boption,otheroption,xrev1,workfilename);
        !           170:                 } else {
        !           171:                         temp2file=mktempfile("/tmp/",TMPFILE2);
        !           172:                         diagnose("retrieving revision %s",xrev2);
        !           173:                         sprintf(command,"%s/co -q -p%s %s > %s\n",
        !           174:                                 TARGETDIR,xrev2,RCSfilename,temp2file);
        !           175:                         if (system(command)){
        !           176:                                 error("co failed");
        !           177:                                 continue;
        !           178:                         }
        !           179:                         diagnose("diff %s%s -r%s -r%s",boption,otheroption,xrev1,xrev2);
        !           180:                 }
        !           181:                 sprintf(command,"%s %s %s %s %s\n",DIFF,boption,
        !           182:                         otheroption, temp1file, temp2file);
        !           183:                 exit_stats = system (command);
        !           184:                 if (exit_stats != 0 && exit_stats != (1 << BYTESIZ)) {
        !           185:                         error ("diff failed");
        !           186:                         continue;
        !           187:                 }
        !           188:         } while (cleanup(),
        !           189:                  ++argv, --argc >=1);
        !           190: 
        !           191: 
        !           192:         exit(nerror!=0);
        !           193: 
        !           194: }
        !           195: 

unix.superglobalmegacorp.com

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