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

LCOV - code coverage report
Current view: top level - ext/standard - cyr_convert.c (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 36 37 97.3 %
Date: 2014-07-29 Functions: 2 2 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :    +----------------------------------------------------------------------+
       3             :    | PHP Version 5                                                        |
       4             :    +----------------------------------------------------------------------+
       5             :    | Copyright (c) 1997-2014 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: Kirill Maximov <kir@rus.net>                                 |
      16             :    +----------------------------------------------------------------------+
      17             :  */
      18             : 
      19             : /* $Id$ */
      20             : 
      21             : #include <stdlib.h>
      22             : 
      23             : #ifdef HAVE_UNISTD_H
      24             : #include <unistd.h>
      25             : #endif
      26             : #include <string.h>
      27             : #include <errno.h>
      28             : 
      29             : #include "php.h"
      30             : #include "cyr_convert.h"
      31             : 
      32             : #include <stdio.h>
      33             : 
      34             : /*****************************************************************************
      35             : * This is codetables for different Cyrillic charsets (relative to koi8-r). 
      36             : * Each table contains data for 128-255 symbols from ASCII table.
      37             : * First 256 symbols are for conversion from koi8-r to corresponding charset,
      38             : * second 256 symbols are for reverse conversion, from charset to koi8-r.
      39             : *
      40             : * Here we have the following tables:
      41             : * _cyr_win1251   - for windows-1251 charset
      42             : * _cyr_iso88595  - for iso8859-5 charset
      43             : * _cyr_cp866     - for x-cp866 charset
      44             : * _cyr_mac       - for x-mac-cyrillic charset
      45             : *
      46             : *****************************************************************************/
      47             : 
      48             : typedef unsigned char _cyr_charset_table[512];
      49             : 
      50             : /* {{{ static const _cyr_charset_table _cyr_win1251
      51             :  */
      52             : static const _cyr_charset_table _cyr_win1251 = {
      53             : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
      54             : 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
      55             : 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
      56             : 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
      57             : 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
      58             : 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
      59             : 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
      60             : 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
      61             : 46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,
      62             : 46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,46,
      63             : 154,174,190,46,159,189,46,46,179,191,180,157,46,46,156,183,
      64             : 46,46,182,166,173,46,46,158,163,152,164,155,46,46,46,167,
      65             : 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
      66             : 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
      67             : 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
      68             : 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,
      69             : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
      70             : 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
      71             : 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
      72             : 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
      73             : 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
      74             : 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
      75             : 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
      76             : 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
      77             : 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
      78             : 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
      79             : 32,32,32,184,186,32,179,191,32,32,32,32,32,180,162,32,
      80             : 32,32,32,168,170,32,178,175,32,32,32,32,32,165,161,169,
      81             : 254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
      82             : 239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
      83             : 222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
      84             : 207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218,
      85             : },
      86             : _cyr_cp866 = { 
      87             : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
      88             : 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
      89             : 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
      90             : 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
      91             : 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
      92             : 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
      93             : 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
      94             : 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
      95             : 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
      96             : 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
      97             : 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
      98             : 35,35,35,124,124,124,124,43,43,124,124,43,43,43,43,43,
      99             : 43,45,45,124,45,43,124,124,43,43,45,45,124,45,43,45,
     100             : 45,45,45,43,43,43,43,43,43,43,43,35,35,124,124,35,
     101             : 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,
     102             : 179,163,180,164,183,167,190,174,32,149,158,32,152,159,148,154,
     103             : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
     104             : 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
     105             : 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
     106             : 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
     107             : 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
     108             : 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
     109             : 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
     110             : 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
     111             : 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
     112             : 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
     113             : 205,186,213,241,243,201,32,245,187,212,211,200,190,32,247,198,
     114             : 199,204,181,240,242,185,32,244,203,207,208,202,216,32,246,32,
     115             : 238,160,161,230,164,165,228,163,229,168,169,170,171,172,173,174,
     116             : 175,239,224,225,226,227,166,162,236,235,167,232,237,233,231,234,
     117             : 158,128,129,150,132,133,148,131,149,136,137,138,139,140,141,142,
     118             : 143,159,144,145,146,147,134,130,156,155,135,152,157,153,151,154,
     119             : },
     120             : _cyr_iso88595 = {
     121             : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
     122             : 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
     123             : 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
     124             : 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
     125             : 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
     126             : 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
     127             : 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
     128             : 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
     129             : 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
     130             : 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
     131             : 32,179,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
     132             : 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
     133             : 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
     134             : 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
     135             : 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209,
     136             : 32,163,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
     137             : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
     138             : 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
     139             : 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
     140             : 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
     141             : 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
     142             : 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
     143             : 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
     144             : 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
     145             : 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
     146             : 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
     147             : 32,32,32,241,32,32,32,32,32,32,32,32,32,32,32,32,
     148             : 32,32,32,161,32,32,32,32,32,32,32,32,32,32,32,32,
     149             : 238,208,209,230,212,213,228,211,229,216,217,218,219,220,221,222,
     150             : 223,239,224,225,226,227,214,210,236,235,215,232,237,233,231,234,
     151             : 206,176,177,198,180,181,196,179,197,184,185,186,187,188,189,190,
     152             : 191,207,192,193,194,195,182,178,204,203,183,200,205,201,199,202,
     153             : },
     154             : _cyr_mac = {
     155             : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
     156             : 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
     157             : 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
     158             : 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
     159             : 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
     160             : 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
     161             : 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
     162             : 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
     163             : 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
     164             : 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
     165             : 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
     166             : 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
     167             : 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
     168             : 144,145,146,147,148,149,150,151,152,153,154,155,156,179,163,209,
     169             : 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
     170             : 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,255,
     171             : 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
     172             : 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
     173             : 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
     174             : 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
     175             : 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,
     176             : 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,
     177             : 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,
     178             : 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,
     179             : 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,
     180             : 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,
     181             : 160,161,162,222,164,165,166,167,168,169,170,171,172,173,174,175,
     182             : 176,177,178,221,180,181,182,183,184,185,186,187,188,189,190,191,
     183             : 254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
     184             : 239,223,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
     185             : 158,128,129,150,132,133,148,131,149,136,137,138,139,140,141,142,
     186             : 143,159,144,145,146,147,134,130,156,155,135,152,157,153,151,154,
     187             : };
     188             : /* }}} */
     189             : 
     190             : /* {{{ static char * php_convert_cyr_string(unsigned char *str, int length, char from, char to TSRMLS_DC)
     191             : * This is the function that performs real in-place conversion of the string 
     192             : * between charsets. 
     193             : * Parameters:
     194             : *    str - string to be converted
     195             : *    from,to - one-symbol label of source and destination charset
     196             : * The following symbols are used as labels:
     197             : *    k - koi8-r
     198             : *    w - windows-1251
     199             : *    i - iso8859-5
     200             : *    a - x-cp866
     201             : *    d - x-cp866
     202             : *    m - x-mac-cyrillic
     203             : *****************************************************************************/
     204         159 : static char * php_convert_cyr_string(unsigned char *str, int length, char from, char to TSRMLS_DC)
     205             : {
     206             :         const unsigned char *from_table, *to_table;
     207             :         unsigned char tmp;
     208             :         int i;
     209             : 
     210         159 :         from_table = NULL;
     211         159 :         to_table   = NULL;
     212             :         
     213         159 :         switch (toupper((int)(unsigned char)from))
     214             :         {
     215             :                 case 'W':
     216         149 :                         from_table = _cyr_win1251;
     217         149 :                         break;
     218             :                 case 'A':
     219             :                 case 'D':
     220           2 :                         from_table = _cyr_cp866;
     221           2 :                         break;
     222             :                 case 'I':
     223           1 :                         from_table = _cyr_iso88595;
     224           1 :                         break;
     225             :                 case 'M':
     226           1 :                         from_table = _cyr_mac;
     227           1 :                         break;
     228             :                 case 'K':
     229           2 :                         break;
     230             :                 default:
     231           4 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown source charset: %c", from);
     232             :                         break;
     233             :         }
     234             : 
     235         159 :         switch (toupper((int)(unsigned char)to))
     236             :         {
     237             :                 case 'W':
     238           1 :                         to_table = _cyr_win1251;
     239           1 :                         break;
     240             :                 case 'A':
     241             :                 case 'D':
     242           2 :                         to_table = _cyr_cp866;
     243           2 :                         break;
     244             :                 case 'I':
     245           3 :                         to_table = _cyr_iso88595;
     246           3 :                         break;
     247             :                 case 'M':
     248           1 :                         to_table = _cyr_mac;
     249           1 :                         break;
     250             :                 case 'K':
     251         148 :                         break;
     252             :                 default:
     253           4 :                         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown destination charset: %c", to);
     254             :                         break;
     255             :         }
     256             : 
     257             : 
     258         159 :         if (!str)
     259           0 :                 return (char *)str;
     260             :         
     261         505 :         for( i = 0; i<length; i++)
     262             :         {
     263         346 :                 tmp = (from_table == NULL)? str[i] : from_table[ str[i] ];
     264         346 :                 str[i] = (to_table == NULL) ? tmp : to_table[tmp + 256];
     265             :         }
     266         159 :         return (char *)str;
     267             : }
     268             : /* }}} */
     269             : 
     270             : /* {{{ proto string convert_cyr_string(string str, string from, string to)
     271             :    Convert from one Cyrillic character set to another */
     272         170 : PHP_FUNCTION(convert_cyr_string)
     273             : {
     274             :         char *input, *fr_cs, *to_cs;
     275             :         int input_len, fr_cs_len, to_cs_len;
     276             :         unsigned char *str;
     277             : 
     278         170 :         if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss", &input, &input_len, &fr_cs, &fr_cs_len, &to_cs, &to_cs_len) == FAILURE) {
     279          11 :                 return;
     280             :         }
     281             : 
     282         159 :         str = (unsigned char*) estrndup(input, input_len);
     283             : 
     284         159 :         php_convert_cyr_string(str, input_len, fr_cs[0], to_cs[0] TSRMLS_CC);
     285         159 :         RETVAL_STRING((char *)str, 0);
     286             : }
     287             : /* }}} */
     288             : 
     289             : /*
     290             :  * Local variables:
     291             :  * tab-width: 4
     292             :  * c-basic-offset: 4
     293             :  * End:
     294             :  * vim600: sw=4 ts=4 fdm=marker
     295             :  * vim<600: sw=4 ts=4
     296             :  */

Generated by: LCOV version 1.10

Generated at Tue, 29 Jul 2014 09:53:13 +0000 (45 hours ago)

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