|
|
1.1 root 1: /*
2: * Copyright (c) 1980 Regents of the University of California.
3: * Copyright (c) 1976 Board of Trustees of the University of Illinois.
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms are permitted
7: * provided that the above copyright notice and this paragraph are
8: * duplicated in all such forms and that any documentation,
9: * advertising materials, and other materials related to such
10: * distribution and use acknowledge that the software was developed
11: * by the University of California, Berkeley and the University
12: * of Illinois, Urbana. The name of either
13: * University may not be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: static char sccsid[] = "@(#)args.c 5.4 (Berkeley) 6/29/88";
22: #endif /* not lint */
23:
24: /*
25: * Argument scanning and profile reading code. Default parameters
26: * are set here as well.
27: */
28:
29: #include "indent_globs.h"
30: #include <sys/types.h>
31: #include <ctype.h>
32:
33: char *getenv(), *index();
34:
35: /* profile types */
36: #define PRO_SPECIAL 1 /* special case */
37: #define PRO_BOOL 2 /* boolean */
38: #define PRO_INT 3 /* integer */
39:
40: /* profile specials for booleans */
41: #define ON 1 /* turn it on */
42: #define OFF 0 /* turn it off */
43:
44: /* profile specials for specials */
45: #define IGN 1 /* ignore it */
46: #define CLI 2 /* case label indent (float) */
47: #define STDIN 3 /* use stdin */
48: #define KEY 4 /* type (keyword) */
49:
50: /*
51: * N.B.: because of the way the table here is scanned, options
52: * whose names are substrings of other options must occur later;
53: * that is, with -lp vs -l, -lp must be first. Also, while (most)
54: * booleans occur more than once, the last default value is the
55: * one actually assigned.
56: */
57: struct pro {
58: char *p_name; /* name, eg -bl, -cli */
59: int p_type; /* type (int, bool, special) */
60: int p_default; /* the default value (if int) */
61: int p_special; /* depends on type */
62: int *p_obj; /* the associated variable */
63: } pro[] = {
64: "npro", PRO_SPECIAL, 0, IGN, 0,
65: "lc", PRO_INT, 0, 0, &block_comment_max_col,
66: "lp", PRO_BOOL, true, ON, &lineup_to_parens,
67: "nlp", PRO_BOOL, true, OFF, &lineup_to_parens,
68: "l", PRO_INT, 78, 0, &max_col,
69: "psl", PRO_BOOL, true, ON, &procnames_start_line,
70: "npsl", PRO_BOOL, true, OFF, &procnames_start_line,
71: "fc1", PRO_BOOL, true, ON, &format_col1_comments,
72: "nfc1", PRO_BOOL, true, OFF, &format_col1_comments,
73: "pcs", PRO_BOOL, false, ON, &proc_calls_space,
74: "npcs", PRO_BOOL, false, OFF, &proc_calls_space,
75: "ip", PRO_BOOL, true, ON, &ps.indent_parameters,
76: "nip", PRO_BOOL, true, OFF, &ps.indent_parameters,
77: /* see set_defaults for initialization of -cli */
78: "cli", PRO_SPECIAL, 0, CLI, 0,
79: "ci", PRO_INT, 0, 0, &continuation_indent,
80: "cdb", PRO_BOOL, true, ON, &comment_delimiter_on_blankline,
81: "ncdb", PRO_BOOL, true, OFF, &comment_delimiter_on_blankline,
82: "i", PRO_INT, 8, 0, &ps.ind_size,
83: "cd", PRO_INT, 0, 0, &ps.decl_com_ind,
84: "ce", PRO_BOOL, true, ON, &cuddle_else,
85: "nce", PRO_BOOL, true, OFF, &cuddle_else,
86: "c", PRO_INT, 33, 0, &ps.com_ind,
87: "v", PRO_BOOL, false, ON, &verbose,
88: "nv", PRO_BOOL, false, OFF, &verbose,
89: "dj", PRO_BOOL, false, ON, &ps.ljust_decl,
90: "ndj", PRO_BOOL, false, OFF, &ps.ljust_decl,
91: /* don't ask *me* why -bc/-nbc is backwards.... */
92: "bc", PRO_BOOL, true, OFF, &ps.leave_comma,
93: "nbc", PRO_BOOL, true, ON, &ps.leave_comma,
94: "di", PRO_INT, 16, 0, &ps.decl_indent,
95: "d", PRO_INT, 0, 0, &ps.unindent_displace,
96: "br", PRO_BOOL, true, ON, &btype_2,
97: "bl", PRO_BOOL, true, OFF, &btype_2,
98: "st", PRO_SPECIAL, 0, STDIN, 0,
99: "ei", PRO_BOOL, true, ON, &ps.else_if,
100: "nei", PRO_BOOL, true, OFF, &ps.else_if,
101: "sc", PRO_BOOL, true, ON, &star_comment_cont,
102: "nsc", PRO_BOOL, true, OFF, &star_comment_cont,
103: "bap", PRO_BOOL, false, ON, &blanklines_after_procs,
104: "nbap", PRO_BOOL, false, OFF, &blanklines_after_procs,
105: "sob", PRO_BOOL, false, ON, &swallow_optional_blanklines,
106: "nsob", PRO_BOOL, false, OFF, &swallow_optional_blanklines,
107: "bad", PRO_BOOL, false, ON, &blanklines_after_declarations,
108: "nbad", PRO_BOOL, false, OFF, &blanklines_after_declarations,
109: "bbb", PRO_BOOL, false, ON, &blanklines_before_blockcomments,
110: "nbbb", PRO_BOOL, false, OFF, &blanklines_before_blockcomments,
111: "ps", PRO_BOOL, false, ON, &pointer_as_binop,
112: "nps", PRO_BOOL, false, OFF, &pointer_as_binop,
113: "troff", PRO_BOOL, false, ON, &troff,
114: "T", PRO_SPECIAL, 0, KEY, 0,
115: /* whew! */
116: 0, 0, 0, 0, 0
117: };
118:
119: /*
120: * set_profile reads $HOME/.indent.pro and ./.indent.pro and
121: * handles arguments given in these files.
122: */
123: set_profile()
124: {
125: register FILE *f;
126: char fname[BUFSIZ];
127: static char pro[] = ".indent.pro";
128:
129: sprintf(fname, "%s/%s", getenv("HOME"), pro);
130: if ((f = fopen(fname, "r")) != NULL) {
131: scan_profile(f);
132: (void) fclose(f);
133: }
134: if ((f = fopen(pro, "r")) != NULL) {
135: scan_profile(f);
136: (void) fclose(f);
137: }
138: }
139:
140: scan_profile(f)
141: register FILE *f;
142: {
143: register char *p, *arg;
144: char buf[BUFSIZ];
145:
146: while (fgets(buf, sizeof buf, f)) {
147: if ((p = index(buf, '\n')) != NULL)
148: *p = 0;
149: if (verbose)
150: printf("profile: %s\n", buf);
151: p = buf;
152: for (;;) {
153: while (isspace(*p))
154: p++;
155: if (*p == 0)
156: break;
157: arg = p;
158: while (*p) {
159: if (isspace(*p)) {
160: *p++ = 0;
161: break;
162: }
163: p++;
164: }
165: set_option(arg);
166: }
167: }
168: }
169:
170: char *param_start;
171:
172: eqin(s1, s2)
173: register char *s1;
174: register char *s2;
175: {
176: while (*s1) {
177: if (*s1++ != *s2++)
178: return (false);
179: }
180: param_start = s2;
181: return (true);
182: }
183:
184: /*
185: * Set the defaults.
186: */
187: set_defaults()
188: {
189: register struct pro *p;
190:
191: /*
192: * Because ps.case_indent is a float, we can't initialize it
193: * from the table:
194: */
195: ps.case_indent = 0.0; /* -cli0.0 */
196: for (p = pro; p->p_name; p++)
197: if (p->p_type != PRO_SPECIAL)
198: *p->p_obj = p->p_default;
199: }
200:
201: set_option(arg)
202: register char *arg;
203: {
204: register struct pro *p;
205: extern double atof();
206:
207: arg++; /* ignore leading "-" */
208: for (p = pro; p->p_name; p++)
209: if (*p->p_name == *arg && eqin(p->p_name, arg))
210: goto found;
211: fprintf(stderr, "indent: unknown parameter \"%s\"\n", arg - 1);
212: exit(1);
213: found:
214: switch (p->p_type) {
215:
216: case PRO_SPECIAL:
217: switch (p->p_special) {
218:
219: case IGN:
220: break;
221:
222: case CLI:
223: if (*param_start == 0)
224: goto need_param;
225: ps.case_indent = atof(param_start);
226: break;
227:
228: case STDIN:
229: if (input == 0)
230: input = stdin;
231: if (output == 0)
232: output = stdout;
233: break;
234:
235: case KEY:
236: if (*param_start == 0)
237: goto need_param;
238: addkey(param_start, 4);
239: break;
240:
241: default:
242: fprintf(stderr, "\
243: indent: set_option: internal error: p_special %d\n", p->p_special);
244: exit(1);
245: }
246: break;
247:
248: case PRO_BOOL:
249: if (p->p_special == OFF)
250: *p->p_obj = false;
251: else
252: *p->p_obj = true;
253: break;
254:
255: case PRO_INT:
256: if (*param_start == 0) {
257: need_param:
258: fprintf(stderr, "indent: ``%s'' requires a parameter\n",
259: arg - 1);
260: exit(1);
261: }
262: *p->p_obj = atoi(param_start);
263: break;
264:
265: default:
266: fprintf(stderr, "indent: set_option: internal error: p_type %d\n",
267: p->p_type);
268: exit(1);
269: }
270: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.