Annotation of 43BSDTahoe/ucb/indent/args.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.