rcskeys.c revision 90399
1271546Sian/* RCS keyword table and match operation */
2271546Sian
3271546Sian/* Copyright 1982, 1988, 1989 Walter Tichy
4271546Sian   Copyright 1990, 1991, 1992, 1993, 1995 Paul Eggert
5271546Sian   Distributed under license by the Free Software Foundation, Inc.
6271546Sian
7271546SianThis file is part of RCS.
8271546Sian
9271546SianRCS is free software; you can redistribute it and/or modify
10271546Sianit under the terms of the GNU General Public License as published by
11271546Sianthe Free Software Foundation; either version 2, or (at your option)
12271546Sianany later version.
13271546Sian
14271546SianRCS is distributed in the hope that it will be useful,
15271546Sianbut WITHOUT ANY WARRANTY; without even the implied warranty of
16271546SianMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17271546SianGNU General Public License for more details.
18271546Sian
19271546SianYou should have received a copy of the GNU General Public License
20271546Sianalong with RCS; see the file COPYING.
21271546SianIf not, write to the Free Software Foundation,
22271546Sian59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23271546Sian
24271546SianReport problems and direct all questions to:
25271546Sian
26271546Sian    rcs-bugs@cs.purdue.edu
27271546Sian
28271546Sian*/
29271546Sian
30271546Sian/*
31271546Sian * Revision 5.4  1995/06/16 06:19:24  eggert
32271546Sian * Update FSF address.
33271546Sian *
34271546Sian * Revision 5.3  1993/11/03 17:42:27  eggert
35271546Sian * Add Name keyword.
36271546Sian *
37271546Sian * Revision 5.2  1991/08/19  03:13:55  eggert
38271546Sian * Say `T const' instead of `const T'; it's less confusing for pointer types.
39271546Sian * (This change was made in other source files too.)
40271546Sian *
41271546Sian * Revision 5.1  1991/04/21  11:58:25  eggert
42271546Sian * Don't put , just before } in initializer.
43271546Sian *
44271546Sian * Revision 5.0  1990/08/22  08:12:54  eggert
45271546Sian * Add -k.  Ansify and Posixate.
46271546Sian *
47271546Sian * Revision 4.3  89/05/01  15:13:02  narten
48271546Sian * changed copyright header to reflect current distribution rules
49271546Sian *
50271546Sian * Revision 4.2  87/10/18  10:36:33  narten
51271546Sian * Updating version numbers. Changes relative to 1.1 actuallyt
52271546Sian * relative to 4.1
53271546Sian *
54271546Sian * Revision 1.2  87/09/24  14:00:10  narten
55271546Sian * Sources now pass through lint (if you ignore printf/sprintf/fprintf
56271546Sian * warnings)
57271546Sian *
58271546Sian * Revision 4.1  83/05/04  10:06:53  wft
59 * Initial revision.
60 *
61 */
62
63
64#include "rcsbase.h"
65
66libId(keysId, "$FreeBSD: head/gnu/usr.bin/rcs/lib/rcskeys.c 90399 2002-02-08 11:57:43Z ru $")
67
68
69char const *Keyword[] = {
70    /* This must be in the same order as rcsbase.h's enum markers type. */
71	0,
72	AUTHOR, DATE, HEADER, IDH,
73	LOCKER, LOG, NAME, RCSFILE, REVISION, SOURCE, STATE, CVSHEADER,
74	NULL
75};
76
77/* Expand all keywords by default */
78static int ExpandKeyword[] = {
79	false,
80	true, true, true, true,
81	true, true, true, true, true, true, true, true,
82	true
83};
84enum markers LocalIdMode = Id;
85
86	enum markers
87trymatch(string)
88	char const *string;
89/* function: Checks whether string starts with a keyword followed
90 * by a KDELIM or a VDELIM.
91 * If successful, returns the appropriate marker, otherwise Nomatch.
92 */
93{
94        register int j;
95	register char const *p, *s;
96	for (j = sizeof(Keyword)/sizeof(*Keyword);  (--j);  ) {
97		if (!ExpandKeyword[j])
98			continue;
99		/* try next keyword */
100		p = Keyword[j];
101		if (p == NULL)
102			continue;
103		s = string;
104		while (*p++ == *s++) {
105			if (!*p)
106			    switch (*s) {
107				case KDELIM:
108				case VDELIM:
109				    return (enum markers)j;
110				default:
111				    return Nomatch;
112			    }
113		}
114        }
115        return(Nomatch);
116}
117
118	void
119setIncExc(arg)
120	char const *arg;
121/* Sets up the ExpandKeyword table according to command-line flags */
122{
123	char *key;
124	char *copy, *next;
125	int include = 0, j;
126
127	copy = strdup(arg);
128	next = copy;
129	switch (*next++) {
130	    case 'e':
131		include = false;
132		break;
133	    case 'i':
134		include = true;
135		break;
136	    default:
137		free(copy);
138		return;
139	}
140	if (include)
141		for (j = sizeof(Keyword)/sizeof(*Keyword);  (--j);  )
142			ExpandKeyword[j] = false;
143	key = strtok(next, ",");
144	while (key) {
145		for (j = sizeof(Keyword)/sizeof(*Keyword);  (--j);  ) {
146			if (Keyword[j] == NULL)
147				continue;
148			if (!strcmp(key, Keyword[j]))
149				ExpandKeyword[j] = include;
150		}
151		key = strtok(NULL, ",");
152	}
153	free(copy);
154	return;
155}
156
157	void
158setRCSLocalId(string)
159	char const *string;
160/* function: sets local RCS id and RCSLOCALID envariable */
161{
162	static char local_id[keylength+1];
163	char *copy, *next, *key;
164	int j;
165
166	copy = strdup(string);
167	next = copy;
168	key = strtok(next, "=");
169	if (strlen(key) > keylength)
170		faterror("LocalId is too long");
171	VOID strcpy(local_id, key);
172	Keyword[LocalId] = local_id;
173
174	/* options? */
175	while (key = strtok(NULL, ",")) {
176		if (!strcmp(key, Keyword[Id]))
177			LocalIdMode=Id;
178		else if (!strcmp(key, Keyword[Header]))
179			LocalIdMode=Header;
180		else if (!strcmp(key, Keyword[CVSHeader]))
181			LocalIdMode=CVSHeader;
182		else
183			error("Unknown LocalId mode");
184	}
185	free(copy);
186}
187