LCOV - code coverage report
Current view: top level - http - php_http_utf8.h (source / functions) Hit Total Coverage
Test: PHP Code Coverage Lines: 22 37 59.5 %
Date: 2014-11-03 12:21:11 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :     +--------------------------------------------------------------------+
       3             :     | PECL :: http                                                       |
       4             :     +--------------------------------------------------------------------+
       5             :     | Redistribution and use in source and binary forms, with or without |
       6             :     | modification, are permitted provided that the conditions mentioned |
       7             :     | in the accompanying LICENSE file are met.                          |
       8             :     +--------------------------------------------------------------------+
       9             :     | Copyright (c) 2004-2014, Michael Wallner <mike@php.net>            |
      10             :     +--------------------------------------------------------------------+
      11             : */
      12             : 
      13             : #ifndef PHP_HTTP_UTF8_H
      14             : #define PHP_HTTP_UTF8_H
      15             : 
      16             : typedef struct utf8_range {
      17             :         unsigned int start;
      18             :         unsigned int end;
      19             :         unsigned char step;
      20             : } utf8_range_t;
      21             : 
      22             : static const unsigned char utf8_mblen[256] = {
      23             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      24             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      25             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      26             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      27             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      28             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      29             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      30             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      31             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      32             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      33             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      34             :     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
      35             :     2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
      36             :     2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
      37             :     3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
      38             :     4,4,4,4,4,4,4,4,5,5,5,5,6,6,6,6
      39             : };
      40             : 
      41             : static const unsigned char utf8_mask[] = {
      42             :                 0, 0x7f, 0x1f, 0x0f, 0x07, 0x03, 0x01
      43             : };
      44             : 
      45             : static const utf8_range_t utf8_ranges[] = {
      46             : /* BEGIN::UTF8TABLE */
      47             : /* BASIC LATIN */
      48             :         {    0x0041,     0x005A, 1},
      49             :         {    0x0061,     0x007A, 1},
      50             : /* LATIN-1 SUPPLEMENT */
      51             :         {    0x00AA,          0, 0},
      52             :         {    0x00B5,          0, 0},
      53             :         {    0x00BA,          0, 0},
      54             :         {    0x00C0,     0x00D6, 1},
      55             :         {    0x00D8,     0x00F6, 1},
      56             :         {    0x00F8,     0x00FF, 1},
      57             : /* LATIN EXTENDED-A */
      58             :         {    0x0100,     0x017F, 1},
      59             : /* LATIN EXTENDED-B */
      60             :         {    0x0180,     0x024F, 1},
      61             : /* IPA EXTENSIONS */
      62             :         {    0x0250,     0x02AF, 1},
      63             : /* SPACING MODIFIER LETTERS */
      64             :         {    0x02B0,     0x02C1, 1},
      65             :         {    0x02C6,     0x02D1, 1},
      66             :         {    0x02E0,     0x02E4, 1},
      67             :         {    0x02EE,          0, 0},
      68             : /* COMBINING DIACRITICAL MARKS */
      69             :         {    0x0345,          0, 0},
      70             : /* BASIC GREEK */
      71             :         {    0x0370,     0x0373, 1},
      72             :         {    0x0376,     0x0377, 1},
      73             :         {    0x037A,     0x037D, 1},
      74             :         {    0x0386,          0, 0},
      75             :         {    0x0388,     0x038A, 1},
      76             :         {    0x038C,          0, 0},
      77             :         {    0x038E,     0x03A1, 1},
      78             :         {    0x03A3,     0x03CE, 1},
      79             : /* GREEK SYMBOLS AND COPTIC */
      80             :         {    0x03D0,     0x03F5, 1},
      81             :         {    0x03F7,     0x03FF, 1},
      82             : /* CYRILLIC */
      83             :         {    0x0400,     0x0481, 1},
      84             :         {    0x048A,     0x04FF, 1},
      85             : /* CYRILLIC SUPPLEMENT */
      86             :         {    0x0500,     0x0523, 1},
      87             : /* ARMENIAN */
      88             :         {    0x0531,     0x0556, 1},
      89             :         {    0x0559,          0, 0},
      90             :         {    0x0561,     0x0587, 1},
      91             : /* HEBREW */
      92             :         {    0x05D0,     0x05EA, 1},
      93             :         {    0x05F0,     0x05F2, 1},
      94             : /* ARABIC */
      95             :         {    0x0621,     0x064A, 1},
      96             :         {    0x066E,     0x066F, 1},
      97             :         {    0x0671,     0x06D3, 1},
      98             :         {    0x06D5,          0, 0},
      99             :         {    0x06E5,     0x06E6, 1},
     100             :         {    0x06EE,     0x06EF, 1},
     101             :         {    0x06FA,     0x06FC, 1},
     102             :         {    0x06FF,          0, 0},
     103             : /* SYRIAC */
     104             :         {    0x0710,          0, 0},
     105             :         {    0x0712,     0x072F, 1},
     106             :         {    0x074D,     0x074F, 1},
     107             : /* ARABIC SUPPLEMENT */
     108             :         {    0x0750,     0x077F, 1},
     109             : /* THAANA */
     110             :         {    0x0780,     0x07A5, 1},
     111             :         {    0x07B1,          0, 0},
     112             : /* NKO */
     113             :         {    0x07C0,     0x07EA, 1},
     114             :         {    0x07F4,     0x07F5, 1},
     115             :         {    0x07FA,          0, 0},
     116             : /* - All Matras of Indic and Sinhala are moved from punct to alpha class */
     117             : /* - Added Unicode 5.1 charctares of Indic scripts */
     118             : /* DEVANAGARI */
     119             :         {    0x0901,     0x0939, 1},
     120             :         {    0x093C,     0x094D, 1},
     121             :         {    0x0950,     0x0954, 1},
     122             :         {    0x0958,     0x0961, 1},
     123             :         {    0x0962,          0, 0},
     124             :         {    0x0963,          0, 0},
     125             :         {    0x0972,          0, 0},
     126             :         {    0x097B,     0x097F, 1},
     127             : /* TABLE 18 BENGALI */
     128             :         {    0x0981,     0x0983, 1},
     129             :         {    0x0985,     0x098C, 1},
     130             :         {    0x098F,          0, 0},
     131             :         {    0x0990,          0, 0},
     132             :         {    0x0993,     0x09A8, 1},
     133             :         {    0x09AA,     0x09B0, 1},
     134             :         {    0x09B2,          0, 0},
     135             :         {    0x09B6,     0x09B9, 1},
     136             :         {    0x09BC,     0x09C4, 1},
     137             :         {    0x09C7,          0, 0},
     138             :         {    0x09C8,          0, 0},
     139             :         {    0x09CB,     0x09CE, 1},
     140             :         {    0x09D7,          0, 0},
     141             :         {    0x09DC,          0, 0},
     142             :         {    0x09DD,          0, 0},
     143             :         {    0x09DF,     0x09E3, 1},
     144             :         {    0x09F0,     0x09FA, 1},
     145             : /* GURMUKHI */
     146             :         {    0x0A01,     0x0A03, 1},
     147             :         {    0x0A05,     0x0A0A, 1},
     148             :         {    0x0A0F,          0, 0},
     149             :         {    0x0A10,          0, 0},
     150             :         {    0x0A13,     0x0A28, 1},
     151             :         {    0x0A2A,     0x0A30, 1},
     152             :         {    0x0A32,          0, 0},
     153             :         {    0x0A33,          0, 0},
     154             :         {    0x0A35,          0, 0},
     155             :         {    0x0A36,          0, 0},
     156             :         {    0x0A38,          0, 0},
     157             :         {    0x0A39,          0, 0},
     158             :         {    0x0A3C,          0, 0},
     159             :         {    0x0A3E,     0x0A42, 1},
     160             :         {    0x0A47,          0, 0},
     161             :         {    0x0A48,          0, 0},
     162             :         {    0x0A4B,     0x0A4D, 1},
     163             :         {    0x0A51,          0, 0},
     164             :         {    0x0A59,     0x0A5C, 1},
     165             :         {    0x0A5E,          0, 0},
     166             :         {    0x0A70,     0x0A75, 1},
     167             : /* GUJARATI */
     168             :         {    0x0A81,     0x0A83, 1},
     169             :         {    0x0A85,     0x0A8D, 1},
     170             :         {    0x0A8F,     0x0A91, 1},
     171             :         {    0x0A93,     0x0AA8, 1},
     172             :         {    0x0AAA,     0x0AB0, 1},
     173             :         {    0x0AB2,          0, 0},
     174             :         {    0x0AB3,          0, 0},
     175             :         {    0x0AB5,     0x0AB9, 1},
     176             :         {    0x0ABC,     0x0AC5, 1},
     177             :         {    0x0AC7,     0x0AC9, 1},
     178             :         {    0x0ACB,     0x0ACD, 1},
     179             :         {    0x0AD0,          0, 0},
     180             :         {    0x0AE0,     0x0AE3, 1},
     181             :         {    0x0AF1,          0, 0},
     182             : /* ORIYA */
     183             :         {    0x0B01,     0x0B03, 1},
     184             :         {    0x0B05,     0x0B0C, 1},
     185             :         {    0x0B0F,          0, 0},
     186             :         {    0x0B10,          0, 0},
     187             :         {    0x0B13,     0x0B28, 1},
     188             :         {    0x0B2A,     0x0B30, 1},
     189             :         {    0x0B32,          0, 0},
     190             :         {    0x0B33,          0, 0},
     191             :         {    0x0B35,     0x0B39, 1},
     192             :         {    0x0B3C,     0x0B44, 1},
     193             :         {    0x0B47,     0x0B48, 1},
     194             :         {    0x0B4B,     0x0B4D, 1},
     195             :         {    0x0B56,     0x0B57, 1},
     196             :         {    0x0B5C,          0, 0},
     197             :         {    0x0B5D,          0, 0},
     198             :         {    0x0B5F,     0x0B63, 1},
     199             :         {    0x0B70,          0, 0},
     200             :         {    0x0B71,          0, 0},
     201             : /* TAMIL */
     202             :         {    0x0B82,          0, 0},
     203             :         {    0x0B83,          0, 0},
     204             :         {    0x0B85,     0x0B8A, 1},
     205             :         {    0x0B8E,     0x0B90, 1},
     206             :         {    0x0B92,     0x0B95, 1},
     207             :         {    0x0B99,          0, 0},
     208             :         {    0x0B9A,          0, 0},
     209             :         {    0x0B9C,          0, 0},
     210             :         {    0x0B9E,          0, 0},
     211             :         {    0x0B9F,          0, 0},
     212             :         {    0x0BA3,          0, 0},
     213             :         {    0x0BA4,          0, 0},
     214             :         {    0x0BA8,     0x0BAA, 1},
     215             :         {    0x0BAE,     0x0BB9, 1},
     216             :         {    0x0BBE,     0x0BC2, 1},
     217             :         {    0x0BC6,     0x0BC8, 1},
     218             :         {    0x0BCA,     0x0BCD, 1},
     219             :         {    0x0BD0,          0, 0},
     220             :         {    0x0BD7,          0, 0},
     221             :         {    0x0BF0,     0x0BFA, 1},
     222             : /* TELUGU */
     223             :         {    0x0C01,     0x0C03, 1},
     224             :         {    0x0C05,     0x0C0C, 1},
     225             :         {    0x0C0E,     0x0C10, 1},
     226             :         {    0x0C12,     0x0C28, 1},
     227             :         {    0x0C2A,     0x0C33, 1},
     228             :         {    0x0C35,     0x0C39, 1},
     229             :         {    0x0C3D,     0x0C44, 1},
     230             :         {    0x0C46,     0x0C48, 1},
     231             :         {    0x0C4A,     0x0C4D, 1},
     232             :         {    0x0C55,     0x0C56, 1},
     233             :         {    0x0C58,     0x0C59, 1},
     234             :         {    0x0C60,     0x0C63, 1},
     235             : /* KANNADA */
     236             :         {    0x0C82,     0x0C83, 1},
     237             :         {    0x0C85,     0x0C8C, 1},
     238             :         {    0x0C8E,     0x0C90, 1},
     239             :         {    0x0C92,     0x0CA8, 1},
     240             :         {    0x0CAA,     0x0CB3, 1},
     241             :         {    0x0CB5,     0x0CB9, 1},
     242             :         {    0x0CBC,     0x0CC4, 1},
     243             :         {    0x0CC6,     0x0CC8, 1},
     244             :         {    0x0CCA,     0x0CCD, 1},
     245             :         {    0x0CD5,     0x0CD6, 1},
     246             :         {    0x0CDE,          0, 0},
     247             :         {    0x0CE0,     0x0CE3, 1},
     248             :         {    0x0CF1,          0, 0},
     249             :         {    0x0CF2,          0, 0},
     250             : /* MALAYALAM */
     251             :         {    0x0D02,     0x0D03, 1},
     252             :         {    0x0D05,     0x0D0C, 1},
     253             :         {    0x0D0E,     0x0D10, 1},
     254             :         {    0x0D12,     0x0D28, 1},
     255             :         {    0x0D2A,     0x0D39, 1},
     256             :         {    0x0D3D,     0x0D44, 1},
     257             :         {    0x0D46,     0x0D48, 1},
     258             :         {    0x0D4A,     0x0D4D, 1},
     259             :         {    0x0D57,          0, 0},
     260             :         {    0x0D60,     0x0D63, 1},
     261             :         {    0x0D79,     0x0D7F, 1},
     262             : /* SINHALA */
     263             :         {    0x0D82,     0x0D83, 1},
     264             :         {    0x0D85,     0x0D96, 1},
     265             :         {    0x0D9A,     0x0DB1, 1},
     266             :         {    0x0DB3,     0x0DBB, 1},
     267             :         {    0x0DBD,          0, 0},
     268             :         {    0x0DC0,     0x0DC6, 1},
     269             :         {    0x0DCA,          0, 0},
     270             :         {    0x0DCF,     0x0DD4, 1},
     271             :         {    0x0DD6,          0, 0},
     272             :         {    0x0DD8,     0x0DDF, 1},
     273             :         {    0x0DF2,     0x0DF4, 1},
     274             : /* THAI */
     275             :         {    0x0E01,     0x0E2E, 1},
     276             :         {    0x0E30,     0x0E3A, 1},
     277             :         {    0x0E40,     0x0E45, 1},
     278             :         {    0x0E47,     0x0E4E, 1},
     279             : /* LAO */
     280             :         {    0x0E81,     0x0E82, 1},
     281             :         {    0x0E84,          0, 0},
     282             :         {    0x0E87,     0x0E88, 1},
     283             :         {    0x0E8A,          0, 0},
     284             :         {    0x0E8D,          0, 0},
     285             :         {    0x0E94,     0x0E97, 1},
     286             :         {    0x0E99,     0x0E9F, 1},
     287             :         {    0x0EA1,     0x0EA3, 1},
     288             :         {    0x0EA5,          0, 0},
     289             :         {    0x0EA7,          0, 0},
     290             :         {    0x0EAA,     0x0EAB, 1},
     291             :         {    0x0EAD,     0x0EB0, 1},
     292             :         {    0x0EB2,     0x0EB3, 1},
     293             :         {    0x0EBD,          0, 0},
     294             :         {    0x0EC0,     0x0EC4, 1},
     295             :         {    0x0EC6,          0, 0},
     296             :         {    0x0EDC,     0x0EDD, 1},
     297             : /* TIBETAN */
     298             :         {    0x0F00,          0, 0},
     299             :         {    0x0F40,     0x0F47, 1},
     300             :         {    0x0F49,     0x0F6C, 1},
     301             :         {    0x0F88,     0x0F8B, 1},
     302             : /* MYANMAR */
     303             :         {    0x1000,     0x102A, 1},
     304             :         {    0x1050,     0x1055, 1},
     305             :         {    0x105A,     0x105D, 1},
     306             :         {    0x1061,          0, 0},
     307             :         {    0x0165,          0, 0},
     308             :         {    0x1066,          0, 0},
     309             :         {    0x106E,     0x1070, 1},
     310             :         {    0x1075,     0x1081, 1},
     311             :         {    0x108E,          0, 0},
     312             : /* GEORGIAN */
     313             :         {    0x10A0,     0x10C5, 1},
     314             :         {    0x10D0,     0x10FA, 1},
     315             :         {    0x10FC,          0, 0},
     316             : /* HANGUL JAMO */
     317             :         {    0x1100,     0x1159, 1},
     318             :         {    0x115F,     0x11A2, 1},
     319             :         {    0x11A8,     0x11F9, 1},
     320             : /* ETHIOPIC */
     321             :         {    0x1200,     0x1248, 1},
     322             :         {    0x124A,     0x124D, 1},
     323             :         {    0x1250,     0x1256, 1},
     324             :         {    0x1258,          0, 0},
     325             :         {    0x125A,     0x125D, 1},
     326             :         {    0x1260,     0x1288, 1},
     327             :         {    0x128A,     0x128D, 1},
     328             :         {    0x1290,     0x12B0, 1},
     329             :         {    0x12B2,     0x12B5, 1},
     330             :         {    0x12B8,     0x12BE, 1},
     331             :         {    0x12C0,          0, 0},
     332             :         {    0x12C2,     0x12C5, 1},
     333             :         {    0x12C8,     0x12D6, 1},
     334             :         {    0x12D8,     0x1310, 1},
     335             :         {    0x1312,     0x1315, 1},
     336             :         {    0x1318,     0x135A, 1},
     337             : /* ETHIOPIC EXTENDED */
     338             :         {    0x1380,     0x138F, 1},
     339             : /* CHEROKEE */
     340             :         {    0x13A0,     0x13F4, 1},
     341             : /* UNIFIED CANADIAN ABORIGINAL SYLLABICS */
     342             :         {    0x1401,     0x166C, 1},
     343             :         {    0x166F,     0x1676, 1},
     344             : /* OGHAM */
     345             :         {    0x1681,     0x169A, 1},
     346             : /* RUNIC */
     347             :         {    0x16A0,     0x16EA, 1},
     348             :         {    0x16EE,     0x16F0, 1},
     349             : /* TAGALOG */
     350             :         {    0x1700,     0x170C, 1},
     351             :         {    0x170E,     0x1711, 1},
     352             : /* HANUNOO */
     353             :         {    0x1720,     0x1731, 1},
     354             : /* BUHID */
     355             :         {    0x1740,     0x1751, 1},
     356             : /* TAGBANWA */
     357             :         {    0x1760,     0x176C, 1},
     358             :         {    0x176E,     0x1770, 1},
     359             : /* KHMER */
     360             :         {    0x1780,     0x17B3, 1},
     361             :         {    0x17D7,          0, 0},
     362             :         {    0x17DC,          0, 0},
     363             : /* MONGOLIAN */
     364             :         {    0x1820,     0x1877, 1},
     365             :         {    0x1880,     0x18A8, 1},
     366             :         {    0x18AA,          0, 0},
     367             : /* LIMBU */
     368             :         {    0x1900,     0x191C, 1},
     369             :         {    0x1946,     0x194F, 1},
     370             : /* TAI LE */
     371             :         {    0x1950,     0x196D, 1},
     372             :         {    0x1970,     0x1974, 1},
     373             : /* NEW TAI LUE */
     374             :         {    0x1980,     0x19A9, 1},
     375             :         {    0x19C1,     0x19C7, 1},
     376             :         {    0x19D0,     0x19D9, 1},
     377             : /* BUGINESE */
     378             :         {    0x1A00,     0x1A16, 1},
     379             : /* BALINESE */
     380             :         {    0x1B05,     0x1B33, 1},
     381             :         {    0x1B45,     0x1B4B, 1},
     382             :         {    0x1B50,     0x1B59, 1},
     383             : /* SUNDANESE */
     384             :         {    0x1B83,     0x1BA0, 1},
     385             :         {    0x1BAE,     0x1BAF, 1},
     386             : /* LEPCHA */
     387             :         {    0x1C00,     0x1C23, 1},
     388             :         {    0x1C4D,     0x1C4F, 1},
     389             : /* OL CHIKI */
     390             :         {    0x1C5A,     0x1C7D, 1},
     391             : /* PHONETIC EXTENSIONS */
     392             :         {    0x1D00,     0x1DBF, 1},
     393             : /* LATIN EXTENDED ADDITIONAL */
     394             :         {    0x1E00,     0x1E9F, 1},
     395             :         {    0x1EA0,     0x1EFF, 1},
     396             : /* GREEK EXTENDED */
     397             :         {    0x1F00,     0x1F15, 1},
     398             :         {    0x1F18,     0x1F1D, 1},
     399             :         {    0x1F20,     0x1F45, 1},
     400             :         {    0x1F48,     0x1F4D, 1},
     401             :         {    0x1F50,     0x1F57, 1},
     402             :         {    0x1F59,          0, 0},
     403             :         {    0x1F5B,          0, 0},
     404             :         {    0x1F5D,          0, 0},
     405             :         {    0x1F5F,     0x1F7D, 1},
     406             :         {    0x1F80,     0x1FB4, 1},
     407             :         {    0x1FB6,     0x1FBC, 1},
     408             :         {    0x1FBE,          0, 0},
     409             :         {    0x1FC2,     0x1FC4, 1},
     410             :         {    0x1FC6,     0x1FCC, 1},
     411             :         {    0x1FD0,     0x1FD3, 1},
     412             :         {    0x1FD6,     0x1FDB, 1},
     413             :         {    0x1FE0,     0x1FEC, 1},
     414             :         {    0x1FF2,     0x1FF4, 1},
     415             :         {    0x1FF6,     0x1FFC, 1},
     416             : /* SUPERSCRIPTS AND SUBSCRIPTS */
     417             :         {    0x2071,          0, 0},
     418             :         {    0x207F,          0, 0},
     419             :         {    0x2090,     0x2094, 1},
     420             : /* LETTERLIKE SYMBOLS */
     421             :         {    0x2102,          0, 0},
     422             :         {    0x2107,          0, 0},
     423             :         {    0x210A,     0x2113, 1},
     424             :         {    0x2115,          0, 0},
     425             :         {    0x2119,     0x211D, 1},
     426             :         {    0x2124,          0, 0},
     427             :         {    0x2126,          0, 0},
     428             :         {    0x2128,     0x212D, 1},
     429             :         {    0x212F,     0x2139, 1},
     430             :         {    0x213C,     0x213F, 1},
     431             :         {    0x2145,     0x2149, 1},
     432             :         {    0x214E,          0, 0},
     433             : /* NUMBER FORMS */
     434             :         {    0x2160,     0x2188, 1},
     435             : /* ENCLOSED ALPHANUMERICS */
     436             :         {    0x249C,     0x24E9, 1},
     437             : /* GLAGOLITIC */
     438             :         {    0x2C00,     0x2C2E, 1},
     439             :         {    0x2C30,     0x2C5E, 1},
     440             : /* LATIN EXTENDED-C */
     441             :         {    0x2C60,     0x2C6F, 1},
     442             :         {    0x2C71,     0x2C7D, 1},
     443             : /* COPTIC */
     444             :         {    0x2C80,     0x2CE4, 1},
     445             : /* GEORGIAN SUPPLEMENT */
     446             :         {    0x2D00,     0x2D25, 1},
     447             : /* TIFINAGH */
     448             :         {    0x2D30,     0x2D65, 1},
     449             :         {    0x2D6F,          0, 0},
     450             : /* ETHIOPIC EXTENDED */
     451             :         {    0x2D80,     0x2D96, 1},
     452             :         {    0x2DA0,     0x2DA6, 1},
     453             :         {    0x2DA8,     0x2DAE, 1},
     454             :         {    0x2DB0,     0x2DB6, 1},
     455             :         {    0x2DB8,     0x2DBE, 1},
     456             :         {    0x2DC0,     0x2DC6, 1},
     457             :         {    0x2DC8,     0x2DCE, 1},
     458             :         {    0x2DD0,     0x2DD6, 1},
     459             :         {    0x2DD8,     0x2DDE, 1},
     460             : /* CJK SYMBOLS AND PUNCTUATION */
     461             :         {    0x3005,     0x3007, 1},
     462             :         {    0x3021,     0x3029, 1},
     463             :         {    0x3031,     0x3035, 1},
     464             :         {    0x3038,     0x303C, 1},
     465             : /* HIRAGANA */
     466             :         {    0x3041,     0x3096, 1},
     467             :         {    0x309D,     0x309F, 1},
     468             : /* KATAKANA */
     469             :         {    0x30A1,     0x30FA, 1},
     470             :         {    0x30FC,     0x30FF, 1},
     471             : /* BOPOMOFO */
     472             :         {    0x3105,     0x312D, 1},
     473             : /* HANGUL COMPATIBILITY JAMO */
     474             :         {    0x3131,     0x318E, 1},
     475             : /* BOPOMOFO EXTENDED */
     476             :         {    0x31A0,     0x31B7, 1},
     477             : /* KATAKANA PHONETIC EXTENSIONS */
     478             :         {    0x31F0,     0x31FF, 1},
     479             : /* CJK UNIFIED IDEOGRAPHS EXTENSION */
     480             :         {    0x3400,     0x4DB5, 1},
     481             : /* CJK UNIFIED IDEOGRAPHS */
     482             :         {    0x4E00,     0x9FBB, 1},
     483             : /* YI SYLLABLES */
     484             :         {    0xA000,     0xA48C, 1},
     485             : /* VAI SYLLABLES */
     486             :         {    0xA500,     0xA60B, 1},
     487             :         {    0xA610,     0xA61F, 1},
     488             :         {    0xA62A,     0xA62B, 1},
     489             : /* CYRILLIC SUPPLEMENT 2 */
     490             :         {    0xA640,     0xA65F, 1},
     491             :         {    0xA662,     0xA66E, 1},
     492             :         {    0xA680,     0xA697, 1},
     493             : /* LATIN EXTENDED-D */
     494             :         {    0xA717,     0xA71F, 1},
     495             :         {    0xA722,     0xA78C, 1},
     496             :         {    0xA7FB,     0xA7FF, 1},
     497             : /* SYLOTI NEGRI */
     498             :         {    0xA800,          0, 0},
     499             :         {    0xA801,          0, 0},
     500             :         {    0xA803,     0xA805, 1},
     501             :         {    0xA807,     0xA80A, 1},
     502             :         {    0xA80C,     0xA822, 1},
     503             : /* PHAGS PA */
     504             :         {    0xA840,     0xA873, 1},
     505             : /* SAURASHTRA */
     506             :         {    0xA882,     0xA8B3, 1},
     507             : /* KAYAH LI */
     508             :         {    0xA90A,     0xA92D, 1},
     509             : /* REJANG */
     510             :         {    0xA930,     0xA946, 1},
     511             : /* CHAM */
     512             :         {    0xAA00,     0xAA28, 1},
     513             :         {    0xAA40,     0xAA42, 1},
     514             :         {    0xAA44,     0xAA4B, 1},
     515             : /* HANGUL SYLLABLES */
     516             :         {    0xAC00,     0xD7A3, 1},
     517             : /* CJK COMPATIBILITY IDEOGRAPHS */
     518             :         {    0xF900,     0xFA2D, 1},
     519             :         {    0xFA30,     0xFA6A, 1},
     520             :         {    0xFA70,     0xFAD9, 1},
     521             : /* ALPHABETIC PRESENTATION FORMS */
     522             :         {    0xFB00,     0xFB06, 1},
     523             :         {    0xFB13,     0xFB17, 1},
     524             :         {    0xFB1D,          0, 0},
     525             :         {    0xFB1F,     0xFB28, 1},
     526             :         {    0xFB2A,     0xFB36, 1},
     527             :         {    0xFB38,     0xFB3C, 1},
     528             :         {    0xFB3E,          0, 0},
     529             :         {    0xFB40,          0, 0},
     530             :         {    0xFB41,          0, 0},
     531             :         {    0xFB43,          0, 0},
     532             :         {    0xFB44,          0, 0},
     533             :         {    0xFB46,     0xFB4F, 1},
     534             : /* ARABIC PRESENTATION FORMS-A */
     535             :         {    0xFB50,     0xFBB1, 1},
     536             :         {    0xFBD3,     0xFD3D, 1},
     537             :         {    0xFD50,     0xFD8F, 1},
     538             :         {    0xFD92,     0xFDC7, 1},
     539             :         {    0xFDF0,     0xFDFB, 1},
     540             : /* ARABIC PRESENTATION FORMS-B */
     541             :         {    0xFE70,     0xFE74, 1},
     542             :         {    0xFE76,     0xFEFC, 1},
     543             : /* HALFWIDTH AND FULLWIDTH FORMS */
     544             :         {    0xFF21,     0xFF3A, 1},
     545             :         {    0xFF41,     0xFF5A, 1},
     546             :         {    0xFF66,     0xFFBE, 1},
     547             :         {    0xFFC2,     0xFFC7, 1},
     548             :         {    0xFFCA,     0xFFCF, 1},
     549             :         {    0xFFD2,     0xFFD7, 1},
     550             :         {    0xFFDA,     0xFFDC, 1},
     551             : /* LINEAR B SYLLABARY */
     552             :         {0x00010000, 0x0001000B, 1},
     553             :         {0x0001000D, 0x00010026, 1},
     554             :         {0x00010028, 0x0001003A, 1},
     555             :         {0x0001003C, 0x0001003D, 1},
     556             :         {0x0001003F, 0x0001004D, 1},
     557             :         {0x00010050, 0x0001005D, 1},
     558             : /* LINEAR B IDEOGRAMS */
     559             :         {0x00010080, 0x000100FA, 1},
     560             : /* ANCIENT GREEK NUMBERS */
     561             :         {0x00010140, 0x00010174, 1},
     562             : /* LYCIAN */
     563             :         {0x00010280, 0x0001029C, 1},
     564             : /* CARIAN */
     565             :         {0x000102A0, 0x000102D0, 1},
     566             : /* OLD ITALIC */
     567             :         {0x00010300, 0x0001031E, 1},
     568             : /* GOTHIC */
     569             :         {0x00010330, 0x0001034A, 1},
     570             : /* UGARITIC */
     571             :         {0x00010380, 0x0001039D, 1},
     572             : /* OLD PERSIAN */
     573             :         {0x000103A0, 0x000103C3, 1},
     574             :         {0x000103C8, 0x000103CF, 1},
     575             :         {0x000103D1, 0x000103D5, 1},
     576             : /* DESERET */
     577             :         {0x00010400, 0x0001044F, 1},
     578             : /* SHAVIAN */
     579             :         {0x00010450, 0x0001047F, 1},
     580             : /* OSMANYA */
     581             :         {0x00010480, 0x0001049D, 1},
     582             :         {0x000104A0, 0x000104A9, 1},
     583             : /* CYPRIOT SYLLABARY */
     584             :         {0x00010800, 0x00010805, 1},
     585             :         {0x00010808,          0, 0},
     586             :         {0x0001080A, 0x00010835, 1},
     587             :         {0x00010837, 0x00010838, 1},
     588             :         {0x0001083C,          0, 0},
     589             :         {0x0001083F,          0, 0},
     590             : /* PHOENICIAN */
     591             :         {0x00010900, 0x00010915, 1},
     592             :         {0x00010A00,          0, 0},
     593             :         {0x00010A10, 0x00010A13, 1},
     594             : /* KHAROSHTI */
     595             :         {0x00010A15, 0x00010A17, 1},
     596             :         {0x00010A19, 0x00010A33, 1},
     597             : /* CUNEIFORM */
     598             :         {0x00012000, 0x0001236E, 1},
     599             : /* CUNEIFORM NUMBERS AND PONCTUATION */
     600             :         {0x00012400, 0x00012462, 1},
     601             : /* BYZANTINE MUSICAL SYMBOLS */
     602             : /* MATHEMATICAL ALPHANUMERIC SYMBOLS */
     603             :         {0x0001D400, 0x0001D454, 1},
     604             :         {0x0001D456, 0x0001D49C, 1},
     605             :         {0x0001D49E, 0x0001D49F, 1},
     606             :         {0x0001D4A2,          0, 0},
     607             :         {0x0001D4A5, 0x0001D4A6, 1},
     608             :         {0x0001D4A9, 0x0001D4AC, 1},
     609             :         {0x0001D4AE, 0x0001D4B9, 1},
     610             :         {0x0001D4BB,          0, 0},
     611             :         {0x0001D4BD, 0x0001D4C3, 1},
     612             :         {0x0001D4C5, 0x0001D505, 1},
     613             :         {0x0001D507, 0x0001D50A, 1},
     614             :         {0x0001D50D, 0x0001D514, 1},
     615             :         {0x0001D516, 0x0001D51C, 1},
     616             :         {0x0001D51E, 0x0001D539, 1},
     617             :         {0x0001D53B, 0x0001D53E, 1},
     618             :         {0x0001D540, 0x0001D544, 1},
     619             :         {0x0001D546,          0, 0},
     620             :         {0x0001D54A, 0x0001D550, 1},
     621             :         {0x0001D552, 0x0001D6A5, 1},
     622             :         {0x0001D6A8, 0x0001D6C0, 1},
     623             :         {0x0001D6C2, 0x0001D6DA, 1},
     624             :         {0x0001D6DC, 0x0001D6FA, 1},
     625             :         {0x0001D6FC, 0x0001D714, 1},
     626             :         {0x0001D716, 0x0001D734, 1},
     627             :         {0x0001D736, 0x0001D74E, 1},
     628             :         {0x0001D750, 0x0001D76E, 1},
     629             :         {0x0001D770, 0x0001D788, 1},
     630             :         {0x0001D78A, 0x0001D7A8, 1},
     631             :         {0x0001D7AA, 0x0001D7C2, 1},
     632             :         {0x0001D7C4, 0x0001D7CB, 1},
     633             :         {0x0001D7CE, 0x0001D7FF, 1},
     634             : /* CJK UNIFIED IDEOGRAPHS EXTENSION */
     635             :         {0x00020000, 0x0002A6D6, 1},
     636             : /* CJK COMPATIBILITY IDEOGRAPHS SUPPLEMENT */
     637             :         {0x0002F800, 0x0002FA1D, 1},
     638             : /* The non-ASCII number characters are included here because ISO C 99 */
     639             : /* forbids us to classify them as digits; however, they behave more like */
     640             : /* alphanumeric than like punctuation. */
     641             : /* ARABIC */
     642             :         {    0x0660,     0x0669, 1},
     643             :         {    0x06F0,     0x06F9, 1},
     644             : /* DEVANAGARI */
     645             :         {    0x0966,     0x096F, 1},
     646             : /* BENGALI */
     647             :         {    0x09E6,     0x09EF, 1},
     648             : /* GURMUKHI */
     649             :         {    0x0A66,     0x0A6F, 1},
     650             : /* GUJARATI */
     651             :         {    0x0AE6,     0x0AEF, 1},
     652             : /* ORIYA */
     653             :         {    0x0B66,     0x0B6F, 1},
     654             : /* TAMIL */
     655             :         {    0x0BE6,     0x0BEF, 1},
     656             : /* TELUGU */
     657             :         {    0x0C66,     0x0C6F, 1},
     658             :         {    0x0C78,     0x0C7F, 1},
     659             : /* KANNADA */
     660             :         {    0x0CE6,     0x0CEF, 1},
     661             : /* MALAYALAM */
     662             :         {    0x0D66,     0x0D75, 1},
     663             :         {    0x0D70,     0x0D75, 1},
     664             : /* THAI */
     665             :         {    0x0E50,     0x0E59, 1},
     666             : /* LAO */
     667             :         {    0x0ED0,     0x0ED9, 1},
     668             : /* TIBETAN */
     669             :         {    0x0F20,     0x0F29, 1},
     670             : /* MYANMAR */
     671             :         {    0x1040,     0x1049, 1},
     672             : /* KHMER */
     673             :         {    0x17E0,     0x17E9, 1},
     674             : /* MONGOLIAN */
     675             :         {    0x1810,     0x1819, 1},
     676             : /* SUNDANESE */
     677             :         {    0x1BB0,     0x1BB9, 1},
     678             : /* LEPCHA */
     679             :         {    0x1C40,     0x1C49, 1},
     680             : /* OL CHIKI */
     681             :         {    0x1C50,     0x1C59, 1},
     682             : /* VAI */
     683             :         {    0xA620,     0xA629, 1},
     684             : /* SAURASHTRA */
     685             :         {    0xA8D0,     0xA8D9, 1},
     686             : /* KAYAH LI */
     687             :         {    0xA900,     0xA909, 1},
     688             : /* CHAM */
     689             :         {    0xAA50,     0xAA59, 1},
     690             : /* HALFWIDTH AND FULLWIDTH FORMS */
     691             :         {    0xFF10,     0xFF19, 1},
     692             : 
     693             : /* END::UTF8TABLE */
     694             : };
     695             : 
     696          21 : static inline size_t utf8towc(unsigned *wc, const unsigned char *uc, size_t len)
     697             : {
     698          21 :         unsigned char ub = utf8_mblen[*uc];
     699             : 
     700          21 :         if (!ub || ub > len || ub > 3) {
     701           0 :                 return 0;
     702             :         }
     703             : 
     704          21 :         *wc = *uc & utf8_mask[ub];
     705             : 
     706          21 :         switch (ub) {
     707             :         case 4:
     708           0 :                 if ((uc[1] & 0xc0) != 0x80) {
     709           0 :                         return 0;
     710             :                 }
     711           0 :                 *wc <<= 6;
     712           0 :                 *wc += *++uc & 0x3f;
     713             :                 /* no break */
     714             :         case 3:
     715           1 :                 if ((uc[1] & 0xc0) != 0x80) {
     716           0 :                         return 0;
     717             :                 }
     718           1 :                 *wc <<= 6;
     719           1 :                 *wc += *++uc & 0x3f;
     720             :                 /* no break */
     721             :         case 2:
     722          21 :                 if ((uc[1] & 0xc0) != 0x80) {
     723           0 :                         return 0;
     724             :                 }
     725          21 :                 *wc <<= 6;
     726          21 :                 *wc += *++uc & 0x3f;
     727             :                 /* no break */
     728             :         case 1:
     729          21 :                 break;
     730             : 
     731             :         default:
     732           0 :                 return 0;
     733             :         }
     734             : 
     735          21 :         return ub;
     736             : }
     737             : 
     738          15 : static inline zend_bool isualpha(unsigned ch)
     739             : {
     740             :         unsigned i, j;
     741             : 
     742         115 :         for (i = 0; i < sizeof(utf8_ranges)/sizeof(utf8_range_t); ++i) {
     743         115 :                 if (utf8_ranges[i].start == ch) {
     744           0 :                         return 1;
     745         115 :                 } else if (utf8_ranges[i].start <= ch && utf8_ranges[i].end >= ch) {
     746          15 :                         if (utf8_ranges[i].step == 1) {
     747          15 :                                 return 1;
     748             :                         }
     749           0 :                         for (j = utf8_ranges[i].start; j <= utf8_ranges[i].end; j+= utf8_ranges[i].step) {
     750           0 :                                 if (ch == j) {
     751           0 :                                         return 1;
     752             :                                 }
     753             :                         }
     754           0 :                         return 0;
     755             :                 }
     756             :         }
     757           0 :         return 0;
     758             : }
     759             : 
     760          15 : static inline zend_bool isualnum(unsigned ch)
     761             : {
     762             :         /* digits */
     763          15 :         if (ch >= 0x30 && ch <= 0x39) {
     764           0 :                 return 1;
     765             :         }
     766          15 :         return isualpha(ch);
     767             : }
     768             : 
     769             : #endif  /* PHP_HTTP_UTF8_H */
     770             : 
     771             : /*
     772             :  * Local variables:
     773             :  * tab-width: 4
     774             :  * c-basic-offset: 4
     775             :  * End:
     776             :  * vim600: noet sw=4 ts=4 fdm=marker
     777             :  * vim<600: noet sw=4 ts=4
     778             :  */

Generated by: LCOV version 1.11