Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
cb9dc086
Commit
cb9dc086
authored
Apr 26, 2014
by
Paul Sokolovsky
Browse files
modio: Implement io.StringIO class.
parent
dbc81df5
Changes
6
Hide whitespace changes
Inline
Side-by-side
py/modio.c
View file @
cb9dc086
...
...
@@ -11,6 +11,8 @@ STATIC const mp_map_elem_t mp_module_io_globals_table[] = {
// Note: mp_builtin_open_obj should be defined by port, it's not
// part of the core.
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_open
),
(
mp_obj_t
)
&
mp_builtin_open_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_BytesIO
),
(
mp_obj_t
)
&
mp_type_stringio
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_StringIO
),
(
mp_obj_t
)
&
mp_type_stringio
},
};
STATIC
const
mp_obj_dict_t
mp_module_io_globals
=
{
...
...
py/obj.h
View file @
cb9dc086
...
...
@@ -292,6 +292,7 @@ extern const mp_obj_type_t mp_type_module;
extern
const
mp_obj_type_t
mp_type_staticmethod
;
extern
const
mp_obj_type_t
mp_type_classmethod
;
extern
const
mp_obj_type_t
mp_type_property
;
extern
const
mp_obj_type_t
mp_type_stringio
;
// Exceptions
extern
const
mp_obj_type_t
mp_type_BaseException
;
...
...
py/objstringio.c
0 → 100644
View file @
cb9dc086
#include
<stdio.h>
#include
<string.h>
#include
"nlr.h"
#include
"misc.h"
#include
"mpconfig.h"
#include
"qstr.h"
#include
"obj.h"
#include
"runtime.h"
#include
"stream.h"
typedef
struct
_mp_obj_stringio_t
{
mp_obj_base_t
base
;
vstr_t
*
vstr
;
// StringIO has single pointer used for both reading and writing
machine_uint_t
pos
;
}
mp_obj_stringio_t
;
STATIC
void
stringio_print
(
void
(
*
print
)(
void
*
env
,
const
char
*
fmt
,
...),
void
*
env
,
mp_obj_t
self_in
,
mp_print_kind_t
kind
)
{
mp_obj_stringio_t
*
self
=
self_in
;
print
(
env
,
"<io.StringIO 0x%x>"
,
self
->
vstr
);
}
STATIC
machine_int_t
stringio_read
(
mp_obj_t
o_in
,
void
*
buf
,
machine_uint_t
size
,
int
*
errcode
)
{
mp_obj_stringio_t
*
o
=
o_in
;
machine_uint_t
remaining
=
o
->
vstr
->
len
-
o
->
pos
;
if
(
size
>
remaining
)
{
size
=
remaining
;
}
memcpy
(
buf
,
o
->
vstr
->
buf
+
o
->
pos
,
size
);
o
->
pos
+=
size
;
return
size
;
}
STATIC
machine_int_t
stringio_write
(
mp_obj_t
o_in
,
const
void
*
buf
,
machine_uint_t
size
,
int
*
errcode
)
{
mp_obj_stringio_t
*
o
=
o_in
;
machine_uint_t
remaining
=
o
->
vstr
->
alloc
-
o
->
pos
;
if
(
size
>
remaining
)
{
// Take all what's already allocated...
o
->
vstr
->
len
=
o
->
vstr
->
alloc
;
// ... and add more
vstr_add_len
(
o
->
vstr
,
size
-
remaining
);
}
memcpy
(
o
->
vstr
->
buf
+
o
->
pos
,
buf
,
size
);
o
->
pos
+=
size
;
if
(
o
->
pos
>
o
->
vstr
->
len
)
{
o
->
vstr
->
len
=
o
->
pos
;
}
return
size
;
}
STATIC
mp_obj_t
stringio_getvalue
(
mp_obj_t
self_in
)
{
mp_obj_stringio_t
*
self
=
self_in
;
return
mp_obj_new_str
((
byte
*
)
self
->
vstr
->
buf
,
self
->
vstr
->
len
,
false
);
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_1
(
stringio_getvalue_obj
,
stringio_getvalue
);
STATIC
mp_obj_t
stringio_close
(
mp_obj_t
self_in
)
{
mp_obj_stringio_t
*
self
=
self_in
;
vstr_free
(
self
->
vstr
);
self
->
vstr
=
NULL
;
return
mp_const_none
;
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_1
(
stringio_close_obj
,
stringio_close
);
mp_obj_t
stringio___exit__
(
uint
n_args
,
const
mp_obj_t
*
args
)
{
return
stringio_close
(
args
[
0
]);
}
STATIC
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN
(
stringio___exit___obj
,
4
,
4
,
stringio___exit__
);
STATIC
mp_obj_stringio_t
*
stringio_new
()
{
mp_obj_stringio_t
*
o
=
m_new_obj
(
mp_obj_stringio_t
);
o
->
base
.
type
=
&
mp_type_stringio
;
o
->
vstr
=
vstr_new
();
o
->
pos
=
0
;
return
o
;
}
STATIC
mp_obj_t
stringio_make_new
(
mp_obj_t
type_in
,
uint
n_args
,
uint
n_kw
,
const
mp_obj_t
*
args
)
{
mp_obj_stringio_t
*
o
=
stringio_new
();
if
(
n_args
>
0
)
{
mp_buffer_info_t
bufinfo
;
mp_get_buffer_raise
(
args
[
0
],
&
bufinfo
,
MP_BUFFER_READ
);
stringio_write
(
o
,
bufinfo
.
buf
,
bufinfo
.
len
,
NULL
);
// Cur ptr is always at the beginning of buffer at the construction
o
->
pos
=
0
;
}
return
o
;
}
STATIC
const
mp_map_elem_t
stringio_locals_dict_table
[]
=
{
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_read
),
(
mp_obj_t
)
&
mp_stream_read_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readall
),
(
mp_obj_t
)
&
mp_stream_readall_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_readline
),
(
mp_obj_t
)
&
mp_stream_unbuffered_readline_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_write
),
(
mp_obj_t
)
&
mp_stream_write_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_close
),
(
mp_obj_t
)
&
stringio_close_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR_getvalue
),
(
mp_obj_t
)
&
stringio_getvalue_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR___enter__
),
(
mp_obj_t
)
&
mp_identity_obj
},
{
MP_OBJ_NEW_QSTR
(
MP_QSTR___exit__
),
(
mp_obj_t
)
&
stringio___exit___obj
},
};
STATIC
MP_DEFINE_CONST_DICT
(
stringio_locals_dict
,
stringio_locals_dict_table
);
STATIC
const
mp_stream_p_t
stringio_stream_p
=
{
.
read
=
stringio_read
,
.
write
=
stringio_write
,
};
const
mp_obj_type_t
mp_type_stringio
=
{
{
&
mp_type_type
},
.
name
=
MP_QSTR_StringIO
,
.
print
=
stringio_print
,
.
make_new
=
stringio_make_new
,
.
getiter
=
mp_identity
,
.
iternext
=
mp_stream_unbuffered_iter
,
.
stream_p
=
&
stringio_stream_p
,
.
locals_dict
=
(
mp_obj_t
)
&
stringio_locals_dict
,
};
py/py.mk
View file @
cb9dc086
...
...
@@ -74,6 +74,7 @@ PY_O_BASENAME = \
objset.o
\
objslice.o
\
objstr.o
\
objstringio.o
\
objtuple.o
\
objtype.o
\
objzip.o
\
...
...
py/qstrdefs.h
View file @
cb9dc086
...
...
@@ -118,7 +118,6 @@ Q(hash)
Q
(
hex
)
Q
(
%
#
x
)
Q
(
id
)
Q
(
io
)
Q
(
int
)
Q
(
isinstance
)
Q
(
issubclass
)
...
...
@@ -308,6 +307,13 @@ Q(pack)
Q
(
unpack
)
#endif
#if MICROPY_ENABLE_MOD_IO
Q
(
io
)
Q
(
StringIO
)
Q
(
BytesIO
)
Q
(
getvalue
)
#endif
#if MICROPY_ENABLE_PROPERTY
Q
(
property
)
Q
(
getter
)
...
...
tests/io/stringio1.py
0 → 100644
View file @
cb9dc086
import
io
a
=
io
.
StringIO
()
print
(
a
.
getvalue
())
print
(
a
.
read
())
a
=
io
.
StringIO
(
"foobar"
)
print
(
a
.
getvalue
())
print
(
a
.
read
())
print
(
a
.
read
())
a
=
io
.
StringIO
()
a
.
write
(
"foo"
)
print
(
a
.
getvalue
())
a
=
io
.
StringIO
(
"foo"
)
a
.
write
(
"12"
)
print
(
a
.
getvalue
())
a
=
io
.
StringIO
(
"foo"
)
a
.
write
(
"123"
)
print
(
a
.
getvalue
())
a
=
io
.
StringIO
(
"foo"
)
a
.
write
(
"1234"
)
print
(
a
.
getvalue
())
a
=
io
.
StringIO
()
a
.
write
(
"foo"
)
print
(
a
.
read
())
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment