diff --git a/logging.c b/logging.c index 8f46500d..a04ca633 100644 --- a/logging.c +++ b/logging.c @@ -256,15 +256,18 @@ void logevent_and_free(LogContext *ctx, char *event) sfree(event); } +void logeventvf(LogContext *ctx, const char *fmt, va_list ap) +{ + logevent_and_free(ctx, dupvprintf(fmt, ap)); +} + void logeventf(LogContext *ctx, const char *fmt, ...) { va_list ap; - char *buf; va_start(ap, fmt); - buf = dupvprintf(fmt, ap); + logeventvf(ctx, fmt, ap); va_end(ap); - logevent_and_free(ctx, buf); } /* diff --git a/misc.c b/misc.c index f360eebb..274f8aa8 100644 --- a/misc.c +++ b/misc.c @@ -1259,6 +1259,24 @@ int ptrlen_eq_string(ptrlen pl, const char *str) return (pl.len == len && !memcmp(pl.ptr, str, len)); } +int ptrlen_eq_ptrlen(ptrlen pl1, ptrlen pl2) +{ + return (pl1.len == pl2.len && !memcmp(pl1.ptr, pl2.ptr, pl1.len)); +} + +int ptrlen_startswith(ptrlen whole, ptrlen prefix, ptrlen *tail) +{ + if (whole.len >= prefix.len && + !memcmp(whole.ptr, prefix.ptr, prefix.len)) { + if (tail) { + tail->ptr = (const char *)whole.ptr + prefix.len; + tail->len = whole.len - prefix.len; + } + return TRUE; + } + return FALSE; +} + char *mkstr(ptrlen pl) { char *p = snewn(pl.len + 1, char); diff --git a/misc.h b/misc.h index fd63b335..90322092 100644 --- a/misc.h +++ b/misc.h @@ -100,6 +100,8 @@ ptrlen make_ptrlen(const void *ptr, size_t len); ptrlen ptrlen_from_asciz(const char *str); ptrlen ptrlen_from_strbuf(strbuf *sb); int ptrlen_eq_string(ptrlen pl, const char *str); +int ptrlen_eq_ptrlen(ptrlen pl1, ptrlen pl2); +int ptrlen_startswith(ptrlen whole, ptrlen prefix, ptrlen *tail); char *mkstr(ptrlen pl); int string_length_for_printf(size_t); /* Derive two printf arguments from a ptrlen, suitable for "%.*s" */ diff --git a/putty.h b/putty.h index 492d87e1..46b8be54 100644 --- a/putty.h +++ b/putty.h @@ -1484,6 +1484,8 @@ void logtraffic(LogContext *logctx, unsigned char c, int logmode); void logflush(LogContext *logctx); void logevent(LogContext *logctx, const char *event); void logeventf(LogContext *logctx, const char *fmt, ...); +void logeventvf(LogContext *logctx, const char *fmt, va_list ap); + /* * Pass a dynamically allocated string to logevent and immediately * free it. Intended for use by wrapper macros which pass the return