]> granicus.if.org Git - php/commitdiff
add fast bin2hex string function
authorSascha Schumann <sas@php.net>
Sun, 16 May 1999 11:12:23 +0000 (11:12 +0000)
committerSascha Schumann <sas@php.net>
Sun, 16 May 1999 11:12:23 +0000 (11:12 +0000)
ext/standard/php3_string.h
ext/standard/string.c

index 04c2f79f95c4a1ffb9666236339a3abc226c1298..af90dbec5fb2584689199e8acd56a92f925718b4 100644 (file)
@@ -79,6 +79,7 @@ extern void php3_setlocale(INTERNAL_FUNCTION_PARAMETERS);
 extern void php3_stristr(INTERNAL_FUNCTION_PARAMETERS);
 extern void php3_chunk_split(INTERNAL_FUNCTION_PARAMETERS);
 extern void php3_parsestr(INTERNAL_FUNCTION_PARAMETERS);
+PHP_FUNCTION(bin2hex);
 
 extern PHPAPI char *_php3_strtoupper(char *s);
 extern PHPAPI char *_php3_strtolower(char *s);
index 133f817f175c1376ffce4823c7fbb538150d6141..2964d463aba0cf24f2210e8a46759a726c19ffce 100644 (file)
 #include "zend_execute.h"
 #include "php_globals.h"
 
+static char hexconvtab[] = "0123456789abcdef";
+
+static char *php_bin2hex(const char *old, const size_t oldlen, size_t *newlen)
+{
+       char *new = NULL;
+       int i, j;
+
+       new = (char *) emalloc(oldlen * 2 * sizeof(char));
+       if(!new) {
+               return new;
+       }
+       
+       for(i = j = 0; i < oldlen; i++) {
+               new[j++] = hexconvtab[old[i] >> 4];
+               new[j++] = hexconvtab[old[i] & 15];
+       }
+
+       if(newlen) *newlen = oldlen * 2 * sizeof(char);
+
+       return new;
+}
+
+/* proto bin2hex(string data)
+   converts the binary representation of data to hex */
+PHP_FUNCTION(bin2hex)
+{
+       pval *data;
+       char *new;
+       size_t newlen;
+
+       if(ARG_COUNT(ht) != 1 || getParameters(ht, 1, &data) == FAILURE) {
+               WRONG_PARAM_COUNT;
+       }
+
+       convert_to_string(data);
+
+       new = php_bin2hex(data->value.str.val, data->value.str.len, &newlen);
+       
+       if(!new) {
+               RETURN_FALSE;
+       }
+
+       RETURN_STRINGL(new, newlen, 0);
+}
 
 /* {{{ proto int strlen(string str)
    Get string length */