Filter ANSI escape sequences from ABC output
authorClifford Wolf <clifford@clifford.at>
Wed, 13 Aug 2014 11:40:29 +0000 (13:40 +0200)
committerClifford Wolf <clifford@clifford.at>
Wed, 13 Aug 2014 11:40:29 +0000 (13:40 +0200)
passes/abc/abc.cc

index 77419e6163d26d7b23c1670c2299a59644d1f301..b9baea38bd088d0d52265e8af9bb4384a8f11993 100644 (file)
@@ -639,10 +639,25 @@ static void abc_module(RTLIL::Design *design, RTLIL::Module *current_module, std
                        log("ABC: %s", logbuf);
 #else
                bool got_cr = false;
+               int escape_seq_state = 0;
                std::string linebuf;
                char logbuf[1024];
                while (fgets(logbuf, 1024, f) != NULL)
                        for (char *p = logbuf; *p; p++) {
+                               if (escape_seq_state == 0 && *p == '\033') {
+                                       escape_seq_state = 1;
+                                       continue;
+                               }
+                               if (escape_seq_state == 1) {
+                                       escape_seq_state = *p == '[' ? 2 : 0;
+                                       continue;
+                               }
+                               if (escape_seq_state == 2) {
+                                       if ((*p < '0' || '9' < *p) && *p != ';')
+                                               escape_seq_state = 0;
+                                       continue;
+                               }
+                               escape_seq_state = 0;
                                if (*p == '\r') {
                                        got_cr = true;
                                        continue;