Annotation of 42BSD/ucb/indent/pr_comment.c, revision 1.1.1.1

1.1       root        1: static char sccsid[] = "@(#)pr_comment.c       4.1     (Berkeley)      10/21/82";
                      2: 
                      3: /*
                      4: 
                      5:                          Copyright (C) 1976
                      6:                                by the
                      7:                          Board of Trustees
                      8:                                of the
                      9:                        University of Illinois
                     10: 
                     11:                         All rights reserved
                     12: 
                     13: 
                     14: NAME:
                     15:        pr_comment
                     16: 
                     17: FUNCTION:
                     18:        This routine takes care of scanning and printing comments.
                     19: 
                     20: ALGORITHM:
                     21:        1) Decide where the comment should be aligned, and if lines should
                     22:           be broken.
                     23:        2) If lines should not be broken and filled, just copy up to end of
                     24:           comment.
                     25:        3) If lines should be filled, then scan thru input_buffer copying
                     26:           characters to com_buf.  Remember where the last blank, tab, or
                     27:           newline was.  When line is filled, print up to last blank and 
                     28:           continue copying.
                     29: 
                     30: PARAMETERS:
                     31:        None
                     32: 
                     33: RETURNS:
                     34:        Nothing
                     35: 
                     36: GLOBALS:
                     37:        combuf =
                     38:        s_com
                     39:        e_com =
                     40: 
                     41:        buf_ptr =
                     42:        buf_end
                     43: 
                     44:        bl_line
                     45:        col_1
                     46:        com_col =
                     47:        com_ind
                     48:        decl_com_ind
                     49:        decl_on_line
                     50:        had_eof
                     51:        ind_level
                     52:        ind_size
                     53:        line_no =
                     54:        max_col
                     55:        out_com =       Count number of comments
                     56:        unindent_displace
                     57:        use_ff =
                     58: 
                     59: CALLS:
                     60:        count_spaces
                     61:        dump_line
                     62:        fill_buffer
                     63:        printf          (lib)
                     64: 
                     65: CALLED BY:
                     66:        main
                     67: 
                     68: HISTORY:
                     69:        November 1976   D A Willcox of CAC      Initial coding
                     70:        12/6/76         D A Willcox of CAC      Modification to handle 
                     71:                                                UNIX-style comments
                     72: 
                     73: */
                     74: 
                     75: /* this routine processes comments.  It makes an attempt to keep comments from
                     76:    going over the max line length.  If a line is too long, it moves everything
                     77:    from the last blank to the next comment line.  Blanks and tabs from the
                     78:    beginning of the input line are removed */
                     79: 
                     80: #include "indent_globs.h";
                     81: 
                     82: 
                     83: pr_comment () {
                     84:     int     now_col;
                     85:  /* column we are in now */
                     86:     int     box_com;
                     87:  /* set to true when we are in a "boxed" comment. In that case, the first
                     88:     non-blank char should be lined up with the / in /* */
                     89:     int     col_1_com;
                     90:  /* this comment should not be touched */
                     91:     char   *last_bl;
                     92:  /* points to the last blank in the output buffer */
                     93:     char    achar;
                     94:     char   *t_ptr; /* used for movinf string */
                     95:     int     unix_comment;
                     96:  /* tri-state variable used to decide if it is a unix-style comment. 0 means
                     97:     only blanks since /*, 1 means regular style comment, 2 means unix style
                     98:     comment */
                     99: 
                    100: 
                    101:     last_bl = 0;              /* no blanks found so far */
                    102:     box_com = col_1_com = false;
                    103:  /* at first, assume that we are not in a boxed comment or some other comment
                    104:     that should not be touched */
                    105:     ++out_coms;                       /* keep track of number of comments */
                    106:     unix_comment = 0;         /* set flag to let us figure out if there is a
                    107:                                  unix-style comment */
                    108: 
                    109: /*----------------------------------------------------------*\ 
                    110: |   Figure where to align and how to treat the comment
                    111: \*----------------------------------------------------------*/
                    112: 
                    113:     if (col_1) {              /* if comment starts in column 1 it should not
                    114:                                  be touched */
                    115:        col_1_com = box_com = true;
                    116:        com_col = 1;
                    117:     }
                    118:     else {
                    119:        if (*buf_ptr == '-')
                    120:            box_com = true;    /* a comment with a '-' immediately after the /*
                    121:                                  is assumed to be a boxed comment */
                    122:        if ( /* bl_line && */ (s_lab == e_lab) && (s_code == e_code)) {
                    123:        /* klg: check only if this line is blank */
                    124:        /* 
                    125:         * If this (*and previous lines are*) blank,
                    126:         * don't put comment way out at left
                    127:         */
                    128:            com_col = (ind_level - unindent_displace) * ind_size + 1;
                    129:            if (com_col <= 1)
                    130:                com_col = 2;
                    131:        }
                    132:        else {
                    133:            com_col = (decl_on_line || ind_level == 0 ? decl_com_ind : com_ind);
                    134:        }
                    135:     }
                    136: 
                    137:     *e_com++ = '/';           /* put '/*' into buffer */
                    138:     *e_com++ = '*';
                    139:     if (*buf_ptr != ' ' && !box_com)
                    140:        *e_com++ = ' ';
                    141: 
                    142:     *e_com = '\0';
                    143:     now_col = count_spaces (com_col, s_com);
                    144:  /* figure where what column we would be in if we printed the comment now */
                    145: 
                    146: 
                    147: /*----------------------------------------------------------*\ 
                    148: |    Start to copy the comment
                    149: \*----------------------------------------------------------*/
                    150: 
                    151:     while (1) {                       /* this loop will go until the comment is copied 
                    152:                               */
                    153:        switch (*buf_ptr) {    /* this checks for various spcl cases */
                    154:            case 014:          /* check for a form feed */
                    155:                if (!box_com) {/* in a text comment, break the line here */
                    156:                    use_ff = true;
                    157:                /* fix so dump_line uses a form feed */
                    158:                    dump_line ();
                    159:                    last_bl = 0;
                    160:                    *e_com++ = ' ';
                    161:                    *e_com++ = ' ';
                    162:                    *e_com++ = ' ';
                    163:                    do {       /* get rid of leading blanks */
                    164:                        if (++buf_ptr >= buf_end)
                    165:                            fill_buffer ();
                    166:                    } while (*buf_ptr == ' ' || *buf_ptr == '\t');
                    167:                }
                    168:                else {
                    169:                    if (++buf_ptr >= buf_end)
                    170:                        fill_buffer ();
                    171:                    *e_com++ = 014;
                    172:                }
                    173: 
                    174:                break;
                    175: 
                    176:            case '\n': 
                    177:                if (had_eof) { /* check for unexpected eof */
                    178:                    printf ("Unterminated comment\n");
                    179:                    *e_com = '\0';
                    180:                    dump_line ();
                    181:                    return;
                    182:                }
                    183: 
                    184:                if (box_com) { /* if this is a boxed comment, we don't ignore
                    185:                                  the newline */
                    186:                    *e_com = '\0';
                    187:                    dump_line ();
                    188:                    ++line_no;
                    189:                    now_col = com_col;
                    190: 
                    191:                    if (!col_1_com) {
                    192:                    /* if merely a boxed comment, we should line up first
                    193:                       non-blank character */
                    194:                        do {   /* flush leading non-blanks */
                    195:                            if (++buf_ptr >= buf_end)
                    196:                                fill_buffer ();
                    197:                        } while (*buf_ptr == ' ' || *buf_ptr == '\t');
                    198:                    }
                    199:                    else {     /* make sure we at least flush the blank */
                    200:                        if (++buf_ptr >= buf_end)
                    201:                            fill_buffer ();
                    202:                    }
                    203: 
                    204:                    break;
                    205:                }
                    206: 
                    207:                if (unix_comment != 1) {
                    208:                /* we are in unix_style comment */
                    209:                    if (unix_comment == 0 && s_code == e_code) {
                    210:                    /* if it is a UNIX-style comment, ignore the requirement
                    211:                       that pervious line be blank for unindention */
                    212:                        com_col = (ind_level - unindent_displace) * ind_size + 1;
                    213:                        if (com_col <= 1)
                    214:                            com_col = 2;
                    215:                    }
                    216: 
                    217:                    unix_comment = 2;
                    218:                /* permanently remember that we are in this type of comment */
                    219:                    dump_line ();
                    220:                    ++line_no;
                    221:                    now_col = com_col;
                    222:                    *e_com++ = ' ';
                    223:                /* fix so that the star at the start of the line will line up 
                    224:                */
                    225:                    do         /* flush leading white space */
                    226:                        if (++buf_ptr >= buf_end)
                    227:                            fill_buffer ();
                    228:                    while (*buf_ptr == ' ' || *buf_ptr == '\t');
                    229:                    break;
                    230:                }
                    231: 
                    232:                if (*(e_com - 1) == ' ' || *(e_com - 1) == '\t')
                    233:                    last_bl = e_com - 1;
                    234:            /* if there was a space at the end of the last line, remember where
                    235:               it was */
                    236:                else {         /* otherwise, insert one */
                    237:                    last_bl = e_com;
                    238:                    *e_com++ = ' ';
                    239:                    ++now_col;
                    240:                }
                    241: 
                    242:                ++line_no;     /* keep track of input line number */
                    243:                do {           /* copy any blanks and/or tabs at start of next
                    244:                                  line */
                    245:                    if (++buf_ptr >= buf_end)
                    246:                        fill_buffer ();
                    247:                } while (*buf_ptr == ' ' || *buf_ptr == '\t');
                    248: 
                    249:                break;         /* end of case for newline */
                    250: 
                    251:            case '*':          /* must check for possibility of being at end of
                    252:                                  comment */
                    253:                if (++buf_ptr >= buf_end)
                    254:                               /* get to next char after * */
                    255:                    fill_buffer ();
                    256: 
                    257:                if (unix_comment == 0)
                    258:                               /* set flag to show we are not in unix-style
                    259:                                  comment */
                    260:                    unix_comment = 1;
                    261: 
                    262:                if (*buf_ptr == '/') {
                    263:                /* it is the end!!! */
                    264:                    if (++buf_ptr >= buf_end)
                    265:                        fill_buffer ();
                    266: 
                    267:                    if (*(e_com - 1) != ' ' && !box_com) {
                    268:                    /* insure blank before end */
                    269:                        *e_com++ = ' ';
                    270:                        ++now_col;
                    271:                    }
                    272: 
                    273:                    if (now_col > max_col - 2 && !box_com) {
                    274:                    /* check if star-slash will go over line */
                    275:                        *e_com = '\0';
                    276:                    /* it will */
                    277:                        dump_line ();
                    278:                        now_col = com_col;
                    279:                    }
                    280: 
                    281:                    *e_com++ = '*';
                    282:                /* move end of comment */
                    283:                    *e_com++ = '/';
                    284:                    *e_com = '\0';
                    285:                    return;    /* we is done */
                    286:                }              /* end of end of comment */
                    287: 
                    288: 
                    289:                else {         /* handle isolated '*' */
                    290:                    *e_com++ = '*';
                    291:                    ++now_col;
                    292:                    break;
                    293:                }
                    294:            /* end of processing of * */
                    295: 
                    296:            default:           /* we have a random char */
                    297:                if (unix_comment == 0 && *buf_ptr != ' ' && *buf_ptr != '\t')
                    298:                    unix_comment = 1;
                    299:            /* we are not in unix-style comment */
                    300: 
                    301:                *e_com = *buf_ptr++;
                    302:                if (buf_ptr >= buf_end)
                    303:                    fill_buffer ();
                    304: 
                    305:                if (*e_com == '\t')
                    306:                               /* keep track of column */
                    307:                    now_col = ((now_col - 1) & tabmask) + tabsize + 1;
                    308:                else
                    309:                    if (*e_com == '')
                    310:                               /* this is a backspace */
                    311:                        --now_col;
                    312:                    else
                    313:                        ++now_col;
                    314: 
                    315:                if (*e_com == ' ' || *e_com == '\t')
                    316:                    last_bl = e_com;
                    317:            /* remember we saw a blank */
                    318: 
                    319:                ++e_com;
                    320:                if (now_col > max_col && !box_com && unix_comment == 1) {
                    321:                /* the comment is too long, it must be broken up */
                    322:                    if (last_bl == 0) {
                    323:                    /* we have seen no blanks */
                    324:                        printf ("%d: Comment too long\n", line_no);
                    325:                        last_bl = e_com;
                    326:                    /* fake it */
                    327:                        *e_com++ = ' ';
                    328:                    }
                    329: 
                    330:                    *e_com = '\0';
                    331:                /* print what we have */
                    332:                    *last_bl = '\0';
                    333:                    e_com = last_bl;
                    334:                    dump_line ();
                    335: 
                    336:                    *e_com++ = ' ';
                    337:                /* add blanks for continuation */
                    338:                    *e_com++ = ' ';
                    339:                    *e_com++ = ' ';
                    340: 
                    341:                    t_ptr = last_bl + 1;
                    342:                    last_bl = 0;
                    343:                    while (*t_ptr != '\0') {
                    344:                    /* move unprinted pare of comment down in buffer */
                    345:                        if (*t_ptr == ' ' || *t_ptr == '\t')
                    346:                            last_bl = e_com;
                    347:                        *e_com++ = *t_ptr++;
                    348:                    }
                    349: 
                    350:                    *e_com = '\0';
                    351:                    now_col = count_spaces (com_col, s_com);
                    352:                /* recompute current position */
                    353:                }              /* end of code for splitting a comment */
                    354:                break;         /* end of default case */
                    355: 
                    356: 
                    357:        }                      /* end of switch */
                    358: 
                    359:     }                         /* end of while (1) */
                    360: }                 /* end of pr_comment */

unix.superglobalmegacorp.com

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