summaryrefslogtreecommitdiffstats
path: root/libgfortran/intrinsics/string_intrinsics.c
diff options
context:
space:
mode:
authorfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>2007-08-17 13:09:23 +0000
committerfxcoudert <fxcoudert@138bc75d-0d04-0410-961f-82ee72b054a4>2007-08-17 13:09:23 +0000
commit4ec67f4e476c5096aa4f9b29fafa3898ecf79de6 (patch)
tree13fdeb4ff7ed9cef89a72af1fccc8442c308d49d /libgfortran/intrinsics/string_intrinsics.c
parentf7a00bdb09cb3716b05e56bcacfaab14f81102be (diff)
downloadppe42-gcc-4ec67f4e476c5096aa4f9b29fafa3898ecf79de6.tar.gz
ppe42-gcc-4ec67f4e476c5096aa4f9b29fafa3898ecf79de6.zip
PR fortran/33079
* intrinsics/string_intrinsics.c (string_trim, string_minmax): Fix the zero-length result case. * gfortran.dg/zero_length_2.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@127584 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran/intrinsics/string_intrinsics.c')
-rw-r--r--libgfortran/intrinsics/string_intrinsics.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/libgfortran/intrinsics/string_intrinsics.c b/libgfortran/intrinsics/string_intrinsics.c
index be028114476..c663daa6d86 100644
--- a/libgfortran/intrinsics/string_intrinsics.c
+++ b/libgfortran/intrinsics/string_intrinsics.c
@@ -77,6 +77,11 @@ export_proto(string_trim);
extern void string_minmax (GFC_INTEGER_4 *, void **, int, int, ...);
export_proto(string_minmax);
+
+/* Use for functions which can return a zero-length string. */
+static char zero_length_string = '\0';
+
+
/* Strings of unequal length are extended with pad characters. */
int
@@ -167,16 +172,16 @@ string_trim (GFC_INTEGER_4 * len, void ** dest, GFC_INTEGER_4 slen,
}
*len = i + 1;
- if (*len > 0)
+ if (*len == 0)
+ *dest = &zero_length_string;
+ else
{
/* Allocate space for result string. */
*dest = internal_malloc_size (*len);
- /* copy string if necessary. */
+ /* Copy string if necessary. */
memmove (*dest, src, *len);
}
- else
- *dest = NULL;
}
@@ -403,14 +408,13 @@ string_minmax (GFC_INTEGER_4 *rlen, void **dest, int op, int nargs, ...)
}
va_end (ap);
- if (*rlen > 0)
+ if (*rlen == 0)
+ *dest = &zero_length_string;
+ else
{
char * tmp = internal_malloc_size (*rlen);
memcpy (tmp, res, reslen);
memset (&tmp[reslen], ' ', *rlen - reslen);
*dest = tmp;
}
- else
- *dest = NULL;
}
-
OpenPOWER on IntegriCloud