home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
RCS_SRC.ZIP
/
RCSFCMP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-01-15
|
7KB
|
227 lines
/*
* RCS file comparison
*/
#ifndef lint
static char rcsid[]= "$Id: rcsfcmp.c,v 4.5 89/05/01 15:12:42 narten Exp $ Purdue CS";
#endif
/*****************************************************************************
* rcsfcmp()
* Testprogram: define FCMPTEST
*****************************************************************************
*/
/* Copyright (C) 1982, 1988, 1989 Walter Tichy
Distributed under license by the Free Software Foundation, Inc.
This file is part of RCS.
RCS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 1, or (at your option)
any later version.
RCS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with RCS; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
Report problems and direct all questions to:
rcs-bugs@cs.purdue.edu
*/
/* $Log: rcsfcmp.c,v $
* Revision 4.5 89/05/01 15:12:42 narten
* changed copyright header to reflect current distribution rules
*
* Revision 4.4 88/11/08 12:01:33 narten
* changes from eggert@sm.unisys.com (Paul Eggert)
*
* Revision 4.4 88/08/09 19:12:50 eggert
* Shrink stdio code size.
*
* Revision 4.3 87/12/18 11:40:02 narten
* lint cleanups (Guy Harris)
*
* Revision 4.2 87/10/18 10:33:06 narten
* updting version number. Changes relative to 1.1 actually relative to
* 4.1
*
* Revision 1.2 87/03/27 14:22:19 jenkins
* Port to suns
*
* Revision 1.1 84/01/23 14:50:23 kcs
* Initial revision
*
* Revision 4.1 83/05/10 16:24:04 wft
* Marker matching now uses trymatch(). Marker pattern is now
* checked precisely.
*
* Revision 3.1 82/12/04 13:21:40 wft
* Initial revision.
*
*/
/*
#define FCMPTEST
/* Testprogram; prints out whether two files are identical,
* except for keywords
*/
#include "rcsbase.h"
extern FILE * fopen();
extern enum markers trymatch(); /* check for keywords */
rcsfcmp(xfname,uxfname,delta)
char * xfname, *uxfname; struct hshentry *delta;
/* Function: compares the files xfname and uxfname. Returns true
* if xfname has the same contents as uxfname, while disregarding
* keyword values. For the LOG-keyword, rcsfcmp skips the log message
* given by the parameter delta in xfname. Thus, rcsfcmp returns true
* if xfname contains the same as uxfname, with the keywords expanded.
* Implementation: character-by-character comparison until $ is found.
* If a $ is found, read in the marker keywords; if they are real keywords
* and identical, read in keyword value. If value is terminated properly,
* disregard it and optionally skip log message; otherwise, compare value.
*/
{
register int xc,uxc;
char xkeyword[keylength+2], uxkeyword[keylength+2];
char xkeyval[keyvallength+1], uxkeyval[keyvallength+1];
register FILE * xfp, * uxfp;
register char * tp;
int result;
enum markers match1,match2;
if ((xfp=fopen(tp=xfname,"r"))==NULL || (uxfp=fopen(tp=uxfname,"r"))==NULL) {
faterror("Can't open %s\n", tp);
return false;
}
result=false;
xc=getc(xfp); uxc=getc(uxfp);
while( xc == uxc) { /* comparison loop */
if (xc==EOF) { /* finished; everything is the same*/
result=true;
break;
}
if ( xc!=KDELIM) {
/* get the next characters */
xc=getc(xfp); uxc=getc(uxfp);
} else {
/* try to get both keywords */
tp = xkeyword;
while( (xc=getc(xfp))!=EOF && (tp< xkeyword+keylength) && (xc!='\n')
&& (xc!=KDELIM) && (xc!=VDELIM))
*tp++ = xc;
*tp++ = xc; /* add closing K/VDELIM */
*tp='\0';
tp = uxkeyword;
while( (uxc=getc(uxfp))!=EOF && (tp< uxkeyword+keylength) && (uxc!='\n')
&& (uxc!=KDELIM) && (uxc!=VDELIM))
*tp++ = uxc;
*tp++ = xc; /* add closing K/VDELIM */
*tp='\0';
/* now we have 2 keywords, or something thal looks like it.*/
match1=trymatch(xkeyword,false);
match2=trymatch(uxkeyword,false);
if (match1 != match2) break; /* not identical */
#ifdef FCMPTEST
VOID printf("found potential keywords %s and %s\n",xkeyword,uxkeyword);
#endif
if (match1 == Nomatch) {
/* not a keyword pattern, but could still be identical */
if (strcmp(xkeyword,uxkeyword)==0)
continue;
else break;
}
#ifdef FCMPTEST
VOID printf("found common keyword %s\n",xkeyword);
#endif
tp=xkeyval;
if (xc==VDELIM) {/* get value */
while (((xc=getc(xfp))!=KDELIM) && (xc!='\n') && (xc!=EOF) &&
(tp<xkeyval+keyvallength))
*tp++ = xc;
}
*tp = '\0'; /*xkeyval now filled with value; possibly empty*/
tp=uxkeyval;
if (uxc==VDELIM) {/* get value */
while (((uxc=getc(uxfp))!=KDELIM) && (uxc!='\n') && (uxc!=EOF) &&
(tp<uxkeyval+keyvallength))
*tp++ = uxc;
}
*tp = '\0'; /*uxkeyval now filled with value; possibly empty*/
if (xc!=uxc) break; /* not the same */
if (xc==KDELIM) {
xc=getc(xfp); uxc=getc(uxfp); /* skip closing KDELIM */
/* if the keyword is LOG, also skip the log message in xfp*/
if (match1==Log) {
/* first, compute the number of line feeds in log msg */
int lncnt, ccnt;
lncnt=2; tp=delta->log;
while(*tp) if(*tp++=='\n') lncnt++;
while(xc!=EOF) {
if (xc=='\n')
if(--lncnt==0) break;
xc=getc(xfp);
}
/* skip last comment leader */
/* Can't just skip another line here, because there may be */
/* additional characters on the line (after the Log....$) */
for (ccnt=strlen(Comment); ccnt>=0; lncnt--) {
xc=getc(xfp);
if(xc=='\n') break;
/* reads to the end of the comment leader or '\n', */
/* whatever comes first. This is because some editors */
/* strip off trailing blanks from a leader like " * ". */
}
}
} else {
/* both end in the same character, but not a KDELIM */
/* must compare string values.*/
#ifdef FCMPTEST
VOID printf("non-terminated keywords %s, potentially different values\n",xkeyword);
#endif
if (strcmp(xkeyval,uxkeyval)!=0) break; /*different */
xc=getc(xfp); uxc=getc(uxfp); /* skip closing char */
}
}
}
VOID fclose(xfp); VOID fclose(uxfp);
return result;
}
#ifdef FCMPTEST
char * RCSfilename, * workfilename;
char * Comment;
main(argc, argv)
int argc; char *argv[];
/* first argument: comment leader; 2nd: log message, 3rd: expanded file,
* 4th: unexpanded file
*/
{ struct hshentry delta;
cmdid="rcsfcmp";
Comment=argv[1];
delta.log=argv[2];
if (rcsfcmp(argv[3],argv[4],&delta))
VOID printf("files are the same\n");
else VOID printf("files are different\n");
}
#endif