diff options
| author | tobi <tobi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-18 13:00:34 +0000 | 
|---|---|---|
| committer | tobi <tobi@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-07-18 13:00:34 +0000 | 
| commit | f653e99bfe37c59a9e905b90b1a531c787b936d2 (patch) | |
| tree | 24c3eb4bb41b68910dfda108e20201c7d79da360 /gcc/fortran/scanner.c | |
| parent | 90e67cff4d8788bb3004f33e880b13bdbae3a7d6 (diff) | |
| download | ppe42-gcc-f653e99bfe37c59a9e905b90b1a531c787b936d2.tar.gz ppe42-gcc-f653e99bfe37c59a9e905b90b1a531c787b936d2.zip | |
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: svn+ssh://gcc.gnu.org/svn/gcc/trunk@84891 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fortran/scanner.c')
| -rw-r--r-- | gcc/fortran/scanner.c | 70 | 
1 files changed, 57 insertions, 13 deletions
| 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; | 

