aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>2004-07-18 13:00:34 +0000
committerTobias Schlüter <tobi@gcc.gnu.org>2004-07-18 13:00:34 +0000
commit1e3ce9874a2e864ea0c381a429b49a2d09f17beb (patch)
tree24c3eb4bb41b68910dfda108e20201c7d79da360
parentcad89e239c57a408817df1fa11954df69b4baa71 (diff)
PR fortran/16465
* lang.opt (ffixed-line-length-none, ffixed-line-length-): New options. (ffixed-line-length-80, ffixed-line-length-132): Remove. * options.c (gfc_handle_options): Deal with changed options. * scanner.c (load_line): Change second arg to 'char **', allocate if pointing to NULL. Keep track of buffer's length. Adapt buffer size to overlong lines. Pad lines to full length in fixed form. (load_file): Adapt to new interface of load_line. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@84891 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/fortran/ChangeLog13
-rw-r--r--gcc/fortran/lang.opt10
-rw-r--r--gcc/fortran/options.c10
-rw-r--r--gcc/fortran/scanner.c70
4 files changed, 81 insertions, 22 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 819d7357fea..01cedd8f1af 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,16 @@
+2004-07-18 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de>
+
+ PR fortran/16465
+ * lang.opt (ffixed-line-length-none, ffixed-line-length-): New
+ options.
+ (ffixed-line-length-80, ffixed-line-length-132): Remove.
+ * options.c (gfc_handle_options): Deal with changed options.
+ * scanner.c (load_line): Change second arg to 'char **',
+ allocate if pointing to NULL. Keep track of buffer's length.
+ Adapt buffer size to overlong lines. Pad lines to full length
+ in fixed form.
+ (load_file): Adapt to new interface of load_line.
+
2004-07-17 Joseph S. Myers <jsm@polyomino.org.uk>
* trans.h (builtin_function): Declare.
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index ff670d66f2b..6e6912c154b 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -97,13 +97,13 @@ fimplicit-none
F95
Specify that no implicit typing is allowed, unless overridden by explicit IMPLICIT statements
-ffixed-line-length-80
+ffixed-line-length-none
F95 RejectNegative
-Use 80 character line width in fixed mode
+Allow arbitrary character line width in fixed mode
-ffixed-line-length-132
-F95 RejectNegative
-Use 132 character line width in fixed mode
+ffixed-line-length-
+F95 RejectNegative Joined UInteger
+-ffixed-line-length-<n> Use n as character line width in fixed mode
fmax-identifier-length=
F95 RejectNegative Joined UInteger
diff --git a/gcc/fortran/options.c b/gcc/fortran/options.c
index b0f9a76e5f2..c8dc3293efd 100644
--- a/gcc/fortran/options.c
+++ b/gcc/fortran/options.c
@@ -260,12 +260,14 @@ gfc_handle_option (size_t scode, const char *arg, int value)
gfc_option.flag_repack_arrays = value;
break;
- case OPT_ffixed_line_length_80:
- gfc_option.fixed_line_length = 80;
+ case OPT_ffixed_line_length_none:
+ gfc_option.fixed_line_length = 0;
break;
- case OPT_ffixed_line_length_132:
- gfc_option.fixed_line_length = 132;
+ 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_:
diff --git a/gcc/fortran/scanner.c b/gcc/fortran/scanner.c
index 8b8f0b0295e..ae473d80992 100644
--- a/gcc/fortran/scanner.c
+++ b/gcc/fortran/scanner.c
@@ -671,26 +671,49 @@ gfc_gobble_whitespace (void)
}
-/* Load a single line into the buffer. We truncate lines that are too
- long. 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 a single line into pbuf.
+
+ If pbuf points to a NULL pointer, it is allocated.
+ We truncate lines that are too long, unless we're dealing with
+ preprocessor lines or if the option -ffixed-line-length-none is set,
+ in which case we reallocate the buffer to fit the entire line, if
+ need be.
+ 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. */
static void
-load_line (FILE * input, char *buffer, char *filename, int linenum)
+load_line (FILE * input, char **pbuf, char *filename, int linenum)
{
int c, maxlen, i, trunc_flag, preprocessor_flag;
+ static int buflen = 0;
+ char *buffer;
+
+ /* Detemine the maximum allowed line length. */
+ if (gfc_current_form == FORM_FREE)
+ maxlen = GFC_MAX_LINE;
+ else
+ maxlen = gfc_option.fixed_line_length;
+
+ if (*pbuf == NULL)
+ {
+ /* Allocate the line buffer, storing its length into buflen. */
+ if (maxlen > 0)
+ buflen = maxlen;
+ else
+ buflen = GFC_MAX_LINE;
- maxlen = (gfc_current_form == FORM_FREE)
- ? 132
- : gfc_option.fixed_line_length;
+ *pbuf = gfc_getmem (buflen + 1);
+ }
i = 0;
+ buffer = *pbuf;
preprocessor_flag = 0;
c = fgetc (input);
if (c == '#')
- /* Don't truncate preprocessor lines. */
+ /* In order to not truncate preprocessor lines, we have to
+ remember that this is one. */
preprocessor_flag = 1;
ungetc (c, input);
@@ -729,8 +752,17 @@ load_line (FILE * input, char *buffer, char *filename, int linenum)
*buffer++ = c;
i++;
- if (i >= maxlen && !preprocessor_flag)
- { /* Truncate the rest of the line. */
+ if (i >= buflen && (maxlen == 0 || preprocessor_flag))
+ {
+ /* Reallocate line buffer to double size to hold the
+ overlong line. */
+ buflen = buflen * 2;
+ *pbuf = xrealloc (*pbuf, buflen);
+ buffer = (*pbuf)+i;
+ }
+ else if (i >= buflen)
+ {
+ /* Truncate the rest of the line. */
trunc_flag = 1;
for (;;)
@@ -753,6 +785,14 @@ load_line (FILE * input, char *buffer, char *filename, int linenum)
}
}
+ /* Pad lines to the selected line length in fixed form. */
+ if (gfc_current_form == FORM_FIXED
+ && gfc_option.fixed_line_length > 0
+ && !preprocessor_flag
+ && c != EOF)
+ while (i++ < buflen)
+ *buffer++ = ' ';
+
*buffer = '\0';
}
@@ -925,7 +965,7 @@ include_line (char *line)
static try
load_file (char *filename, bool initial)
{
- char line[GFC_MAX_LINE+1];
+ char *line;
gfc_linebuf *b;
gfc_file *f;
FILE *input;
@@ -963,10 +1003,11 @@ load_file (char *filename, bool initial)
f->up = current_file;
current_file = f;
current_file->line = 1;
+ line = NULL;
for (;;)
{
- load_line (input, line, filename, current_file->line);
+ load_line (input, &line, filename, current_file->line);
len = strlen (line);
if (feof (input) && len == 0)
@@ -1003,6 +1044,9 @@ load_file (char *filename, bool initial)
line_tail = b;
}
+ /* Release the line buffer allocated in load_line. */
+ gfc_free (line);
+
fclose (input);
current_file = current_file->up;