Quellcode durchsuchen

Added visual studio equivalent of libc's strtoull() - name redefine for newer VS versions, custom implementation for VS6 (I hope it works).
This should fix the compilation error from r14242 (bugreport:4059).

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@14245 54d463be-8e91-2dee-dedb-b68131a5f0ec

ultramage vor 15 Jahren
Ursprung
Commit
8dfa315ce8
3 geänderte Dateien mit 46 neuen und 0 gelöschten Zeilen
  1. 3 0
      src/common/cbasetypes.h
  2. 39 0
      src/common/strlib.c
  3. 4 0
      src/common/strlib.h

+ 3 - 0
src/common/cbasetypes.h

@@ -234,6 +234,9 @@ typedef int32 intptr;
 #define strncmpi			strncasecmp
 #define strnicmp			strncasecmp
 #endif
+#if defined(_MSC_VER) && _MSC_VER > 1200
+#define strtoull			_strtoui64
+#endif
 
 // keyword replacement in windows
 #ifdef _WIN32

+ 39 - 0
src/common/strlib.c

@@ -9,6 +9,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <errno.h>
 
 
 
@@ -251,6 +252,44 @@ size_t strnlen (const char* string, size_t maxlen)
 }
 #endif
 
+#if defined(WIN32) && defined(_MSC_VER) && _MSC_VER <= 1200
+unsigned long long strtoull(const char* str, char** endptr, int base)
+{
+	unsigned long long result;
+	int count;
+	int n;
+
+	if( base == 0 )
+	{
+		if( str[0] == '0' && (str[1] == 'x' || str[1] == 'X') )
+			base = 16;
+		else
+		if( str[0] == '0' )
+			base = 8;
+	}
+
+	if( base == 10 )
+		count = sscanf(str, "%I64u%n", &result, &n);
+	else
+	if( base == 16 )
+		count = sscanf(str, "%I64x%n", &result, &n);
+	else
+		count = 0; // fail
+
+	if( count < 1 )
+	{
+		errno = EINVAL;
+		result = 0;
+		n = 0;
+	}
+
+	if( endptr )
+		*endptr = (char*)str + n;
+
+	return result;
+}
+#endif
+
 //----------------------------------------------------
 // E-mail check: return 0 (not correct) or 1 (valid).
 //----------------------------------------------------

+ 4 - 0
src/common/strlib.h

@@ -28,6 +28,10 @@ char* _strtok_r(char* s1, const char* s2, char** lasts);
 size_t strnlen (const char* string, size_t maxlen);
 #endif
 
+#if defined(WIN32) && defined(_MSC_VER) && _MSC_VER <= 1200
+unsigned long long strtoull(const char* str, char** endptr, int base);
+#endif
+
 int e_mail_check(char* email);
 int config_switch(const char* str);