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 */

Defined functions

pr_comment defined in line 83; used 1 times

Defined variables

sccsid defined in line 1; never used
Last modified: 1983-09-04
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 863
Valid CSS Valid XHTML 1.0 Strict