PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LTP GCOV extension - code coverage report
Current view: directory - standard - uuencode.c
Test: PHP Code Coverage
Date: 2009-11-23 Instrumented lines: 95
Code covered: 89.5 % Executed lines: 85
Legend: not executed executed

       1                 : /*
       2                 :    +----------------------------------------------------------------------+
       3                 :    | PHP Version 6                                                        |
       4                 :    +----------------------------------------------------------------------+
       5                 :    | Copyright (c) 1997-2009 The PHP Group                                |
       6                 :    +----------------------------------------------------------------------+
       7                 :    | This source file is subject to version 3.01 of the PHP license,      |
       8                 :    | that is bundled with this package in the file LICENSE, and is        |
       9                 :    | available through the world-wide-web at the following url:           |
      10                 :    | http://www.php.net/license/3_01.txt                                  |
      11                 :    | If you did not receive a copy of the PHP license and are unable to   |
      12                 :    | obtain it through the world-wide-web, please send a note to          |
      13                 :    | license@php.net so we can mail you a copy immediately.               |
      14                 :    +----------------------------------------------------------------------+
      15                 :    | Author: Ilia Alshanetsky <ilia@php.net>                              |
      16                 :    +----------------------------------------------------------------------+
      17                 :  */
      18                 : 
      19                 : /* $Id: uuencode.c 280459 2009-05-13 16:29:03Z kalle $ */
      20                 : 
      21                 : /*
      22                 :  * Portions of this code are based on Berkeley's uuencode/uudecode
      23                 :  * implementation.
      24                 :  *
      25                 :  * Copyright (c) 1983, 1993
      26                 :  *  The Regents of the University of California.  All rights reserved.
      27                 :  *
      28                 :  * Redistribution and use in source and binary forms, with or without
      29                 :  * modification, are permitted provided that the following conditions
      30                 :  * are met:
      31                 :  * 1. Redistributions of source code must retain the above copyright
      32                 :  *    notice, this list of conditions and the following disclaimer.
      33                 :  * 2. Redistributions in binary form must reproduce the above copyright
      34                 :  *    notice, this list of conditions and the following disclaimer in the
      35                 :  *    documentation and/or other materials provided with the distribution.
      36                 :  * 3. All advertising materials mentioning features or use of this software
      37                 :  *    must display the following acknowledgement:
      38                 :  *  This product includes software developed by the University of
      39                 :  *  California, Berkeley and its contributors.
      40                 :  * 4. Neither the name of the University nor the names of its contributors
      41                 :  *    may be used to endorse or promote products derived from this software
      42                 :  *    without specific prior written permission.
      43                 :  *
      44                 :  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
      45                 :  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
      46                 :  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
      47                 :  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
      48                 :  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
      49                 :  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
      50                 :  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      51                 :  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
      52                 :  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
      53                 :  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
      54                 :  * SUCH DAMAGE.
      55                 :  */
      56                 : 
      57                 : #include <math.h>
      58                 : 
      59                 : #include "php.h"
      60                 : #include "php_uuencode.h"
      61                 : 
      62                 : #define PHP_UU_ENC(c) ((c) ? ((c) & 077) + ' ' : '`')
      63                 : #define PHP_UU_ENC_C2(c) PHP_UU_ENC(((*(c) << 4) & 060) | ((*((c) + 1) >> 4) & 017))
      64                 : #define PHP_UU_ENC_C3(c) PHP_UU_ENC(((*(c + 1) << 2) & 074) | ((*((c) + 2) >> 6) & 03))
      65                 : 
      66                 : #define PHP_UU_DEC(c) (((c) - ' ') & 077)
      67                 : 
      68                 : PHPAPI int php_uuencode(char *src, int src_len, char **dest) /* {{{ */
      69              34 : {
      70              34 :         int len = 45;
      71                 :         char *p, *s, *e, *ee;
      72                 : 
      73                 :         /* encoded length is ~ 38% greater then the original */
      74              34 :         p = *dest = safe_emalloc((size_t) ceil(src_len * 1.38), 1, 46);
      75              34 :         s = src;
      76              34 :         e = src + src_len;
      77                 : 
      78              94 :         while ((s + 3) < e) {
      79              26 :                 ee = s + len;
      80              26 :                 if (ee > e) {
      81              20 :                         ee = e;
      82              20 :                         len = ee - s;
      83              20 :                         if (len % 3) {
      84              10 :                                 ee = s + (int) (floor(len / 3) * 3);
      85                 :                         }
      86                 :                 }
      87              26 :                 *p++ = PHP_UU_ENC(len);
      88                 : 
      89             215 :                 while (s < ee) {
      90             163 :                         *p++ = PHP_UU_ENC(*s >> 2);
      91             163 :                         *p++ = PHP_UU_ENC_C2(s);
      92             163 :                         *p++ = PHP_UU_ENC_C3(s);
      93             163 :                         *p++ = PHP_UU_ENC(*(s + 2) & 077);
      94                 : 
      95             163 :                         s += 3;
      96                 :                 }
      97                 : 
      98              26 :                 if (len == 45) {
      99               6 :                         *p++ = '\n';
     100                 :                 }
     101                 :         }
     102                 : 
     103              34 :         if (s < e) {
     104              24 :                 if (len == 45) {
     105              14 :                         *p++ = PHP_UU_ENC(e - s);
     106              14 :                         len = 0;
     107                 :                 }
     108                 : 
     109              24 :                 *p++ = PHP_UU_ENC(*s >> 2);
     110              24 :                 *p++ = PHP_UU_ENC_C2(s);
     111              24 :                 *p++ = ((e - s) > 1) ? PHP_UU_ENC_C3(s) : PHP_UU_ENC('\0');
     112              24 :                 *p++ = ((e - s) > 2) ? PHP_UU_ENC(*(s + 2) & 077) : PHP_UU_ENC('\0');
     113                 :         }
     114                 : 
     115              34 :         if (len < 45) {
     116              34 :                 *p++ = '\n';
     117                 :         }
     118                 : 
     119              34 :         *p++ = PHP_UU_ENC('\0');
     120              34 :         *p++ = '\n';
     121              34 :         *p = '\0';
     122                 : 
     123              34 :         return (p - *dest);
     124                 : }
     125                 : /* }}} */
     126                 : 
     127                 : PHPAPI int php_uudecode(char *src, int src_len, char **dest) /* {{{ */
     128              26 : {
     129              26 :         int len, total_len=0;
     130                 :         char *s, *e, *p, *ee;
     131                 : 
     132              26 :         p = *dest = safe_emalloc((size_t) ceil(src_len * 0.75), 1, 1);
     133              26 :         s = src;
     134              26 :         e = src + src_len;
     135                 : 
     136              55 :         while (s < e) {
     137              29 :                 if ((len = PHP_UU_DEC(*s++)) <= 0) {
     138               0 :                         break;
     139                 :                 }
     140                 :                 /* sanity check */
     141              29 :                 if (len > src_len) {
     142              12 :                         goto err;
     143                 :                 }
     144                 : 
     145              17 :                 total_len += len;
     146                 : 
     147              17 :                 ee = s + (len == 45 ? 60 : (int) floor(len * 1.33));
     148                 :                 /* sanity check */
     149              17 :                 if (ee > e) {
     150               1 :                         goto err;
     151                 :                 }
     152                 : 
     153             124 :                 while (s < ee) {
     154              92 :                         *p++ = PHP_UU_DEC(*s) << 2 | PHP_UU_DEC(*(s + 1)) >> 4;
     155              92 :                         *p++ = PHP_UU_DEC(*(s + 1)) << 4 | PHP_UU_DEC(*(s + 2)) >> 2;
     156              92 :                         *p++ = PHP_UU_DEC(*(s + 2)) << 6 | PHP_UU_DEC(*(s + 3));
     157              92 :                         s += 4;
     158                 :                 }
     159                 : 
     160              16 :                 if (len < 45) {
     161              13 :                         break;
     162                 :                 }
     163                 : 
     164                 :                 /* skip \n */
     165               3 :                 s++;
     166                 :         }
     167                 : 
     168              13 :         if ((len = total_len > (p - *dest))) {
     169               0 :                 *p++ = PHP_UU_DEC(*s) << 2 | PHP_UU_DEC(*(s + 1)) >> 4;
     170               0 :                 if (len > 1) {
     171               0 :                         *p++ = PHP_UU_DEC(*(s + 1)) << 4 | PHP_UU_DEC(*(s + 2)) >> 2;
     172               0 :                         if (len > 2) {
     173               0 :                                 *p++ = PHP_UU_DEC(*(s + 2)) << 6 | PHP_UU_DEC(*(s + 3));
     174                 :                         }
     175                 :                 }
     176                 :         }
     177                 : 
     178              13 :         *(*dest + total_len) = '\0';
     179                 : 
     180              13 :         return total_len;
     181                 : 
     182              13 : err:
     183              13 :         efree(*dest);
     184              13 :         return -1;
     185                 : }
     186                 : /* }}} */
     187                 : 
     188                 : /* {{{ proto string convert_uuencode(string data) U
     189                 :    uuencode a string */
     190                 : PHP_FUNCTION(convert_uuencode)
     191              48 : {
     192                 :         char *src, *dst;
     193                 :         int src_len, dst_len;
     194                 :         zend_uchar src_type;
     195                 : 
     196              48 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &src, &src_len, &src_type) == FAILURE || src_len < 1) {
     197              14 :                 RETURN_FALSE;
     198                 :         }
     199                 : 
     200              34 :         if (src_type == IS_UNICODE) {
     201              14 :                 src = zend_unicode_to_ascii((UChar*)src, src_len TSRMLS_CC);
     202              14 :                 if (!src) {
     203               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Binary or ASCII-Unicode string expected, non-ASCII-Unicode string received");
     204               0 :                         RETURN_FALSE;
     205                 :                 }
     206                 :         }
     207                 : 
     208              34 :         dst_len = php_uuencode(src, src_len, &dst);
     209              34 :         if (src_type == IS_UNICODE) {
     210              14 :                 efree(src);
     211                 :         }
     212                 : 
     213              34 :         RETURN_RT_STRINGL(dst, dst_len, ZSTR_AUTOFREE);
     214                 : }
     215                 : /* }}} */
     216                 : 
     217                 : /* {{{ proto string convert_uudecode(string data) U
     218                 :    decode a uuencoded string */
     219                 : PHP_FUNCTION(convert_uudecode)
     220              40 : {
     221                 :         char *src, *dst;
     222                 :         int src_len, dst_len;
     223                 :         zend_uchar src_type;
     224                 : 
     225              40 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &src, &src_len, &src_type) == FAILURE || src_len < 1) {
     226              14 :                 RETURN_FALSE;
     227                 :         }
     228                 : 
     229              26 :         if (src_type == IS_UNICODE) {
     230              26 :                 src = zend_unicode_to_ascii((UChar*)src, src_len TSRMLS_CC);
     231              26 :                 if (!src) {
     232               0 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Binary or ASCII-Unicode string expected, non-ASCII-Unicode string received");
     233               0 :                         RETURN_FALSE;
     234                 :                 }
     235                 :         }
     236                 : 
     237              26 :         dst_len = php_uudecode(src, src_len, &dst);
     238              26 :         if (src_type == IS_UNICODE) {
     239              26 :                 efree(src);
     240                 :         }
     241                 : 
     242              26 :         if (dst_len < 0) {
     243              13 :                 php_error_docref(NULL TSRMLS_CC, E_WARNING, "The given parameter is not a valid uuencoded string");
     244              13 :                 RETURN_FALSE;
     245                 :         }
     246                 : 
     247              13 :         RETURN_STRINGL(dst, dst_len, 0);
     248                 : }
     249                 : /* }}} */
     250                 : 
     251                 : /*
     252                 :  * Local variables:
     253                 :  * tab-width: 4
     254                 :  * c-basic-offset: 4
     255                 :  * End:
     256                 :  * vim600: noet sw=4 ts=4 fdm=marker
     257                 :  * vim<600: noet sw=4 ts=4
     258                 :  */

Generated by: LTP GCOV extension version 1.5

Generated at Mon, 23 Nov 2009 17:39:41 +0000 (34 hours ago)

Copyright © 2005-2009 The PHP Group
All rights reserved.