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

1.1     ! root        1: /*
        !             2:  *                     RCS file comparison
        !             3:  */
        !             4: #ifndef lint
        !             5: static char rcsid[]= "$Id: rcsfcmp.c,v 4.5 89/05/01 15:12:42 narten Exp $ Purdue CS";
        !             6: #endif
        !             7: /*****************************************************************************
        !             8:  *                       rcsfcmp()
        !             9:  *                       Testprogram: define FCMPTEST
        !            10:  *****************************************************************************
        !            11:  */
        !            12: 
        !            13: /* Copyright (C) 1982, 1988, 1989 Walter Tichy
        !            14:  * All rights reserved.
        !            15:  *
        !            16:  * Redistribution and use in source and binary forms are permitted
        !            17:  * provided that the above copyright notice and this paragraph are
        !            18:  * duplicated in all such forms and that any documentation,
        !            19:  * advertising materials, and other materials related to such
        !            20:  * distribution and use acknowledge that the software was developed
        !            21:  * by Walter Tichy.
        !            22:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            23:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            24:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            25:  *
        !            26:  * Report all problems and direct all questions to:
        !            27:  *   [email protected]
        !            28:  * 
        !            29: 
        !            30: 
        !            31: 
        !            32: 
        !            33: 
        !            34: 
        !            35: 
        !            36: */
        !            37: 
        !            38: 
        !            39: 
        !            40: 
        !            41: 
        !            42: /* $Log:       rcsfcmp.c,v $
        !            43:  * Revision 4.5  89/05/01  15:12:42  narten
        !            44:  * changed copyright header to reflect current distribution rules
        !            45:  * 
        !            46:  * Revision 4.4  88/11/08  12:01:33  narten
        !            47:  * changes from  [email protected] (Paul Eggert)
        !            48:  * 
        !            49:  * Revision 4.4  88/08/09  19:12:50  eggert
        !            50:  * Shrink stdio code size.
        !            51:  * 
        !            52:  * Revision 4.3  87/12/18  11:40:02  narten
        !            53:  * lint cleanups (Guy Harris)
        !            54:  * 
        !            55:  * Revision 4.2  87/10/18  10:33:06  narten
        !            56:  * updting version number. Changes relative to 1.1 actually relative to 
        !            57:  * 4.1
        !            58:  * 
        !            59:  * Revision 1.2  87/03/27  14:22:19  jenkins
        !            60:  * Port to suns
        !            61:  * 
        !            62:  * Revision 1.1  84/01/23  14:50:23  kcs
        !            63:  * Initial revision
        !            64:  * 
        !            65:  * Revision 4.1  83/05/10  16:24:04  wft
        !            66:  * Marker matching now uses trymatch(). Marker pattern is now
        !            67:  * checked precisely.
        !            68:  * 
        !            69:  * Revision 3.1  82/12/04  13:21:40  wft
        !            70:  * Initial revision.
        !            71:  *
        !            72:  */
        !            73: 
        !            74: /*
        !            75: #define FCMPTEST
        !            76: /* Testprogram; prints out whether two files are identical,
        !            77:  * except for keywords
        !            78:  */
        !            79: 
        !            80: #include  "rcsbase.h"
        !            81: extern FILE * fopen();
        !            82: extern enum markers trymatch(); /* check for keywords */
        !            83: 
        !            84: 
        !            85: rcsfcmp(xfname,uxfname,delta)
        !            86: char * xfname, *uxfname; struct hshentry *delta;
        !            87: /* Function: compares the files xfname and uxfname. Returns true
        !            88:  * if xfname has the same contents as uxfname, while disregarding
        !            89:  * keyword values. For the LOG-keyword, rcsfcmp skips the log message
        !            90:  * given by the parameter delta in xfname. Thus, rcsfcmp returns true
        !            91:  * if xfname contains the same as uxfname, with the keywords expanded.
        !            92:  * Implementation: character-by-character comparison until $ is found.
        !            93:  * If a $ is found, read in the marker keywords; if they are real keywords
        !            94:  * and identical, read in keyword value. If value is terminated properly,
        !            95:  * disregard it and optionally skip log message; otherwise, compare value.
        !            96:  */
        !            97: {
        !            98:     register int xc,uxc;
        !            99:     char xkeyword[keylength+2],   uxkeyword[keylength+2];
        !           100:     char xkeyval[keyvallength+1], uxkeyval[keyvallength+1];
        !           101:     register FILE * xfp, * uxfp;
        !           102:     register char * tp;
        !           103:     int result;
        !           104:     enum markers match1,match2;
        !           105: 
        !           106:     if ((xfp=fopen(tp=xfname,"r"))==NULL || (uxfp=fopen(tp=uxfname,"r"))==NULL) {
        !           107:        faterror("Can't open %s\n", tp);
        !           108:        return false;
        !           109:     }
        !           110:     result=false;
        !           111:     xc=getc(xfp); uxc=getc(uxfp);
        !           112:     while( xc == uxc) { /* comparison loop */
        !           113:         if (xc==EOF) { /* finished; everything is the same*/
        !           114:             result=true;
        !           115:             break;
        !           116:         }
        !           117:         if ( xc!=KDELIM) {
        !           118:             /* get the next characters */
        !           119:             xc=getc(xfp); uxc=getc(uxfp);
        !           120:         } else {
        !           121:             /* try to get both keywords */
        !           122:             tp = xkeyword;
        !           123:             while( (xc=getc(xfp))!=EOF && (tp< xkeyword+keylength) && (xc!='\n')
        !           124:                    && (xc!=KDELIM) && (xc!=VDELIM))
        !           125:                 *tp++ = xc;
        !           126:            *tp++ = xc;  /* add closing K/VDELIM */
        !           127:             *tp='\0';
        !           128:             tp = uxkeyword;
        !           129:             while( (uxc=getc(uxfp))!=EOF && (tp< uxkeyword+keylength) && (uxc!='\n')
        !           130:                    && (uxc!=KDELIM) && (uxc!=VDELIM))
        !           131:                 *tp++ = uxc;
        !           132:            *tp++ = xc;  /* add closing K/VDELIM */
        !           133:             *tp='\0';
        !           134:             /* now we have 2 keywords, or something thal looks like it.*/
        !           135:            match1=trymatch(xkeyword,false);
        !           136:            match2=trymatch(uxkeyword,false);
        !           137:            if (match1 != match2) break; /* not identical */
        !           138: #ifdef FCMPTEST
        !           139:            VOID printf("found potential keywords %s and %s\n",xkeyword,uxkeyword);
        !           140: #endif
        !           141: 
        !           142:            if (match1 == Nomatch) {
        !           143:                /* not a keyword pattern, but could still be identical */
        !           144:                if (strcmp(xkeyword,uxkeyword)==0)
        !           145:                     continue;
        !           146:                else break;
        !           147:            }
        !           148: #ifdef FCMPTEST
        !           149:            VOID printf("found common keyword %s\n",xkeyword);
        !           150: #endif
        !           151:            tp=xkeyval;
        !           152:            if (xc==VDELIM) {/* get value */
        !           153:                while (((xc=getc(xfp))!=KDELIM) && (xc!='\n') && (xc!=EOF) &&
        !           154:                        (tp<xkeyval+keyvallength))
        !           155:                    *tp++ = xc;
        !           156:            }
        !           157:            *tp = '\0';   /*xkeyval now filled with value; possibly empty*/
        !           158:            tp=uxkeyval;
        !           159:            if (uxc==VDELIM) {/* get value */
        !           160:                while (((uxc=getc(uxfp))!=KDELIM) && (uxc!='\n') && (uxc!=EOF) &&
        !           161:                        (tp<uxkeyval+keyvallength))
        !           162:                    *tp++ = uxc;
        !           163:            }
        !           164:            *tp = '\0';   /*uxkeyval now filled with value; possibly empty*/
        !           165:            if (xc!=uxc) break; /* not the same */
        !           166:            if (xc==KDELIM) {
        !           167:                xc=getc(xfp); uxc=getc(uxfp); /* skip closing KDELIM */
        !           168:                /* if the keyword is LOG, also skip the log message in xfp*/
        !           169:                if (match1==Log) {
        !           170:                    /* first, compute the number of line feeds in log msg */
        !           171:                    int lncnt, ccnt;
        !           172:                    lncnt=2; tp=delta->log;
        !           173:                    while(*tp) if(*tp++=='\n') lncnt++;
        !           174:                    while(xc!=EOF) {
        !           175:                        if (xc=='\n')
        !           176:                            if(--lncnt==0) break;
        !           177:                        xc=getc(xfp);
        !           178:                    }
        !           179:                    /* skip last comment leader */
        !           180:                    /* Can't just skip another line here, because there may be */
        !           181:                    /* additional characters on the line (after the Log....$)  */
        !           182:                    for (ccnt=strlen(Comment); ccnt>=0; lncnt--) {
        !           183:                        xc=getc(xfp);
        !           184:                        if(xc=='\n') break;
        !           185:                        /* reads to the end of the comment leader or '\n',     */
        !           186:                        /* whatever comes first. This is because some editors  */
        !           187:                        /* strip off trailing blanks from a leader like " * ". */
        !           188:                    }
        !           189:                }
        !           190:            } else {
        !           191:                /* both end in the same character, but not a KDELIM */
        !           192:                /* must compare string values.*/
        !           193: #ifdef FCMPTEST
        !           194:                VOID printf("non-terminated keywords %s, potentially different values\n",xkeyword);
        !           195: #endif
        !           196:                if (strcmp(xkeyval,uxkeyval)!=0) break; /*different */
        !           197:                xc=getc(xfp); uxc=getc(uxfp); /* skip closing char  */
        !           198:             }
        !           199:         }
        !           200:     }
        !           201:     VOID fclose(xfp); VOID fclose(uxfp);
        !           202:     return result;
        !           203: }
        !           204: 
        !           205: 
        !           206: 
        !           207: #ifdef FCMPTEST
        !           208: char * RCSfilename, * workfilename;
        !           209: 
        !           210: char * Comment;
        !           211: 
        !           212: main(argc, argv)
        !           213: int  argc; char  *argv[];
        !           214: /* first argument: comment leader; 2nd: log message, 3rd: expanded file,
        !           215:  * 4th: unexpanded file
        !           216:  */
        !           217: {       struct hshentry delta;
        !           218: 
        !           219:         cmdid="rcsfcmp";
        !           220:         Comment=argv[1];
        !           221:         delta.log=argv[2];
        !           222:         if (rcsfcmp(argv[3],argv[4],&delta))
        !           223:                 VOID printf("files are the same\n");
        !           224:         else    VOID printf("files are different\n");
        !           225: }
        !           226: #endif

unix.superglobalmegacorp.com

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