rcskeys.c revision 11927
111894Speter/* RCS keyword table and match operation */
29Sjkh
311894Speter/* Copyright 1982, 1988, 1989 Walter Tichy
411894Speter   Copyright 1990, 1991, 1992, 1993, 1995 Paul Eggert
59Sjkh   Distributed under license by the Free Software Foundation, Inc.
69Sjkh
79SjkhThis file is part of RCS.
89Sjkh
99SjkhRCS is free software; you can redistribute it and/or modify
109Sjkhit under the terms of the GNU General Public License as published by
119Sjkhthe Free Software Foundation; either version 2, or (at your option)
129Sjkhany later version.
139Sjkh
149SjkhRCS is distributed in the hope that it will be useful,
159Sjkhbut WITHOUT ANY WARRANTY; without even the implied warranty of
169SjkhMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
179SjkhGNU General Public License for more details.
189Sjkh
199SjkhYou should have received a copy of the GNU General Public License
2011894Speteralong with RCS; see the file COPYING.
2111894SpeterIf not, write to the Free Software Foundation,
2211894Speter59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
239Sjkh
249SjkhReport problems and direct all questions to:
259Sjkh
269Sjkh    rcs-bugs@cs.purdue.edu
279Sjkh
289Sjkh*/
299Sjkh
3011894Speter/*
3111894Speter * $Log: rcskeys.c,v $
3211927Speter * Revision 1.6  1995/10/28  21:49:45  peter
3311927Speter * First part of import conflict merge from rcs-5.7 import.
3411927Speter *
3511927Speter * All those $Log$ entries, combined with the whitespace changes are a real
3611927Speter * pain.
3711927Speter *
3811927Speter * I'm committing this now, before it's completely finished to get it compiling
3911927Speter * and working again ASAP.  Some of the FreeBSD specific features are not working
4011927Speter * in this commit yet (mainly rlog stuff and $FreeBSD: head/gnu/usr.bin/rcs/lib/rcskeys.c 11927 1995-10-29 19:31:11Z peter $ support)
4111927Speter *
4211894Speter * Revision 5.4  1995/06/16 06:19:24  eggert
4311894Speter * Update FSF address.
448858Srgrimes *
4511894Speter * Revision 5.3  1993/11/03 17:42:27  eggert
4611894Speter * Add Name keyword.
471764Srgrimes *
489Sjkh * Revision 5.2  1991/08/19  03:13:55  eggert
499Sjkh * Say `T const' instead of `const T'; it's less confusing for pointer types.
509Sjkh * (This change was made in other source files too.)
519Sjkh *
529Sjkh * Revision 5.1  1991/04/21  11:58:25  eggert
539Sjkh * Don't put , just before } in initializer.
549Sjkh *
559Sjkh * Revision 5.0  1990/08/22  08:12:54  eggert
569Sjkh * Add -k.  Ansify and Posixate.
579Sjkh *
589Sjkh * Revision 4.3  89/05/01  15:13:02  narten
599Sjkh * changed copyright header to reflect current distribution rules
608858Srgrimes *
619Sjkh * Revision 4.2  87/10/18  10:36:33  narten
629Sjkh * Updating version numbers. Changes relative to 1.1 actuallyt
639Sjkh * relative to 4.1
648858Srgrimes *
659Sjkh * Revision 1.2  87/09/24  14:00:10  narten
668858Srgrimes * Sources now pass through lint (if you ignore printf/sprintf/fprintf
679Sjkh * warnings)
688858Srgrimes *
699Sjkh * Revision 4.1  83/05/04  10:06:53  wft
709Sjkh * Initial revision.
718858Srgrimes *
729Sjkh */
739Sjkh
749Sjkh
759Sjkh#include "rcsbase.h"
769Sjkh
7711927SpeterlibId(keysId, "$Id: rcskeys.c,v 1.6 1995/10/28 21:49:45 peter Exp $")
789Sjkh
799Sjkh
809Sjkhchar const *const Keyword[] = {
819Sjkh    /* This must be in the same order as rcsbase.h's enum markers type. */
8211894Speter	0,
839Sjkh	AUTHOR, DATE, HEADER, IDH,
8411927Speter	LOCKER, LOG, NAME, RCSFILE, REVISION, SOURCE, STATE,
8511927Speter	FREEBSD
869Sjkh};
879Sjkh
8811927Speter/* Expand all keywords by default */
899Sjkh
9011927Speterstatic int ExpandKeyword[] = {
9111927Speter	false,
9211927Speter	true, true, true, true,
9311927Speter	true, true, true, true, true, true, true,
9411927Speter	false
9511927Speter};
969Sjkh
979Sjkh	enum markers
989Sjkhtrymatch(string)
999Sjkh	char const *string;
1009Sjkh/* function: Checks whether string starts with a keyword followed
1019Sjkh * by a KDELIM or a VDELIM.
1029Sjkh * If successful, returns the appropriate marker, otherwise Nomatch.
1039Sjkh */
1049Sjkh{
1059Sjkh        register int j;
1069Sjkh	register char const *p, *s;
1079Sjkh	for (j = sizeof(Keyword)/sizeof(*Keyword);  (--j);  ) {
10811927Speter		if (!ExpandKeyword[j])
10911927Speter			continue;
1109Sjkh		/* try next keyword */
1119Sjkh		p = Keyword[j];
1129Sjkh		s = string;
1139Sjkh		while (*p++ == *s++) {
1149Sjkh			if (!*p)
1159Sjkh			    switch (*s) {
1169Sjkh				case KDELIM:
1179Sjkh				case VDELIM:
1189Sjkh				    return (enum markers)j;
1199Sjkh				default:
1209Sjkh				    return Nomatch;
1219Sjkh			    }
1229Sjkh		}
1239Sjkh        }
1249Sjkh        return(Nomatch);
1259Sjkh}
1269Sjkh
12711927SpetersetIncExc(arg)
12811927Speter	char *arg;
12911927Speter/* Sets up the ExpandKeyword table according to command-line flags */
13011927Speter{
13111927Speter	char *key;
13211927Speter	int include = 0, j;
13311927Speter
13411927Speter	arg += 2;
13511927Speter	switch (*arg++) {
13611927Speter	    case 'e':
13711927Speter		include = false;
13811927Speter		break;
13911927Speter	    case 'i':
14011927Speter		include = true;
14111927Speter		break;
14211927Speter	    default:
14311927Speter		return(false);
14411927Speter	}
14511927Speter	if (include)
14611927Speter		for (j = sizeof(Keyword)/sizeof(*Keyword);  (--j);  )
14711927Speter			ExpandKeyword[j] = false;
14811927Speter	key = strtok(arg, ",");
14911927Speter	while (key) {
15011927Speter		for (j = sizeof(Keyword)/sizeof(*Keyword);  (--j);  )
15111927Speter			if (!strcmp(key, Keyword[j]))
15211927Speter				ExpandKeyword[j] = include;
15311927Speter		key = strtok(NULL, ",");
15411927Speter	}
15511927Speter	return(true);
15611927Speter}
157