Added the ability to specify dumping options (show types, show location,
depth control, pointer depth, and more) when dumping memory and viewing as
a type.



git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@130436 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Interpreter/Args.cpp b/source/Interpreter/Args.cpp
index e7dd536..95183a0 100644
--- a/source/Interpreter/Args.cpp
+++ b/source/Interpreter/Args.cpp
@@ -876,7 +876,8 @@
 Args::StringToFormat
 (
     const char *s,
-    lldb::Format &format
+    lldb::Format &format,
+    uint32_t *byte_size_ptr
 )
 {
     format = eFormatInvalid;
@@ -884,29 +885,51 @@
 
     if (s && s[0])
     {
-        switch (s[0])
+        if (byte_size_ptr)
         {
-        case 'y': format = eFormatBytes;            break;
-        case 'Y': format = eFormatBytesWithASCII;   break;
-        case 'b': format = eFormatBinary;           break;
-        case 'B': format = eFormatBoolean;          break;
-        case 'c': format = eFormatChar;             break;
-        case 'C': format = eFormatCharPrintable;    break;
-        case 'o': format = eFormatOctal;            break;
-        case 'O': format = eFormatOSType;           break;
-        case 'i':
-        case 'd': format = eFormatDecimal;          break;
-        case 'I': format = eFormatComplexInteger;   break;
-        case 'u': format = eFormatUnsigned;         break;
-        case 'x': format = eFormatHex;              break;
-        case 'X': format = eFormatComplex;          break;
-        case 'f':
-        case 'e':
-        case 'g': format = eFormatFloat;            break;
-        case 'p': format = eFormatPointer;          break;
-        case 's': format = eFormatCString;          break;
-        default:
-            error.SetErrorStringWithFormat("Invalid format character '%c'. Valid values are:\n"
+            if (isdigit (s[0]))
+            {
+                char *format_char = NULL;
+                unsigned long byte_size = ::strtoul (s, &format_char, 0);
+                if (byte_size != ULONG_MAX)
+                    *byte_size_ptr = byte_size;
+                s = format_char;
+            }
+            else
+                *byte_size_ptr = 0;
+        }
+
+        bool success = s[1] == '\0';
+        if (success)
+        {
+            switch (s[0])
+            {
+            case 'y': format = eFormatBytes;            break;
+            case 'Y': format = eFormatBytesWithASCII;   break;
+            case 'b': format = eFormatBinary;           break;
+            case 'B': format = eFormatBoolean;          break;
+            case 'c': format = eFormatChar;             break;
+            case 'C': format = eFormatCharPrintable;    break;
+            case 'o': format = eFormatOctal;            break;
+            case 'O': format = eFormatOSType;           break;
+            case 'i':
+            case 'd': format = eFormatDecimal;          break;
+            case 'I': format = eFormatComplexInteger;   break;
+            case 'u': format = eFormatUnsigned;         break;
+            case 'x': format = eFormatHex;              break;
+            case 'X': format = eFormatComplex;          break;
+            case 'f':
+            case 'e':
+            case 'g': format = eFormatFloat;            break;
+            case 'p': format = eFormatPointer;          break;
+            case 's': format = eFormatCString;          break;
+            default:
+                success = false;
+                break;
+            }
+        }
+        if (!success)
+            error.SetErrorStringWithFormat ("Invalid format specification '%s'. Valid values are:\n"
                                             "  b - binary\n"
                                             "  B - boolean\n"
                                             "  c - char\n"
@@ -925,9 +948,10 @@
                                             "  x - hex\n"
                                             "  X - complex float\n"
                                             "  y - bytes\n"
-                                            "  Y - bytes with ASCII\n", s[0]);
-            break;
-        }
+                                            "  Y - bytes with ASCII\n%s",
+                                            s, 
+                                            byte_size_ptr ? "An optional byte size can precede the format character.\n" : "");
+
 
         if (error.Fail())
             return error;