summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-04-08 01:29:53 +0100
committerDamien George <damien.p.george@gmail.com>2014-04-08 01:29:53 +0100
commita12a0f78b0462f9b5e8f3d4cb1b164656f44ad03 (patch)
tree1d828572cecd5fa90155050ec73a3a9afa52179c
parent97543c5285b47c765e19d6ab7c08b36630e23c6a (diff)
downloadmicropython-a12a0f78b0462f9b5e8f3d4cb1b164656f44ad03.tar.gz
micropython-a12a0f78b0462f9b5e8f3d4cb1b164656f44ad03.zip
py: Rename pfenv_print_int to pfenv_print_mp_int, and add back former.
stmhal relies on pfenv_* to implement its printf. Thus, it needs a pfenv_print_int which prints a proper 32-bit integer. With latest change to pfenv, this function became one that took mp_obj_t, and extracted the integer value from that object. To fix temporarily, pfenv_print_int has been renamed to pfenv_print_mp_int (to indicate it takes a mp_obj_t for the int), and pfenv_print_int has been added (which takes a normal C int). Currently, pfenv_print_int proxies to pfenv_print_mp_int, but this means it looses the MSB. Need to find a way to fix this, but the only way I can think of will duplicate lots of code.
-rw-r--r--py/objstr.c18
-rw-r--r--py/pfenv.c7
-rw-r--r--py/pfenv.h3
3 files changed, 17 insertions, 11 deletions
diff --git a/py/objstr.c b/py/objstr.c
index 07134687d1..4c09871b96 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -792,7 +792,7 @@ mp_obj_t str_format(uint n_args, const mp_obj_t *args) {
if (arg_looks_integer(arg)) {
switch (type) {
case 'b':
- pfenv_print_int(&pfenv_vstr, arg, 1, 2, 'a', flags, fill, width);
+ pfenv_print_mp_int(&pfenv_vstr, arg, 1, 2, 'a', flags, fill, width);
continue;
case 'c':
@@ -805,7 +805,7 @@ mp_obj_t str_format(uint n_args, const mp_obj_t *args) {
case '\0': // No explicit format type implies 'd'
case 'n': // I don't think we support locales in uPy so use 'd'
case 'd':
- pfenv_print_int(&pfenv_vstr, arg, 1, 10, 'a', flags, fill, width);
+ pfenv_print_mp_int(&pfenv_vstr, arg, 1, 10, 'a', flags, fill, width);
continue;
case 'o':
@@ -813,15 +813,15 @@ mp_obj_t str_format(uint n_args, const mp_obj_t *args) {
flags |= PF_FLAG_SHOW_OCTAL_LETTER;
}
- pfenv_print_int(&pfenv_vstr, arg, 1, 8, 'a', flags, fill, width);
+ pfenv_print_mp_int(&pfenv_vstr, arg, 1, 8, 'a', flags, fill, width);
continue;
case 'x':
- pfenv_print_int(&pfenv_vstr, arg, 1, 16, 'a', flags, fill, width);
+ pfenv_print_mp_int(&pfenv_vstr, arg, 1, 16, 'a', flags, fill, width);
continue;
case 'X':
- pfenv_print_int(&pfenv_vstr, arg, 1, 16, 'A', flags, fill, width);
+ pfenv_print_mp_int(&pfenv_vstr, arg, 1, 16, 'A', flags, fill, width);
continue;
case 'e':
@@ -1042,7 +1042,7 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t
case 'd':
case 'i':
case 'u':
- pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 10, 'a', flags, fill, width);
+ pfenv_print_mp_int(&pfenv_vstr, arg_as_int(arg), 1, 10, 'a', flags, fill, width);
break;
#if MICROPY_ENABLE_FLOAT
@@ -1060,7 +1060,7 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t
if (alt) {
flags |= (PF_FLAG_SHOW_PREFIX | PF_FLAG_SHOW_OCTAL_LETTER);
}
- pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 8, 'a', flags, fill, width);
+ pfenv_print_mp_int(&pfenv_vstr, arg_as_int(arg), 1, 8, 'a', flags, fill, width);
break;
case 'r':
@@ -1085,14 +1085,14 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t
if (alt) {
flags |= PF_FLAG_SHOW_PREFIX;
}
- pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'a', flags, fill, width);
+ pfenv_print_mp_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'a', flags, fill, width);
break;
case 'X':
if (alt) {
flags |= PF_FLAG_SHOW_PREFIX;
}
- pfenv_print_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'A', flags, fill, width);
+ pfenv_print_mp_int(&pfenv_vstr, arg_as_int(arg), 1, 16, 'A', flags, fill, width);
break;
default:
diff --git a/py/pfenv.c b/py/pfenv.c
index ab45328ad7..b91390d6d9 100644
--- a/py/pfenv.c
+++ b/py/pfenv.c
@@ -77,11 +77,16 @@ int pfenv_print_strn(const pfenv_t *pfenv, const char *str, unsigned int len, in
return len;
}
+int pfenv_print_int(const pfenv_t *pfenv, int x, int sgn, int base, int base_char, int flags, char fill, int width) {
+ // XXX this really needs to be a dedicated function, since converting to a mp_int looses the MSB
+ return pfenv_print_mp_int(pfenv, MP_OBJ_NEW_SMALL_INT((machine_int_t)x), sgn, base, base_char, flags, fill, width);
+}
+
// 32-bits is 10 digits, add 3 for commas, 1 for sign, 1 for terminating null
// We can use 16 characters for 32-bit and 32 characters for 64-bit
#define INT_BUF_SIZE (sizeof(machine_int_t) * 4)
-int pfenv_print_int(const pfenv_t *pfenv, mp_obj_t x, int sgn, int base, int base_char, int flags, char fill, int width) {
+int pfenv_print_mp_int(const pfenv_t *pfenv, mp_obj_t x, int sgn, int base, int base_char, int flags, char fill, int width) {
if (!MP_OBJ_IS_INT(x)) {
// This will convert booleans to int, or raise an error for
// non-integer types.
diff --git a/py/pfenv.h b/py/pfenv.h
index 32ecc159ff..6240b47acb 100644
--- a/py/pfenv.h
+++ b/py/pfenv.h
@@ -18,7 +18,8 @@ typedef struct _pfenv_t {
void pfenv_vstr_add_strn(void *data, const char *str, unsigned int len);
int pfenv_print_strn(const pfenv_t *pfenv, const char *str, unsigned int len, int flags, char fill, int width);
-int pfenv_print_int(const pfenv_t *pfenv, mp_obj_t x, int sgn, int base, int base_char, int flags, char fill, int width);
+int pfenv_print_int(const pfenv_t *pfenv, int x, int sgn, int base, int base_char, int flags, char fill, int width);
+int pfenv_print_mp_int(const pfenv_t *pfenv, mp_obj_t x, int sgn, int base, int base_char, int flags, char fill, int width);
#if MICROPY_ENABLE_FLOAT
int pfenv_print_float(const pfenv_t *pfenv, mp_float_t f, char fmt, int flags, char fill, int width, int prec);
#endif