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