diff options
| author | Bob Jamison <ishmalius@gmail.com> | 2007-03-05 10:34:59 +0000 |
|---|---|---|
| committer | ishmal <ishmal@users.sourceforge.net> | 2007-03-05 10:34:59 +0000 |
| commit | 33837efd4b94c4ebb80f95b3d9dbb6efd5499a98 (patch) | |
| tree | de482d7687b3bffa97cc78608ba75a8ad7e52b60 /src/dom/js/jsprf.c | |
| parent | Adding optional dialog preview. Implments RFE [ 1435276 ] switch preview on/o... (diff) | |
| download | inkscape-33837efd4b94c4ebb80f95b3d9dbb6efd5499a98.tar.gz inkscape-33837efd4b94c4ebb80f95b3d9dbb6efd5499a98.zip | |
update JS
(bzr r2555)
Diffstat (limited to 'src/dom/js/jsprf.c')
| -rw-r--r-- | src/dom/js/jsprf.c | 64 |
1 files changed, 58 insertions, 6 deletions
diff --git a/src/dom/js/jsprf.c b/src/dom/js/jsprf.c index 591313ef7..ba7c0f03b 100644 --- a/src/dom/js/jsprf.c +++ b/src/dom/js/jsprf.c @@ -49,6 +49,8 @@ #include "jsprf.h" #include "jslong.h" #include "jsutil.h" /* Added by JSIFY */ +#include "jspubtd.h" +#include "jsstr.h" /* ** Note: on some platforms va_list is defined as an array, @@ -105,6 +107,7 @@ struct NumArgState{ #define TYPE_STRING 8 #define TYPE_DOUBLE 9 #define TYPE_INTSTR 10 +#define TYPE_WSTRING 11 #define TYPE_UNKNOWN 20 #define FLAG_LEFT 0x1 @@ -395,6 +398,27 @@ static int cvt_s(SprintfState *ss, const char *s, int width, int prec, return fill2(ss, s ? s : "(null)", slen, width, flags); } +static int cvt_ws(SprintfState *ss, const jschar *ws, int width, int prec, + int flags) +{ + int result; + /* + * Supply NULL as the JSContext; errors are not reported, + * and malloc() is used to allocate the buffer buffer. + */ + if (ws) { + int slen = js_strlen(ws); + char *s = js_DeflateString(NULL, ws, slen); + if (!s) + return -1; /* JSStuffFunc error indicator. */ + result = cvt_s(ss, s, width, prec, flags); + free(s); + } else { + result = cvt_s(ss, NULL, width, prec, flags); + } + return result; +} + /* ** BuildArgArray stands for Numbered Argument list Sprintf ** for example, @@ -578,7 +602,7 @@ static struct NumArgState* BuildArgArray( const char *fmt, va_list ap, int* rv, break; case 's': - nas[ cn ].type = TYPE_STRING; + nas[ cn ].type = (nas[ cn ].type == TYPE_UINT16) ? TYPE_WSTRING : TYPE_STRING; break; case 'n': @@ -635,6 +659,8 @@ static struct NumArgState* BuildArgArray( const char *fmt, va_list ap, int* rv, case TYPE_STRING: (void)va_arg( ap, char* ); break; + case TYPE_WSTRING: (void)va_arg( ap, jschar* ); break; + case TYPE_INTSTR: (void)va_arg( ap, JSIntn* ); break; case TYPE_DOUBLE: (void)va_arg( ap, double ); break; @@ -662,11 +688,13 @@ static int dosprintf(SprintfState *ss, const char *fmt, va_list ap) int flags, width, prec, radix, type; union { char ch; + jschar wch; int i; long l; JSInt64 ll; double d; const char *s; + const jschar* ws; int *ip; } u; const char *fmt0; @@ -678,7 +706,10 @@ static int dosprintf(SprintfState *ss, const char *fmt, va_list ap) struct NumArgState nasArray[ NAS_DEFAULT_NUM ]; char pattern[20]; const char *dolPt = NULL; /* in "%4$.2f", dolPt will poiont to . */ - +#ifdef JS_C_STRINGS_ARE_UTF8 + char utf8buf[6]; + int utf8len; +#endif /* ** build an argument array, IF the fmt is numbered argument @@ -905,7 +936,6 @@ static int dosprintf(SprintfState *ss, const char *fmt, va_list ap) break; case 'c': - u.ch = va_arg(ap, int); if ((flags & FLAG_LEFT) == 0) { while (width-- > 1) { rv = (*ss->stuff)(ss, " ", 1); @@ -914,7 +944,20 @@ static int dosprintf(SprintfState *ss, const char *fmt, va_list ap) } } } - rv = (*ss->stuff)(ss, &u.ch, 1); + switch (type) { + case TYPE_INT16: + /* Treat %hc as %c if JS_C_STRINGS_ARE_UTF8 is undefined. */ +#ifdef JS_C_STRINGS_ARE_UTF8 + u.wch = va_arg(ap, int); + utf8len = js_OneUcs4ToUtf8Char (utf8buf, u.wch); + rv = (*ss->stuff)(ss, utf8buf, utf8len); + break; +#endif + case TYPE_INTN: + u.ch = va_arg(ap, int); + rv = (*ss->stuff)(ss, &u.ch, 1); + break; + } if (rv < 0) { return rv; } @@ -953,8 +996,17 @@ static int dosprintf(SprintfState *ss, const char *fmt, va_list ap) #endif case 's': - u.s = va_arg(ap, const char*); - rv = cvt_s(ss, u.s, width, prec, flags); + if(type == TYPE_INT16) { + /* + * This would do a simple string/byte conversion + * if JS_C_STRINGS_ARE_UTF8 is not defined. + */ + u.ws = va_arg(ap, const jschar*); + rv = cvt_ws(ss, u.ws, width, prec, flags); + } else { + u.s = va_arg(ap, const char*); + rv = cvt_s(ss, u.s, width, prec, flags); + } if (rv < 0) { return rv; } |
