From 0a707030d9bab84149bba13e9d2a8bbb6bda4da5 Mon Sep 17 00:00:00 2001 From: CSRG Date: Wed, 17 Feb 1988 20:58:13 -0800 Subject: [PATCH] BSD 4_3_Tahoe development Work on file usr/src/new/rcs/src/rcsfcmp.c Synthesized-from: CSRG/cd2/4.3tahoe --- usr/src/new/rcs/src/rcsfcmp.c | 200 ++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 usr/src/new/rcs/src/rcsfcmp.c diff --git a/usr/src/new/rcs/src/rcsfcmp.c b/usr/src/new/rcs/src/rcsfcmp.c new file mode 100644 index 0000000000..4db9651740 --- /dev/null +++ b/usr/src/new/rcs/src/rcsfcmp.c @@ -0,0 +1,200 @@ +/* + * RCS file comparison + */ +#ifndef lint +static char rcsid[]= "$Id: rcsfcmp.c,v 4.3 87/12/18 11:40:02 narten Exp $ Purdue CS"; +#endif +/***************************************************************************** + * rcsfcmp() + * Testprogram: define FCMPTEST + ***************************************************************************** + * + * Copyright (C) 1982 by Walter F. Tichy + * Purdue University + * Computer Science Department + * West Lafayette, IN 47907 + * + * All rights reserved. No part of this software may be sold or distributed + * in any form or by any means without the prior written permission of the + * author. + * Report problems and direct all inquiries to Tichy@purdue (ARPA net). + */ + + + +/* $Log: rcsfcmp.c,v $ + * 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 char * tp; + FILE * xfp, * uxfp; + 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) && + (tplog; + 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 -- 2.20.1