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

1.1     ! root        1: /*
        !             2:  *                     RCS file comparison
        !             3:  */
        !             4:  static char rcsid[]=
        !             5:  "$Header: /usr/wft/RCS/SRC/RCS/rcsfcmp.c,v 3.1 82/12/04 13:21:40 wft Exp $ Purdue CS";
        !             6: /*****************************************************************************
        !             7:  *                       rcsfcmp()
        !             8:  *                       Testprogram: define FCMPTEST
        !             9:  *****************************************************************************
        !            10:  *
        !            11:  * Copyright (C) 1982 by Walter F. Tichy
        !            12:  *                       Purdue University
        !            13:  *                       Computer Science Department
        !            14:  *                       West Lafayette, IN 47907
        !            15:  *
        !            16:  * All rights reserved. No part of this software may be sold or distributed
        !            17:  * in any form or by any means without the prior written permission of the
        !            18:  * author.
        !            19:  * Report problems and direct all inquiries to Tichy@purdue (ARPA net).
        !            20:  */
        !            21: 
        !            22: 
        !            23: 
        !            24: /* $Log:       rcsfcmp.c,v $
        !            25:  * Revision 3.1  82/12/04  13:21:40  wft
        !            26:  * Initial revision.
        !            27:  * 
        !            28:  */
        !            29: 
        !            30: /*
        !            31: #define FCMPTEST
        !            32: /* Testprogram; prints out whether two files are identical,
        !            33:  * except for keywords
        !            34:  */
        !            35: 
        !            36: #include  "rcsbase.h"
        !            37: extern FILE * fopen();
        !            38: 
        !            39: 
        !            40: rcsfcmp(xfname,uxfname,delta)
        !            41: char * xfname, *uxfname; struct hshentry *delta;
        !            42: /* Function: compares the files xfname and uxfname. Returns true
        !            43:  * if xfname has the same contents as uxfname, while disregarding
        !            44:  * keyword values. For the LOG-keyword, rcsfcmp skips the log message
        !            45:  * given by the parameter delta in xfname. Thus, rcsfcmp returns true
        !            46:  * if xfname contains the same as uxfname, with the keywords expanded.
        !            47:  */
        !            48: {
        !            49:     register int xc,uxc;
        !            50:     char xkeyword[keylength+2], uxkeyword[keylength+2];
        !            51:     register char * tp;
        !            52:     FILE * xfp, * uxfp;
        !            53:     int result;
        !            54: 
        !            55:     if ((xfp=fopen(tp=xfname,"r"))==NULL || (uxfp=fopen(tp=uxfname,"r"))==NULL) {
        !            56:        faterror("Can't open %s\n", tp);
        !            57:        return false;
        !            58:     }
        !            59:     result=false;
        !            60:     xc=getc(xfp); uxc=getc(uxfp);
        !            61:     while( xc == uxc) { /* comparison loop */
        !            62:         if (xc==EOF) { /* finished; everything is the same*/
        !            63:             result=true;
        !            64:             break;
        !            65:         }
        !            66:         if ( xc!=KDELIM) {
        !            67:             /* get the next characters */
        !            68:             xc=getc(xfp); uxc=getc(uxfp);
        !            69:         } else {
        !            70:             /* try to get both keywords */
        !            71:             tp = xkeyword;
        !            72:             while( ctab[(xc=getc(xfp))]==LETTER && tp< xkeyword+keylength)
        !            73:                 *tp++ = xc;
        !            74:             *tp='\0';
        !            75:             tp = uxkeyword;
        !            76:             while( ctab[(uxc=getc(uxfp))]==LETTER && tp< uxkeyword+keylength)
        !            77:                 *tp++ = uxc;
        !            78:             *tp='\0';
        !            79:             /* now we have 2 keywords, or something thal looks like it.*/
        !            80:             if (strcmp(xkeyword,uxkeyword)!=0) break; /* not the same! */
        !            81:             /* now check whether it's really a keyword */
        !            82:             if (!(strcmp(xkeyword,AUTHOR)==0 || strcmp(xkeyword,DATE)    ==0 ||
        !            83:                   strcmp(xkeyword,HEADER)==0 || strcmp(xkeyword,LOCKER)  ==0 ||
        !            84:                   strcmp(xkeyword,LOG)   ==0 || strcmp(xkeyword,REVISION)==0 ||
        !            85:                   strcmp(xkeyword,SOURCE)==0 || strcmp(xkeyword,STATE)   ==0 )) {
        !            86:                 /* it's not a keyword, so continue normally */
        !            87:                 continue;
        !            88:             } else {
        !            89:                 /* it's a keyword, so skip value */
        !            90:                 while (xc!=KDELIM && xc!='\n' && xc!=EOF) xc=getc(xfp);
        !            91:                 while (uxc!=KDELIM && uxc!='\n' && uxc!=EOF) uxc=getc(uxfp);
        !            92:                 if (xc==uxc && xc==KDELIM) {
        !            93:                     xc=getc(xfp); uxc=getc(uxfp); /* skip KDELIM */
        !            94:                     /* if the keyword is LOG, also skip the log message in xfp*/
        !            95:                     if (strcmp(xkeyword,LOG)==0) {
        !            96:                         /* first, compute the number of line feeds in log msg */
        !            97:                         int lncnt;
        !            98:                         lncnt=2; tp=delta->log;
        !            99:                         while(*tp) if(*tp++=='\n') lncnt++;
        !           100:                         while(xc!=EOF) {
        !           101:                             if (xc=='\n')
        !           102:                                 if(--lncnt==0) break;
        !           103:                             xc=getc(xfp);
        !           104:                         }
        !           105:                         /* skip last comment leader */
        !           106:                         for (lncnt=strlen(Comment); lncnt>=0; lncnt--) xc=getc(xfp);
        !           107:                     }
        !           108:                 }
        !           109:             }
        !           110:         }
        !           111:     }
        !           112:     fclose(xfp);fclose(uxfp);
        !           113:     return result;
        !           114: }
        !           115: 
        !           116: 
        !           117: 
        !           118: #ifdef FCMPTEST
        !           119: cleanup(){} /* dummy */
        !           120: 
        !           121: char * Comment;
        !           122: 
        !           123: main(argc, argv)
        !           124: int  argc; char  *argv[];
        !           125: /* first argument: comment leader; 2nd: log message, 3rd: expanded file,
        !           126:  * 4th: unexpanded file
        !           127:  */
        !           128: {       struct hshentry delta;
        !           129: 
        !           130:         cmdid="rcsfcmp";
        !           131:         Comment=argv[1];
        !           132:         delta.log=argv[2];
        !           133:         if (rcsfcmp(argv[3],argv[4],&delta))
        !           134:                 printf("files are the same\n");
        !           135:         else    printf("files are different\n");
        !           136: }
        !           137: #endif

unix.superglobalmegacorp.com

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