diff options
Diffstat (limited to 'libgfortran/runtime/string.c')
-rw-r--r-- | libgfortran/runtime/string.c | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/libgfortran/runtime/string.c b/libgfortran/runtime/string.c index a7f68bf5aa..3c339da22a 100644 --- a/libgfortran/runtime/string.c +++ b/libgfortran/runtime/string.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002-2014 Free Software Foundation, Inc. +/* Copyright (C) 2002-2015 Free Software Foundation, Inc. Contributed by Paul Brook This file is part of the GNU Fortran 95 runtime library (libgfortran). @@ -24,6 +24,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #include "libgfortran.h" #include <string.h> +#include <stdlib.h> /* Given a fortran string, return its length exclusive of the trailing @@ -90,6 +91,63 @@ cf_strcpy (char *dest, gfc_charlen_type dest_len, const char *src) } +#ifndef HAVE_STRNLEN +static size_t +strnlen (const char *s, size_t maxlen) +{ + for (size_t ii = 0; ii < maxlen; ii++) + { + if (s[ii] == '\0') + return ii; + } + return maxlen; +} +#endif + + +#ifndef HAVE_STRNDUP +static char * +strndup (const char *s, size_t n) +{ + size_t len = strnlen (s, n); + char *p = malloc (len + 1); + if (!p) + return NULL; + memcpy (p, s, len); + p[len] = '\0'; + return p; +} +#endif + + +/* Duplicate a non-null-terminated Fortran string to a malloced + null-terminated C string. */ + +char * +fc_strdup (const char *src, gfc_charlen_type src_len) +{ + gfc_charlen_type n = fstrlen (src, src_len); + char *p = strndup (src, n); + if (!p) + os_error ("Memory allocation failed in fc_strdup"); + return p; +} + + +/* Duplicate a non-null-terminated Fortran string to a malloced + null-terminated C string, without getting rid of trailing + blanks. */ + +char * +fc_strdup_notrim (const char *src, gfc_charlen_type src_len) +{ + char *p = strndup (src, src_len); + if (!p) + os_error ("Memory allocation failed in fc_strdup"); + return p; +} + + /* Given a fortran string and an array of st_option structures, search through the array to find a match. If the option is not found, we generate an error if no default is provided. */ |