aboutsummaryrefslogtreecommitdiff
path: root/py/modio.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-05-03 01:47:08 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2017-05-03 01:47:08 +0300
commitd7da2dba07778fa3c0c7873b7c253bde48066e9c (patch)
treee03df2d1f0cda9842914a7c752b9b2893ce031c4 /py/modio.c
parent4c2fa83f2afa1dc9522755261c8a6969857a2031 (diff)
py/modio: Implement uio.resource_stream(package, resource_path).
The with semantics of this function is close to pkg_resources.resource_stream() function from setuptools, which is the canonical way to access non-source files belonging to a package (resources), regardless of what medium the package uses (e.g. individual source files vs zip archive). In the case of MicroPython, this function allows to access resources which are frozen into the executable, besides accessing resources in the file system. This is initial stage of the implementation, which actually doesn't implement "package" part of the semantics, just accesses frozen resources from "root", or filesystem resource - from current dir.
Diffstat (limited to 'py/modio.c')
-rw-r--r--py/modio.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/py/modio.c b/py/modio.c
index d5da0b1db..6bf5129e6 100644
--- a/py/modio.c
+++ b/py/modio.c
@@ -30,6 +30,8 @@
#include "py/runtime.h"
#include "py/builtin.h"
#include "py/stream.h"
+#include "py/objstringio.h"
+#include "py/frozenmod.h"
#if MICROPY_PY_IO
@@ -129,11 +131,38 @@ STATIC const mp_obj_type_t bufwriter_type = {
};
#endif // MICROPY_PY_IO_BUFFEREDWRITER
+#if MICROPY_MODULE_FROZEN_STR
+STATIC mp_obj_t resource_stream(mp_obj_t package_in, mp_obj_t path_in) {
+ if (package_in != mp_const_none) {
+ mp_not_implemented("");
+ }
+
+ size_t len;
+ const char *path = mp_obj_str_get_data(path_in, &len);
+ const char *data = mp_find_frozen_str(path, &len);
+ if (data != NULL) {
+ mp_obj_stringio_t *o = m_new_obj(mp_obj_stringio_t);
+ o->base.type = &mp_type_bytesio;
+ o->vstr = m_new_obj(vstr_t);
+ vstr_init_fixed_buf(o->vstr, len + 1, (char*)data);
+ o->vstr->len = len;
+ o->pos = 0;
+ return MP_OBJ_FROM_PTR(o);
+ }
+
+ return mp_builtin_open(1, &path_in, (mp_map_t*)&mp_const_empty_map);
+}
+MP_DEFINE_CONST_FUN_OBJ_2(resource_stream_obj, resource_stream);
+#endif
+
STATIC const mp_rom_map_elem_t mp_module_io_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_uio) },
// Note: mp_builtin_open_obj should be defined by port, it's not
// part of the core.
{ MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&mp_builtin_open_obj) },
+ #if MICROPY_PY_IO_RESOURCE_STREAM
+ { MP_ROM_QSTR(MP_QSTR_resource_stream), MP_ROM_PTR(&resource_stream_obj) },
+ #endif
#if MICROPY_PY_IO_FILEIO
{ MP_ROM_QSTR(MP_QSTR_FileIO), MP_ROM_PTR(&mp_type_fileio) },
#if MICROPY_CPYTHON_COMPAT