py: remove depedence on strcat and stpcpy.
This fixes Issue #29, and means the core is no longer dependent on
string functions, except strlen.
diff --git a/py/compile.c b/py/compile.c
index fe22a90..b00ab7e 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -1182,13 +1182,18 @@
len += strlen(qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i])));
}
char *str = m_new(char, len + 1);
+ char *str_dest = str;
str[0] = 0;
for (int i = 0; i < n; i++) {
if (i > 0) {
- strcat(str, ".");
+ *str_dest++ = '.';
}
- strcat(str, qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i])));
+ const char *str_src = qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i]));
+ size_t str_src_len = strlen(str_src);
+ memcpy(str_dest, str_src, str_src_len);
+ str_dest += str_src_len;
}
+ *str_dest = '\0';
*q2 = qstr_from_str_take(str, len + 1);
EMIT(import_name, *q2);
if (is_as) {
@@ -2124,13 +2129,16 @@
// allocate memory for concatenated string/bytes
char *cat_str = m_new(char, n_bytes + 1);
- cat_str[0] = '\0';
// concatenate string/bytes
+ char *s_dest = cat_str;
for (int i = 0; i < n; i++) {
- const char *str = qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i]));
- strcat(cat_str, str);
+ const char *s = qstr_str(MP_PARSE_NODE_LEAF_ARG(pns->nodes[i]));
+ size_t s_len = strlen(s);
+ memcpy(s_dest, s, s_len);
+ s_dest += s_len;
}
+ *s_dest = '\0';
EMIT(load_const_str, qstr_from_str_take(cat_str, n_bytes + 1), string_kind == MP_PARSE_NODE_BYTES);
}