o
    eA                     @   s   d dl mZ d dlZd dlZd dlZd dlZdZdZzd dlZ	eZ
W n ey-   eZ
Y nw dZdZejejddZdddZdddZdddZdd Zdd Zdd ZG dd deZdS )    )absolute_importNCPYTHONzno-stringiter   ),:)
separatorsFTc                 C   s    | t| |rtnd |d d S N)indent	sort_keys)writedumperSPACES_PER_LEVEL)objstreamprettyr    r   */usr/lib/python3/dist-packages/ovs/json.py	to_stream$   s   r   c                 C   s>   t |d}t| ||| W d    d S 1 sw   Y  d S )Nw)openr   )r   namer   r   r   r   r   r   to_file)   s   "r   c                 C   s   t | |r	t|dS d |dS r	   )r   r   )r   r   r   r   r   r   	to_string.   s
   
r   c                 C   s<   t dd}	 | d}|dks||t|kr	 | S q)NTcheck_traileri    )Parserreadfeedlenfinish)r   pbufr   r   r   from_stream3   s   

r$   c                 C   s(   t | d}z	t|W |  S |  w )Nr)r   r$   close)r   r   r   r   r   	from_file<   s   
r'   c              
   C   s   t | ts4zt| d} W n' ty3 } zddd |j|j|j D }d| W  Y d }~S d }~ww tdd}||  |	 S )Nzutf-8 c                 S   s$   g | ]}t |d krdt | qS )   z0x%2x)ord).0cr   r   r   
<listcomp>L   s    
zfrom_string.<locals>.<listcomp>z3not a valid UTF-8 string: invalid UTF-8 sequence %sTr   )

isinstancestrUnicodeDecodeErrorjoinobjectstartendr   r   r!   )seseqr"   r   r   r   from_stringD   s   



r8   c                	       s  e Zd ZdZ fddZdiddZdd Zd	d
 Zdd Zdd Z	dd Z
dd Zi ZdD ]Zeee< q-dD ]Zeee< q6dD ]Zeee< q?dD ]Ze	ee< qHe
ed< dd Zi ZdD ]Zdee< q[dd Zdd Zed Zd!d" Zd#d$ Zed%Zd&d' Zed(d) Zed*d+ Zed,d- Zdd.d/d0d1d2d3d4d5Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dJdK Z(dLdM Z)dNdO Z*dPdQ Z+djdSdTZ,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1d_d` Z2dadb Z3dcdd Z4dedf Z5dgdh Z6  Z7S )kr   i  c                    s*   t tkrtjj|i |S tt| | S N)PARSERPARSER_Covs_jsonr   super__new__)clsargskwargs	__class__r   r   r?   X   s   zParser.__new__Fc                 C   sJ   || _ tj| _d| _d| _d| _d| _tj| _	g | _
d | _d| _d | _d S )Nr   r   F)r   r   _Parser__lex_start	lex_statebufferline_numbercolumn_numberbyte_number_Parser__parse_startparse_statestackmember_namedoneerror)selfr   r   r   r   __init__]   s   
zParser.__init__c                 C   s   d S r9   r   rQ   r,   r   r   r   __lex_start_spacep   s   zParser.__lex_start_spacec                 C      || _ tj| _d S r9   )rG   r   _Parser__lex_keywordrF   rS   r   r   r   __lex_start_alphas      zParser.__lex_start_alphac                 C   s   |  | d S r9   )_Parser__parser_inputrS   r   r   r   __lex_start_tokenw      zParser.__lex_start_tokenc                 C   rU   r9   )rG   r   _Parser__lex_numberrF   rS   r   r   r   __lex_start_numberz   rX   zParser.__lex_start_numberc                 C   s   t j| _d S r9   )r   _Parser__lex_stringrF   )rQ   _r   r   r   __lex_start_string~   s   zParser.__lex_start_stringc                 C   s@   t |dkrt |dk r| d|  d S | dt |  d S )N    r)   zinvalid character '%s'zinvalid character U+%04x)r*   _Parser__errorrS   r   r   r   __lex_start_error   s   zParser.__lex_start_errorz 	
abcdefghijklmnopqrstuvwxyzz[{]}:,z-0123456789"c                 C   s   t j|t j| | dS NT)r   _Parser__lex_start_actionsget_Parser__lex_start_errorrS   r   r   r   __lex_start   s   zParser.__lex_start4abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZTc                 C   s\   | j dkr| d d S | j dkr| d d S | j dkr$| d  d S | d| j   d S )NfalseFtrueTnullzinvalid keyword '%s')rG   rY   rb   rQ   r   r   r   __lex_finish_keyword   s   


zParser.__lex_finish_keywordc                 C   s(   |t jv r|  j|7  _dS |   dS NTF)r   _Parser__lex_alpharG   _Parser__lex_finish_keywordrS   r   r   r   __lex_keyword   s
   
zParser.__lex_keywordz9(-)?(0|[1-9][0-9]*)(?:\.([0-9]+))?(?:[eE]([-+]?[0-9]+))?$c                 C   sP  | j }tj|}|r| \}}}}|d ur/t|tjks(t|tj d k r/| d d S |d ur>t	|
ddkr>d }|}|d urH||7 }t|}d}	|d urX|	t	|8 }	|d urb|	t|7 }	|dkrm| d d S |dkr|	dkr|dkr|d9 }|	d8 }	|	dkr|dksy|	dk r|d dkr|d }|	d7 }	|	dk r|d dks|	dkr|s|dk s|r|dkr|r| |  d S | | d S t|}
|
tdks|
tdkr| d	 d S |
dkrd}
| |
 d S td
|r| d d S td|r| d d S td|r| d d S td|r!| d d S | d d S )N   zexponent outside valid range0r   l            
   infz-infznumber outside valid rangez-?0[0-9]zleading zeros not allowedz-([^0-9]|$)z'-' must be followed by digitz-?(0|[1-9][0-9]*)\.([^0-9]|$)z'decimal point must be followed by digitze[-+]?([^0-9]|$)z(exponent must contain at least one digitzsyntax error in number)rG   r   _Parser__number_rematchgroupsintsysmaxsizerb   r    lstriprY   floatresearch)rQ   r5   msignintegerfractionexp
sig_stringsignificandpow10valuer   r   r   __lex_finish_number   sv   "



zParser.__lex_finish_numberc                 C   s&   |dv r|  j |7  _ dS |   dS )Nz.0123456789eE-+TF)rG   _Parser__lex_finish_numberrS   r   r   r   __lex_number   s
   zParser.__lex_numberz[0-9a-fA-F]{4}c                 C   sT   t |dk r| d d S tj|s| d d S |dkr%| d d S t|dS )N   z#quoted string ends within \u escapezmalformed \u escape0000z*null bytes not supported in quoted strings   )r    rb   r   _Parser__4hex_rerz   r|   )rQ   r5   r   r   r   
__lex_4hex   s   
zParser.__lex_4hexc                 C      | dko| dkS )zLReturns true if 'c' is a Unicode code point for a leading
        surrogate.i   i  r   r,   r   r   r   __is_leading_surrogate     zParser.__is_leading_surrogatec                 C   r   )zMReturns true if 'c' is a Unicode code point for a trailing
        surrogate.i   i  r   r   r   r   r   __is_trailing_surrogate  r   zParser.__is_trailing_surrogatec                 C   s8   | d? d@ }|d }| d@ }|d@ }|d> |d> B |B S )a  Returns the unicode code point corresponding to leading surrogate
        'leading' and trailing surrogate 'trailing'.  The return value will not
        make any sense if 'leading' or 'trailing' are not in the correct ranges
        for leading or trailing surrogates.      ru   ?   i  r   rw   r   )leadingtrailingr   ux0x1r   r   r   __utf16_decode_surrogate_pair  s
   	z$Parser.__utf16_decode_surrogate_pair\/
	)re   r   r   bfnr%   tc                 C   s~  | j }d}t|r|d}|dkr||7 }n||d | 7 }||d d  }|dkr2| d d S tj|d }|d urI||7 }|dd  }q|d dkrZ| d|d   d S | |dd	 }|d u rid S |d	d  }t|r|d d
 dkr| d d S | |d
d }|d u rd S t	|s| d d S t
||}|dd  }n|}|t|7 }t|s	| d| d S )Nr   r   ru   z(quoted string may not end with backslashr   r   zbad escape \%s   r   z\uz malformed escaped surrogate pairr   z?second half of escaped surrogate pair is not trailing surrogatestring)rG   r    findrb   r   _Parser__unescaperh   _Parser__lex_4hex_Parser__is_leading_surrogate_Parser__is_trailing_surrogate$_Parser__utf16_decode_surrogate_pairchrrY   )rQ   inpout	backslashreplacementc0c1
code_pointr   r   r   __lex_finish_string%  sP   





)zParser.__lex_finish_stringc                 C   s   |  j |7  _ tj| _dS rf   )rG   r   r^   rF   rS   r   r   r   __lex_string_escapeS  s   zParser.__lex_string_escapec                 C   sj   |dkr|  j |7  _ tj| _dS |dkr|   dS t|dkr*|  j |7  _ dS | dt|  dS )Nr   re   ra   z'U+%04X must be escaped in quoted stringT)rG   r   _Parser__lex_string_escaperF   _Parser__lex_finish_stringr*   rb   rS   r   r   r   __lex_stringX  s   zParser.__lex_stringc                 C   s$   |  | |}|du s|du sJ |S rq   )rF   )rQ   r,   eatr   r   r   __lex_inputd  s   zParser.__lex_inputc                 C   s6   |dkr
|    d S |dkr|   d S | d d S )N{[z"syntax error at beginning of input)_Parser__push_object_Parser__push_arrayrb   rQ   tokenunused_stringr   r   r   __parse_starti  
   zParser.__parse_startc                 C   s   |  d d S )Nz trailing garbage at end of input)rb   )rQ   unused_tokenr   r   r   r   __parse_endq  r[   zParser.__parse_endc                 C   $   |dkr
|    d S | || d S )N})_Parser__parser_pop_Parser__parse_object_namerQ   r   r   r   r   r   __parse_object_initt     zParser.__parse_object_initc                 C   s(   |dkr|| _ tj| _d S | d d S )Nr   z,syntax error parsing object expecting string)rN   r   _Parser__parse_object_colonrL   rb   r   r   r   r   __parse_object_namez  s   zParser.__parse_object_namec                 C   s"   |dkr
t j| _d S | d d S )Nr   z)syntax error parsing object expecting ':')r   _Parser__parse_object_valuerL   rb   r   r   r   r   __parse_object_colon  s   zParser.__parse_object_colonc                 C      |  ||tj d S r9   )_Parser__parse_valuer   _Parser__parse_object_nextr   r   r   r   __parse_object_value     zParser.__parse_object_valuec                 C   6   |dkr
t j| _d S |dkr|   d S | d d S )Nr   r   z!syntax error expecting '}' or ',')r   r   rL   r   rb   r   r   r   r   __parse_object_next  r   zParser.__parse_object_nextc                 C   r   )N])r   _Parser__parse_array_valuer   r   r   r   __parse_array_init  r   zParser.__parse_array_initc                 C   r   r9   )r   r   _Parser__parse_array_nextr   r   r   r   __parse_array_value  r   zParser.__parse_array_valuec                 C   r   )Nr   r   z!syntax error expecting ']' or ',')r   r   rL   r   rb   r   r   r   r   __parse_array_next  r   zParser.__parse_array_nextNc                 C   s    t j| _d| _| | || d S )Nr   )r   rE   rF   rG   rL   r   r   r   r   __parser_input  s   zParser.__parser_inputc                 C   s0   | j d }t|tr||| j< d S || d S )Nr   )rM   r.   dictrN   append)rQ   r   topr   r   r   __put_value  s   

zParser.__put_valuec                 C   sR   t | jtjk rt | jdkr| | | j| || _d S | dtj  d S )Nr   z&input exceeds maximum nesting depth %d)r    rM   r   
MAX_HEIGHT_Parser__put_valuer   rL   rb   )rQ   new_json
next_stater   r   r   __parser_push  s   


zParser.__parser_pushc                 C   s   |  i tj d S r9   )_Parser__parser_pushr   _Parser__parse_object_initro   r   r   r   __push_object     zParser.__push_objectc                 C   s   |  g tj d S r9   )r   r   _Parser__parse_array_initro   r   r   r   __push_array  r   zParser.__push_arrayc                 C   s`   t | jdkrtj| _| jsd| _d S d S | j  | jd }t|t	r*tj
| _d S tj| _d S )Nru   Tr   )r    rM   r   _Parser__parse_endrL   r   rO   popr.   listr   r   )rQ   r   r   r   r   __parser_pop  s   



zParser.__parser_popc                 C   s   t g}|tg t|}|dv st||r| | n%|dkr&| | n|dkr0|   d S |dkr:|   d S | d d S || _	d S )N)FNTr   r   r   zsyntax error expecting value)
r|   extendr   tupler.   r   r   r   rb   rL   )rQ   r   r   r   number_typesr   r   r   __parse_value  s    

zParser.__parse_valuec                 C   s0   | j d u rd| j| j| j|f | _ d| _d S d S )Nzline %d, column %d, byte %d: %sT)rP   rH   rI   rJ   rO   )rQ   messager   r   r   __error  s   

zParser.__errorc                 C   sr   d}	 | j s|t|kr|S || }| |r8|  jd7  _|dkr-d| _|  jd7  _n|  jd7  _|d7 }q)Nr   Tru   r   )rO   r    _Parser__lex_inputrJ   rI   rH   )rQ   r5   ir,   r   r   r   r     s   
zParser.feedc                 C   s   | j S r9   )rO   ro   r   r   r   is_done  s   zParser.is_donec                 C   s   | j tjkrn| j tjtjfv r| d n| d | jtjkr'| d n| jtj	kr2| d | j
d u rEt| jdks@J | j S | j
S )Nz(unexpected end of input in quoted stringr(   zempty input streamzunexpected end of inputru   )rF   r   rE   r^   r   rb   r  rL   rK   r   rP   r    rM   r   ro   r   r   r   r!     s   



zParser.finish)Fr9   )8__name__
__module____qualname__r   r?   rR   _Parser__lex_start_space_Parser__lex_start_alpha_Parser__lex_start_token_Parser__lex_start_number_Parser__lex_start_stringri   rg   r,   rE   rr   rs   rV   r   compilery   r   r\   r   r   staticmethodr   r   r   r   r   r   r^   r  rK   r   r   r   r   r   r   r   r   r   rY   r   r   r   r   r   r   rb   r   r  r!   __classcell__r   r   rC   r   r   T   s    







>




	.

r   )FT)
__future__r   	functoolsjsonr   r}   r;   	PARSER_PY	ovs._jsonr<   r:   ImportError__pychecker__r   partialdumpsr   r   r   r   r$   r'   r8   r2   r   r   r   r   r   <module>   s.   


	