implementation of itoa/itow
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 23 Mar 2015 18:01:10 +0000 (20:01 +0200)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 23 Mar 2015 18:01:10 +0000 (20:01 +0200)
configure.ac
include/nms_util.h
include/unicode.h
src/libnetxms/tools.cpp
tests/test-libnetxms/test-libnetxms.cpp

index 6bbedcd..6130b2c 100644 (file)
@@ -1615,7 +1615,7 @@ AC_CHECK_FUNCS([gettimeofday memmove memset bcopy strchr strcspn strdup strerror
 AC_CHECK_FUNCS([strrchr strlwr strtol strtoul strtoll strtoull setlocale])
 AC_CHECK_FUNCS([if_nametoindex daemon mmap strerror_r scandir uname poll])
 AC_CHECK_FUNCS([usleep nanosleep gmtime_r localtime_r stat64 fstat64 lstat64])
-AC_CHECK_FUNCS([fopen64 strptime timegm gethostbyname2_r])
+AC_CHECK_FUNCS([fopen64 strptime timegm gethostbyname2_r itoa _itoa])
 
 AC_CHECK_DECLS([nanosleep])
 
@@ -1958,6 +1958,7 @@ AC_CHECK_FUNCS([wcslwr wcserror wcserror_r wfopen wfopen64 fputws putws])
 AC_CHECK_FUNCS([wopen wstat waccess wgetenv wrename wunlink wremove wchdir])
 AC_CHECK_FUNCS([wmkdir wrmdir wsystem wmkstemp wpopen wctime wchmod vwscanf])
 AC_CHECK_FUNCS([vswscanf vfwscanf wcscasecmp wcsncasecmp wcstombs wcsrtombs])
+AC_CHECK_FUNCS([itow _itow])
 
 if test "x$DISABLE_ICONV" != "xyes"; then
        AC_CHECK_LIB(iconv, libiconv_open,
index cbc0efe..bcdd53d 100644 (file)
@@ -1589,6 +1589,28 @@ int LIBNETXMS_EXPORTABLE wcscasecmp(const wchar_t *s1, const wchar_t *s2);
 int LIBNETXMS_EXPORTABLE wcsncasecmp(const wchar_t *s1, const wchar_t *s2, size_t n);
 #endif
 
+#ifndef _WIN32
+
+#if HAVE_ITOA && !HAVE__ITOA
+#define _itoa itoa
+#undef HAVE__ITOA
+#define HAVE__ITOA 1
+#endif
+#if !HAVE__ITOA && !defined(_WIN32)
+char LIBNETXMS_EXPORTABLE *_itoa(int value, char *str, int base);
+#endif
+
+#if HAVE_ITOW && !HAVE__ITOW
+#define _itow itow
+#undef HAVE__ITOW
+#define HAVE__ITOW 1
+#endif
+#if !HAVE__ITOW && !defined(_WIN32)
+WCHAR LIBNETXMS_EXPORTABLE *_itow(int value, WCHAR *str, int base);
+#endif
+
+#endif /* _WIN32 */
+
 #ifdef _WIN32
 #ifdef UNICODE
 DIRW LIBNETXMS_EXPORTABLE *wopendir(const WCHAR *filename);
index 28c4238..cbde0c5 100644 (file)
 #define _istalpha iswalpha
 #define _istupper iswupper
 #define _istprint iswprint
-#define _itot     itow
+#define _itot     _itow
 #define _tgetenv  wgetenv
 #define _tmkdir   wmkdir
 #define _tchdir   wchdir
 #define _istalpha isalpha
 #define _istupper isupper
 #define _istprint isprint
-#define _itot     itoa
+#define _itot     _itoa
 #define _tgetenv  getenv
 #define _tmkdir   mkdir
 #define _tchdir   chdir
index 82294ce..fea1b58 100644 (file)
@@ -2190,3 +2190,67 @@ WCHAR LIBNETXMS_EXPORTABLE *wcslwr(WCHAR *str)
 }
 
 #endif
+
+#if !HAVE__ITOA && !defined(_WIN32)
+
+/**
+ * _itoa() implementation
+ */
+char LIBNETXMS_EXPORTABLE *_itoa(int value, char *str, int base)
+{
+   char *p = str;
+   if (value < 0)
+   {
+      *p++ = '-';
+      value = -value;
+   }
+   
+   char buffer[64];
+   char *t = buffer;
+   do
+   {
+      int rem = value % base;
+      *t++ = (rem < 10) ? (rem + '0') : (rem - 10 + 'a');
+      value = value / base;
+   } while(value > 0);
+
+   t--;
+   while(t >= buffer)
+      *p++ = *t--;
+   *p = 0;
+   return str;
+}
+
+#endif
+
+#if !HAVE__ITOA && !defined(_WIN32)
+
+/**
+ * _itow() implementation
+ */
+WCHAR LIBNETXMS_EXPORTABLE *_itow(int value, WCHAR *str, int base)
+{
+   WCHAR *p = str;
+   if (value < 0)
+   {
+      *p++ = '-';
+      value = -value;
+   }
+   
+   WCHAR buffer[64];
+   WCHAR *t = buffer;
+   do
+   {
+      int rem = value % base;
+      *t++ = (rem < 10) ? (rem + '0') : (rem - 10 + 'a');
+      value = value / base;
+   } while(value > 0);
+
+   t--;
+   while(t >= buffer)
+      *p++ = *t--;
+   *p = 0;
+   return str;
+}
+
+#endif
index 666cf37..45da0d4 100644 (file)
@@ -319,6 +319,31 @@ static void TestInetAddress()
    EndTest();
 }
 
+/**
+ * Test itoa/itow
+ */
+static void TestItoa()
+{
+   char buffer[64];
+   WCHAR wbuffer[64];
+
+   StartTest(_T("itoa"));
+   AssertTrue(!strcmp(_itoa(127, buffer, 10), "127"));
+   AssertTrue(!strcmp(_itoa(0, buffer, 10), "0"));
+   AssertTrue(!strcmp(_itoa(-3, buffer, 10), "-3"));
+   AssertTrue(!strcmp(_itoa(0555, buffer, 8), "555"));
+   AssertTrue(!strcmp(_itoa(0xFA48, buffer, 16), "fa48"));
+   EndTest();
+
+   StartTest(_T("itow"));
+   AssertTrue(!wcscmp(_itow(127, wbuffer, 10), L"127"));
+   AssertTrue(!wcscmp(_itow(0, wbuffer, 10), L"0"));
+   AssertTrue(!wcscmp(_itow(-3, wbuffer, 10), L"-3"));
+   AssertTrue(!wcscmp(_itow(0555, wbuffer, 8), L"555"));
+   AssertTrue(!wcscmp(_itow(0xFA48, wbuffer, 16), L"fa48"));
+   EndTest();
+}
+
 /**
  * main()
  */
@@ -335,5 +360,6 @@ int main(int argc, char *argv[])
    TestStringSet();
    TestMsgWaitQueue();
    TestInetAddress();
+   TestItoa();
    return 0;
 }