From: Julian Seward Date: Thu, 30 May 2002 01:22:20 +0000 (+0000) Subject: demangle_number: handle base-36 numbers. X-Git-Tag: svn/VALGRIND_1_0_3~122 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5b259dc0324558b4726d9154f554838388df7ecb;p=thirdparty%2Fvalgrind.git demangle_number: handle base-36 numbers. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@344 --- diff --git a/coregrind/demangle/cp-demangle.c b/coregrind/demangle/cp-demangle.c index 76c669a1a3..5cf99c8c89 100644 --- a/coregrind/demangle/cp-demangle.c +++ b/coregrind/demangle/cp-demangle.c @@ -1400,12 +1400,16 @@ demangle_number (dm, value, base, is_signed) *value = strtol (dyn_string_buf (number), NULL, base); */ /* vg_assert( base == 10 ); */ - if ( base != 10 ) { + if ( base != 10 && base != 36 ) { dyn_string_delete(number); return STATUS_UNIMPLEMENTED; } - *value = VG_(atoll) (dyn_string_buf (number)); + if (base == 36) { + *value = VG_(atoll36) (dyn_string_buf (number)); + } else { + *value = VG_(atoll) (dyn_string_buf (number)); + } dyn_string_delete (number); return STATUS_OK; diff --git a/coregrind/vg_include.h b/coregrind/vg_include.h index f5e665823b..1472e63844 100644 --- a/coregrind/vg_include.h +++ b/coregrind/vg_include.h @@ -823,6 +823,7 @@ extern Bool VG_(isspace) ( Char c ); extern Int VG_(strlen) ( const Char* str ); extern Long VG_(atoll) ( Char* str ); +extern Long VG_(atoll36) ( Char* str ); extern Char* VG_(strcat) ( Char* dest, const Char* src ); extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n ); diff --git a/coregrind/vg_mylibc.c b/coregrind/vg_mylibc.c index 8cb776ea12..c0ebba3ac3 100644 --- a/coregrind/vg_mylibc.c +++ b/coregrind/vg_mylibc.c @@ -664,6 +664,33 @@ Long VG_(atoll) ( Char* str ) } +Long VG_(atoll36) ( Char* str ) +{ + Bool neg = False; + Long n = 0; + if (*str == '-') { str++; neg = True; }; + while (True) { + if (*str >= '0' && *str <= '9') { + n = 36*n + (Long)(*str - '0'); + } + else + if (*str >= 'A' && *str <= 'Z') { + n = 36*n + (Long)((*str - 'A') + 10); + } + else + if (*str >= 'a' && *str <= 'z') { + n = 36*n + (Long)((*str - 'a') + 10); + } + else { + break; + } + str++; + } + if (neg) n = -n; + return n; +} + + Char* VG_(strcat) ( Char* dest, const Char* src ) { Char* dest_orig = dest; diff --git a/demangle/cp-demangle.c b/demangle/cp-demangle.c index 76c669a1a3..5cf99c8c89 100644 --- a/demangle/cp-demangle.c +++ b/demangle/cp-demangle.c @@ -1400,12 +1400,16 @@ demangle_number (dm, value, base, is_signed) *value = strtol (dyn_string_buf (number), NULL, base); */ /* vg_assert( base == 10 ); */ - if ( base != 10 ) { + if ( base != 10 && base != 36 ) { dyn_string_delete(number); return STATUS_UNIMPLEMENTED; } - *value = VG_(atoll) (dyn_string_buf (number)); + if (base == 36) { + *value = VG_(atoll36) (dyn_string_buf (number)); + } else { + *value = VG_(atoll) (dyn_string_buf (number)); + } dyn_string_delete (number); return STATUS_OK; diff --git a/vg_include.h b/vg_include.h index f5e665823b..1472e63844 100644 --- a/vg_include.h +++ b/vg_include.h @@ -823,6 +823,7 @@ extern Bool VG_(isspace) ( Char c ); extern Int VG_(strlen) ( const Char* str ); extern Long VG_(atoll) ( Char* str ); +extern Long VG_(atoll36) ( Char* str ); extern Char* VG_(strcat) ( Char* dest, const Char* src ); extern Char* VG_(strncat) ( Char* dest, const Char* src, Int n ); diff --git a/vg_mylibc.c b/vg_mylibc.c index 8cb776ea12..c0ebba3ac3 100644 --- a/vg_mylibc.c +++ b/vg_mylibc.c @@ -664,6 +664,33 @@ Long VG_(atoll) ( Char* str ) } +Long VG_(atoll36) ( Char* str ) +{ + Bool neg = False; + Long n = 0; + if (*str == '-') { str++; neg = True; }; + while (True) { + if (*str >= '0' && *str <= '9') { + n = 36*n + (Long)(*str - '0'); + } + else + if (*str >= 'A' && *str <= 'Z') { + n = 36*n + (Long)((*str - 'A') + 10); + } + else + if (*str >= 'a' && *str <= 'z') { + n = 36*n + (Long)((*str - 'a') + 10); + } + else { + break; + } + str++; + } + if (neg) n = -n; + return n; +} + + Char* VG_(strcat) ( Char* dest, const Char* src ) { Char* dest_orig = dest;