]> granicus.if.org Git - php/commitdiff
Added fabled hex2bin() function
authorScott MacVicar <scottmac@php.net>
Fri, 3 Jun 2011 00:12:22 +0000 (00:12 +0000)
committerScott MacVicar <scottmac@php.net>
Fri, 3 Jun 2011 00:12:22 +0000 (00:12 +0000)
ext/standard/basic_functions.c
ext/standard/php_string.h
ext/standard/string.c

index 9d2e656a6a92e4eb80bb87f0873a2d30f7d1a1a4..b56f85caee5a2f7f3b2a060995c7a45d9be07df0 100644 (file)
@@ -2142,6 +2142,10 @@ ZEND_BEGIN_ARG_INFO(arginfo_bin2hex, 0)
        ZEND_ARG_INFO(0, data)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO(arginfo_hex2bin, 0)
+       ZEND_ARG_INFO(0, data)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(arginfo_strspn, 0, 0, 2)
        ZEND_ARG_INFO(0, str)
        ZEND_ARG_INFO(0, mask)
@@ -2682,6 +2686,7 @@ ZEND_END_ARG_INFO()
 const zend_function_entry basic_functions[] = { /* {{{ */
        PHP_FE(constant,                                                                                                                arginfo_constant)
        PHP_FE(bin2hex,                                                                                                                 arginfo_bin2hex)
+       PHP_FE(hex2bin,                                                                                                                 arginfo_hex2bin)
        PHP_FE(sleep,                                                                                                                   arginfo_sleep)
        PHP_FE(usleep,                                                                                                                  arginfo_usleep)
 #if HAVE_NANOSLEEP
index 71271cc6d92caa184c4a8a78ab30577e3b6ddd12..23c703336abaa5a8029de6c573e6387bb8187084 100644 (file)
@@ -78,6 +78,7 @@ PHP_FUNCTION(chunk_split);
 PHP_FUNCTION(parse_str);
 PHP_FUNCTION(str_getcsv);
 PHP_FUNCTION(bin2hex);
+PHP_FUNCTION(hex2bin);
 PHP_FUNCTION(similar_text);
 PHP_FUNCTION(strip_tags);
 PHP_FUNCTION(str_repeat);
index 7cd986c51e7a8d0cf5fc445141cf3b743d5dc7b9..44c5cd3b0062c6115907f527f6a9c65214fbfe30 100644 (file)
@@ -146,6 +146,46 @@ static char *php_bin2hex(const unsigned char *old, const size_t oldlen, size_t *
 }
 /* }}} */
 
+/* {{{ php_hex2bin
+ */
+static char *php_hex2bin(const unsigned char *old, const size_t oldlen, size_t *newlen)
+{
+       size_t target_length = oldlen >> 1;
+       register unsigned char *str = (unsigned char *)safe_emalloc(target_length, sizeof(char), 1);
+       size_t i, j;
+       for (i = j = 0; i < target_length; i++) {
+               char c = old[j++];
+               if (c >= '0' && c <= '9') {
+                       str[i] = (c - '0') << 4;
+               } else if (c >= 'a' && c <= 'f') {
+                       str[i] = (c - 'a' + 10) << 4;
+               } else if (c >= 'A' && c <= 'F') {
+                       str[i] = (c - 'A' + 10) << 4;
+               } else {
+                       efree(str);
+                       return NULL;
+               }
+               c = old[j++];
+               if (c >= '0' && c <= '9') {
+                       str[i] |= c - '0';
+               } else if (c >= 'a' && c <= 'f') {
+                       str[i] |= c - 'a' + 10;
+               } else if (c >= 'A' && c <= 'F') {
+                       str[i] |= c - 'A' + 10;
+               } else {
+                       efree(str);
+                       return NULL;
+               }
+       }
+       str[target_length] = '\0';
+       
+       if (newlen) 
+               *newlen = target_length;
+
+       return (char *)str;
+}
+/* }}} */
+
 #ifdef HAVE_LOCALECONV
 /* {{{ localeconv_r
  * glibc's localeconv is not reentrant, so lets make it so ... sorta */
@@ -214,6 +254,28 @@ PHP_FUNCTION(bin2hex)
 }
 /* }}} */
 
+/* {{{ proto string hex2bin(string data)
+   Converts the hex representation of data to binary */
+PHP_FUNCTION(hex2bin)
+{
+       char *result, *data;
+       size_t newlen;
+       int datalen;
+
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &datalen) == FAILURE) {
+               return;
+       }
+
+       result = php_hex2bin((unsigned char *)data, datalen, &newlen);
+       
+       if (!result) {
+               RETURN_FALSE;
+       }
+
+       RETURN_STRINGL(result, newlen, 0);
+}
+/* }}} */
+
 static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, int behavior) /* {{{ */
 {
        char *s11, *s22;