silc_pem_* routines renamed to silc_base64_*.
[silc.git] / lib / silcutil / silcstrutil.c
index 8bec2fc7d54f99d0394f2a696471315bb7b3d912..d4df969324d2ff855a74b72ee93761c8836e85c1 100644 (file)
@@ -4,7 +4,7 @@
 
   Author: Pekka Riikonen <priikone@silcnet.org>
 
-  Copyright (C) 2002 - 2006 Pekka Riikonen
+  Copyright (C) 2002 - 2007 Pekka Riikonen
 
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
 static unsigned char pem_enc[64] =
 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
-/* Encodes data into PEM encoding. Returns NULL terminated PEM encoded
+/* Encodes data into Base 64 encoding. Returns NULL terminated base 64 encoded
    data string. */
 
-char *silc_pem_encode(unsigned char *data, SilcUInt32 len)
+char *silc_base64_encode(unsigned char *data, SilcUInt32 len)
 {
   int i, j;
   SilcUInt32 bits, c, char_count;
@@ -75,13 +75,13 @@ char *silc_pem_encode(unsigned char *data, SilcUInt32 len)
 
 /* Same as above but puts newline ('\n') every 72 characters. */
 
-char *silc_pem_encode_file(unsigned char *data, SilcUInt32 data_len)
+char *silc_base64_encode_file(unsigned char *data, SilcUInt32 data_len)
 {
   int i, j;
   SilcUInt32 len, cols;
   char *pem, *pem2;
 
-  pem = silc_pem_encode(data, data_len);
+  pem = silc_base64_encode(data, data_len);
   len = strlen(pem);
 
   pem2 = silc_calloc(len + (len / 72) + 1, sizeof(*pem2));
@@ -101,10 +101,11 @@ char *silc_pem_encode_file(unsigned char *data, SilcUInt32 data_len)
   return pem2;
 }
 
-/* Decodes PEM into data. Returns the decoded data. */
+/* Decodes Base 64 into data. Returns the decoded data. */
 
-unsigned char *silc_pem_decode(unsigned char *pem, SilcUInt32 pem_len,
-                              SilcUInt32 *ret_len)
+unsigned char *silc_base64_decode(unsigned char *base64,
+                                 SilcUInt32 base64_len,
+                                 SilcUInt32 *ret_len)
 {
   int i, j;
   SilcUInt32 len, c, char_count, bits;
@@ -120,15 +121,15 @@ unsigned char *silc_pem_decode(unsigned char *pem, SilcUInt32 pem_len,
   bits = 0;
   j = 0;
 
-  if (!pem_len)
-    len = strlen(pem);
+  if (!base64_len)
+    len = strlen(base64);
   else
-    len = pem_len;
+    len = base64_len;
 
   data = silc_calloc(((len * 6) / 8), sizeof(*data));
 
   for (i = 0; i < len; i++) {
-    c = pem[i];
+    c = base64[i];
 
     if (c == '=')
       break;
@@ -264,3 +265,52 @@ int silc_string_compare(char *string1, char *string2)
   silc_free(tmpstr2);
   return FALSE;
 }
+
+/* Splits a string containing separator `ch' and returns an array of the
+   splitted strings. */
+
+char **silc_string_split(const char *string, char ch, int *ret_count)
+{
+  char **splitted = NULL, sep[1], *item, *cp;
+  int i = 0, len;
+
+  if (!string)
+    return NULL;
+  if (!ret_count)
+    return NULL;
+
+  splitted = silc_calloc(1, sizeof(*splitted));
+  if (!splitted)
+    return NULL;
+
+  if (!strchr(string, ch)) {
+    splitted[0] = silc_memdup(string, strlen(string));
+    *ret_count = 1;
+    return splitted;
+  }
+
+  sep[0] = ch;
+  cp = (char *)string;
+  while(cp) {
+    len = strcspn(cp, sep);
+    item = silc_memdup(cp, len);
+    if (!item) {
+      silc_free(splitted);
+      return NULL;
+    }
+
+    cp += len;
+    if (strlen(cp) == 0)
+      cp = NULL;
+    else
+      cp++;
+
+    splitted = silc_realloc(splitted, (i + 1) * sizeof(*splitted));
+    if (!splitted)
+      return NULL;
+    splitted[i++] = item;
+  }
+  *ret_count = i;
+
+  return splitted;
+}