[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