X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=muttlib.c;h=f63ad45ddacb108b8c89c04547b8ceeb1e83c0ef;hp=f185e1291951794751073acbadf46e56d3804372;hb=8a2967d883cee12f0de4c0cdf0cd594ea96e622b;hpb=1eeaaac6bdcad962c41bf975a32078cc4a0e578c diff --git a/muttlib.c b/muttlib.c index f185e12..f63ad45 100644 --- a/muttlib.c +++ b/muttlib.c @@ -329,15 +329,22 @@ void mutt_safe_path(char *s, ssize_t l, address_t *a) } ssize_t m_strformat(char *dst, ssize_t dlen, const char *fmt, - format_t *callback, unsigned long data, format_flag flags) + format_t *callback, anytype cdata, format_flag flags) { - ssize_t pos = (flags & M_FORMAT_ARROWCURSOR && option (OPTARROWCURSOR)) ? 3 : 0; + ssize_t pos = flags & M_FORMAT_ARROWCURSOR ? 3 : 0; + + m_strpad(dst, dlen, '\0', pos + 1); + if (!fmt) + return; while (*fmt) { - char ifstring[STRING], elsestring[STRING], prefix[STRING] = ""; int ch; if (*fmt == '%') { + char ifstr[STRING], elstr[STRING], prefix[STRING]; + + *ifstr = *elstr = *prefix = '\0'; + if (*++fmt == '%') { pos += m_strputc(dst + pos, dlen - pos, *fmt++); continue; @@ -369,7 +376,7 @@ ssize_t m_strformat(char *dst, ssize_t dlen, const char *fmt, /* eat the `if' part of the string */ iflen = strcspn(fmt, "?&"); - m_strncpy(ifstring, ssizeof(ifstring), fmt, iflen); + m_strncpy(ifstr, ssizeof(ifstr), fmt, iflen); fmt += iflen; /* eat the `else' part of the string (optional) */ @@ -377,13 +384,11 @@ ssize_t m_strformat(char *dst, ssize_t dlen, const char *fmt, fmt++; /* skip the & */ p = m_strchrnul(fmt, '?'); - m_strncpy(elsestring, ssizeof(elsestring), fmt, p - fmt); + m_strncpy(elstr, ssizeof(elstr), fmt, p - fmt); fmt = p; if (!*fmt++) /* move past the trailing `?' */ break; /* bad format */ - } else { - *ifstring = *elsestring = '\0'; } switch (ch) { @@ -396,20 +401,16 @@ ssize_t m_strformat(char *dst, ssize_t dlen, const char *fmt, ch = *fmt++; /* pad char */ if (COLS - SW > col) { - m_strformat(buf, sizeof(buf), fmt, callback, data, flags); + m_strformat(buf, sizeof(buf), fmt, callback, cdata, flags); pos += m_strpad(dst + pos, dlen - pos, ch, COLS - SW - col - mutt_strwidth(buf)); pos += m_strcpy(dst + pos, dlen - pos, buf); } return pos; /* skip rest of input */ - case '|': - col = mutt_strwidth(dst); - - ch = *fmt++; - /* pad to EOL */ - pos += m_strpad(dst + pos, dlen - pos, ch, COLS - SW - col); - return pos; /* skip rest of input */ + case '|': /* pad to EOL */ + return pos + m_strpad(dst + pos, dlen - pos, *fmt, + COLS - SW - mutt_strwidth(dst)); default: lower = nodots = 0; @@ -422,7 +423,7 @@ ssize_t m_strformat(char *dst, ssize_t dlen, const char *fmt, /* use callback function to handle this case */ fmt = callback(buf, sizeof (buf), ch, fmt, prefix, - ifstring, elsestring, data, flags); + ifstr, elstr, cdata, flags); if (lower) m_strtolower(buf);