+static void
+print_clean (const char *line)
+{
+ const char *p = line;
+
+ if (is_esc (p))
+ p = get_end_of_esc (p);
+
+ while (*p != '\0')
+ {
+ const char *text_start = p;
+ const char *text_end = get_end_of_text (p);
+ print_text (text_start, text_end - text_start);
+ p = get_end_of_esc (text_end);
+ }
+}
+
+static bool
+is_esc (const char *p)
+{
+ return gather_esc_offsets (p, NULL, NULL);
+}
+
+static const char *
+get_end_of_esc (const char *p)
+{
+ const char *esc;
+ const char *end = NULL;
+ while ((esc = strchr (p, '\033')))
+ {
+ if (gather_esc_offsets (esc, NULL, &end))
+ break;
+ p = esc + 1;
+ }
+ return end ? end + 1 : p + strlen (p);
+}
+
+static const char *
+get_end_of_text (const char *p)
+{
+ const char *esc;
+ const char *start = NULL;
+ while ((esc = strchr (p, '\033')))
+ {
+ if (gather_esc_offsets (esc, &start, NULL))
+ break;
+ p = esc + 1;
+ }
+ return start ? start : p + strlen (p);
+}
+
+static void
+print_text (const char *p, size_t len)
+{
+ size_t bytes_written;
+ bytes_written = fwrite (p, 1, len, stdout);
+ if (bytes_written != len)
+ vfprintf_fail (formats[FMT_ERROR], (unsigned long)len, "written");
+}
+
+static bool
+gather_esc_offsets (const char *p, const char **start, const char **end)
+{
+ /* ESC[ */
+ if (*p == 27 && *(p + 1) == '[')
+ {
+ bool valid = false;
+ const char *begin = p;
+ p += 2;
+ if (clean_all)
+ valid = validate_esc_clean_all (&p);
+ else if (clean)
+ {
+ bool check_values;
+ unsigned int iter = 0;
+ const char *digit;
+ do {
+ check_values = false;
+ iter++;
+ if (!isdigit (*p))
+ break;
+ digit = p;
+ while (isdigit (*p))
+ p++;
+ if (p - digit > 2)
+ break;
+ else /* check range */
+ {
+ char val[3];
+ int value;
+ unsigned int i;
+ const unsigned int digits = p - digit;
+ for (i = 0; i < digits; i++)
+ val[i] = *digit++;
+ val[i] = '\0';
+ value = atoi (val);
+ valid = validate_esc_clean (value, iter, &p, &check_values);
+ }
+ } while (check_values);
+ }
+ if (valid)
+ {
+ if (start)
+ *start = begin;
+ if (end)
+ *end = p;
+ return true;
+ }
+ }
+ return false;
+}
+
+static bool
+validate_esc_clean_all (const char **p)
+{
+ while (isdigit (**p) || **p == ';')
+ (*p)++;
+ return (**p == 'm');
+}
+
+static bool
+validate_esc_clean (int value, unsigned int iter, const char **p, bool *check_values)
+{
+ if (is_reset (value, iter, p))
+ return true;
+ else if (is_bold (value, iter, p))
+ {
+ (*p)++;
+ *check_values = true;
+ return false; /* partial escape sequence, need another valid value */
+ }
+ else if (is_fg_color (value, p))
+ return true;
+ else if (is_bg_color (value, iter, p))
+ return true;
+ else
+ return false;
+}
+
+static bool
+is_reset (int value, unsigned int iter, const char **p)
+{
+ return (value == 0 && iter == 1 && **p == 'm');
+}
+
+static bool
+is_bold (int value, unsigned int iter, const char **p)
+{
+ return (value == 1 && iter == 1 && **p == ';');
+}
+
+static bool
+is_fg_color (int value, const char **p)
+{
+ return (((value >= 30 && value <= 37) || value == 39) && **p == 'm');
+}
+
+static bool
+is_bg_color (int value, unsigned int iter, const char **p)
+{
+ return (((value >= 40 && value <= 47) || value == 49) && iter == 1 && **p == 'm');
+}
+
+#if !DEBUG
+static void *
+malloc_wrap (size_t size)
+{
+ void *p = malloc (size);
+ if (!p)
+ MEM_ALLOC_FAIL ();
+ return p;
+}
+
+static void *
+calloc_wrap (size_t nmemb, size_t size)
+{
+ void *p = calloc (nmemb, size);
+ if (!p)
+ MEM_ALLOC_FAIL ();
+ return p;
+}
+
+static void *
+realloc_wrap (void *ptr, size_t size)
+{
+ void *p = realloc (ptr, size);
+ if (!p)
+ MEM_ALLOC_FAIL ();
+ return p;
+}
+#else