Arrange a mechanism whereby each backend can be passed a filename
[sgt/halibut] / ustring.c
index a64d155..c4af519 100644 (file)
--- a/ustring.c
+++ b/ustring.c
@@ -33,6 +33,21 @@ char *ustrtoa(wchar_t *s, char *outbuf, int size) {
     return outbuf;
 }
 
+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;
@@ -48,6 +63,21 @@ char *utoa_dup(wchar_t *s) {
     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 *s) {
     int len = 0;
     while (*s++) len++;