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