return outbuf;
}
-int ustrlen(wchar_t *s) {
+wchar_t *ustrfroma(char *s, wchar_t *outbuf, int size) {
+ wchar_t *p;
+ if (!s) {
+ *outbuf = L'\0';
+ return outbuf;
+ }
+ for (p = outbuf; *s && p < outbuf+size; p++,s++)
+ *p = *s;
+ if (p < outbuf+size)
+ *p = '\0';
+ else
+ outbuf[size-1] = '\0';
+ return outbuf;
+}
+
+char *utoa_dup(wchar_t *s) {
+ int len;
+ char *buf = NULL;
+
+ len = ustrlen(s) + 1;
+ do {
+ buf = resize(buf, len);
+ ustrtoa(s, buf, len);
+ len = (3 * len) / 2 + 1; /* this guarantees a strict increase */
+ } while ((int)strlen(buf) >= len-1);
+
+ buf = resize(buf, strlen(buf)+1);
+ return buf;
+}
+
+wchar_t *ufroma_dup(char *s) {
+ int len;
+ wchar_t *buf = NULL;
+
+ len = strlen(s) + 1;
+ do {
+ buf = resize(buf, len);
+ ustrfroma(s, buf, len);
+ len = (3 * len) / 2 + 1; /* this guarantees a strict increase */
+ } while (ustrlen(buf) >= len-1);
+
+ buf = resize(buf, ustrlen(buf)+1);
+ return buf;
+}
+
+int ustrlen(wchar_t const *s) {
int len = 0;
while (*s++) len++;
return len;
return s + 1 + ustrlen(s);
}
-wchar_t *ustrcpy(wchar_t *dest, wchar_t *source) {
+wchar_t *ustrcpy(wchar_t *dest, wchar_t const *source) {
wchar_t *ret = dest;
do {
*dest++ = *source;