From d6fb45e7dd0c00e4b2bc4249334e17a43542d0cb Mon Sep 17 00:00:00 2001 From: "alecf%netscape.com" Date: Fri, 30 Aug 2002 15:44:35 +0000 Subject: [PATCH] fix for bug 164633 - add ssprintf for formatting strings into nsAStrings r=dougt, sr=darin --- xpcom/ds/nsTextFormatter.cpp | 89 ++++++++++++++++++++---------------- xpcom/ds/nsTextFormatter.h | 4 ++ 2 files changed, 53 insertions(+), 40 deletions(-) diff --git a/xpcom/ds/nsTextFormatter.cpp b/xpcom/ds/nsTextFormatter.cpp index 7744c8b1e9b5..712d2d7d344a 100644 --- a/xpcom/ds/nsTextFormatter.cpp +++ b/xpcom/ds/nsTextFormatter.cpp @@ -65,8 +65,7 @@ struct SprintfStateStr { PRUnichar *cur; PRUint32 maxlen; - int (*func)(void *arg, const PRUnichar *sp, PRUint32 len); - void *arg; + void *stuffclosure; }; /* @@ -646,8 +645,7 @@ static int cvt_S(SprintfState *ss, const PRUnichar *s, int width, } /* and away we go */ - nsAutoString nullstr; - nullstr.Assign(NS_LITERAL_STRING("(null)")); + NS_NAMED_LITERAL_STRING(nullstr, "(null)"); return fill2(ss, s ? s : nullstr.get(), slen, width, flags); } @@ -1298,46 +1296,19 @@ static int dosprintf(SprintfState *ss, const PRUnichar *fmt, va_list ap) /************************************************************************/ -#if 0 -static int FuncStuff(SprintfState *ss, const PRUnichar *sp, PRUint32 len) +static int +StringStuff(SprintfState* ss, const PRUnichar* sp, PRUint32 len) { - int rv; + ptrdiff_t off = ss->cur - ss->base; + + nsAFlatString* str = NS_STATIC_CAST(nsAFlatString*,ss->stuffclosure); + str->Append(sp, len); + ss->base = NS_CONST_CAST(PRUnichar*,str->get()); + ss->cur = ss->base + off; - rv = (*ss->func)(ss->arg, sp, len); - if (rv < 0) { - return rv; - } - ss->maxlen += len; return 0; } -PRUint32 nsTextFormatter::sxprintf(PRStuffFunc func, void *arg, - const PRUnichar *fmt, ...) -{ - va_list ap; - int rv; - - va_start(ap, fmt); - rv = nsTextFormatter::vsxprintf(func, arg, fmt, ap); - va_end(ap); - return rv; -} - -PRUint32 vsxprintf(PRStuffFunc func, void *arg, - const PRUnichar *fmt, va_list ap) -{ - SprintfState ss; - int rv; - - ss.stuff = FuncStuff; - ss.func = func; - ss.arg = arg; - ss.maxlen = 0; - rv = dosprintf(&ss, fmt, ap); - return (rv < 0) ? (PRUint32)-1 : ss.maxlen; -} -#endif - /* ** Stuff routine that automatically grows the malloc'd output buffer ** before it overflows. @@ -1389,6 +1360,17 @@ PRUnichar * nsTextFormatter::smprintf(const PRUnichar *fmt, ...) return rv; } +PRUint32 nsTextFormatter::ssprintf(nsAString& out, const PRUnichar* fmt, ...) +{ + va_list ap; + PRUint32 rv; + + va_start(ap, fmt); + rv = nsTextFormatter::vssprintf(out, fmt, ap); + va_end(ap); + return rv; +} + /* ** Free memory allocated, for the caller, by smprintf */ @@ -1397,6 +1379,33 @@ void nsTextFormatter::smprintf_free(PRUnichar *mem) PR_DELETE(mem); } +PRUint32 nsTextFormatter::vssprintf(nsAString& out, const PRUnichar* fmt, va_list ap) +{ + SprintfState ss; + ss.stuff = StringStuff; + ss.base = 0; + ss.cur = 0; + ss.maxlen = 0; + ss.stuffclosure = &out; + + int n; + if (out.GetFlatBufferHandle()) { + nsAFlatString *flattenedString = NS_STATIC_CAST(nsAFlatString*, &out); + out.Truncate(); + ss.stuffclosure = NS_STATIC_CAST(void*, flattenedString); + n = dosprintf(&ss, fmt, ap); + } else { + // stack based, instantiated only in the non-flat case + nsAutoString flattenedString; + ss.stuffclosure = NS_STATIC_CAST(void*, &flattenedString); + n=dosprintf(&ss, fmt, ap); + out = flattenedString; + } + + + return n ? n - 1 : n; +} + PRUnichar * nsTextFormatter::vsmprintf(const PRUnichar *fmt, va_list ap) { SprintfState ss; @@ -1440,7 +1449,7 @@ static int LimitStuff(SprintfState *ss, const PRUnichar *sp, PRUint32 len) PRUint32 nsTextFormatter::snprintf(PRUnichar *out, PRUint32 outlen, const PRUnichar *fmt, ...) { va_list ap; - int rv; + PRUint32 rv; PR_ASSERT((PRInt32)outlen > 0); if ((PRInt32)outlen <= 0) { diff --git a/xpcom/ds/nsTextFormatter.h b/xpcom/ds/nsTextFormatter.h index 62a1ccb93f8d..546ee55e0abe 100644 --- a/xpcom/ds/nsTextFormatter.h +++ b/xpcom/ds/nsTextFormatter.h @@ -41,6 +41,7 @@ #include #include #include "nscore.h" +#include "nsAString.h" class NS_COM nsTextFormatter { @@ -61,6 +62,8 @@ static PRUint32 snprintf(PRUnichar *out, PRUint32 outlen, const PRUnichar *fmt, */ static PRUnichar* smprintf(const PRUnichar *fmt, ...); + +static PRUint32 ssprintf(nsAString& out, const PRUnichar* fmt, ...); /* ** Free the memory allocated, for the caller, by smprintf */ @@ -80,6 +83,7 @@ static PRUnichar* sprintf_append(PRUnichar *last, const PRUnichar *fmt, ...); */ static PRUint32 vsnprintf(PRUnichar *out, PRUint32 outlen, const PRUnichar *fmt, va_list ap); static PRUnichar* vsmprintf(const PRUnichar *fmt, va_list ap); +static PRUint32 vssprintf(nsAString& out, const PRUnichar *fmt, va_list ap); static PRUnichar* vsprintf_append(PRUnichar *last, const PRUnichar *fmt, va_list ap); #ifdef DEBUG