|
|
1.1 root 1: /* Copyright (C) 1982, 1988, 1989 Walter Tichy
2: * All rights reserved.
3: *
4: * Redistribution and use in source and binary forms are permitted
5: * provided that the above copyright notice and this paragraph are
6: * duplicated in all such forms and that any documentation,
7: * advertising materials, and other materials related to such
8: * distribution and use acknowledge that the software was developed
9: * by Walter Tichy.
10: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
11: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
12: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
13: *
14: * Report all problems and direct all questions to:
15: * [email protected]
16: *
17:
18:
19:
20:
21:
22:
23:
24: */
25:
26: /*
27: * RCS identification operation
28: */
29: #ifndef lint
30: static char rcsid[]=
31: "$Header: /usr/src/local/bin/rcs/src/RCS/ident.c,v 4.5 89/05/01 15:11:54 narten Exp $Purdue CS";
32: #endif
33:
34: /* $Log: ident.c,v $
35: * Revision 4.5 89/05/01 15:11:54 narten
36: * changed copyright header to reflect current distribution rules
37: *
38: * Revision 4.4 87/10/23 17:09:57 narten
39: * added exit(0) so exit return code would be non random
40: *
41: * Revision 4.3 87/10/18 10:23:55 narten
42: * Updating version numbers. Changes relative to 1.1 are actually relative
43: * to 4.1
44: *
45: * Revision 1.3 87/07/09 09:20:52 trinkle
46: * Added check to make sure there is at least one arg before comparing argv[1]
47: * with "-q". This necessary on machines that don't allow dereferncing null
48: * pointers (i.e. Suns).
49: *
50: * Revision 1.2 87/03/27 14:21:47 jenkins
51: * Port to suns
52: *
53: * Revision 1.1 84/01/23 14:50:03 kcs
54: * Initial revision
55: *
56: * Revision 4.1 83/05/10 16:31:02 wft
57: * Added option -q and input from reading stdin.
58: * Marker matching is now done with trymatch() (independent of keywords).
59: *
60: * Revision 3.4 83/02/18 17:37:49 wft
61: * removed printing of new line after last file.
62: *
63: * Revision 3.3 82/12/04 12:48:55 wft
64: * Added LOCKER.
65: *
66: * Revision 3.2 82/11/28 18:24:17 wft
67: * removed Suffix; added ungetc to avoid skipping over trailing KDELIM.
68: *
69: * Revision 3.1 82/10/13 15:58:51 wft
70: * fixed type of variables receiving from getc() (char-->int).
71: */
72:
73: #include "rcsbase.h"
74: #define fflsbuf _flsbuf
75: /* redefinition of _flsbuf in putc not needed */
76: #ifndef lint
77: static char rcsbaseid[] = RCSBASE;
78: #endif
79:
80: extern enum markers trymatch();
81:
82: int quietflag;
83:
84: main(argc, argv)
85: int argc; char *argv[];
86: /* Ident searches the named files for all occurrences
87: * of the pattern $keyword:...$, where the keywords are
88: * Author, Date, Header, Id, Log, RCSfile, Revision, Source, and State.
89: */
90:
91: {
92: FILE *fp, *fopen();
93:
94: quietflag = false;
95: if (argc > 1 && strcmp("-q",argv[1])==0) {
96: quietflag = true;
97: argc--; argv++;
98: }
99:
100: if (argc<2) {
101: if ((scanfile(stdin) == 0) && !quietflag)
102: VOID fprintf(stderr, "ident warning: no id keywords in input\n");
103: exit(0);
104: }
105:
106: while ( --argc > 0 ) {
107: if ( (fp = fopen(*++argv, "r") ) == NULL ) {
108: VOID fprintf(stderr, "ident error: can't open %s\n", *argv);
109: continue;
110: } else {
111: VOID printf( "%s:\n", *argv); /* print file name */
112: if ((scanfile(fp) == 0) && !quietflag)
113: VOID fprintf(stderr, "ident warning: no id keywords in %s\n", *argv);
114: if (argc>1) putchar('\n');
115: VOID fclose(fp);
116: }
117: }
118: exit(0);
119: }
120:
121:
122: int scanfile(file)
123: FILE * file;
124: /* Function: scan an open file with descriptor file for keywords.
125: * Returns the number of matches.
126: */
127: {
128: register int matchcount;
129: register int c;
130:
131:
132: matchcount = 0;
133: while( (c=getc(file)) != EOF) {
134: if ( (char)c==KDELIM)
135: matchcount += match(file);
136: }
137: return matchcount;
138: }
139:
140:
141:
142: match(fp) /* group substring between two KDELIM's; then do pattern match */
143: FILE *fp;
144: {
145: char line[keyvallength];
146: register int c;
147: register char * tp;
148:
149: tp = line;
150: while( (c = getc(fp)) != KDELIM ) {
151: *tp++ = c;
152: if ( c==EOF || c=='\n' || tp>= line+keyvallength-2)
153: return(0);
154: }
155: *tp++ = c; /*append trailing KDELIM*/
156: *tp = '\0';
157: if (trymatch(line,true)!=Nomatch) {
158: VOID fprintf(stdout," $%s\n",line);
159: return(1);
160: } else {
161: /* no match; put trailing KDELIM back into input */
162: VOID ungetc(c,fp );
163: return(0);
164: }
165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.