
[[\<                 @   sw  d  Z  d d l Z d d l Z d d l Td d l m Z e j e k sS t d   e j d k rk d Z n d Z d	 d
   Z	 e
 e e g  Z e
 e e e g  Z e
 e e g  Z e
 e e g  Z d d   Z d d d  Z d d   Z e j d Z d d d Z e e d d  Z d d   Z d d   Z  d d   Z! d d   Z" d d    Z# d! d"   Z$ d d# d$  Z% d S)%zInternal support module for sre    N)*)	MAXREPEATzSRE module mismatch   i  l    c             C   s   |  S)N )xr   r   !/usr/lib/python3.4/sre_compile.py_identityfunction   s    r   c             C   s  |  j  } t } t } t } t } t } xY| D]Q\ }	 }
 |	 | k r | t @r{ | t t |	  | t	 j
 |
 |   q| t |	  | |
  q. |	 t k r$| t @r | t t |	  | d d  } n | t |	  t } | |   } | d  t |
 | |  |  | |   | |  | <q. |	 t k r\| t @rK| t t  q| t t  q. |	 | k r| t @rt d   qt |
  r/|	 t k	 r/|	 t k r| t t  n | t t  | |   } | d  | |
 d  | |
 d  t |  |
 d |  | t t  | |   | |  | <q| t t  | |   } | d  | |
 d  | |
 d  t |  |
 d |  | |   | |  | <|	 t k r| t t  q| t t  q. |	 t k rN|
 d r| t t  | |
 d d d  n  t |  |
 d |  |
 d r| t t  | |
 d d d d  qq. |	 | k rk| t |	  q. |	 | k r,| t |	  | |   } | d  |
 d d k r| d  n; |
 d j   \ } } | | k rt d   n  | |  t |  |
 d |  | t t  | |   | |  | <q. |	 t k r| t |	  | |   } | d  t |  |
 |  | t t  | |   | |  | <q. |	 t  k r| t |	  | t! @rt" j# |
 |
  }
 n  | t$ @rt% j# |
 |
  }
 n | t& @rt' j# |
 |
  }
 n  | t( |
  q. |	 t) k r| t |	  g  } | j  } xt |
 d D]h }
 | |   } | d  t |  |
 |  | t t*  | | |    | d  | |   | |  | <qMW| d  x| D] } | |   | |  | <qWq. |	 t+ k rD| t |	  | t$ @rt, |
 }
 n | t& @r3t- |
 }
 n  | t. |
  q. |	 t/ k r| t @ro| t t |	  n | t |	  | |
 d  q. |	 t0 k rp| t |	  | |
 d d  | |   } | d  t |  |
 d |  |
 d rU| t t*  | |   } | d  | |   | d |  | <t |  |
 d |  | |   | |  | <q| |   | d |  | <q. t1 d |	   q. Wd  S)	Nc             S   s   t  j |  |  S)N)_sregetlower)literalflagsr   r   r   fixup4   s    z_compile.<locals>.fixupr   z'internal: unsupported template operator   r   z(look-behind requires fixed-width patternzunsupported operand type)2appendlen_LITERAL_CODES_REPEATING_CODES_SUCCESS_CODES_ASSERT_CODESSRE_FLAG_IGNORECASEOPCODES	OP_IGNOREr	   r
   INr   _compile_charsetANYSRE_FLAG_DOTALLANY_ALLSRE_FLAG_TEMPLATEerror_simpleREPEAT
MAX_REPEAT
REPEAT_ONEMIN_REPEAT_ONE_compileSUCCESS	MAX_UNTIL	MIN_UNTIL
SUBPATTERNMARKgetwidthCALLATSRE_FLAG_MULTILINEAT_MULTILINEgetSRE_FLAG_LOCALE	AT_LOCALESRE_FLAG_UNICODE
AT_UNICODEATCODESBRANCHJUMPCATEGORY	CH_LOCALE
CH_UNICODECHCODESGROUPREFGROUPREF_EXISTS
ValueError)codepatternr   emit_lenLITERAL_CODESREPEATING_CODESSUCCESS_CODESASSERT_CODESopavr   skiplohitail
tailappendskipyesskipnor   r   r   r$   !   s   	

 


 
 


  

 



	 
 




 

 
r$   c             C   sb  | j  } | d  k r t } n  x/t |  |  D]\ } } | t |  | t k rW q. | t k rv | | |   q. | t k r | | | d   | | | d   q. | t k r | j |  q. | t	 k r | j |  q. | t
 k r@| t @r| t t |  qL| t @r/| t t |  qL| t |  q. t d   q. W| t t  d  S)Nr   r   z"internal: unsupported set operator)r   r   _optimize_charsetr   NEGATELITERALRANGECHARSETextend
BIGCHARSETr7   r0   r:   r8   r2   r9   r   FAILURE)charsetr   r>   r   r@   rF   rG   r   r   r   r      s0    		

r   c             C   s  g  } g  } t  d  } x|  D]\ } } x y | t k rP d | | |  <n | t k r xq t | | d  | | d  d  D] } d | | <q Wn5 | t k r | j | | f  n | j | | f  WnK t k
 rt |  d k r| d d 7} w. n  | j | | f  Yn XPq. q Wg  } d }	 x | j d |	  }
 |
 d k  rXPn  t |  d k rtd  } Pn  | j d |
  }	 |	 d k  r| j |
 t |  f  Pn  | j |
 |	 f  q6| d  k	 rUxW | D]O \ }
 }	 |	 |
 d k r
| j t |
 f  q| j t |
 |	 d f f  qW| | 7} t |  t |   k  rQ| S|  St |  d k rt	 |  } | j t
 | f  | | 7} | St |  } i  } t  d  } d } t    } xy t d d d  D]e } | | | d  } | | k r| | | | d <q| | | d <| | <| d 7} | | 7} qWt	 |  } | g t |  | d d  <| j t | f  | | 7} | S)N   r   r   s    i   r   i   )	bytearrayrQ   rR   rangerP   r   
IndexErrorr   find
_mk_bitmaprS   bytes_bytes_to_codesrU   )rW   r   outrK   charmaprF   rG   irunsqpdatacompsmappingblockchunkr   r   r   rO      s    .!

	

rO         0   1   c                sL   |  j  t  d  d  d       f d d   t t   d    D S)Nr   c                s-   g  |  ]# }   |   |  d    q S)r   r   ).0rb   )	_CODEBITS_intsr   r   
<listcomp>0  s   	z_mk_bitmap.<locals>.<listcomp>r   )	translate_BITS_TRANSrZ   r   )bitsrp   rq   r   )rp   rq   rr   r   r]   .  s    r]   c             C   se   d d  l  } | j  d |   } | j t j k s6 t  t |  | j t |   k s[ t  | j   S)Nr   I)arrayitemsizer	   CODESIZEAssertionErrorr   tolist)bry   ar   r   r   r_   3  s
    %r_   c             C   sH   |  d j    \ } } | | k o- d k n oG |  d d d t k S)Nr   r   r   )r*   r(   )rG   rI   rJ   r   r   r   r   ;  s    r   c             C   s   d g t  |   } x| t d t  |    D]e } | | d } xN |  | |  | k r | d k rn d | | <Pn  | | d } q@ W| d | | <q) W| S)aj  
    Generate an overlap table for the following prefix.
    An overlap table is a table of the same size as the prefix which
    informs about the potential self-overlap for each index in the prefix:
    - if overlap[i] == 0, prefix[i:] can't overlap prefix[0:...]
    - if overlap[i] == k with 0 < k <= i, prefix[i-k+1:i+1] overlaps with
      prefix[0:k]
    r   r   )r   rZ   )prefixtablerb   idxr   r   r   _generate_overlap_table@  s    	
r   c             C   s  | j    \ } } | d k r" d  Sg  } | j } d } g  } | j }	 | t @sfx | j D] \ }
 } |
 t k r t |  | k r | d } n  | |  qZ |
 t k r t | d  d k r | d d \ }
 } |
 t k r | |  q PqZ PqZ W| rf| j rf| j d \ }
 } |
 t k r| d r| d d \ }
 } |
 t k rb|	 |
 | f  q`|
 t k r`g  } | j } xU | d D]@ } | sPn  | d \ }
 } |
 t k r| |
 | f  qPqW| } q`qc|
 t k rKg  } | j } xj | d D]@ } | sPn  | d \ }
 } |
 t k r=| |
 | f  qPqW| } qc|
 t k rc| } qcqfn  |  j } | t	 t
  t |   } | d  d } | rt } t |  | k ot | j  k n r| t } qn | r| t } n  | |  | t k  r| |  n | t  | d  t  } | t k  rI| |  n
 | d  | r| t |   | |  |  j |  |  j t |   n | rt | | |   n  t |   | |  | <d  S)Nr   r   )r*   r   r   rf   rQ   r   r(   r5   r   r   INFOSRE_INFO_PREFIXSRE_INFO_LITERALSRE_INFO_CHARSETMAXCODErT   r   r   )r>   r?   r   rI   rJ   r   prefixappendprefix_skiprW   charsetappendrF   rG   ccappendre   r@   rH   maskr   r   r   _compile_infoU  s    		
"				 
+



r   c             C   s   t  |  t t f  S)N)
isinstancestrr^   )objr   r   r   isstring  s    r   c             C   sN   |  j  j | B} g  } t | |  |  t | |  j |  | j t t  | S)N)r?   r   r   r$   rf   r   r   r%   )re   r   r>   r   r   r   _code  s    r   c             C   s   t  |   r' |  } t j |  |  }  n d  } t |  |  } |  j j d k r] t d   n  |  j j } d  g |  j j } x$ | j   D] \ } } | | | <q Wt	 j
 | | |  j j B| |  j j d | |  S)Nd   z6sorry, but this version only supports 100 named groupsr   )r   	sre_parseparser   r?   groupsr|   	groupdictitemsr	   compiler   )re   r   r?   r>   
groupindex
indexgroupkrb   r   r   r   r     s     r   )&__doc__r	   r   sre_constantsr   MAGICr|   r{   r   r   setrQ   NOT_LITERALr   r    
MIN_REPEATr!   r   r%   rV   r   ASSERT
ASSERT_NOTr   r$   r   rO   rp   rv   intr]   r_   r   r   r   r   r   r   r   r   r   r   <module>   s4   
	ce