Add ecore_strlcpy for an strlcpy copy available on all architectures.
authorningerso <ningerso>
Wed, 10 Jan 2007 11:28:41 +0000 (11:28 +0000)
committerningerso <ningerso@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 10 Jan 2007 11:28:41 +0000 (11:28 +0000)
SVN revision: 27890

legacy/ecore/configure.in
legacy/ecore/src/lib/ecore/Ecore_Str.h [new file with mode: 0644]
legacy/ecore/src/lib/ecore/Makefile.am
legacy/ecore/src/lib/ecore/ecore_str.c [new file with mode: 0644]

index 07110f5..9dbbd39 100644 (file)
@@ -58,6 +58,7 @@ fi
 changequote([,])dnl
 
 AC_CHECK_FUNCS(gettimeofday)
+AC_CHECK_FUNCS(strlcpy)
 
 AC_CHECK_HEADERS(netinet/in.h)
 
diff --git a/legacy/ecore/src/lib/ecore/Ecore_Str.h b/legacy/ecore/src/lib/ecore/Ecore_Str.h
new file mode 100644 (file)
index 0000000..aa2cd04
--- /dev/null
@@ -0,0 +1,47 @@
+#ifndef _ECORE_STR_H
+# define _ECORE_STR_H
+
+#ifdef EAPI
+#undef EAPI
+#endif
+#ifdef WIN32
+# ifdef BUILDING_DLL
+#  define EAPI __declspec(dllexport)
+# else
+#  define EAPI __declspec(dllimport)
+# endif
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif
+
+/**
+ * @file Ecore_Data.h
+ * @brief Contains threading, list, hash, debugging and tree functions.
+ */
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+# ifdef __sgi
+#  define __FUNCTION__ "unknown"
+#  ifndef __cplusplus
+#   define inline
+#  endif
+# endif
+
+   /* strlcpy implementation for libc's lacking it */
+   EAPI size_t ecore_strlcpy(char *dst, const char *src, size_t siz);
+
+#ifdef __cplusplus
+}
+#endif
+#endif                         /* _ECORE_STR_H */
index c0bdd3a..bae47f1 100644 (file)
@@ -5,7 +5,8 @@ INCLUDES =
 lib_LTLIBRARIES = libecore.la
 include_HEADERS = \
 Ecore.h \
-Ecore_Data.h
+Ecore_Data.h \
+Ecore_Str.h
 
 libecore_la_SOURCES = \
 ecore.c \
@@ -23,6 +24,7 @@ ecore_path.c \
 ecore_plugin.c \
 ecore_sheap.c \
 ecore_signal.c \
+ecore_str.c \
 ecore_strings.c \
 ecore_time.c \
 ecore_timer.c \
diff --git a/legacy/ecore/src/lib/ecore/ecore_str.c b/legacy/ecore/src/lib/ecore/ecore_str.c
new file mode 100644 (file)
index 0000000..09f205e
--- /dev/null
@@ -0,0 +1,56 @@
+/* Leave the OpenBSD version below so we can track upstream fixes */
+/*      $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $        */
+
+/*
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+#include <string.h>
+
+/*
+ * Copy src to string dst of size siz.  At most siz-1 characters
+ * will be copied.  Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t
+ecore_strlcpy(char *dst, const char *src, size_t siz)
+{
+#ifdef HAVE_STRLCPY
+       return strlcpy(dst, src, siz);
+#else
+        char *d = dst;
+        const char *s = src;
+        size_t n = siz;
+
+        /* Copy as many bytes as will fit */
+        if (n != 0) {
+                while (--n != 0) {
+                        if ((*d++ = *s++) == '\0')
+                                break;
+                }
+        }
+
+        /* Not enough room in dst, add NUL and traverse rest of src */
+        if (n == 0) {
+                if (siz != 0)
+                        *d = '\0';                /* NUL-terminate dst */
+                while (*s++)
+                        ;
+        }
+
+        return(s - src - 1);        /* count does not include NUL */
+#endif
+}