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