aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8/libgfortran/io/format.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.8/libgfortran/io/format.c')
-rw-r--r--gcc-4.8/libgfortran/io/format.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/gcc-4.8/libgfortran/io/format.c b/gcc-4.8/libgfortran/io/format.c
index ff3c68046..3c685e34e 100644
--- a/gcc-4.8/libgfortran/io/format.c
+++ b/gcc-4.8/libgfortran/io/format.c
@@ -149,8 +149,7 @@ save_parsed_format (st_parameter_dt *dtp)
u->format_hash_table[hash].hashed_fmt = NULL;
free (u->format_hash_table[hash].key);
- u->format_hash_table[hash].key = xmalloc (dtp->format_len);
- memcpy (u->format_hash_table[hash].key, dtp->format, dtp->format_len);
+ u->format_hash_table[hash].key = dtp->format;
u->format_hash_table[hash].key_len = dtp->format_len;
u->format_hash_table[hash].hashed_fmt = dtp->u.p.fmt;
@@ -588,16 +587,15 @@ format_lex (format_data *fmt)
* parenthesis node which contains the rest of the list. */
static fnode *
-parse_format_list (st_parameter_dt *dtp, bool *save_ok, bool *seen_dd)
+parse_format_list (st_parameter_dt *dtp, bool *seen_dd)
{
fnode *head, *tail;
format_token t, u, t2;
int repeat;
format_data *fmt = dtp->u.p.fmt;
- bool saveit, seen_data_desc = false;
+ bool seen_data_desc = false;
head = tail = NULL;
- saveit = *save_ok;
/* Get the next format item */
format_item:
@@ -614,7 +612,7 @@ parse_format_list (st_parameter_dt *dtp, bool *save_ok, bool *seen_dd)
}
get_fnode (fmt, &head, &tail, FMT_LPAREN);
tail->repeat = -2; /* Signifies unlimited format. */
- tail->u.child = parse_format_list (dtp, &saveit, &seen_data_desc);
+ tail->u.child = parse_format_list (dtp, &seen_data_desc);
if (fmt->error != NULL)
goto finished;
if (!seen_data_desc)
@@ -633,7 +631,7 @@ parse_format_list (st_parameter_dt *dtp, bool *save_ok, bool *seen_dd)
case FMT_LPAREN:
get_fnode (fmt, &head, &tail, FMT_LPAREN);
tail->repeat = repeat;
- tail->u.child = parse_format_list (dtp, &saveit, &seen_data_desc);
+ tail->u.child = parse_format_list (dtp, &seen_data_desc);
*seen_dd = seen_data_desc;
if (fmt->error != NULL)
goto finished;
@@ -661,7 +659,7 @@ parse_format_list (st_parameter_dt *dtp, bool *save_ok, bool *seen_dd)
case FMT_LPAREN:
get_fnode (fmt, &head, &tail, FMT_LPAREN);
tail->repeat = 1;
- tail->u.child = parse_format_list (dtp, &saveit, &seen_data_desc);
+ tail->u.child = parse_format_list (dtp, &seen_data_desc);
*seen_dd = seen_data_desc;
if (fmt->error != NULL)
goto finished;
@@ -725,8 +723,6 @@ parse_format_list (st_parameter_dt *dtp, bool *save_ok, bool *seen_dd)
goto between_desc;
case FMT_STRING:
- /* TODO: Find out why it is necessary to turn off format caching. */
- saveit = false;
get_fnode (fmt, &head, &tail, FMT_STRING);
tail->u.string.p = fmt->string;
tail->u.string.length = fmt->value;
@@ -1106,8 +1102,6 @@ parse_format_list (st_parameter_dt *dtp, bool *save_ok, bool *seen_dd)
finished:
- *save_ok = saveit;
-
return head;
}
@@ -1224,6 +1218,13 @@ parse_format (st_parameter_dt *dtp)
/* Not found so proceed as follows. */
+ if (format_cache_ok)
+ {
+ char *fmt_string = xmalloc (dtp->format_len);
+ memcpy (fmt_string, dtp->format, dtp->format_len);
+ dtp->format = fmt_string;
+ }
+
dtp->u.p.fmt = fmt = xmalloc (sizeof (format_data));
fmt->format_string = dtp->format;
fmt->format_string_len = dtp->format_len;
@@ -1250,14 +1251,15 @@ parse_format (st_parameter_dt *dtp)
fmt->avail++;
if (format_lex (fmt) == FMT_LPAREN)
- fmt->array.array[0].u.child = parse_format_list (dtp, &format_cache_ok,
- &seen_data_desc);
+ fmt->array.array[0].u.child = parse_format_list (dtp, &seen_data_desc);
else
fmt->error = "Missing initial left parenthesis in format";
if (fmt->error)
{
format_error (dtp, NULL, fmt->error);
+ if (format_cache_ok)
+ free (dtp->format);
free_format_hash_table (dtp->u.p.current_unit);
return;
}