Mailing List Archive

python/dist/src/Objects stringobject.c,2.189,2.190
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv1745/Objects

Modified Files:
stringobject.c
Log Message:
Patch #479898: Use multibyte C library for printing strings if available.


Index: stringobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/stringobject.c,v
retrieving revision 2.189
retrieving revision 2.190
diff -C2 -d -r2.189 -r2.190
*** stringobject.c 12 Sep 2002 14:43:40 -0000 2.189
--- stringobject.c 7 Oct 2002 13:55:50 -0000 2.190
***************
*** 27,30 ****
--- 27,43 ----


+ #if defined(HAVE_MBTOWC) && defined(HAVE_WCHAR_H)
+ # define PRINT_MULTIBYTE_STRING
+ # include <locale.h>
+ # include <wchar.h>
+ # if defined(HAVE_ISWPRINT)
+ # define _isprint iswprint
+ # else
+ # define _isprint isprint
+ # endif
+ #endif
+
+ static const char *hexchars = "0123456789abcdef";
+
/*
For both PyString_FromString() and PyString_FromStringAndSize(), the
***************
*** 750,755 ****
--- 763,774 ----
string_print(PyStringObject *op, FILE *fp, int flags)
{
+ #ifndef PRINT_MULTIBYTE_STRING
int i;
char c;
+ #else
+ char *scur, *send;
+ wchar_t c;
+ int cr;
+ #endif
int quote;

***************
*** 777,794 ****

fputc(quote, fp);
for (i = 0; i < op->ob_size; i++) {
c = op->ob_sval[i];
if (c == quote || c == '\\')
! fprintf(fp, "\\%c", c);
else if (c == '\t')
! fprintf(fp, "\\t");
else if (c == '\n')
! fprintf(fp, "\\n");
else if (c == '\r')
! fprintf(fp, "\\r");
! else if (c < ' ' || c >= 0x7f)
! fprintf(fp, "\\x%02x", c & 0xff);
! else
fputc(c, fp);
}
fputc(quote, fp);
--- 796,829 ----

fputc(quote, fp);
+ #ifndef PRINT_MULTIBYTE_STRING
for (i = 0; i < op->ob_size; i++) {
c = op->ob_sval[i];
+ #else
+ for (scur = op->ob_sval, send = op->ob_sval + op->ob_size;
+ scur < send; scur += cr) {
+ if ((cr = mbtowc(&c, scur, send - scur)) <= 0)
+ goto non_printable;
+ #endif
if (c == quote || c == '\\')
! fputc('\\', fp), fputc(c, fp);
else if (c == '\t')
! fputs("\\t", fp);
else if (c == '\n')
! fputs("\\n", fp);
else if (c == '\r')
! fputs("\\r", fp);
! #ifndef PRINT_MULTIBYTE_STRING
! else if (' ' <= c && c < 0x7f)
fputc(c, fp);
+ else
+ fprintf(fp, "\\x%02x", c & 0xff);
+ #else
+ else if (_isprint(c))
+ fwrite(scur, cr, 1, fp);
+ else {
+ non_printable: cr = 1; /* unit to move cursor */
+ fprintf(fp, "\\x%02x", *scur & 0xff);
+ }
+ #endif
}
fputc(quote, fp);
***************
*** 811,816 ****
--- 846,857 ----
}
else {
+ #ifndef PRINT_MULTIBYTE_STRING
register int i;
register char c;
+ #else
+ register char *scur, *send;
+ wchar_t c;
+ int cr;
+ #endif
register char *p;
int quote;
***************
*** 825,828 ****
--- 866,870 ----
p = PyString_AS_STRING(v);
*p++ = quote;
+ #ifndef PRINT_MULTIBYTE_STRING
for (i = 0; i < op->ob_size; i++) {
/* There's at least enough room for a hex escape
***************
*** 830,833 ****
--- 872,881 ----
assert(newsize - (p - PyString_AS_STRING(v)) >= 5);
c = op->ob_sval[i];
+ #else
+ for (scur = op->ob_sval, send = op->ob_sval + op->ob_size;
+ scur < send; scur += cr) {
+ if ((cr = mbtowc(&c, scur, send - scur)) <= 0)
+ goto non_printable;
+ #endif
if (c == quote || c == '\\')
*p++ = '\\', *p++ = c;
***************
*** 838,850 ****
else if (c == '\r')
*p++ = '\\', *p++ = 'r';
! else if (c < ' ' || c >= 0x7f) {
! /* For performance, we don't want to call
! PyOS_snprintf here (extra layers of
! function call). */
! sprintf(p, "\\x%02x", c & 0xff);
! p += 4;
! }
! else
*p++ = c;
}
assert(newsize - (p - PyString_AS_STRING(v)) >= 1);
--- 886,903 ----
else if (c == '\r')
*p++ = '\\', *p++ = 'r';
! #ifndef PRINT_MULTIBYTE_STRING
! else if (' ' <= c && c < 0x7f)
*p++ = c;
+ else {
+ #else
+ else if (_isprint(c))
+ memcpy(p, scur, cr), p += cr;
+ else {
+ non_printable: cr = 1; c = *scur;
+ #endif
+ *p++ = '\\'; *p++ = 'x';
+ *p++ = hexchars[(c >> 4) & 0x0f];
+ *p++ = hexchars[c & 0x0f];
+ }
}
assert(newsize - (p - PyString_AS_STRING(v)) >= 1);