summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorDagfinn Ilmari Mannsåker <ilmari@ilmari.org>2017-10-21 20:05:17 +0100
committerDagfinn Ilmari Mannsåker <ilmari@ilmari.org>2017-10-21 20:05:17 +0100
commitaefb3fa072c057c13029faf2c7044bca8e0cc344 (patch)
tree9da4f463295151cce28cc409e69eebf2c73dcf5f /util.c
parentb961752cf64eb09f62d550c34bc311c4447339c7 (diff)
downloadperl-aefb3fa072c057c13029faf2c7044bca8e0cc344.tar.gz
Provide fallback strnlen implementation
Diffstat (limited to 'util.c')
-rw-r--r--util.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/util.c b/util.c
index 087c918faa..244d9368a8 100644
--- a/util.c
+++ b/util.c
@@ -5480,6 +5480,36 @@ Perl_my_strlcpy(char *dst, const char *src, Size_t size)
}
#endif
+/*
+=for apidoc my_strnlen
+
+The C library C<strnlen> if available, or a Perl implementation of it.
+
+C<my_strnlen()> computes the length of the string, up to C<maxlen>
+characters. It will will never attempt to address more than C<maxlen>
+characters, making it suitable for use with strings that are not
+guaranteed to be NUL-terminated.
+
+=cut
+
+Description stolen from http://man.openbsd.org/strnlen.3,
+implementation stolen from PostgreSQL.
+*/
+#ifndef HAS_STRNLEN
+Size_t
+Perl_my_strnlen(const char *str, Size_t maxlen)
+{
+ const char *p = str;
+
+ PERL_ARGS_ASSERT_MY_STRNLEN;
+
+ while(maxlen-- && *p)
+ p++;
+
+ return p - str;
+}
+#endif
+
#if defined(_MSC_VER) && (_MSC_VER >= 1300) && (_MSC_VER < 1400) && (WINVER < 0x0500)
/* VC7 or 7.1, building with pre-VC7 runtime libraries. */
long _ftol( double ); /* Defined by VC6 C libs. */