/[suikacvs]/markup/html/whatpm/Whatpm/HTML/Tokenizer.pm
Suika

Diff of /markup/html/whatpm/Whatpm/HTML/Tokenizer.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by wakaba, Tue Oct 14 11:46:57 2008 UTC revision 1.7 by wakaba, Tue Oct 14 15:25:50 2008 UTC
# Line 178  sub _initialize_tokenizer ($) { Line 178  sub _initialize_tokenizer ($) {
178    #$self->{is_xml} (if XML)    #$self->{is_xml} (if XML)
179    
180    $self->{state} = DATA_STATE; # MUST    $self->{state} = DATA_STATE; # MUST
181    #$self->{s_kwd}; # state keyword - initialized when used    $self->{s_kwd} = ''; # state keyword
182    #$self->{entity__value}; # initialized when used    #$self->{entity__value}; # initialized when used
183    #$self->{entity__match}; # initialized when used    #$self->{entity__match}; # initialized when used
184    $self->{content_model} = PCDATA_CONTENT_MODEL; # be    $self->{content_model} = PCDATA_CONTENT_MODEL; # be
# Line 219  sub _initialize_tokenizer ($) { Line 219  sub _initialize_tokenizer ($) {
219  ##        ->{value}  ##        ->{value}
220  ##        ->{has_reference} == 1 or 0  ##        ->{has_reference} == 1 or 0
221  ##   ->{data} (COMMENT_TOKEN, CHARACTER_TOKEN)  ##   ->{data} (COMMENT_TOKEN, CHARACTER_TOKEN)
222    ##   ->{has_reference} == 1 or 0 (CHARACTER_TOKEN)
223  ## NOTE: The "self-closing flag" is hold as |$self->{self_closing}|.  ## NOTE: The "self-closing flag" is hold as |$self->{self_closing}|.
224  ##     |->{self_closing}| is used to save the value of |$self->{self_closing}|  ##     |->{self_closing}| is used to save the value of |$self->{self_closing}|
225  ##     while the token is pushed back to the stack.  ##     while the token is pushed back to the stack.
# Line 362  sub _get_next_token ($) { Line 363  sub _get_next_token ($) {
363          }          }
364        } elsif ($self->{nc} == 0x002D) { # -        } elsif ($self->{nc} == 0x002D) { # -
365          if ($self->{content_model} & CM_LIMITED_MARKUP) { # RCDATA | CDATA          if ($self->{content_model} & CM_LIMITED_MARKUP) { # RCDATA | CDATA
366            $self->{s_kwd} .= '-';            if ($self->{s_kwd} eq '<!-') {
             
           if ($self->{s_kwd} eq '<!--') {  
367                            
368              $self->{escape} = 1; # unless $self->{escape};              $self->{escape} = 1; # unless $self->{escape};
369              $self->{s_kwd} = '--';              $self->{s_kwd} = '--';
370              #              #
371            } elsif ($self->{s_kwd} eq '---') {            } elsif ($self->{s_kwd} eq '-') {
372                            
373              $self->{s_kwd} = '--';              $self->{s_kwd} = '--';
374              #              #
375              } elsif ($self->{s_kwd} eq '<!' or $self->{s_kwd} eq '-') {
376                
377                $self->{s_kwd} .= '-';
378                #
379            } else {            } else {
380                            
381                $self->{s_kwd} = '-';
382              #              #
383            }            }
384          }          }
# Line 420  sub _get_next_token ($) { Line 424  sub _get_next_token ($) {
424            if ($self->{s_kwd} eq '--') {            if ($self->{s_kwd} eq '--') {
425                            
426              delete $self->{escape};              delete $self->{escape};
427                #
428            } else {            } else {
429                            
430                #
431            }            }
432            } elsif ($self->{is_xml} and $self->{s_kwd} eq ']]') {
433              
434              $self->{parse_error}->(level => $self->{level}->{must}, type => 'unmatched mse', ## TODO: type
435                              line => $self->{line_prev},
436                              column => $self->{column_prev} - 1);
437              #
438          } else {          } else {
439                        
440              #
441          }          }
442                    
443          $self->{s_kwd} = '';          $self->{s_kwd} = '';
444          #          #
445          } elsif ($self->{nc} == 0x005D) { # ]
446            if ($self->{s_kwd} eq ']' or $self->{s_kwd} eq '') {
447              
448              $self->{s_kwd} .= ']';
449            } elsif ($self->{s_kwd} eq ']]') {
450              
451              #
452            } else {
453              
454              $self->{s_kwd} = '';
455            }
456            #
457        } elsif ($self->{nc} == -1) {        } elsif ($self->{nc} == -1) {
458                    
459          $self->{s_kwd} = '';          $self->{s_kwd} = '';
# Line 446  sub _get_next_token ($) { Line 471  sub _get_next_token ($) {
471                     data => chr $self->{nc},                     data => chr $self->{nc},
472                     line => $self->{line}, column => $self->{column},                     line => $self->{line}, column => $self->{column},
473                    };                    };
474        if ($self->{read_until}->($token->{data}, q[-!<>&],        if ($self->{read_until}->($token->{data}, q{-!<>&\]},
475                                  length $token->{data})) {                                  length $token->{data})) {
476          $self->{s_kwd} = '';          $self->{s_kwd} = '';
477        }        }
478    
479        ## Stay in the data state.        ## Stay in the data state.
480        if ($self->{content_model} == PCDATA_CONTENT_MODEL) {        if (not $self->{is_xml} and
481              $self->{content_model} == PCDATA_CONTENT_MODEL) {
482                    
483          $self->{state} = PCDATA_STATE;          $self->{state} = PCDATA_STATE;
484        } else {        } else {
# Line 500  sub _get_next_token ($) { Line 526  sub _get_next_token ($) {
526    
527          ## reconsume          ## reconsume
528          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
529            $self->{s_kwd} = '';
530          return  ({type => CHARACTER_TOKEN, data => '<',          return  ({type => CHARACTER_TOKEN, data => '<',
531                    line => $self->{line_prev},                    line => $self->{line_prev},
532                    column => $self->{column_prev},                    column => $self->{column_prev},
# Line 583  sub _get_next_token ($) { Line 610  sub _get_next_token ($) {
610                            line => $self->{line_prev},                            line => $self->{line_prev},
611                            column => $self->{column_prev});                            column => $self->{column_prev});
612            $self->{state} = DATA_STATE;            $self->{state} = DATA_STATE;
613              $self->{s_kwd} = '';
614                        
615      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
616        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 619  sub _get_next_token ($) { Line 647  sub _get_next_token ($) {
647                            line => $self->{line_prev},                            line => $self->{line_prev},
648                            column => $self->{column_prev});                            column => $self->{column_prev});
649            $self->{state} = DATA_STATE;            $self->{state} = DATA_STATE;
650              $self->{s_kwd} = '';
651            ## reconsume            ## reconsume
652    
653            return  ({type => CHARACTER_TOKEN, data => '<',            return  ({type => CHARACTER_TOKEN, data => '<',
# Line 647  sub _get_next_token ($) { Line 676  sub _get_next_token ($) {
676            ## NOTE: See <http://krijnhoetmer.nl/irc-logs/whatwg/20070626#l-564>.            ## NOTE: See <http://krijnhoetmer.nl/irc-logs/whatwg/20070626#l-564>.
677                        
678            $self->{state} = DATA_STATE;            $self->{state} = DATA_STATE;
679              $self->{s_kwd} = '';
680            ## Reconsume.            ## Reconsume.
681            return  ({type => CHARACTER_TOKEN, data => '</',            return  ({type => CHARACTER_TOKEN, data => '</',
682                      line => $l, column => $c,                      line => $l, column => $c,
# Line 700  sub _get_next_token ($) { Line 730  sub _get_next_token ($) {
730                          line => $self->{line_prev}, ## "<" in "</>"                          line => $self->{line_prev}, ## "<" in "</>"
731                          column => $self->{column_prev} - 1);                          column => $self->{column_prev} - 1);
732          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
733            $self->{s_kwd} = '';
734                    
735      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
736        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 715  sub _get_next_token ($) { Line 746  sub _get_next_token ($) {
746        } elsif ($self->{nc} == -1) {        } elsif ($self->{nc} == -1) {
747                    
748          $self->{parse_error}->(level => $self->{level}->{must}, type => 'bare etago');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'bare etago');
749            $self->{s_kwd} = '';
750          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
751          # reconsume          # reconsume
752    
# Line 764  sub _get_next_token ($) { Line 796  sub _get_next_token ($) {
796          } else {          } else {
797                        
798            $self->{state} = DATA_STATE;            $self->{state} = DATA_STATE;
799              $self->{s_kwd} = '';
800            ## Reconsume.            ## Reconsume.
801            return  ({type => CHARACTER_TOKEN,            return  ({type => CHARACTER_TOKEN,
802                      data => '</' . $self->{s_kwd},                      data => '</' . $self->{s_kwd},
# Line 782  sub _get_next_token ($) { Line 815  sub _get_next_token ($) {
815                        
816            ## Reconsume.            ## Reconsume.
817            $self->{state} = DATA_STATE;            $self->{state} = DATA_STATE;
818              $self->{s_kwd} = '';
819            return  ({type => CHARACTER_TOKEN,            return  ({type => CHARACTER_TOKEN,
820                      data => '</' . $self->{s_kwd},                      data => '</' . $self->{s_kwd},
821                      line => $self->{line_prev},                      line => $self->{line_prev},
# Line 833  sub _get_next_token ($) { Line 867  sub _get_next_token ($) {
867            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
868          }          }
869          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
870            $self->{s_kwd} = '';
871                    
872      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
873        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 885  sub _get_next_token ($) { Line 920  sub _get_next_token ($) {
920            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
921          }          }
922          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
923            $self->{s_kwd} = '';
924          # reconsume          # reconsume
925    
926          return  ($self->{ct}); # start tag or end tag          return  ($self->{ct}); # start tag or end tag
# Line 955  sub _get_next_token ($) { Line 991  sub _get_next_token ($) {
991            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
992          }          }
993          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
994            $self->{s_kwd} = '';
995                    
996      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
997        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 1022  sub _get_next_token ($) { Line 1059  sub _get_next_token ($) {
1059            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1060          }          }
1061          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1062            $self->{s_kwd} = '';
1063          # reconsume          # reconsume
1064    
1065          return  ($self->{ct}); # start tag or end tag          return  ($self->{ct}); # start tag or end tag
# Line 1117  sub _get_next_token ($) { Line 1155  sub _get_next_token ($) {
1155            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1156          }          }
1157          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1158            $self->{s_kwd} = '';
1159                    
1160      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
1161        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 1185  sub _get_next_token ($) { Line 1224  sub _get_next_token ($) {
1224            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1225          }          }
1226          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1227            $self->{s_kwd} = '';
1228          # reconsume          # reconsume
1229    
1230          return  ($self->{ct}); # start tag or end tag          return  ($self->{ct}); # start tag or end tag
# Line 1261  sub _get_next_token ($) { Line 1301  sub _get_next_token ($) {
1301            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1302          }          }
1303          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1304            $self->{s_kwd} = '';
1305                    
1306      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
1307        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 1328  sub _get_next_token ($) { Line 1369  sub _get_next_token ($) {
1369          } else {          } else {
1370            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1371          }          }
1372            $self->{s_kwd} = '';
1373          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1374          # reconsume          # reconsume
1375    
# Line 1429  sub _get_next_token ($) { Line 1471  sub _get_next_token ($) {
1471            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1472          }          }
1473          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1474            $self->{s_kwd} = '';
1475                    
1476      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
1477        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 1462  sub _get_next_token ($) { Line 1505  sub _get_next_token ($) {
1505            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1506          }          }
1507          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1508            $self->{s_kwd} = '';
1509          ## reconsume          ## reconsume
1510    
1511          return  ($self->{ct}); # start tag or end tag          return  ($self->{ct}); # start tag or end tag
# Line 1544  sub _get_next_token ($) { Line 1588  sub _get_next_token ($) {
1588            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1589          }          }
1590          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1591            $self->{s_kwd} = '';
1592          ## reconsume          ## reconsume
1593    
1594          return  ($self->{ct}); # start tag or end tag          return  ($self->{ct}); # start tag or end tag
# Line 1625  sub _get_next_token ($) { Line 1670  sub _get_next_token ($) {
1670            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1671          }          }
1672          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1673            $self->{s_kwd} = '';
1674          ## reconsume          ## reconsume
1675    
1676          return  ($self->{ct}); # start tag or end tag          return  ($self->{ct}); # start tag or end tag
# Line 1705  sub _get_next_token ($) { Line 1751  sub _get_next_token ($) {
1751            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1752          }          }
1753          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1754            $self->{s_kwd} = '';
1755                    
1756      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
1757        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 1738  sub _get_next_token ($) { Line 1785  sub _get_next_token ($) {
1785            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1786          }          }
1787          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1788            $self->{s_kwd} = '';
1789          ## reconsume          ## reconsume
1790    
1791          return  ($self->{ct}); # start tag or end tag          return  ($self->{ct}); # start tag or end tag
# Line 1806  sub _get_next_token ($) { Line 1854  sub _get_next_token ($) {
1854            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1855          }          }
1856          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1857            $self->{s_kwd} = '';
1858                    
1859      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
1860        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 1853  sub _get_next_token ($) { Line 1902  sub _get_next_token ($) {
1902            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1903          }          }
1904          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1905            $self->{s_kwd} = '';
1906          ## Reconsume.          ## Reconsume.
1907          return  ($self->{ct}); # start tag or end tag          return  ($self->{ct}); # start tag or end tag
1908          redo A;          redo A;
# Line 1883  sub _get_next_token ($) { Line 1933  sub _get_next_token ($) {
1933          }          }
1934    
1935          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1936            $self->{s_kwd} = '';
1937                    
1938      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
1939        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 1915  sub _get_next_token ($) { Line 1966  sub _get_next_token ($) {
1966            die "$0: $self->{ct}->{type}: Unknown token type";            die "$0: $self->{ct}->{type}: Unknown token type";
1967          }          }
1968          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1969            $self->{s_kwd} = '';
1970          ## Reconsume.          ## Reconsume.
1971          return  ($self->{ct}); # start tag or end tag          return  ($self->{ct}); # start tag or end tag
1972          redo A;          redo A;
# Line 1935  sub _get_next_token ($) { Line 1987  sub _get_next_token ($) {
1987        if ($self->{nc} == 0x003E) { # >        if ($self->{nc} == 0x003E) { # >
1988                    
1989          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
1990            $self->{s_kwd} = '';
1991                    
1992      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
1993        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 1952  sub _get_next_token ($) { Line 2005  sub _get_next_token ($) {
2005        } elsif ($self->{nc} == -1) {        } elsif ($self->{nc} == -1) {
2006                    
2007          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2008            $self->{s_kwd} = '';
2009          ## reconsume          ## reconsume
2010    
2011          return  ($self->{ct}); # comment          return  ($self->{ct}); # comment
# Line 2175  sub _get_next_token ($) { Line 2229  sub _get_next_token ($) {
2229        } elsif ($self->{s_kwd} eq '[CDATA' and        } elsif ($self->{s_kwd} eq '[CDATA' and
2230                 $self->{nc} == 0x005B) { # [                 $self->{nc} == 0x005B) { # [
2231                    
2232    
2233            if ($self->{is_xml} and
2234                not $self->{tainted} and
2235                @{$self->{open_elements} or []} == 0) {
2236              $self->{parse_error}->(level => $self->{level}->{must}, type => 'cdata outside of root element',
2237                              line => $self->{line_prev},
2238                              column => $self->{column_prev} - 7);
2239              $self->{tainted} = 1;
2240            }
2241    
2242          $self->{ct} = {type => CHARACTER_TOKEN,          $self->{ct} = {type => CHARACTER_TOKEN,
2243                                    data => '',                                    data => '',
2244                                    line => $self->{line_prev},                                    line => $self->{line_prev},
# Line 2226  sub _get_next_token ($) { Line 2290  sub _get_next_token ($) {
2290                    
2291          $self->{parse_error}->(level => $self->{level}->{must}, type => 'bogus comment');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'bogus comment');
2292          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2293            $self->{s_kwd} = '';
2294                    
2295      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
2296        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 2245  sub _get_next_token ($) { Line 2310  sub _get_next_token ($) {
2310                    
2311          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');
2312          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2313            $self->{s_kwd} = '';
2314          ## reconsume          ## reconsume
2315    
2316          return  ($self->{ct}); # comment          return  ($self->{ct}); # comment
# Line 2288  sub _get_next_token ($) { Line 2354  sub _get_next_token ($) {
2354                    
2355          $self->{parse_error}->(level => $self->{level}->{must}, type => 'bogus comment');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'bogus comment');
2356          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2357            $self->{s_kwd} = '';
2358                    
2359      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
2360        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 2307  sub _get_next_token ($) { Line 2374  sub _get_next_token ($) {
2374                    
2375          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');
2376          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2377            $self->{s_kwd} = '';
2378          ## reconsume          ## reconsume
2379    
2380          return  ($self->{ct}); # comment          return  ($self->{ct}); # comment
# Line 2350  sub _get_next_token ($) { Line 2418  sub _get_next_token ($) {
2418                    
2419          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');
2420          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2421            $self->{s_kwd} = '';
2422          ## reconsume          ## reconsume
2423    
2424          return  ($self->{ct}); # comment          return  ($self->{ct}); # comment
# Line 2395  sub _get_next_token ($) { Line 2464  sub _get_next_token ($) {
2464        } elsif ($self->{nc} == -1) {        } elsif ($self->{nc} == -1) {
2465                    
2466          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');
2467            $self->{s_kwd} = '';
2468          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2469            $self->{s_kwd} = '';
2470          ## reconsume          ## reconsume
2471    
2472          return  ($self->{ct}); # comment          return  ($self->{ct}); # comment
# Line 2422  sub _get_next_token ($) { Line 2493  sub _get_next_token ($) {
2493        if ($self->{nc} == 0x003E) { # >        if ($self->{nc} == 0x003E) { # >
2494                    
2495          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2496            $self->{s_kwd} = '';
2497                    
2498      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
2499        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 2460  sub _get_next_token ($) { Line 2532  sub _get_next_token ($) {
2532                    
2533          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed comment');
2534          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2535            $self->{s_kwd} = '';
2536          ## reconsume          ## reconsume
2537    
2538          return  ($self->{ct}); # comment          return  ($self->{ct}); # comment
# Line 2528  sub _get_next_token ($) { Line 2601  sub _get_next_token ($) {
2601                    
2602          $self->{parse_error}->(level => $self->{level}->{must}, type => 'no DOCTYPE name');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'no DOCTYPE name');
2603          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2604            $self->{s_kwd} = '';
2605                    
2606      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
2607        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 2547  sub _get_next_token ($) { Line 2621  sub _get_next_token ($) {
2621                    
2622          $self->{parse_error}->(level => $self->{level}->{must}, type => 'no DOCTYPE name');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'no DOCTYPE name');
2623          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2624            $self->{s_kwd} = '';
2625          ## reconsume          ## reconsume
2626    
2627          return  ($self->{ct}); # DOCTYPE (quirks)          return  ($self->{ct}); # DOCTYPE (quirks)
# Line 2590  sub _get_next_token ($) { Line 2665  sub _get_next_token ($) {
2665        } elsif ($self->{nc} == 0x003E) { # >        } elsif ($self->{nc} == 0x003E) { # >
2666                    
2667          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2668            $self->{s_kwd} = '';
2669                    
2670      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
2671        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 2609  sub _get_next_token ($) { Line 2685  sub _get_next_token ($) {
2685                    
2686          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');
2687          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2688            $self->{s_kwd} = '';
2689          ## reconsume          ## reconsume
2690    
2691          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 2652  sub _get_next_token ($) { Line 2729  sub _get_next_token ($) {
2729        } elsif ($self->{nc} == 0x003E) { # >        } elsif ($self->{nc} == 0x003E) { # >
2730                    
2731          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2732            $self->{s_kwd} = '';
2733                    
2734      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
2735        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 2671  sub _get_next_token ($) { Line 2749  sub _get_next_token ($) {
2749                    
2750          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');
2751          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2752            $self->{s_kwd} = '';
2753          ## reconsume          ## reconsume
2754    
2755          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 2899  sub _get_next_token ($) { Line 2978  sub _get_next_token ($) {
2978          $self->{parse_error}->(level => $self->{level}->{must}, type => 'no PUBLIC literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'no PUBLIC literal');
2979    
2980          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
2981            $self->{s_kwd} = '';
2982                    
2983      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
2984        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 2920  sub _get_next_token ($) { Line 3000  sub _get_next_token ($) {
3000          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');
3001    
3002          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3003            $self->{s_kwd} = '';
3004          ## reconsume          ## reconsume
3005    
3006          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 2966  sub _get_next_token ($) { Line 3047  sub _get_next_token ($) {
3047          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed PUBLIC literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed PUBLIC literal');
3048    
3049          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3050            $self->{s_kwd} = '';
3051                    
3052      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3053        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 2987  sub _get_next_token ($) { Line 3069  sub _get_next_token ($) {
3069          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed PUBLIC literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed PUBLIC literal');
3070    
3071          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3072            $self->{s_kwd} = '';
3073          ## reconsume          ## reconsume
3074    
3075          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 3035  sub _get_next_token ($) { Line 3118  sub _get_next_token ($) {
3118          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed PUBLIC literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed PUBLIC literal');
3119    
3120          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3121            $self->{s_kwd} = '';
3122                    
3123      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3124        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 3056  sub _get_next_token ($) { Line 3140  sub _get_next_token ($) {
3140          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed PUBLIC literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed PUBLIC literal');
3141    
3142          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3143            $self->{s_kwd} = '';
3144          ## reconsume          ## reconsume
3145    
3146          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 3134  sub _get_next_token ($) { Line 3219  sub _get_next_token ($) {
3219        } elsif ($self->{nc} == 0x003E) { # >        } elsif ($self->{nc} == 0x003E) { # >
3220                    
3221          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3222            $self->{s_kwd} = '';
3223                    
3224      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3225        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 3154  sub _get_next_token ($) { Line 3240  sub _get_next_token ($) {
3240          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');
3241    
3242          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3243            $self->{s_kwd} = '';
3244          ## reconsume          ## reconsume
3245    
3246          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 3231  sub _get_next_token ($) { Line 3318  sub _get_next_token ($) {
3318                    
3319          $self->{parse_error}->(level => $self->{level}->{must}, type => 'no SYSTEM literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'no SYSTEM literal');
3320          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3321            $self->{s_kwd} = '';
3322                    
3323      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3324        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 3252  sub _get_next_token ($) { Line 3340  sub _get_next_token ($) {
3340          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');
3341    
3342          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3343            $self->{s_kwd} = '';
3344          ## reconsume          ## reconsume
3345    
3346          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 3298  sub _get_next_token ($) { Line 3387  sub _get_next_token ($) {
3387          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed SYSTEM literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed SYSTEM literal');
3388    
3389          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3390            $self->{s_kwd} = '';
3391                    
3392      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3393        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 3319  sub _get_next_token ($) { Line 3409  sub _get_next_token ($) {
3409          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed SYSTEM literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed SYSTEM literal');
3410    
3411          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3412            $self->{s_kwd} = '';
3413          ## reconsume          ## reconsume
3414    
3415          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 3367  sub _get_next_token ($) { Line 3458  sub _get_next_token ($) {
3458          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed SYSTEM literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed SYSTEM literal');
3459    
3460          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3461            $self->{s_kwd} = '';
3462                    
3463      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3464        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 3388  sub _get_next_token ($) { Line 3480  sub _get_next_token ($) {
3480          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed SYSTEM literal');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed SYSTEM literal');
3481    
3482          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3483            $self->{s_kwd} = '';
3484          ## reconsume          ## reconsume
3485    
3486          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 3434  sub _get_next_token ($) { Line 3527  sub _get_next_token ($) {
3527        } elsif ($self->{nc} == 0x003E) { # >        } elsif ($self->{nc} == 0x003E) { # >
3528                    
3529          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3530            $self->{s_kwd} = '';
3531                    
3532      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3533        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 3453  sub _get_next_token ($) { Line 3547  sub _get_next_token ($) {
3547                    
3548          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');          $self->{parse_error}->(level => $self->{level}->{must}, type => 'unclosed DOCTYPE');
3549          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3550            $self->{s_kwd} = '';
3551          ## reconsume          ## reconsume
3552    
3553          $self->{ct}->{quirks} = 1;          $self->{ct}->{quirks} = 1;
# Line 3482  sub _get_next_token ($) { Line 3577  sub _get_next_token ($) {
3577        if ($self->{nc} == 0x003E) { # >        if ($self->{nc} == 0x003E) { # >
3578                    
3579          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3580            $self->{s_kwd} = '';
3581                    
3582      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3583        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 3500  sub _get_next_token ($) { Line 3596  sub _get_next_token ($) {
3596        } elsif ($self->{nc} == -1) {        } elsif ($self->{nc} == -1) {
3597                    
3598          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3599            $self->{s_kwd} = '';
3600          ## reconsume          ## reconsume
3601    
3602          return  ($self->{ct}); # DOCTYPE          return  ($self->{ct}); # DOCTYPE
# Line 3545  sub _get_next_token ($) { Line 3642  sub _get_next_token ($) {
3642        
3643          redo A;          redo A;
3644        } elsif ($self->{nc} == -1) {        } elsif ($self->{nc} == -1) {
3645            if ($self->{is_xml}) {
3646              $self->{parse_error}->(level => $self->{level}->{must}, type => 'no mse'); ## TODO: type
3647            }
3648    
3649          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3650            $self->{s_kwd} = '';
3651                    
3652      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3653        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 3614  sub _get_next_token ($) { Line 3716  sub _get_next_token ($) {
3716      } elsif ($self->{state} == CDATA_SECTION_MSE2_STATE) {      } elsif ($self->{state} == CDATA_SECTION_MSE2_STATE) {
3717        if ($self->{nc} == 0x003E) { # >        if ($self->{nc} == 0x003E) { # >
3718          $self->{state} = DATA_STATE;          $self->{state} = DATA_STATE;
3719            $self->{s_kwd} = '';
3720                    
3721      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {      if ($self->{char_buffer_pos} < length $self->{char_buffer}) {
3722        $self->{line_prev} = $self->{line};        $self->{line_prev} = $self->{line};
# Line 3721  sub _get_next_token ($) { Line 3824  sub _get_next_token ($) {
3824        if ($self->{prev_state} == DATA_STATE) {        if ($self->{prev_state} == DATA_STATE) {
3825                    
3826          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
3827            $self->{s_kwd} = '';
3828          ## Reconsume.          ## Reconsume.
3829          return  ({type => CHARACTER_TOKEN, data => '&',          return  ({type => CHARACTER_TOKEN, data => '&',
3830                    line => $self->{line_prev},                    line => $self->{line_prev},
# Line 3731  sub _get_next_token ($) { Line 3835  sub _get_next_token ($) {
3835                    
3836          $self->{ca}->{value} .= '&';          $self->{ca}->{value} .= '&';
3837          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
3838            $self->{s_kwd} = '';
3839          ## Reconsume.          ## Reconsume.
3840          redo A;          redo A;
3841        }        }
# Line 3781  sub _get_next_token ($) { Line 3886  sub _get_next_token ($) {
3886          if ($self->{prev_state} == DATA_STATE) {          if ($self->{prev_state} == DATA_STATE) {
3887                        
3888            $self->{state} = $self->{prev_state};            $self->{state} = $self->{prev_state};
3889              $self->{s_kwd} = '';
3890            ## Reconsume.            ## Reconsume.
3891            return  ({type => CHARACTER_TOKEN,            return  ({type => CHARACTER_TOKEN,
3892                      data => '&#',                      data => '&#',
# Line 3792  sub _get_next_token ($) { Line 3898  sub _get_next_token ($) {
3898                        
3899            $self->{ca}->{value} .= '&#';            $self->{ca}->{value} .= '&#';
3900            $self->{state} = $self->{prev_state};            $self->{state} = $self->{prev_state};
3901              $self->{s_kwd} = '';
3902            ## Reconsume.            ## Reconsume.
3903            redo A;            redo A;
3904          }          }
# Line 3857  sub _get_next_token ($) { Line 3964  sub _get_next_token ($) {
3964        if ($self->{prev_state} == DATA_STATE) {        if ($self->{prev_state} == DATA_STATE) {
3965                    
3966          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
3967            $self->{s_kwd} = '';
3968          ## Reconsume.          ## Reconsume.
3969          return  ({type => CHARACTER_TOKEN, data => chr $code,          return  ({type => CHARACTER_TOKEN, data => chr $code,
3970                      has_reference => 1,
3971                    line => $l, column => $c,                    line => $l, column => $c,
3972                   });                   });
3973          redo A;          redo A;
# Line 3867  sub _get_next_token ($) { Line 3976  sub _get_next_token ($) {
3976          $self->{ca}->{value} .= chr $code;          $self->{ca}->{value} .= chr $code;
3977          $self->{ca}->{has_reference} = 1;          $self->{ca}->{has_reference} = 1;
3978          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
3979            $self->{s_kwd} = '';
3980          ## Reconsume.          ## Reconsume.
3981          redo A;          redo A;
3982        }        }
# Line 3892  sub _get_next_token ($) { Line 4002  sub _get_next_token ($) {
4002          if ($self->{prev_state} == DATA_STATE) {          if ($self->{prev_state} == DATA_STATE) {
4003                        
4004            $self->{state} = $self->{prev_state};            $self->{state} = $self->{prev_state};
4005              $self->{s_kwd} = '';
4006            ## Reconsume.            ## Reconsume.
4007            return  ({type => CHARACTER_TOKEN,            return  ({type => CHARACTER_TOKEN,
4008                      data => '&' . $self->{s_kwd},                      data => '&' . $self->{s_kwd},
# Line 3903  sub _get_next_token ($) { Line 4014  sub _get_next_token ($) {
4014                        
4015            $self->{ca}->{value} .= '&' . $self->{s_kwd};            $self->{ca}->{value} .= '&' . $self->{s_kwd};
4016            $self->{state} = $self->{prev_state};            $self->{state} = $self->{prev_state};
4017              $self->{s_kwd} = '';
4018            ## Reconsume.            ## Reconsume.
4019            redo A;            redo A;
4020          }          }
# Line 4005  sub _get_next_token ($) { Line 4117  sub _get_next_token ($) {
4117        if ($self->{prev_state} == DATA_STATE) {        if ($self->{prev_state} == DATA_STATE) {
4118                    
4119          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
4120            $self->{s_kwd} = '';
4121          ## Reconsume.          ## Reconsume.
4122          return  ({type => CHARACTER_TOKEN, data => chr $code,          return  ({type => CHARACTER_TOKEN, data => chr $code,
4123                      has_reference => 1,
4124                    line => $l, column => $c,                    line => $l, column => $c,
4125                   });                   });
4126          redo A;          redo A;
# Line 4015  sub _get_next_token ($) { Line 4129  sub _get_next_token ($) {
4129          $self->{ca}->{value} .= chr $code;          $self->{ca}->{value} .= chr $code;
4130          $self->{ca}->{has_reference} = 1;          $self->{ca}->{has_reference} = 1;
4131          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
4132            $self->{s_kwd} = '';
4133          ## Reconsume.          ## Reconsume.
4134          redo A;          redo A;
4135        }        }
# Line 4127  sub _get_next_token ($) { Line 4242  sub _get_next_token ($) {
4242        if ($self->{prev_state} == DATA_STATE) {        if ($self->{prev_state} == DATA_STATE) {
4243                    
4244          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
4245            $self->{s_kwd} = '';
4246          ## Reconsume.          ## Reconsume.
4247          return  ({type => CHARACTER_TOKEN,          return  ({type => CHARACTER_TOKEN,
4248                    data => $data,                    data => $data,
4249                      has_reference => $has_ref,
4250                    line => $self->{line_prev},                    line => $self->{line_prev},
4251                    column => $self->{column_prev} + 1 - length $self->{s_kwd},                    column => $self->{column_prev} + 1 - length $self->{s_kwd},
4252                   });                   });
# Line 4139  sub _get_next_token ($) { Line 4256  sub _get_next_token ($) {
4256          $self->{ca}->{value} .= $data;          $self->{ca}->{value} .= $data;
4257          $self->{ca}->{has_reference} = 1 if $has_ref;          $self->{ca}->{has_reference} = 1 if $has_ref;
4258          $self->{state} = $self->{prev_state};          $self->{state} = $self->{prev_state};
4259            $self->{s_kwd} = '';
4260          ## Reconsume.          ## Reconsume.
4261          redo A;          redo A;
4262        }        }

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.7

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24