[Python-checkins] r54075 - sandbox/trunk/pep3101/unicodeformat.c

eric.smith python-checkins at python.org
Fri Mar 2 04:19:11 CET 2007


Author: eric.smith
Date: Fri Mar  2 04:19:03 2007
New Revision: 54075

Modified:
   sandbox/trunk/pep3101/unicodeformat.c
Log:
Added output_allocate() so I can allocate memory separately from copying into it.  Modified signature of built-in conversion functions.

Modified: sandbox/trunk/pep3101/unicodeformat.c
==============================================================================
--- sandbox/trunk/pep3101/unicodeformat.c	(original)
+++ sandbox/trunk/pep3101/unicodeformat.c	Fri Mar  2 04:19:03 2007
@@ -230,18 +230,19 @@
 #define PySet_GET_SIZE   PyDict_Size
 #endif
 
-/* XXX -- similar function elsewhere ???? */
 /*
-    output_data dumps characters into our output string
-    buffer.
+    output_allocate reserves space in our output string buffer
 
     In some cases, it has to reallocate the string.
 
     It returns a status:  0 for a failed reallocation,
     1 for success.
+
+    On success, it sets *ptr to point to the allocated memory.
 */
+
 static int
-output_data(FmtState *fs, const CH_TYPE *s, Py_ssize_t count)
+output_allocate(FmtState *fs, Py_ssize_t count, CH_TYPE **ptr)
 {
     Py_ssize_t room = fs->outstr.end - fs->outstr.ptr;
     if (count > room) {
@@ -258,11 +259,31 @@
         if (fs->size_increment < MAX_SIZE_INCREMENT)
             fs->size_increment *= SIZE_MULTIPLIER;
     }
-    memcpy(fs->outstr.ptr, s, count * sizeof(CH_TYPE));
+    *ptr = fs->outstr.ptr;
     fs->outstr.ptr += count;
     return 1;
 }
 
+/* XXX -- similar function elsewhere ???? */
+/*
+    output_data dumps characters into our output string
+    buffer.
+
+    In some cases, it has to reallocate the string.
+
+    It returns a status:  0 for a failed reallocation,
+    1 for success.
+*/
+static int
+output_data(FmtState *fs, const CH_TYPE *s, Py_ssize_t count)
+{
+    CH_TYPE *dst;
+    if (output_allocate(fs, count, &dst) == 0)
+        return 0;
+    memcpy(dst, s, count * sizeof(CH_TYPE));
+    return 1;
+}
+
 /*
     get_python_identifier is a bit of a misnomer.  It returns
     a value for use with getattr or getindex.  This value
@@ -477,7 +498,7 @@
             if (isnumeric && PySequence_Check(myobj))
                 newobj = PySequence_GetItem(myobj, index);
             else {
-                /* XXX -- do we need PyLong_FromLongLong? 
+                /* XXX -- do we need PyLong_FromLongLong?
                                    Using ssizet, not int... */
                 subobj = isnumeric ?
                           PyInt_FromLong(index) :
@@ -680,77 +701,77 @@
 */
 /* XXX obviously wrong, but just a placeholder currently */
 typedef Py_ssize_t
-(*ConversionFunction)(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign);
+(*ConversionFunction)(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format);
 
 /* conversion functions */
 static Py_ssize_t
-convert_binary(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_binary(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_char(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_char(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_decimal(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_decimal(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_exponent(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_exponent(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_exponentUC(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_exponentUC(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_fixed(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_fixed(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_fixedUC(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_fixedUC(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_general(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_general(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_generalUC(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_generalUC(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_number(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_number(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_octal(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_octal(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_repr(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_repr(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     int ok;
     PyObject *s;
@@ -772,11 +793,12 @@
 }
 
 static Py_ssize_t
-convert_string(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_string(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     PyObject *myobj;
     Py_ssize_t ok;
     Py_ssize_t len;
+    CH_TYPE *dst;
 
     myobj = STROBJ_STR(fieldobj);
     if (myobj == NULL)
@@ -784,26 +806,30 @@
 
     len = STROBJ_GET_SIZE(myobj);
 
-    ok = output_data(fs, STROBJ_AS_PTR(myobj), len);
+    /* reserve all the space we'll need */
+    ok = output_allocate(fs, len, &dst);
+    if (ok) {
+        memcpy(dst, STROBJ_AS_PTR(myobj), len * sizeof(CH_TYPE));
+    }
     Py_DECREF(myobj);
 
     return ok ? len : -1;
 }
 
 static Py_ssize_t
-convert_hex(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_hex(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_hexUC(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_hexUC(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
 
 static Py_ssize_t
-convert_percentage(PyObject *fieldobj, FmtState *fs, CH_TYPE *sign)
+convert_percentage(PyObject *fieldobj, FmtState *fs, const DefaultFormat *format)
 {
     return -1;
 }
@@ -902,7 +928,7 @@
     /* convert to a string first */
     /* get the length written so that we can fixup
        inside the buffer, as needed */
-    len = conversion(fieldobj, fs, &sign);
+    len = conversion(fieldobj, fs, &format);
     if (len < 0)
         return 0;
 


More information about the Python-checkins mailing list