Annotation of 43BSD/ucb/indent/args.c, revision 1.1

1.1     ! root        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) 9/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: }

unix.superglobalmegacorp.com

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