[Python-checkins] python/dist/src/Objects stringobject.c,2.189,2.190

loewis@users.sourceforge.net loewis@users.sourceforge.net
Mon, 07 Oct 2002 06:55:53 -0700


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);