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