Annotation of src/usr.bin/rcs/ident.c, Revision 1.17
1.17 ! xsa 1: /* $OpenBSD: ident.c,v 1.16 2006/04/19 06:53:41 xsa 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.16 xsa 35: static int flags = 0;
1.1 joris 36:
1.14 xsa 37: static void ident_file(const char *, FILE *);
38: static void ident_line(FILE *);
1.1 joris 39:
40: int
41: ident_main(int argc, char **argv)
42: {
43: int i, ch;
44: FILE *fp;
45:
1.5 joris 46: while ((ch = rcs_getopt(argc, argv, "qV")) != -1) {
1.1 joris 47: switch(ch) {
48: case 'q':
1.16 xsa 49: flags |= QUIET;
1.1 joris 50: break;
51: case 'V':
52: printf("%s\n", rcs_version);
53: exit(0);
1.13 ray 54: /* NOTREACHED */
1.1 joris 55: default:
56: (usage)();
57: exit(1);
58: }
59: }
60:
1.5 joris 61: argc -= rcs_optind;
62: argv += rcs_optind;
1.1 joris 63:
1.2 xsa 64: if (argc == 0)
1.1 joris 65: ident_file(NULL, stdin);
1.2 xsa 66: else {
1.1 joris 67: for (i = 0; i < argc; i++) {
68: if ((fp = fopen(argv[i], "r")) == NULL) {
1.17 ! xsa 69: warn("%s", argv[i]);
1.1 joris 70: continue;
71: }
72:
73: ident_file(argv[i], fp);
1.17 ! xsa 74: (void)fclose(fp);
1.1 joris 75: }
76: }
77:
78: return (0);
79: }
80:
81:
1.14 xsa 82: static void
1.1 joris 83: ident_file(const char *filename, FILE *fp)
84: {
85: int c;
86:
1.7 xsa 87: if (filename != NULL)
1.1 joris 88: printf("%s:\n", filename);
1.7 xsa 89: else
90: filename = "standard output";
1.1 joris 91:
1.15 deraadt 92: for (c = 0; c != EOF; c = getc(fp)) {
93: if (feof(fp) || ferror(fp))
1.1 joris 94: break;
95: if (c == KEYDELIM)
96: ident_line(fp);
97: }
1.7 xsa 98:
1.16 xsa 99: if (found == 0 && !(flags & QUIET))
1.7 xsa 100: fprintf(stderr, "ident warning: no id keywords in %s\n",
1.12 deraadt 101: filename);
1.7 xsa 102:
103: found = 0;
1.1 joris 104: }
105:
1.14 xsa 106: static void
1.1 joris 107: ident_line(FILE *fp)
108: {
109: int c;
110: char *p, linebuf[1024];
111:
112: p = linebuf;
113:
114: while ((c = getc(fp)) != VALDELIM) {
1.15 deraadt 115: if (c == EOF && (feof(fp) | ferror(fp)))
1.14 xsa 116: return;
1.1 joris 117:
118: if (isalpha(c))
119: *(p++) = c;
120: else
1.14 xsa 121: return;
1.1 joris 122: }
123:
1.2 xsa 124: *(p++) = VALDELIM;
1.1 joris 125:
126: while ((c = getc(fp)) != KEYDELIM) {
1.15 deraadt 127: if (c == EOF && (feof(fp) | ferror(fp)))
1.14 xsa 128: return;
1.1 joris 129:
130: if (c == '\n')
1.14 xsa 131: return;
1.1 joris 132:
133: *(p++) = c;
134: }
135:
136: if (p[-1] != ' ')
1.14 xsa 137: return;
1.1 joris 138:
139: /* append trailing KEYDELIM */
140: *(p++) = c;
141: *p = '\0';
142:
1.3 joris 143: found++;
1.2 xsa 144: printf(" %c%s\n", KEYDELIM, linebuf);
1.1 joris 145:
1.14 xsa 146: return;
1.1 joris 147: }
148:
149: void
150: ident_usage(void)
151: {
1.8 xsa 152: fprintf(stderr, "usage: ident [-qV] [file ...]\n");
1.1 joris 153: }