Fix bugs in ics{wcs,mbs}to{mbs,wcs}.
[doldaconnect.git] / daemon / utils.c
index c006b4f..d084db6 100644 (file)
@@ -190,7 +190,7 @@ wchar_t *icsmbstowcs(char *mbs, char *charset, wchar_t *def)
        free(buf);
     if((buf = icmbstowcs(mbs, charset)) == NULL)
     {
-       if(*def == '~')
+       if((def != NULL) && (*def == L'~'))
        {
            flog(LOG_WARNING, "icsmbstowcs: could not convert wcs string into charset %s: %s", charset, strerror(errno));
            def++;
@@ -264,7 +264,7 @@ char *icswcstombs(wchar_t *wcs, char *charset, char *def)
        free(buf);
     if((buf = icwcstombs(wcs, charset)) == NULL)
     {
-       if(*def == '~')
+       if((def != NULL) && (*def == '~'))
        {
            flog(LOG_WARNING, "icswcstombs: could not convert mbs string from charset %s: %s", charset, strerror(errno));
            def++;
@@ -533,6 +533,8 @@ char *base64decode(char *data, size_t *datalen)
        c = (int)(unsigned char)*data;
        if(c == '=')
            break;
+       if(c == '\n')
+           continue;
        if(base64rev[c] == -1)
        {
            if(buf != NULL)
@@ -630,6 +632,8 @@ char *base32decode(char *data, size_t *datalen)
        c = (int)(unsigned char)*data;
        if(c == '=')
            break;
+       if(c == '\n')
+           continue;
        if(base32rev[c] == -1)
        {
            if(buf != NULL)
@@ -741,3 +745,50 @@ char *findfile(char *gname, char *uname, char *homedir)
     }
     return(NULL);
 }
+
+struct wcspair *newwcspair(wchar_t *key, wchar_t *val, struct wcspair **list)
+{
+    struct wcspair *pair;
+    
+    pair = smalloc(sizeof(*pair));
+    memset(pair, 0, sizeof(*pair));
+    if(key != NULL)
+       pair->key = swcsdup(key);
+    if(val != NULL)
+       pair->val = swcsdup(val);
+    if(list == NULL)
+    {
+       pair->next = NULL;
+    } else {
+       pair->next = *list;
+       *list = pair;
+    }
+    return(pair);
+}
+
+void freewcspair(struct wcspair *pair, struct wcspair **list)
+{
+    struct wcspair *cur;
+    
+    for(cur = *list; cur != NULL; list = &(cur->next), cur = cur->next)
+    {
+       if(cur == pair)
+       {
+           *list = cur->next;
+           break;
+       }
+    }
+    free(pair->key);
+    free(pair->val);
+    free(pair);
+}
+
+wchar_t *wpfind(struct wcspair *list, wchar_t *key)
+{
+    for(; list != NULL; list = list->next)
+    {
+       if(!wcscmp(list->key, key))
+           return(list->val);
+    }
+    return(NULL);
+}