date and time created 82/10/21 23:58:39 by mckusick
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 22 Oct 1982 15:58:39 +0000 (07:58 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Fri, 22 Oct 1982 15:58:39 +0000 (07:58 -0800)
SCCS-vsn: usr.bin/indent/pr_comment.c 4.1

usr/src/usr.bin/indent/pr_comment.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/indent/pr_comment.c b/usr/src/usr.bin/indent/pr_comment.c
new file mode 100644 (file)
index 0000000..e1abb7e
--- /dev/null
@@ -0,0 +1,360 @@
+static char sccsid[] = "@(#)pr_comment.c       4.1     (Berkeley)      %G%";
+
+/*
+
+                         Copyright (C) 1976
+                               by the
+                         Board of Trustees
+                               of the
+                       University of Illinois
+
+                        All rights reserved
+
+
+NAME:
+       pr_comment
+
+FUNCTION:
+       This routine takes care of scanning and printing comments.
+
+ALGORITHM:
+       1) Decide where the comment should be aligned, and if lines should
+          be broken.
+       2) If lines should not be broken and filled, just copy up to end of
+          comment.
+       3) If lines should be filled, then scan thru input_buffer copying
+          characters to com_buf.  Remember where the last blank, tab, or
+          newline was.  When line is filled, print up to last blank and 
+          continue copying.
+
+PARAMETERS:
+       None
+
+RETURNS:
+       Nothing
+
+GLOBALS:
+       combuf =
+       s_com
+       e_com =
+
+       buf_ptr =
+       buf_end
+
+       bl_line
+       col_1
+       com_col =
+       com_ind
+       decl_com_ind
+       decl_on_line
+       had_eof
+       ind_level
+       ind_size
+       line_no =
+       max_col
+       out_com =       Count number of comments
+       unindent_displace
+       use_ff =
+
+CALLS:
+       count_spaces
+       dump_line
+       fill_buffer
+       printf          (lib)
+
+CALLED BY:
+       main
+
+HISTORY:
+       November 1976   D A Willcox of CAC      Initial coding
+       12/6/76         D A Willcox of CAC      Modification to handle 
+                                               UNIX-style comments
+
+*/\f
+
+/* this routine processes comments.  It makes an attempt to keep comments from
+   going over the max line length.  If a line is too long, it moves everything
+   from the last blank to the next comment line.  Blanks and tabs from the
+   beginning of the input line are removed */
+
+#include "indent_globs.h";
+
+
+pr_comment () {
+    int     now_col;
+ /* column we are in now */
+    int     box_com;
+ /* set to true when we are in a "boxed" comment. In that case, the first
+    non-blank char should be lined up with the / in /* */
+    int     col_1_com;
+ /* this comment should not be touched */
+    char   *last_bl;
+ /* points to the last blank in the output buffer */
+    char    achar;
+    char   *t_ptr; /* used for movinf string */
+    int     unix_comment;
+ /* tri-state variable used to decide if it is a unix-style comment. 0 means
+    only blanks since /*, 1 means regular style comment, 2 means unix style
+    comment */
+
+
+    last_bl = 0;              /* no blanks found so far */
+    box_com = col_1_com = false;
+ /* at first, assume that we are not in a boxed comment or some other comment
+    that should not be touched */
+    ++out_coms;                       /* keep track of number of comments */
+    unix_comment = 0;         /* set flag to let us figure out if there is a
+                                 unix-style comment */
+
+/*----------------------------------------------------------*\ 
+|   Figure where to align and how to treat the comment
+\*----------------------------------------------------------*/
+
+    if (col_1) {              /* if comment starts in column 1 it should not
+                                 be touched */
+       col_1_com = box_com = true;
+       com_col = 1;
+    }
+    else {
+       if (*buf_ptr == '-')
+           box_com = true;    /* a comment with a '-' immediately after the /*
+                                 is assumed to be a boxed comment */
+       if ( /* bl_line && */ (s_lab == e_lab) && (s_code == e_code)) {
+       /* klg: check only if this line is blank */
+       /* 
+        * If this (*and previous lines are*) blank,
+        * don't put comment way out at left
+        */
+           com_col = (ind_level - unindent_displace) * ind_size + 1;
+           if (com_col <= 1)
+               com_col = 2;
+       }
+       else {
+           com_col = (decl_on_line || ind_level == 0 ? decl_com_ind : com_ind);
+       }
+    }
+
+    *e_com++ = '/';           /* put '/*' into buffer */
+    *e_com++ = '*';
+    if (*buf_ptr != ' ' && !box_com)
+       *e_com++ = ' ';
+
+    *e_com = '\0';
+    now_col = count_spaces (com_col, s_com);
+ /* figure where what column we would be in if we printed the comment now */
+
+
+/*----------------------------------------------------------*\ 
+|    Start to copy the comment
+\*----------------------------------------------------------*/
+
+    while (1) {                       /* this loop will go until the comment is copied 
+                              */
+       switch (*buf_ptr) {    /* this checks for various spcl cases */
+           case 014:          /* check for a form feed */
+               if (!box_com) {/* in a text comment, break the line here */
+                   use_ff = true;
+               /* fix so dump_line uses a form feed */
+                   dump_line ();
+                   last_bl = 0;
+                   *e_com++ = ' ';
+                   *e_com++ = ' ';
+                   *e_com++ = ' ';
+                   do {       /* get rid of leading blanks */
+                       if (++buf_ptr >= buf_end)
+                           fill_buffer ();
+                   } while (*buf_ptr == ' ' || *buf_ptr == '\t');
+               }
+               else {
+                   if (++buf_ptr >= buf_end)
+                       fill_buffer ();
+                   *e_com++ = 014;
+               }
+
+               break;
+
+           case '\n': 
+               if (had_eof) { /* check for unexpected eof */
+                   printf ("Unterminated comment\n");
+                   *e_com = '\0';
+                   dump_line ();
+                   return;
+               }
+
+               if (box_com) { /* if this is a boxed comment, we don't ignore
+                                 the newline */
+                   *e_com = '\0';
+                   dump_line ();
+                   ++line_no;
+                   now_col = com_col;
+
+                   if (!col_1_com) {
+                   /* if merely a boxed comment, we should line up first
+                      non-blank character */
+                       do {   /* flush leading non-blanks */
+                           if (++buf_ptr >= buf_end)
+                               fill_buffer ();
+                       } while (*buf_ptr == ' ' || *buf_ptr == '\t');
+                   }
+                   else {     /* make sure we at least flush the blank */
+                       if (++buf_ptr >= buf_end)
+                           fill_buffer ();
+                   }
+
+                   break;
+               }
+
+               if (unix_comment != 1) {
+               /* we are in unix_style comment */
+                   if (unix_comment == 0 && s_code == e_code) {
+                   /* if it is a UNIX-style comment, ignore the requirement
+                      that pervious line be blank for unindention */
+                       com_col = (ind_level - unindent_displace) * ind_size + 1;
+                       if (com_col <= 1)
+                           com_col = 2;
+                   }
+
+                   unix_comment = 2;
+               /* permanently remember that we are in this type of comment */
+                   dump_line ();
+                   ++line_no;
+                   now_col = com_col;
+                   *e_com++ = ' ';
+               /* fix so that the star at the start of the line will line up 
+               */
+                   do         /* flush leading white space */
+                       if (++buf_ptr >= buf_end)
+                           fill_buffer ();
+                   while (*buf_ptr == ' ' || *buf_ptr == '\t');
+                   break;
+               }
+
+               if (*(e_com - 1) == ' ' || *(e_com - 1) == '\t')
+                   last_bl = e_com - 1;
+           /* if there was a space at the end of the last line, remember where
+              it was */
+               else {         /* otherwise, insert one */
+                   last_bl = e_com;
+                   *e_com++ = ' ';
+                   ++now_col;
+               }
+
+               ++line_no;     /* keep track of input line number */
+               do {           /* copy any blanks and/or tabs at start of next
+                                 line */
+                   if (++buf_ptr >= buf_end)
+                       fill_buffer ();
+               } while (*buf_ptr == ' ' || *buf_ptr == '\t');
+
+               break;         /* end of case for newline */
+
+           case '*':          /* must check for possibility of being at end of
+                                 comment */
+               if (++buf_ptr >= buf_end)
+                              /* get to next char after * */
+                   fill_buffer ();
+
+               if (unix_comment == 0)
+                              /* set flag to show we are not in unix-style
+                                 comment */
+                   unix_comment = 1;
+
+               if (*buf_ptr == '/') {
+               /* it is the end!!! */
+                   if (++buf_ptr >= buf_end)
+                       fill_buffer ();
+
+                   if (*(e_com - 1) != ' ' && !box_com) {
+                   /* insure blank before end */
+                       *e_com++ = ' ';
+                       ++now_col;
+                   }
+
+                   if (now_col > max_col - 2 && !box_com) {
+                   /* check if star-slash will go over line */
+                       *e_com = '\0';
+                   /* it will */
+                       dump_line ();
+                       now_col = com_col;
+                   }
+
+                   *e_com++ = '*';
+               /* move end of comment */
+                   *e_com++ = '/';
+                   *e_com = '\0';
+                   return;    /* we is done */
+               }              /* end of end of comment */
+
+
+               else {         /* handle isolated '*' */
+                   *e_com++ = '*';
+                   ++now_col;
+                   break;
+               }
+           /* end of processing of * */
+
+           default:           /* we have a random char */
+               if (unix_comment == 0 && *buf_ptr != ' ' && *buf_ptr != '\t')
+                   unix_comment = 1;
+           /* we are not in unix-style comment */
+
+               *e_com = *buf_ptr++;
+               if (buf_ptr >= buf_end)
+                   fill_buffer ();
+
+               if (*e_com == '\t')
+                              /* keep track of column */
+                   now_col = ((now_col - 1) & tabmask) + tabsize + 1;
+               else
+                   if (*e_com == '\b')
+                              /* this is a backspace */
+                       --now_col;
+                   else
+                       ++now_col;
+
+               if (*e_com == ' ' || *e_com == '\t')
+                   last_bl = e_com;
+           /* remember we saw a blank */
+
+               ++e_com;
+               if (now_col > max_col && !box_com && unix_comment == 1) {
+               /* the comment is too long, it must be broken up */
+                   if (last_bl == 0) {
+                   /* we have seen no blanks */
+                       printf ("%d: Comment too long\n", line_no);
+                       last_bl = e_com;
+                   /* fake it */
+                       *e_com++ = ' ';
+                   }
+
+                   *e_com = '\0';
+               /* print what we have */
+                   *last_bl = '\0';
+                   e_com = last_bl;
+                   dump_line ();
+
+                   *e_com++ = ' ';
+               /* add blanks for continuation */
+                   *e_com++ = ' ';
+                   *e_com++ = ' ';
+
+                   t_ptr = last_bl + 1;
+                   last_bl = 0;
+                   while (*t_ptr != '\0') {
+                   /* move unprinted pare of comment down in buffer */
+                       if (*t_ptr == ' ' || *t_ptr == '\t')
+                           last_bl = e_com;
+                       *e_com++ = *t_ptr++;
+                   }
+
+                   *e_com = '\0';
+                   now_col = count_spaces (com_col, s_com);
+               /* recompute current position */
+               }              /* end of code for splitting a comment */
+               break;         /* end of default case */
+
+
+       }                      /* end of switch */
+
+    }                         /* end of while (1) */
+}                 /* end of pr_comment */