[patch] pr21302: Max line length in free form mode

Bernhard Fischer rep.nop@aon.at
Sun Nov 20 19:01:00 GMT 2005


Hi,

Changed the patch as suggested by pbrook on irc to add some comments
to gfortran.h for 0, -1, +ve and dropped the check for the size of the
memory requested by -ffixed-line-length-n and -ffree-line-length-n.
Also dropped the part which ignored OPT_ffree_form in
c_common_handle_option when preprocessing as -lang-fortran already
handles this now.


A proposed testcase with two files is attached.
gfortran-4.1-HEAD -ffixed-line-length-none -c f1.f
gfortran-4.1-HEAD -ffree-line-length-none -c f2.f90
gfortran-4.1-HEAD -o runme f1.o f2.o && ./runme

Ok?

thank you,
Bernhard
-------------- next part --------------
Earlier referenced by Paul Brook here:
http://gcc.gnu.org/ml/fortran/2004-07/msg00212.html

2005-11-20 Bernhard Fischer <rep.nop@aon.at>

	PR fortran/21302
	* lang.opt: New options -ffree-line-length- and -ffree-line-length-none.
	* gfortran.h: Add free_line_length and add description of
	free_line_length and fixed_line_length.
	* options.c (gfc_init_options, gfc_handle_option): Initialize
	and set free_line_length and fixed_line_length.
	* scanner.c (load_line): Set free_line_length to 132 and
	fixed_line_length to 72 or user requested values. A line either
	starts with '#' thus is a preprocessor-line or is an include, so
	use "else".
	* scanner.c: Typo in comment.
	* invoke.texi: Document -ffree-line-length- and
	-ffree-line-length-none

-------------- next part --------------
diff -X excl -rduNp gcc.oorig/gcc/fortran/gfortran.h gcc/gcc/fortran/gfortran.h
--- gcc.oorig/gcc/fortran/gfortran.h	2005-11-19 14:05:37.000000000 +0100
+++ gcc/gcc/fortran/gfortran.h	2005-11-20 17:32:27.000000000 +0100
@@ -1460,7 +1460,21 @@ typedef struct
 {
   char *module_dir;
   gfc_source_form source_form;
-  int fixed_line_length;
+  /* When fixed_line_length or free_line_length are 0, the whole line is used.
+   *
+   * Default is -1, the maximum line length mandated by the respective source
+   * form is used:
+   * for FORM_FREE GFC_MAX_LINE (132)
+   * else 72.
+   *
+   * If fixed_line_length or free_line_length is not 0 nor -1 then the user has
+   * requested a specific line-length.
+   *
+   * If the user requests a fixed_line_length <7 then gfc_init_options()
+   * throws a fatal error.
+   */
+  int fixed_line_length; /* maximum line length in fixed-form.  */
+  int free_line_length; /* maximum line length in free-form.  */
   int max_identifier_length;
   int verbose;
 
diff -X excl -rduNp gcc.oorig/gcc/fortran/invoke.texi gcc/gcc/fortran/invoke.texi
--- gcc.oorig/gcc/fortran/invoke.texi	2005-11-20 13:52:50.000000000 +0100
+++ gcc/gcc/fortran/invoke.texi	2005-11-20 13:51:54.000000000 +0100
@@ -119,6 +119,7 @@ by type.  Explanations are in the follow
 -fdollar-ok  -fimplicit-none  -fmax-identifier-length @gol
 -std=@var{std} -fd-lines-as-code -fd-lines-as-comments @gol
 -ffixed-line-length-@var{n}  -ffixed-line-length-none @gol
+-ffree-line-length-@var{n}  -ffree-line-length-none @gol
 -fdefault-double-8  -fdefault-integer-8  -fdefault-real-8 @gol
 -fcray-pointer }
 
@@ -251,6 +252,20 @@ to them to fill out the line.
 @option{-ffixed-line-length-0} means the same thing as
 @option{-ffixed-line-length-none}.
 
+@cindex -ffree-line-length-@var{n} option
+@cindex options, -ffree-line-length-@var{n}
+@item -ffree-line-length-@var{n}
+@cindex source file format
+@cindex lines, length
+@cindex length of source lines
+@cindex free form
+@cindex limits, lengths of source lines
+Set column after which characters are ignored in typical free-form
+lines in the source file.
+@var{n} may be @samp{none}, meaning that the entire line is meaningful.
+@option{-ffree-line-length-0} means the same thing as
+@option{-ffree-line-length-none}.
+
 @cindex -fmax-identifier-length=@var{n} option
 @cindex option -fmax-identifier-length=@var{n}
 @item -fmax-identifier-length=@var{n}
diff -X excl -rduNp gcc.oorig/gcc/fortran/lang.opt gcc/gcc/fortran/lang.opt
--- gcc.oorig/gcc/fortran/lang.opt	2005-10-31 17:56:44.000000000 +0100
+++ gcc/gcc/fortran/lang.opt	2005-11-06 16:56:54.000000000 +0100
@@ -141,6 +141,14 @@ ffixed-line-length-
 Fortran RejectNegative Joined UInteger
 -ffixed-line-length-<n>		Use n as character line width in fixed mode
 
+ffree-line-length-none
+Fortran RejectNegative
+Allow arbitrary character line width in free mode
+
+ffree-line-length-
+Fortran RejectNegative Joined UInteger
+-ffree-line-length-<n>		Use n as character line width in free mode
+
 fmax-identifier-length=
 Fortran RejectNegative Joined UInteger
 -fmax-identifier-length=<n>	Maximum identifier length
diff -X excl -rduNp gcc.oorig/gcc/fortran/options.c gcc/gcc/fortran/options.c
--- gcc.oorig/gcc/fortran/options.c	2005-11-19 14:05:37.000000000 +0100
+++ gcc/gcc/fortran/options.c	2005-11-20 16:48:39.000000000 +0100
@@ -46,7 +46,8 @@ gfc_init_options (unsigned int argc ATTR
   gfc_source_file = NULL;
   gfc_option.module_dir = NULL;
   gfc_option.source_form = FORM_UNKNOWN;
-  gfc_option.fixed_line_length = 72;
+  gfc_option.fixed_line_length = -1;
+  gfc_option.free_line_length = -1;
   gfc_option.max_identifier_length = GFC_MAX_SYMBOL_LEN;
   gfc_option.verbose = 0;
 
@@ -423,10 +424,28 @@ gfc_handle_option (size_t scode, const c
       gfc_option.source_form = FORM_FIXED;
       break;
 
+    case OPT_ffixed_line_length_none:
+      gfc_option.fixed_line_length = 0;
+      break;
+
+    case OPT_ffixed_line_length_:
+      if (value != 0 && value < 7)
+	gfc_fatal_error ("Fixed line length must be at least seven.");
+      gfc_option.fixed_line_length = value;
+      break;
+
     case OPT_ffree_form:
       gfc_option.source_form = FORM_FREE;
       break;
 
+    case OPT_ffree_line_length_none:
+      gfc_option.free_line_length = 0;
+      break;
+
+    case OPT_ffree_line_length_:
+      gfc_option.free_line_length = value;
+      break;
+
     case OPT_funderscoring:
       gfc_option.flag_underscoring = value;
       break;
@@ -459,16 +478,6 @@ gfc_handle_option (size_t scode, const c
       gfc_option.flag_repack_arrays = value;
       break;
 
-    case OPT_ffixed_line_length_none:
-      gfc_option.fixed_line_length = 0;
-      break;
-
-    case OPT_ffixed_line_length_:
-      if (value != 0 && value < 7)
-	gfc_fatal_error ("Fixed line length must be at least seven.");
-      gfc_option.fixed_line_length = value;
-      break;
-
     case OPT_fmax_identifier_length_:
       if (value > GFC_MAX_SYMBOL_LEN)
 	gfc_fatal_error ("Maximum supported idenitifier length is %d",
diff -X excl -rduNp gcc.oorig/gcc/fortran/scanner.c gcc/gcc/fortran/scanner.c
--- gcc.oorig/gcc/fortran/scanner.c	2005-11-19 14:05:37.000000000 +0100
+++ gcc/gcc/fortran/scanner.c	2005-11-19 14:03:21.000000000 +0100
@@ -694,7 +694,7 @@ gfc_gobble_whitespace (void)
    In fixed mode, we expand a tab that occurs within the statement
    label region to expand to spaces that leave the next character in
    the source region.
-   load_line returns wether the line was truncated.  */
+   load_line returns whether the line was truncated.  */
 
 static int
 load_line (FILE * input, char **pbuf, int *pbuflen)
@@ -705,9 +705,21 @@ load_line (FILE * input, char **pbuf, in
 
   /* Determine the maximum allowed line length.  */
   if (gfc_current_form == FORM_FREE)
-    maxlen = GFC_MAX_LINE;
+    {
+      if (gfc_option.free_line_length == -1)
+	maxlen = GFC_MAX_LINE;
+      else
+	maxlen = gfc_option.free_line_length;
+    }
+  else if (gfc_current_form == FORM_FIXED)
+    {
+      if (gfc_option.fixed_line_length == -1)
+	maxlen = 72;
+      else
+	maxlen = gfc_option.fixed_line_length;
+    }
   else
-    maxlen = gfc_option.fixed_line_length;
+    maxlen = 72;
 
   if (*pbuf == NULL)
     {
@@ -772,13 +784,13 @@ load_line (FILE * input, char **pbuf, in
 	    {
 	      /* Reallocate line buffer to double size to hold the
 	         overlong line.  */
-	      buflen = buflen * 2;
+	      buflen += buflen;
 	      *pbuf = xrealloc (*pbuf, buflen + 1);
 	      buffer = (*pbuf)+i;
 	    }
 	}
       else if (i >= maxlen)
-	{			
+	{
 	  /* Truncate the rest of the line.  */
 	  for (;;)
 	    {
@@ -1055,7 +1067,7 @@ load_file (const char *filename, bool in
   line = NULL;
   line_len = 0;
 
-  for (;;) 
+  for (;;)
     {
       int trunc = load_line (input, &line, &line_len);
 
@@ -1071,8 +1083,7 @@ load_file (const char *filename, bool in
 	  preprocessor_line (line);
 	  continue;
 	}
-
-      if (include_line (line))
+      else if (include_line (line))
 	{
 	  current_file->line++;
 	  continue;
-------------- next part --------------
C fixed form example .f/.for
      program one
       if (abs(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).gt.999.d0.or.abs(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb).gt.999.d0.or.abs(cccccccccccccccccccc).gt.999.d0) THEN
       endif
       call two
      end program one
-------------- next part --------------
! free form example .f90/.f95
subroutine two
 if (abs(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa).gt.999.d0.or.abs(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb).gt.999.d0.or.abs(cccccccccccccccccccc).gt.999.d0) THEN
 endif
end subroutine two


More information about the Fortran mailing list