From d74fd3c72be778a1ff4663bf73443bae771d4ce1 Mon Sep 17 00:00:00 2001 From: Janne Blomqvist Date: Mon, 26 May 2014 23:56:45 +0300 Subject: [PATCH] Introduce xrealloc, use it. 2014-05-26 Janne Blomqvist * libgfortran.h (xrealloc): New prototype. * runtime/memory.c (xrealloc): New function. * io/fbuf.c (fbuf_alloc): Use xrealloc. * io/list_read.c (push_char_default): Likewise. (push_char4): Likewise. From-SVN: r210948 --- libgfortran/ChangeLog | 8 ++++++++ libgfortran/io/fbuf.c | 5 +---- libgfortran/io/list_read.c | 15 +++++---------- libgfortran/libgfortran.h | 2 ++ libgfortran/runtime/memory.c | 14 ++++++++++++++ 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 9b33b2ac8ba..ebcae7f0bcc 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,11 @@ +2014-05-26 Janne Blomqvist + + * libgfortran.h (xrealloc): New prototype. + * runtime/memory.c (xrealloc): New function. + * io/fbuf.c (fbuf_alloc): Use xrealloc. + * io/list_read.c (push_char_default): Likewise. + (push_char4): Likewise. + 2014-05-26 Janne Blomqvist PR libfortran/61310 diff --git a/libgfortran/io/fbuf.c b/libgfortran/io/fbuf.c index 170ce9754c9..e24da62d99c 100644 --- a/libgfortran/io/fbuf.c +++ b/libgfortran/io/fbuf.c @@ -121,10 +121,7 @@ fbuf_alloc (gfc_unit * u, int len) { /* Round up to nearest multiple of the current buffer length. */ newlen = ((u->fbuf->pos + len) / u->fbuf->len + 1) * u->fbuf->len; - dest = realloc (u->fbuf->buf, newlen); - if (dest == NULL) - return NULL; - u->fbuf->buf = dest; + u->fbuf->buf = xrealloc (u->fbuf->buf, newlen); u->fbuf->len = newlen; } diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c index 13e38f48afb..a7e4f888f1c 100644 --- a/libgfortran/io/list_read.c +++ b/libgfortran/io/list_read.c @@ -79,7 +79,7 @@ typedef unsigned char uchar; static void push_char_default (st_parameter_dt *dtp, int c) { - char *new; + if (dtp->u.p.saved_string == NULL) { @@ -92,13 +92,11 @@ push_char_default (st_parameter_dt *dtp, int c) if (dtp->u.p.saved_used >= dtp->u.p.saved_length) { dtp->u.p.saved_length = 2 * dtp->u.p.saved_length; - new = realloc (dtp->u.p.saved_string, dtp->u.p.saved_length); - if (new == NULL) - generate_error (&dtp->common, LIBERROR_OS, NULL); - dtp->u.p.saved_string = new; + dtp->u.p.saved_string = + xrealloc (dtp->u.p.saved_string, dtp->u.p.saved_length); // Also this should not be necessary. - memset (new + dtp->u.p.saved_used, 0, + memset (dtp->u.p.saved_string + dtp->u.p.saved_used, 0, dtp->u.p.saved_length - dtp->u.p.saved_used); } @@ -126,10 +124,7 @@ push_char4 (st_parameter_dt *dtp, int c) if (dtp->u.p.saved_used >= dtp->u.p.saved_length) { dtp->u.p.saved_length = 2 * dtp->u.p.saved_length; - new = realloc (p, dtp->u.p.saved_length * sizeof (gfc_char4_t)); - if (new == NULL) - generate_error (&dtp->common, LIBERROR_OS, NULL); - p = new; + p = xrealloc (p, dtp->u.p.saved_length * sizeof (gfc_char4_t)); memset4 (new + dtp->u.p.saved_used, 0, dtp->u.p.saved_length - dtp->u.p.saved_used); diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h index ba6c1e91893..b3e8a2e7cfd 100644 --- a/libgfortran/libgfortran.h +++ b/libgfortran/libgfortran.h @@ -771,6 +771,8 @@ internal_proto(xmalloc); extern void *xcalloc (size_t, size_t) __attribute__ ((malloc)); internal_proto(xcalloc); +extern void *xrealloc (void *, size_t); +internal_proto(xrealloc); /* environ.c */ diff --git a/libgfortran/runtime/memory.c b/libgfortran/runtime/memory.c index efeea86f15a..b18b50532c7 100644 --- a/libgfortran/runtime/memory.c +++ b/libgfortran/runtime/memory.c @@ -58,3 +58,17 @@ xcalloc (size_t nmemb, size_t size) return p; } + + +void * +xrealloc (void *ptr, size_t size) +{ + if (size == 0) + size = 1; + + void *newp = realloc (ptr, size); + if (!newp) + os_error ("Memory allocation failure in xrealloc"); + + return newp; +}