+ s = CS tod_stamp(tod_log_datestamp_monthly);
+ string_datestamp_offset = g->ptr; /* Passed back via global */
+ string_datestamp_length = Ustrlen(s); /* Passed back via global */
+ string_datestamp_type = tod_log_datestamp_monthly;
+ slen = string_datestamp_length;
+ goto INSERT_STRING;
+
+ case 'Y': /* gstring pointer */
+ {
+ gstring * zg = va_arg(ap, gstring *);
+ if (zg) { s = CS zg->s; slen = gstring_length(zg); }
+ else { s = null; slen = Ustrlen(s); }
+ goto INSERT_GSTRING;
+ }
+#ifndef COMPILE_UTILITY
+ case 'V': /* Maybe convert ascii-art to UTF-8 chars */
+ {
+ gstring * zg = NULL;
+ s = va_arg(ap, char *);
+ if (IS_DEBUG(D_noutf8))
+ for ( ; *s; s++)
+ zg = string_catn(zg, CUS (*s == 'K' ? "|" : s), 1);
+ else
+ for ( ; *s; s++) switch (*s)
+ {
+ case '\\': zg = string_catn(zg, US UTF8_UP_RIGHT, 3); break;
+ case '/': zg = string_catn(zg, US UTF8_DOWN_RIGHT, 3); break;
+ case '-':
+ case '_': zg = string_catn(zg, US UTF8_HORIZ, 3); break;
+ case '|': zg = string_catn(zg, US UTF8_VERT, 3); break;
+ case 'K': zg = string_catn(zg, US UTF8_VERT_RIGHT, 3); break;
+ case '<': zg = string_catn(zg, US UTF8_LEFT_TRIANGLE, 3); break;
+ case '>': zg = string_catn(zg, US UTF8_RIGHT_TRIANGLE, 3); break;
+ default: zg = string_catn(zg, CUS s, 1); break;
+ }
+
+ if (!zg)
+ break;
+ s = CS zg->s;
+ slen = gstring_length(zg);
+ goto INSERT_GSTRING;
+ }
+
+ case 'W': /* Maybe mark up spaces & newlines */
+ s = va_arg(ap, char *);
+ if (Ustrpbrk(s, " \n") && !IS_DEBUG(D_noutf8))
+ {
+ gstring * zg = NULL;
+ int p = precision;
+ for ( ; *s; s++)
+ {
+ /* Take a given precision as applying to the input; expand
+ it for the transformed result */
+
+ if (p >= 0 && --p < 0) break;
+ switch (*s)
+ {
+ case ' ':
+ zg = string_catn(zg, CUS UTF8_LIGHT_SHADE, 3);
+ if (precision >= 0) precision += 2;
+ break;
+ case '\n':
+ zg = string_catn(zg, CUS UTF8_L_ARROW_HOOK "\n", 4);
+ if (precision >= 0) precision += 3;
+ break;
+ default:
+ zg = string_catn(zg, CUS s, 1);
+ break;
+ }
+ }
+ if (zg) { s = CS zg->s; slen = gstring_length(zg); }
+ else { s = null; slen = Ustrlen(s); }
+ }
+ else
+ {
+ if (!s) s = null;
+ slen = Ustrlen(s);
+ }
+ goto INSERT_GSTRING;