Improvements to $display system task
authorAndrew Zonenberg <azonenberg@drawersteak.com>
Sat, 19 Sep 2015 00:00:00 +0000 (00:00 +0000)
committerClifford Wolf <clifford@clifford.at>
Sat, 19 Sep 2015 08:33:37 +0000 (10:33 +0200)
frontends/ast/simplify.cc

index dd4f0797eef5b224424e059cd4d4ef1a9ce7326d..6dc9aed31ebe007bca4e8a091d1938c4cdcdc2fe 100644 (file)
@@ -212,6 +212,19 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                        // format specifier
                        if(sformat[i] == '%')
                        {
+                               // If there's no next character, that's a problem
+                               if(i+1 >= sformat.length())
+                                       log_error("System task `%s' called with `%%' at end of string at %s:%d.\n", str.c_str(), filename.c_str(), linenum);
+
+                               char cformat = sformat[++i];
+
+                               // %% is special, does not need a matching argument
+                               if(cformat == '%')
+                               {
+                                       sout += '%';
+                                       continue;
+                               }
+
                                // If we're out of arguments, that's a problem!
                                if(next_arg >= nargs)
                                        log_error("System task `%s' called with more format specifiers than arguments at %s:%d.\n", str.c_str(), filename.c_str(), linenum);
@@ -222,18 +235,9 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                                if (node_arg->type != AST_CONSTANT)
                                        log_error("Failed to evaluate system task `%s' with non-constant argument at %s:%d.\n", str.c_str(), filename.c_str(), linenum);
 
-                               // If there's no next character, that's a problem
-                               if(i+1 >= sformat.length())
-                                       log_error("System task `%s' called with `%%' at end of string at %s:%d.\n", str.c_str(), filename.c_str(), linenum);
-
                                // Everything from here on depends on the format specifier
-                               char cformat = sformat[++i];
                                switch(cformat)
                                {
-                                       case '%':
-                                               sout += '%';
-                                               break;
-
                                        case 's':
                                        case 'S':
                                                sout += node_arg->bitsAsConst().decode_string();
@@ -248,6 +252,15 @@ bool AstNode::simplify(bool const_fold, bool at_zero, bool in_lvalue, int stage,
                                                }
                                                break;
 
+                                       case 'x':
+                                       case 'X':
+                                               {
+                                                       char tmp[128];
+                                                       snprintf(tmp, sizeof(tmp), "%x", node_arg->bitsAsConst().as_int());
+                                                       sout += tmp;
+                                               }
+                                               break;
+
                                        default:
                                                log_error("System task `%s' called with invalid format specifier at %s:%d.\n", str.c_str(), filename.c_str(), linenum);
                                                break;