Merge "config.c: Cleanup AST_INCLUDE_GLOB"
[asterisk/asterisk.git] / main / strcompat.c
index 03c3041..0034c21 100644 (file)
 /*! \file
  *
  * \brief Compatibility functions for strsep and strtoq missing on Solaris
+ *
+ * .. and lots of other functions too.
  */
 
 /*** MODULEINFO
        <support_level>core</support_level>
  ***/
 
+#define ASTMM_LIBC ASTMM_IGNORE
 #include "asterisk.h"
 
 #include <ctype.h>
@@ -68,12 +71,12 @@ int setenv(const char *name, const char *value, int overwrite)
        unsigned char *buf;
        int buflen;
 
-       buflen = strlen(name) + strlen(value) + 2;
-       buf = alloca(buflen);
-
        if (!overwrite && getenv(name))
                return 0;
 
+       buflen = strlen(name) + strlen(value) + 2;
+       buf = ast_alloca(buflen);
+
        snprintf(buf, buflen, "%s=%s", name, value);
 
        return putenv(buf);
@@ -105,23 +108,19 @@ static char *upper(const char *orig, char *buf, int bufsize)
 char *strcasestr(const char *haystack, const char *needle)
 {
        char *u1, *u2;
+       char *offset;
        int u1len = strlen(haystack) + 1, u2len = strlen(needle) + 1;
 
-       u1 = alloca(u1len);
-       u2 = alloca(u2len);
-       if (u1 && u2) {
-               char *offset;
-               if (u2len > u1len) {
-                       /* Needle bigger than haystack */
-                       return NULL;
-               }
-               offset = strstr(upper(haystack, u1, u1len), upper(needle, u2, u2len));
-               if (offset) {
-                       /* Return the offset into the original string */
-                       return ((char *)((unsigned long)haystack + (unsigned long)(offset - u1)));
-               } else {
-                       return NULL;
-               }
+       if (u2len > u1len) {
+               /* Needle bigger than haystack */
+               return NULL;
+       }
+       u1 = ast_alloca(u1len);
+       u2 = ast_alloca(u2len);
+       offset = strstr(upper(haystack, u1, u1len), upper(needle, u2, u2len));
+       if (offset) {
+               /* Return the offset into the original string */
+               return ((char *)((unsigned long)haystack + (unsigned long)(offset - u1)));
        } else {
                return NULL;
        }
@@ -141,7 +140,7 @@ size_t strnlen(const char *s, size_t n)
 }
 #endif /* !HAVE_STRNLEN */
 
-#if !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC)
+#if !defined(HAVE_STRNDUP)
 char *strndup(const char *s, size_t n)
 {
        size_t len = strnlen(s, n);
@@ -153,9 +152,9 @@ char *strndup(const char *s, size_t n)
        new[len] = '\0';
        return memcpy(new, s, len);
 }
-#endif /* !defined(HAVE_STRNDUP) && !defined(__AST_DEBUG_MALLOC) */
+#endif /* !defined(HAVE_STRNDUP) */
 
-#if !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC)
+#if !defined(HAVE_VASPRINTF)
 int vasprintf(char **strp, const char *fmt, va_list ap)
 {
        int size;
@@ -173,7 +172,7 @@ int vasprintf(char **strp, const char *fmt, va_list ap)
 
        return size;
 }
-#endif /* !defined(HAVE_VASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
+#endif /* !defined(HAVE_VASPRINTF) */
 
 #ifndef HAVE_TIMERSUB
 void timersub(struct timeval *tvend, struct timeval *tvstart, struct timeval *tvdiff)
@@ -207,7 +206,7 @@ void timersub(struct timeval *tvend, struct timeval *tvstart, struct timeval *tv
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
-#if !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC)
+#if !defined(HAVE_ASPRINTF)
 int asprintf(char **str, const char *fmt, ...)
 {
        va_list ap;
@@ -220,7 +219,7 @@ int asprintf(char **str, const char *fmt, ...)
 
        return ret;
 }
-#endif /* !defined(HAVE_ASPRINTF) && !defined(__AST_DEBUG_MALLOC) */
+#endif /* !defined(HAVE_ASPRINTF) */
 
 #ifndef HAVE_STRTOQ
 #ifndef LONG_MIN
@@ -572,3 +571,15 @@ char *mkdtemp(char *path)
        return mktemp_internal(path, 0, MKTEMP_DIR) ? NULL : path;
 }
 #endif
+
+#ifndef HAVE_ROUNDF
+#ifndef HAVE_ROUND
+float roundf(float x) {
+       if (x < 0.0) {
+               return (float)(int)((x) - 0.5);
+       } else {
+               return (float)(int)((x) + 0.5);
+       }
+}
+#endif
+#endif