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

1.1       root        1: static char sccsid[] = "@(#)io.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: FILE NAME:
                     15:        io.c
                     16: 
                     17: PURPOSE:
                     18:        Contains routines to handle i/o related stuff for indent.
                     19: 
                     20: GLOBALS:
                     21:        None
                     22: 
                     23: FUNCTIONS:
                     24:        dump_line
                     25:        fill_buffer
                     26:        pad_output
                     27:        count_spaces
                     28:        eqin
                     29:        cmp
                     30: 
                     31: */
                     32: /*
                     33: 
                     34:                          Copyright (C) 1976
                     35:                                by the
                     36:                          Board of Trustees
                     37:                                of the
                     38:                        University of Illinois
                     39: 
                     40:                         All rights reserved
                     41: 
                     42: 
                     43: NAME:
                     44:        dump_line
                     45: 
                     46: FUNCTION:
                     47:        Does the actual printing of the stored up line
                     48: 
                     49: ALGORITHM:
                     50:        For each of the label, code, and comment sections which are used on 
                     51:        this line:
                     52: 
                     53:        1) Use pad_output to get the section aligned properly.
                     54:        2) write the section
                     55: 
                     56:        The indentation level used for the code is set by ind_level.  After
                     57:        printing, ind_level is set to i_l_follow.
                     58: 
                     59:        An extra level of indentation is added if ind_stmt is 1.  After 
                     60:        printing, ind_stmt is set to 1 iff the line just printed has an
                     61:        unterminated, non-declaration statement.
                     62: 
                     63: PARAMETERS:
                     64:        None
                     65: 
                     66: RETURNS:
                     67:        Nothing
                     68: 
                     69: GLOBALS:
                     70:        labbuf
                     71:        s_lab
                     72:        e_lab =         Reset to s_lab
                     73: 
                     74:        codebuf
                     75:        s_code
                     76:        e_code =        Reset to s_code
                     77: 
                     78:        combuf
                     79:        s_com
                     80:        e_com =         Reset to s_com
                     81: 
                     82:        bl_line =       Set to true iff the line was blank
                     83:        case_ind
                     84:        code_lines =    Count lines with code
                     85:        com_col
                     86:        com_lines =     Keep track of lines with comments
                     87:        decl_on_line =  Set to in_decl after line is printed
                     88:        i_l_follow
                     89:        in_decl
                     90:        in_stmt
                     91:        ind_level =     Set to i_l_follow at completion
                     92:        ind_size
                     93:        ind_stmt =      Set to in_stmt at completion if not in declaration
                     94:        out_lines =     Count output lines
                     95:        p_l_follow
                     96:        paren_level =   Set to p_l_follow at completion
                     97:        pcase
                     98:        use_ff =        Reset to false
                     99: 
                    100: CALLS:
                    101:        pad_output
                    102:        printf (lib)
                    103:        write (lib)
                    104: 
                    105: CALLED BY:
                    106:        main
                    107:        pr_comment
                    108: 
                    109: HISTORY:
                    110:        initial coding  November 1976   D A Willcox of CAC
                    111: 
                    112: */
                    113: #include "indent_globs.h";
                    114: 
                    115: 
                    116: 
                    117: int     ff = 014;             /* used to write a form feed */
                    118: 
                    119: 
                    120: dump_line () {                /* dump_line is the routine that actually
                    121:                                  effects the printing of the new source.
                    122:                                  It prints the label section, followed by
                    123:                                  the code section with the appropriate
                    124:                                  nesting level, followed by any comments 
                    125:                               */
                    126:     register int    cur_col,
                    127:                     temp_col,
                    128:                     target_col;
                    129: 
                    130:     bl_line = true;           /* if we don't find otherwise, assume a
                    131:                                  blank line */
                    132: 
                    133:     if (ind_level == 0)
                    134:        ind_stmt = 0;          /* this is a class A kludge. don't do
                    135:                                  additional statement indentation if we
                    136:                                  are at bracket level 0 */
                    137: 
                    138:     if (e_lab != s_lab || e_code != s_code)
                    139:        ++code_lines;          /* keep count of lines with code */
                    140: 
                    141:     if (e_lab != s_lab) {      /* print lab, if any */
                    142:        if (pcase)             /* if the label is really a case, we must
                    143:                                  indent */
                    144:            cur_col = pad_output (1, case_ind * ind_size + 1);
                    145:        else {
                    146:            if (*s_lab == '#') /* check for #define, etc */
                    147:                cur_col = 1;
                    148:            else
                    149:                cur_col = pad_output (1, ind_size * (ind_level - label_offset) + 1);
                    150:        }
                    151: 
                    152:        write (output, s_lab, e_lab - s_lab);
                    153:        cur_col = count_spaces (cur_col, s_lab);
                    154:     /* count_spaces gives number of characters, considering tabs */
                    155:        bl_line = false;       /* line not blank after all */
                    156:     }
                    157:     else
                    158:        cur_col = 1;           /* there is no label section */
                    159: 
                    160:     pcase = false;
                    161: 
                    162:     if (s_code != e_code) {    /* print code section, if any */
                    163:        target_col = ind_size * (ind_level + paren_level + ind_stmt) + 1;
                    164: 
                    165:        cur_col = pad_output (cur_col, target_col);
                    166:     /* pad_output writes enough tabs and spaces to get the current char
                    167:        position up to target_col */
                    168:        write (output, s_code, e_code - s_code);
                    169:        cur_col = count_spaces (cur_col, s_code);
                    170:        bl_line = false;       /* line not blank */
                    171:     }
                    172: 
                    173:     if ((cur_col - 1) > max_col && output!=1)/* check for line too long */
                    174:        printf ("%d: Code has %d chars, max is %d\n", line_no, (cur_col - 1), max_col);
                    175: 
                    176:     if (s_com != e_com) {      /* print comment, if any */
                    177:        if (cur_col > com_col && count_spaces (cur_col, s_com) >= max_col) {
                    178:        /* if comment can't fit on this line, put it on next line */
                    179:            write (output, "\n", 1);
                    180:            cur_col = 1;
                    181:            ++out_lines;
                    182:        }
                    183:        cur_col = pad_output (cur_col, com_col);
                    184:        write (output, s_com, e_com - s_com);
                    185: 
                    186:        cur_col = count_spaces (cur_col, s_com);
                    187:        if ((cur_col - 1) > max_col && output!=1)/* check for too long comment */
                    188:            printf ("%d: Comment goes to column %d.  Max is %d\n",
                    189:                line_no, (cur_col - 1), max_col);
                    190: 
                    191:        bl_line = false;
                    192:        ++com_lines;           /* count lines with comments */
                    193:     }
                    194: 
                    195:     if (use_ff)
                    196:        write (output, &ff, 1);/* end the output with a ff */
                    197:     else
                    198:        write (output, "\n", 1); /* or a newline */
                    199:     use_ff = false;
                    200:     *(e_lab = s_lab) = '\0';   /* reset buffers */
                    201:     *(e_code = s_code) = '\0';
                    202:     *(e_com = s_com) = '\0';
                    203: 
                    204:     ind_level = i_l_follow;
                    205:     paren_level = p_l_follow;
                    206:     ++out_lines;
                    207:     decl_on_line = in_decl;    /* if we are in the middle of a
                    208:                                  declaration, remember that fact for
                    209:                                  proper comment indentation */
                    210:     ind_stmt = in_stmt & ~in_decl;
                    211:  /* next line should be indented if we have not completed this stmt and if
                    212:     we are not in the middle of a declaration */
                    213: 
                    214:     return;
                    215: };
                    216: /*
                    217: 
                    218:                          Copyright (C) 1976
                    219:                                by the
                    220:                          Board of Trustees
                    221:                                of the
                    222:                        University of Illinois
                    223: 
                    224:                         All rights reserved
                    225: 
                    226: 
                    227: NAME:
                    228:        fill_buffer
                    229: 
                    230: FUNCTION:
                    231:        Reads one block of input into input_buffer
                    232: 
                    233: ALGORITHM:
                    234:        Trivial
                    235: 
                    236: PARAMETERS:
                    237:        None
                    238: 
                    239: RETURNS:
                    240:        Nothing
                    241: 
                    242: GLOBALS:
                    243:        in_buffer =
                    244:        buf_end =       Set to 1 past last character read in
                    245:        buf_ptr =       Set to start of buffer
                    246:        be_save =       Set to zero if it was non-zero
                    247:        bp_save =       Set to zero
                    248: 
                    249: CALLS:
                    250:        read (lib)
                    251: 
                    252: CALLED BY:
                    253:        lexi
                    254:        main
                    255:        pr_comment
                    256: 
                    257: HISTORY:
                    258:        initial coding  November 1976   D A Willcox of CAC
                    259:        1/7/77          D A Willcox of CAC      Added check for switch back to
                    260:                                                partly full input buffer from
                    261:                                                temporary buffer 
                    262: 
                    263: */
                    264: int     fill_buffer () { /* this routine reads stuff from the input */
                    265:     int     count;
                    266:     register int    i;
                    267: 
                    268:     if (bp_save != 0) {               /* there is a partly filled input buffer
                    269:                                  left */
                    270:        buf_ptr = bp_save;     /* don't read anything, just switch buffers 
                    271:                               */
                    272:        buf_end = be_save;
                    273:        bp_save = be_save = 0;
                    274:        if (buf_ptr < buf_end)
                    275:            return;            /* only return if there is really something
                    276:                                  in this buffer */
                    277:     }
                    278: 
                    279:     count = read (input, in_buffer, inp_bufs);
                    280: 
                    281:     buf_end = in_buffer + count;
                    282:     buf_ptr = in_buffer;
                    283: 
                    284:     if (count == 0) {         /* count of zero means eof */
                    285:        had_eof = true;
                    286:        *buf_end++ = ' ';
                    287:        *buf_end++ = '\n';     /* insert extra newline.  it will
                    288:                                  eventually get indent to stop */
                    289:     }
                    290: 
                    291:     return;
                    292: };
                    293: /*
                    294: 
                    295:                          Copyright (C) 1976
                    296:                                by the
                    297:                          Board of Trustees
                    298:                                of the
                    299:                        University of Illinois
                    300: 
                    301:                         All rights reserved
                    302: 
                    303: 
                    304: NAME:
                    305:        pad_output
                    306: 
                    307: FUNCTION:
                    308:        Writes tabs and spaces to move the current column up to the
                    309:        desired position.
                    310: 
                    311: ALGORITHM:
                    312:        Put tabs and/or blanks into pobuf, then write pobuf.
                    313: 
                    314: PARAMETERS:
                    315:        current         integer         The current column
                    316:        target          integer         The desired column
                    317: 
                    318: RETURNS:
                    319:        Integer value of the new column.  (If current >= target,
                    320:        no action is taken, and current is returned.
                    321: 
                    322: GLOBALS:
                    323:        None
                    324: 
                    325: CALLS:
                    326:        write (sys)
                    327: 
                    328: CALLED BY:
                    329:        dump_line
                    330: 
                    331: HISTORY:
                    332:        initial coding  November 1976   D A Willcox of CAC
                    333: 
                    334: */
                    335: int     pad_output (current, target)/* writes tabs and blanks (if necessary) to
                    336:                                  get the current output position up to
                    337:                                  the target column */
                    338: int     current;              /* the current column value */
                    339: int     target;                       /* position we want it at */
                    340: {
                    341:     register int    curr; /* internal column pointer */
                    342:     register char  *p; /* pointer into buffer of characters to be written */
                    343:     char    pobuf[256]; /* pad characters are stored here before writing */
                    344:     register int tcur;
                    345: 
                    346:     if (current >= target)
                    347:        return (current);      /* line is already long enough */
                    348: 
                    349:     curr = current;
                    350:     p = pobuf;
                    351:     while (curr < target) {
                    352:        if ((tcur = ((curr - 1) & tabmask) + tabsize + 1) <= target){
                    353:            *p++ = '\t';       /* put a tab into buffer */
                    354:            curr = tcur;
                    355:        }
                    356:        else {
                    357:            while (curr++ < target)
                    358:                *p++ = ' ';    /* pad with final blanks */
                    359:        }
                    360:     }
                    361: 
                    362:     write (output, pobuf, p - pobuf); /* write the characters we saved */
                    363:     return (target);
                    364: };
                    365: /*
                    366: 
                    367:                          Copyright (C) 1976
                    368:                                by the
                    369:                          Board of Trustees
                    370:                                of the
                    371:                        University of Illinois
                    372: 
                    373:                         All rights reserved
                    374: 
                    375: 
                    376: NAME:
                    377:        count_spaces
                    378: 
                    379: FUNCTION:
                    380:        Find out where printing of a given string will leave the current
                    381:        character position on output.
                    382: 
                    383: ALGORITHM:
                    384:        Run thru input string and add appropriate values to current position.
                    385: 
                    386: PARAMETERS:
                    387:        current         integer           The current line character position
                    388:        buffer          ptr to character  Pointer to input string
                    389: 
                    390: RETURNS:
                    391:        Integer value of position after printing "buffer" starting in
                    392:        column "current".
                    393: 
                    394: GLOBALS:
                    395:        None
                    396: 
                    397: CALLS:
                    398:        None
                    399: 
                    400: CALLED BY:
                    401:        pr_comment
                    402: 
                    403: HISTORY:
                    404:        initial coding  November 1976   D A Willcox of CAC
                    405: 
                    406: */
                    407: int     count_spaces (current, buffer)
                    408:                               /* this routine figures out where the
                    409:                                  character position will be after
                    410:                                  printing the text in buffer starting at
                    411:                                  column "current" */
                    412: int     current;
                    413: char   *buffer;
                    414: {
                    415:     register char  *buf; /* used to look thru buffer */
                    416:     register int    cur; /* current character counter */
                    417: 
                    418:     cur = current;
                    419: 
                    420:     for (buf = buffer; *buf != '\0'; ++buf) {
                    421:        switch (*buf) {
                    422: 
                    423:            case '\n': 
                    424:            case 014:          /* form feed */
                    425:                cur = 1;
                    426:                break;
                    427: 
                    428:            case '\t': 
                    429:                cur = ((cur - 1) & tabmask) + tabsize + 1;
                    430:                break;
                    431: 
                    432:            case '':          /* this is a backspace */
                    433:                --cur;
                    434:                break;
                    435: 
                    436:            default: 
                    437:                ++cur;
                    438:                break;
                    439:        }                      /* end of switch */
                    440:     }                         /* end of for loop */
                    441: 
                    442:     return (cur);
                    443: };
                    444: /*
                    445: 
                    446:                          Copyright (C) 1976
                    447:                                by the
                    448:                          Board of Trustees
                    449:                                of the
                    450:                        University of Illinois
                    451: 
                    452:                         All rights reserved
                    453: 
                    454: 
                    455: NAME:
                    456:        eqin
                    457: 
                    458: FUNCTION:
                    459:        Returns true if the first arg matches the beginning of the second arg.
                    460: 
                    461: ALGORITHM:
                    462:        Trivial
                    463: 
                    464: PARAMETERS:
                    465:        str1    pointer to character
                    466:        str2    pointer to character
                    467: 
                    468: RETURNS:
                    469:        1 if first string matches start of second string
                    470:        0 otherwise
                    471: 
                    472: GLOBALS:
                    473:        None
                    474: 
                    475: CALLS:
                    476:        None
                    477: 
                    478: CALLED BY:
                    479:        lexi
                    480:        main
                    481: 
                    482: HISTORY:
                    483:        initial coding November 1976 by D A Willcox of CAC
                    484: 
                    485: */
                    486: eqin (str1, str2)
                    487: char   *str1;
                    488: char   *str2;
                    489: {
                    490:     register char  *s1; /* local pointer into first string */
                    491:     register char  *s2; /* local pointer into second string */
                    492: 
                    493:     s1 = str1;
                    494:     s2 = str2;
                    495:     while (*s1) {             /* compare no further than end of first
                    496:                                  string */
                    497:        if (*s2 == 0)          /* check that second string isn't too short 
                    498:                               */
                    499:            return (false);
                    500:        if (*s1++ != *s2++)
                    501:            return (false);
                    502:     }
                    503: 
                    504:     return (true);
                    505: }
                    506: /*
                    507:                          Copyright (C) 1976
                    508:                                by the
                    509:                          Board of Trustees
                    510:                                of the
                    511:                        University of Illinois
                    512: 
                    513:                         All rights reserved
                    514: 
                    515: NAME:
                    516:        cmp
                    517: 
                    518: FUNCTION:
                    519:        Compares two strings
                    520: 
                    521: ALGORITHM:
                    522:        Trivial
                    523: 
                    524: PARAMETERS:
                    525:        a       Pointer to char         First string to compare
                    526:        b       Pointer to char         Second string to compare
                    527: 
                    528: RETURNS:
                    529:        -1 if a < b
                    530:         0 if a = b
                    531:         1 if a > b
                    532: 
                    533: GLOBALS:
                    534:        None
                    535: 
                    536: CALLS:
                    537:        None
                    538: 
                    539: CALLED BY:
                    540:        main
                    541: 
                    542: HISTORY:
                    543:        1/7/77          D A Willcox of CAC      Initial Coding
                    544: */
                    545: int     cmp (a, b)
                    546: char   *a;
                    547: char   *b;
                    548: {
                    549:     register char  *ta,
                    550:                    *tb;
                    551: 
                    552:     ta = a;
                    553:     tb = b;
                    554: 
                    555:     while (*ta) {
                    556:        if (*ta > *tb)
                    557:            return (1);
                    558:        if (*ta < *tb)
                    559:            return (-1);
                    560:        ++ta;
                    561:        ++tb;
                    562:     }
                    563:     if (*tb)
                    564:        return (1);
                    565:     else
                    566:        return (0);
                    567: }

unix.superglobalmegacorp.com

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