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

1.1       root        1: /*
                      2:  *                     RCS rcsdiff operation
                      3:  */
                      4: #ifndef lint
                      5: static char rcsid[]=
                      6: "$Header: /usr/src/new/rcs/src/RCS/rcsdiff.c,v 3.9 88/02/18 11:55:57 bostic Exp $ Purdue CS";
                      7: #endif
                      8: /*****************************************************************************
                      9:  *                       generate difference between RCS revisions
                     10:  *****************************************************************************
                     11:  *
                     12:  * Copyright (C) 1982 by Walter F. Tichy
                     13:  *                       Purdue University
                     14:  *                       Computer Science Department
                     15:  *                       West Lafayette, IN 47907
                     16:  *
                     17:  * All rights reserved. No part of this software may be sold or distributed
                     18:  * in any form or by any means without the prior written permission of the
                     19:  * author.
                     20:  * Report problems and direct all inquiries to Tichy@purdue (ARPA net).
                     21:  */
                     22: 
                     23: 
                     24: /* $Log:       rcsdiff.c,v $
                     25:  * Revision 3.9  88/02/18  11:55:57  bostic
                     26:  * replaced with version 4
                     27:  * 
                     28:  * Revision 4.4  87/12/18  11:37:46  narten
                     29:  * changes Jay Lepreau made in the 4.3 BSD version, to add support for
                     30:  * "-i", "-w", and "-t" flags and to permit flags to be bundled together, 
                     31:  * merged in.
                     32:  * 
                     33:  * Revision 4.3  87/10/18  10:31:42  narten
                     34:  * Updating version numbers. Changes relative to 1.1 actually
                     35:  * relative to 4.1
                     36:  * 
                     37:  * Revision 1.3  87/09/24  13:59:21  narten
                     38:  * Sources now pass through lint (if you ignore printf/sprintf/fprintf 
                     39:  * warnings)
                     40:  * 
                     41:  * Revision 1.2  87/03/27  14:22:15  jenkins
                     42:  * Port to suns
                     43:  * 
                     44:  * Revision 1.1  84/01/23  14:50:18  kcs
                     45:  * Initial revision
                     46:  * 
                     47:  * Revision 4.1  83/05/03  22:13:19  wft
                     48:  * Added default branch, option -q, exit status like diff.
                     49:  * Added fterror() to replace faterror().
                     50:  * 
                     51:  * Revision 3.6  83/01/15  17:52:40  wft
                     52:  * Expanded mainprogram to handle multiple RCS files.
                     53:  *
                     54:  * Revision 3.5  83/01/06  09:33:45  wft
                     55:  * Fixed passing of -c (context) option to diff.
                     56:  *
                     57:  * Revision 3.4  82/12/24  15:28:38  wft
                     58:  * Added call to catchsig().
                     59:  *
                     60:  * Revision 3.3  82/12/10  16:08:17  wft
                     61:  * Corrected checking of return code from diff; improved error msgs.
                     62:  *
                     63:  * Revision 3.2  82/12/04  13:20:09  wft
                     64:  * replaced getdelta() with gettree(). Changed diagnostics.
                     65:  *
                     66:  * Revision 3.1  82/11/28  19:25:04  wft
                     67:  * Initial revision.
                     68:  *
                     69:  */
                     70: #include <ctype.h>
                     71: #include "rcsbase.h"
                     72: #define ERRCODE 2                   /*error code for exit status            */
                     73: #ifndef lint
                     74: static char rcsbaseid[] = RCSBASE;
                     75: #endif
                     76: 
                     77: extern int    cleanup();            /* cleanup after signals                */
                     78: extern char * mktempfile();         /*temporary file name generator         */
                     79: extern int    fterror();            /*forward for special fatal error func. */
                     80: extern struct hshentry * genrevs(); /*generate delta numbers                */
                     81: extern int    nerror;               /*counter for errors                    */
                     82: extern int    quietflag;            /*suppresses diagnostics                */
                     83: extern FILE * finptr;               /* RCS input file                       */
                     84: 
                     85: char *RCSfilename;
                     86: char *workfilename;
                     87: char * temp1file, * temp2file;
                     88: 
                     89: char bops[10] = "-";
                     90: char otherops[10] = "-";
                     91: 
                     92: main (argc, argv)
                     93: int argc; char **argv;
                     94: {
                     95:         char * cmdusage;
                     96:         char command[NCPPN+revlength+40];
                     97:         int  revnums;                 /* counter for revision numbers given */
                     98:         char * rev1, * rev2;          /* revision numbers from command line */
                     99:         char numericrev[revlength];   /* holds expanded revision number     */
                    100:         char * xrev1, * xrev2;        /* expanded revision numbers          */
                    101:         struct hshentry * gendeltas[hshsize];/*stores deltas to be generated*/
                    102:         struct hshentry * target;
                    103:        char * boption, * otheroption;
                    104:         int  exit_stats;
                    105:         int  filecounter;
                    106:        char *argp;
                    107:        register c;
                    108: 
                    109:         catchints();
                    110:         otheroption = otherops + 1;
                    111:        boption = bops + 1;
                    112:         cmdid = "rcsdiff";
                    113:        cmdusage = "command format:\n    rcsdiff [-biwt] [-q] [-cefhn] [-rrev1] [-rrev2] file";
                    114:         filecounter=revnums=0;
                    115:         while (--argc,++argv, argc>=1 && ((*argv)[0] == '-')) {
                    116:            argp = &((*argv)[1]);
                    117:            while (c = *argp++) switch (c) {
                    118:                 case 'r':
                    119:                        if (*argp!='\0') {
                    120:                             if (revnums==0) {
                    121:                                     rev1= argp; revnums=1;
                    122:                             } elif (revnums==1) {
                    123:                                     rev2= argp; revnums=2;
                    124:                             } else {
                    125:                                    fterror("too many revision numbers");
                    126:                             }
                    127:                         } /* do nothing for empty -r */
                    128:                        argp += strlen(argp);
                    129:                         break;
                    130:                 case 'b':
                    131:                 case 'i':
                    132:                 case 'w':
                    133:                 case 't':
                    134:                        *boption++ = c;
                    135:                        break;
                    136:                case 'q':
                    137:                        quietflag=true;
                    138:                        break;
                    139:                 case 'c':
                    140:                 case 'e':
                    141:                 case 'f':
                    142:                 case 'h':
                    143:                 case 'n':
                    144:                         if (otheroption == otherops + 1) {
                    145:                                *otheroption++ = c;
                    146:                                if (c == 'c' && isdigit(*argp)) {
                    147:                                        while (isdigit(*argp))
                    148:                                                *otheroption++ = *argp++;
                    149:                                        if (*argp)
                    150:                                                faterror("-c: bad count");
                    151:                                        argp = "";
                    152:                                }
                    153:                         } else {
                    154:                                fterror("Options c,e,f,h,n are mutually exclusive");
                    155:                         }
                    156:                        break;
                    157:                 default:
                    158:                        fterror("unknown option: %s\n%s", *argv,cmdusage);
                    159:                 };
                    160:         } /* end of option processing */
                    161: 
                    162:        if (boption != bops + 1) {
                    163:            *boption = ' ';
                    164:            boption = bops;
                    165:        }
                    166:        if (otheroption != otherops + 1) {
                    167:            *otheroption = ' ';
                    168:            otheroption = otherops;
                    169:        }
                    170:        if (argc<1) fterror("No input file\n%s",cmdusage);
                    171: 
                    172:         /* now handle all filenames */
                    173:         do {
                    174:                 finptr=NULL;
                    175: 
                    176:                 if (pairfilenames(argc,argv,true,false)!=1) continue;
                    177:                 if (++filecounter>1)
                    178:                         diagnose("===================================================================");
                    179:                 diagnose("RCS file: %s",RCSfilename);
                    180:                 if (revnums<2 && !(access(workfilename,4)==0)) {
                    181:                         error("Can't open %s",workfilename);
                    182:                         continue;
                    183:                 }
                    184:                 if (!trysema(RCSfilename,false)) continue; /* give up */
                    185: 
                    186: 
                    187:                 gettree(); /* reads in the delta tree */
                    188: 
                    189:                 if (Head==nil) {
                    190:                         error("no revisions present");
                    191:                         continue;
                    192:                 }
                    193:                 if (revnums==0)
                    194:                         rev1=Dbranch!=nil?Dbranch->num:Head->num; /* default rev1 */
                    195: 
                    196:                 if (!expandsym(rev1,numericrev)) continue;
                    197:                 if (!(target=genrevs(numericrev,(char *)nil,(char *)nil,(char *)nil,gendeltas))) continue;
                    198:                 xrev1=target->num;
                    199: 
                    200:                 if (revnums==2) {
                    201:                         if (!expandsym(rev2,numericrev)) continue;
                    202:                         if (!(target=genrevs(numericrev,(char *)nil,(char *)nil,(char *)nil,gendeltas))) continue;
                    203:                         xrev2=target->num;
                    204:                 }
                    205: 
                    206: 
                    207:                 temp1file=mktempfile("/tmp/",TMPFILE1);
                    208:                 diagnose("retrieving revision %s",xrev1);
                    209:                 VOID sprintf(command,"%s/co -q -p%s %s > %s\n",
                    210:                         TARGETDIR,xrev1,RCSfilename,temp1file);
                    211:                 if (system(command)){
                    212:                         error("co failed");
                    213:                         continue;
                    214:                 }
                    215:                 if (revnums<=1) {
                    216:                         temp2file=workfilename;
                    217:                        diagnose("diff %s%s-r%s %s",boption,otheroption,xrev1,workfilename);
                    218:                 } else {
                    219:                         temp2file=mktempfile("/tmp/",TMPFILE2);
                    220:                         diagnose("retrieving revision %s",xrev2);
                    221:                         VOID sprintf(command,"%s/co -q -p%s %s > %s\n",
                    222:                                 TARGETDIR,xrev2,RCSfilename,temp2file);
                    223:                         if (system(command)){
                    224:                                 error("co failed");
                    225:                                 continue;
                    226:                         }
                    227:                         diagnose("diff %s%s-r%s -r%s",boption,otheroption,xrev1,xrev2);
                    228:                 }
                    229:                 VOID sprintf(command,"%s %s%s%s %s\n",DIFF,boption,
                    230:                         otheroption, temp1file, temp2file);
                    231:                 exit_stats = system (command);
                    232:                 if (exit_stats != 0 && exit_stats != (1 << BYTESIZ)) {
                    233:                         error ("diff failed");
                    234:                         continue;
                    235:                 }
                    236:         } while (cleanup(),
                    237:                  ++argv, --argc >=1);
                    238: 
                    239: 
                    240:        if (nerror>0) {
                    241:                exit(ERRCODE);
                    242:        } else {
                    243:                exit(exit_stats>>BYTESIZ);
                    244:                /* return exit status from diff */
                    245:        }
                    246: 
                    247: }
                    248: 
                    249: 
                    250: /*VARARGS3*/
                    251: fterror(e, e1, e2)
                    252: char * e, * e1, * e2;
                    253: /* prints error message and terminates program with ERRCODE */
                    254: {       nerror++;
                    255:         VOID fprintf(stderr,"%s error: ",cmdid);
                    256:        VOID fprintf(stderr,e, e1, e2);
                    257:         VOID fprintf(stderr,"\n%s aborted\n",cmdid);
                    258:         VOID cleanup();
                    259:        exit(ERRCODE);
                    260: }
                    261: 

unix.superglobalmegacorp.com

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