X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcstrutil.c;h=3251c2b0a4d47c43255ca71746e17cf899ffedb4;hb=e7b6c157b80152bf9fb9266e6bdd93f9fb0db776;hp=0bf94f2dd69296777774989bc764c7cf85c5a51a;hpb=b7e04896b1db8142640dfd4da147d7638e8d0a32;p=silc.git diff --git a/lib/silcutil/silcstrutil.c b/lib/silcutil/silcstrutil.c index 0bf94f2d..3251c2b0 100644 --- a/lib/silcutil/silcstrutil.c +++ b/lib/silcutil/silcstrutil.c @@ -21,156 +21,6 @@ #include "silc.h" #include "silcstrutil.h" -static unsigned char pem_enc[64] = -"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -/* Encodes data into Base 64 encoding. Returns NULL terminated base 64 encoded - data string. */ - -char *silc_base64_encode(unsigned char *data, SilcUInt32 len) -{ - int i, j; - SilcUInt32 bits, c, char_count; - char *pem; - - char_count = 0; - bits = 0; - j = 0; - - pem = silc_calloc(((len * 8 + 5) / 6) + 5, sizeof(*pem)); - - for (i = 0; i < len; i++) { - c = data[i]; - bits += c; - char_count++; - - if (char_count == 3) { - pem[j++] = pem_enc[bits >> 18]; - pem[j++] = pem_enc[(bits >> 12) & 0x3f]; - pem[j++] = pem_enc[(bits >> 6) & 0x3f]; - pem[j++] = pem_enc[bits & 0x3f]; - bits = 0; - char_count = 0; - } else { - bits <<= 8; - } - } - - if (char_count != 0) { - bits <<= 16 - (8 * char_count); - pem[j++] = pem_enc[bits >> 18]; - pem[j++] = pem_enc[(bits >> 12) & 0x3f]; - - if (char_count == 1) { - pem[j++] = '='; - pem[j] = '='; - } else { - pem[j++] = pem_enc[(bits >> 6) & 0x3f]; - pem[j] = '='; - } - } - - return pem; -} - -/* Same as above but puts newline ('\n') every 72 characters. */ - -char *silc_base64_encode_file(unsigned char *data, SilcUInt32 data_len) -{ - int i, j; - SilcUInt32 len, cols; - char *pem, *pem2; - - pem = silc_base64_encode(data, data_len); - len = strlen(pem); - - pem2 = silc_calloc(len + (len / 72) + 1, sizeof(*pem2)); - - for (i = 0, j = 0, cols = 1; i < len; i++, cols++) { - if (cols == 72) { - pem2[i] = '\n'; - cols = 0; - len++; - continue; - } - - pem2[i] = pem[j++]; - } - - silc_free(pem); - return pem2; -} - -/* Decodes Base 64 into data. Returns the decoded data. */ - -unsigned char *silc_base64_decode(unsigned char *base64, - SilcUInt32 base64_len, - SilcUInt32 *ret_len) -{ - int i, j; - SilcUInt32 len, c, char_count, bits; - unsigned char *data; - static char ialpha[256], decoder[256]; - - for (i = 64 - 1; i >= 0; i--) { - ialpha[pem_enc[i]] = 1; - decoder[pem_enc[i]] = i; - } - - char_count = 0; - bits = 0; - j = 0; - - if (!base64_len) - len = strlen(base64); - else - len = base64_len; - - data = silc_calloc(((len * 6) / 8), sizeof(*data)); - - for (i = 0; i < len; i++) { - c = base64[i]; - - if (c == '=') - break; - - if (c > 127 || !ialpha[c]) - continue; - - bits += decoder[c]; - char_count++; - - if (char_count == 4) { - data[j++] = bits >> 16; - data[j++] = (bits >> 8) & 0xff; - data[j++] = bits & 0xff; - bits = 0; - char_count = 0; - } else { - bits <<= 6; - } - } - - switch(char_count) { - case 1: - silc_free(data); - return NULL; - break; - case 2: - data[j++] = bits >> 10; - break; - case 3: - data[j++] = bits >> 16; - data[j++] = (bits >> 8) & 0xff; - break; - } - - if (ret_len) - *ret_len = j; - - return data; -} - /* Concatenates the `src' into `dest'. If `src_len' is more than the size of the `dest' (minus NULL at the end) the `src' will be truncated to fit. */ @@ -271,13 +121,13 @@ int silc_string_compare(char *string1, char *string2) char **silc_string_split(const char *string, char ch, int *ret_count) { - char **splitted = NULL, sep[1], *item, *cp; + char **splitted = NULL, sep[2], *item, *cp; int i = 0, len; - if (!string) - return NULL; - if (!ret_count) + if (!string || !ret_count) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); return NULL; + } splitted = silc_calloc(1, sizeof(*splitted)); if (!splitted) @@ -290,9 +140,13 @@ char **silc_string_split(const char *string, char ch, int *ret_count) } sep[0] = ch; + sep[1] = '\0'; cp = (char *)string; - while(cp) { + while (cp) { len = strcspn(cp, sep); + if (!len) + break; + item = silc_memdup(cp, len); if (!item) { silc_free(splitted); @@ -305,10 +159,13 @@ char **silc_string_split(const char *string, char ch, int *ret_count) else cp++; - splitted = silc_realloc(splitted, (i + 1) * sizeof(*splitted)); - if (!splitted) - return NULL; splitted[i++] = item; + + if (cp) { + splitted = silc_realloc(splitted, (i + 1) * sizeof(*splitted)); + if (!splitted) + return NULL; + } } *ret_count = i; @@ -324,8 +181,10 @@ char *silc_string_regexify(const char *string) int i, len, count; char *regex; - if (!string) + if (!string) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); return NULL; + } len = strlen(string); count = 4; @@ -338,7 +197,7 @@ char *silc_string_regexify(const char *string) regex = silc_calloc(len + count + 1, sizeof(*regex)); if (!regex) - reeturn NULL; + return NULL; count = 0; regex[count++] = '('; @@ -374,8 +233,10 @@ char *silc_string_regex_combine(const char *string1, const char *string2) char *tmp; int len1, len2; - if (!string1 || !string2) + if (!string1 || !string2) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); return NULL; + } len1 = strlen(string1); len2 = strlen(string2); @@ -388,24 +249,6 @@ char *silc_string_regex_combine(const char *string1, const char *string2) return tmp; } -/* Matches the two strings and returns TRUE if the strings match. */ - -int silc_string_regex_match(const char *regex, const char *string) -{ - regex_t preg; - int ret = FALSE; - - if (regcomp(&preg, regex, REG_NOSUB | REG_EXTENDED) != 0) - return FALSE; - - if (regexec(&preg, string, 0, NULL, 0) == 0) - ret = TRUE; - - regfree(&preg); - - return ret; -} - /* Do regex match to the two strings `string1' and `string2'. If the `string2' matches the `string1' this returns TRUE. */ @@ -414,8 +257,10 @@ int silc_string_match(const char *string1, const char *string2) char *s1; int ret = FALSE; - if (!string1 || !string2) + if (!string1 || !string2) { + silc_set_errno(SILC_ERR_INVALID_ARGUMENT); return ret; + } s1 = silc_string_regexify(string1); ret = silc_string_regex_match(s1, string2);