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