]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
demangle_number: handle base-36 numbers.
authorJulian Seward <jseward@acm.org>
Thu, 30 May 2002 01:22:20 +0000 (01:22 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 30 May 2002 01:22:20 +0000 (01:22 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@344

coregrind/demangle/cp-demangle.c
coregrind/vg_include.h
coregrind/vg_mylibc.c
demangle/cp-demangle.c
vg_include.h
vg_mylibc.c

index 76c669a1a326e92467ca1ce71217063e93c602f5..5cf99c8c8993a0888c835bde1d13c0fb31fc6a9c 100644 (file)
@@ -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;
index f5e665823b928457cad2dc76262150bafc5863f7..1472e6384470c4b0d8122afe77c382fd484b13e2 100644 (file)
@@ -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 );
index 8cb776ea12aca0798d2e43657ec6f18f3a138072..c0ebba3ac3fed9b7e83d3861d807a0b83661bf7e 100644 (file)
@@ -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;
index 76c669a1a326e92467ca1ce71217063e93c602f5..5cf99c8c8993a0888c835bde1d13c0fb31fc6a9c 100644 (file)
@@ -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;
index f5e665823b928457cad2dc76262150bafc5863f7..1472e6384470c4b0d8122afe77c382fd484b13e2 100644 (file)
@@ -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 );
index 8cb776ea12aca0798d2e43657ec6f18f3a138072..c0ebba3ac3fed9b7e83d3861d807a0b83661bf7e 100644 (file)
@@ -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;