Annotation of src/usr.bin/rcs/ident.c, Revision 1.13
1.13 ! ray 1: /* $OpenBSD: ident.c,v 1.12 2006/03/06 09:41:53 deraadt Exp $ */
1.1 joris 2: /*
3: * Copyright (c) 2005 Xavier Santolaria <xsa@openbsd.org>
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms, with or without
7: * modification, are permitted provided that the following conditions
8: * are met:
9: *
10: * 1. Redistributions of source code must retain the above copyright
11: * notice, this list of conditions and the following disclaimer.
12: * 2. The name of the author may not be used to endorse or promote products
13: * derived from this software without specific prior written permission.
14: *
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
16: * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
17: * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
18: * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23: * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25: */
26:
1.9 xsa 27: #include "includes.h"
1.1 joris 28:
29: #include "rcsprog.h"
30:
1.11 xsa 31: #define KEYDELIM '$' /* keywords delimiter */
32: #define VALDELIM ':' /* values delimiter */
1.1 joris 33:
1.3 joris 34: static int found = 0;
1.1 joris 35:
36: static int ident_file(const char *, FILE *);
37: static int ident_line(FILE *);
38:
39: int
40: ident_main(int argc, char **argv)
41: {
42: int i, ch;
43: FILE *fp;
44:
1.5 joris 45: while ((ch = rcs_getopt(argc, argv, "qV")) != -1) {
1.1 joris 46: switch(ch) {
47: case 'q':
48: verbose = 0;
49: break;
50: case 'V':
51: printf("%s\n", rcs_version);
52: exit(0);
1.13 ! ray 53: /* NOTREACHED */
1.1 joris 54: default:
55: (usage)();
56: exit(1);
57: }
58: }
59:
1.5 joris 60: argc -= rcs_optind;
61: argv += rcs_optind;
1.1 joris 62:
1.2 xsa 63: if (argc == 0)
1.1 joris 64: ident_file(NULL, stdin);
1.2 xsa 65: else {
1.1 joris 66: for (i = 0; i < argc; i++) {
67: if ((fp = fopen(argv[i], "r")) == NULL) {
68: cvs_log(LP_ERRNO, "%s", argv[i]);
69: continue;
70: }
71:
72: ident_file(argv[i], fp);
73: fclose(fp);
74: }
75: }
76:
77: return (0);
78: }
79:
80:
81: static int
82: ident_file(const char *filename, FILE *fp)
83: {
84: int c;
85:
1.7 xsa 86: if (filename != NULL)
1.1 joris 87: printf("%s:\n", filename);
1.7 xsa 88: else
89: filename = "standard output";
1.1 joris 90:
91: for (c = 0; c != EOF; (c = getc(fp))) {
92: if ((feof(fp)) || (ferror(fp)))
93: break;
94: if (c == KEYDELIM)
95: ident_line(fp);
96: }
1.7 xsa 97:
98: if ((found == 0) && (verbose == 1))
99: fprintf(stderr, "ident warning: no id keywords in %s\n",
1.12 deraadt 100: filename);
1.7 xsa 101:
102: found = 0;
1.1 joris 103:
104: return (0);
105: }
106:
107: static int
108: ident_line(FILE *fp)
109: {
110: int c;
111: char *p, linebuf[1024];
112:
113: p = linebuf;
114:
115: while ((c = getc(fp)) != VALDELIM) {
116: if ((c == EOF) && (feof(fp) | ferror(fp)))
117: return (0);
118:
119: if (isalpha(c))
120: *(p++) = c;
121: else
122: return (0);
123: }
124:
1.2 xsa 125: *(p++) = VALDELIM;
1.1 joris 126:
127: while ((c = getc(fp)) != KEYDELIM) {
128: if ((c == EOF) && (feof(fp) | ferror(fp)))
129: return (0);
130:
131: if (c == '\n')
132: return (0);
133:
134: *(p++) = c;
135: }
136:
137: if (p[-1] != ' ')
138: return (0);
139:
140: /* append trailing KEYDELIM */
141: *(p++) = c;
142: *p = '\0';
143:
1.3 joris 144: found++;
1.2 xsa 145: printf(" %c%s\n", KEYDELIM, linebuf);
1.1 joris 146:
147: return (0);
148: }
149:
150: void
151: ident_usage(void)
152: {
1.8 xsa 153: fprintf(stderr, "usage: ident [-qV] [file ...]\n");
1.1 joris 154: }