-#define stk_conv(s, cs_in, cs_out) \
- ({ struct stk_conv_context _c; stk_conv_init(&_c, (s), (cs_in), (cs_out)); \
- while (stk_conv_step(&_c, alloca(_c.request))); _c.c.dest_start; })
-
-#define stk_conv_to_utf8(s, cs_in) stk_conv(s, cs_in, CONV_CHARSET_UTF8)
-#define stk_conv_from_utf8(s, cs_out) stk_conv(s, CONV_CHARSET_UTF8, cs_out)
-
-/* Internal structure and routines. */
-
-struct stk_conv_context {
- struct conv_context c;
- uns count;
- uns sum;
- uns request;
- byte *buf[16];
- uns size[16];
-};
-
-void stk_conv_init(struct stk_conv_context *c, byte *s, uns cs_in, uns cs_out);
-int stk_conv_step(struct stk_conv_context *c, byte *buf);
+#define stk_strconv(s, cs_in, cs_out) \
+ ({ struct conv_context _c; uns _l=stk_strconv_init(&_c, (s), (cs_in), (cs_out)); \
+ while (_l) _l=stk_strconv_step(&_c, alloca(_l), _l); _c.dest_start; })
+
+#define stk_strconv_to_utf8(s, cs_in) stk_strconv(s, cs_in, CONV_CHARSET_UTF8)
+#define stk_strconv_from_utf8(s, cs_out) stk_strconv(s, CONV_CHARSET_UTF8, cs_out)
+
+/* Internals */
+
+uns stk_strconv_init(struct conv_context *c, const byte *s, uns cs_in, uns cs_out);
+uns stk_strconv_step(struct conv_context *c, byte *buf, uns len);