o
    a%                     @   sZ  d dl mZmZmZmZmZ d dlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZ d dlZd dlmZ d dlmZ d dlZeeZdZ e!ed	ed
gZ"eded
gZ#e!e#Z$e!dZ%dZ&d'e&( Z&e!e&Z)e!ededgZ*G dd de+Z,G dd de+Z-G dd de.Z/G dd de	Z0dd Z1dddZ2dS )    )bytechrbyteord	bytesjointobytestostr)eexec   )PSOperatorsps_StandardEncodingps_array
ps_booleanps_dict
ps_integer
ps_literalps_markps_nameps_operatorps_procedureps_procmarkps_real	ps_stringN)Callable)
whitespaces	   ()<>[]{}%   [s   ]*s   [^][(){}<>/%s   %[^
]*sf   
	\(
		(
			(
				[^()]*   \   [()]
			)
			|
			(
				[^()]*  \(   [^()]*  \)
			)
		)*
		[^()]*
	\)
    s   <[s   0-9A-Fa-f]*>c                   @      e Zd ZdS )PSTokenErrorN__name__
__module____qualname__ r!   r!   6/usr/lib/python3/dist-packages/fontTools/misc/psLib.pyr   6       r   c                   @   r   )PSErrorNr   r!   r!   r!   r"   r$   7   r#   r$   c                   @   sd   e Zd ZdddZdddZdd	 Zeeej	e
j	ej	ej	fd
dZej	fddZdd Zdd ZdS )PSTokenizerr   asciic                 C   s.   t |}|| _t|| _d| _d| _|| _d S )Nr   F)r   buflenposclosedencoding)selfr'   r+   r!   r!   r"   __init__<   s   

zPSTokenizer.__init__c                 C   sR   | j rtd|du s|dk r| j}n	t| j| | j}| j| j| }|| _|S )zRead at most 'n' bytes from the buffer, or less if the read
		hits EOF before obtaining 'n' bytes.
		If 'n' is negative or omitted, read all data until EOF is reached.
		zI/O operation on closed fileNr   )r*   
ValueErrorr(   minr)   r'   )r,   nZnewposrr!   r!   r"   readE   s   zPSTokenizer.readc                 C   s   | j sd| _ | `| `d S d S )NT)r*   r'   r)   r,   r!   r!   r"   closeT   s   zPSTokenizer.closec                 C   s  |    | j| jkrdS | j}| j}tt|| }	|	|v r|	dv r'd}
|	}n|	dkr=d}
||| \}}||| }nu|	dkr_d}
|||}|d u rRtd| | \}}||| }nS|	d	krd
}
|||}|d u rttd| | \}}||| }n1td| |	dkrd}
|||d }nd}
|||}|d u rtd| | \}}||| }||| | _t|| j	d}|
|fS )N)NNs   {}[]
do_special   %
do_comment   (	do_stringzbad string at character %d   <do_hexstringzbad hexstring at character %dzbad token at character %d   /
do_literalr    r+   )
	skipwhiter)   r(   r'   r   r   spanr   r   r+   )r,   r(   
ps_specialZstringmatchZhexstringmatchZcommentmatchendmatchr)   r'   char	tokentypetoken_nextposmr!   r!   r"   getnexttokenY   sR   	


zPSTokenizer.getnexttokenc                 C   s    || j | j \}}|| _d S N)r'   r)   rB   )r,   Z
whitematchrH   rI   r!   r!   r"   rA      s   
zPSTokenizer.skipwhitec                 C   sH   | j d | _ | j| j d  | _t| jd\| _}t| j| _d| _ d S )Nr   iq     )r)   r'   dirtybufr   Zdecryptr(   )r,   Rr!   r!   r"   
starteexec   s
   
zPSTokenizer.starteexecc                 C   s   t | dsd S | j| _| `d S )NrN   )hasattrrN   r'   r4   r!   r!   r"   	stopeexec   s   
zPSTokenizer.stopeexecN)r   r&   )r.   )r   r   r    r-   r3   r5   r(   rC   stringREmatchhexstringRE	commentREendofthingRErK   skipwhiteRErA   rP   rR   r!   r!   r!   r"   r%   :   s    

	
6r%   c                   @   s   e Zd Zd%ddZdd Zdd Zefdd	Zd
d Zdd Z	dd Z
eeeeefddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$S )&PSInterpreterr&   c                 C   s8   i }i }|| _ ||g| _g | _d| _t | _|   d S )Nr   )r+   	dictstackstack	proclevelr   procmarkfillsystemdict)r,   r+   
systemdictZuserdictr!   r!   r"   r-      s   
zPSInterpreter.__init__c                 C   st   | j d }t  |d<  |d< | _td| j|d< td|d< td|d< tt|d< ti |d	< | 	|| j
 d S )
Nr   [mark]r   trueZfalseZStandardEncodingFontDirectory)rZ   r   ra   r   do_makearrayr   r   r
   r   suckoperators	__class__)r,   r_   r!   r!   r"   r^      s   
zPSInterpreter.fillsystemdictc                 C   sh   t |D ]!}t| |}t|tr%|d d dkr%|dd  }t||||< q|jD ]}| || q)d S )N   Zps_)dirgetattr
isinstancer   r   	__bases__rf   )r,   r_   klassnameattrZ	baseclassr!   r!   r"   rf      s   

zPSInterpreter.suckoperatorsc                 C   s   t || j }| _|j}| j}| j}z,	 | \}}|sn|r(|| |}	|	|}
n||}
|
d ur4||
 q|  d | _W d S    | jd urftd| jj	| jj
d | jj
 | jj	| jj
| jj
d    )Nr   z/ps error:
- - - - - - -
%s
>>>
%s
- - - - - - -2   )r%   r+   	tokenizerrK   do_tokenhandle_objectr5   logdebugr'   r)   )r,   datarj   rq   rK   rr   rs   rF   rG   Zhandlerobjectr!   r!   r"   	interpret   s4   



	zPSInterpreter.interpretc                 C   sr   | j s2|js2|jdks2|jdkr| |j}|jr | | d S |jdkr,| | d S |  d S | | d S )NproceduretypeZoperatortype)r\   literaltyperesolve_namevaluepushcall_procedurefunctionr,   rw   r!   r!   r"   rs      s   

zPSInterpreter.handle_objectc                 C   s   | j }|jD ]}|| qd S rL   )rs   r}   )r,   procrs   itemr!   r!   r"   r      s   

zPSInterpreter.call_procedurec                 C   sL   | j }tt|d ddD ]}||| v r|| |   S qtdt| )Nr   r.   zname error: )rZ   ranger(   r$   str)r,   rn   rZ   ir!   r!   r"   r|      s   zPSInterpreter.resolve_namec           
      C   s   z	||}W ||S  t tfyj   z||}W nK t tfyc   d|v r[|d}z||d | }	|||d d  |	}W n t tfyR   || Y  Y  Y S w || Y  Y S || Y  Y S w || Y S w )N#r   )r/   OverflowErrorfind)
r,   rG   intfloatr   r   r   ZnumZhashposbaser!   r!   r"   rr      s(   

zPSInterpreter.do_tokenc                 C   s   d S rL   r!   r,   rG   r!   r!   r"   r8     s   zPSInterpreter.do_commentc                 C   s   t |dd  S )Nr   )r   r   r!   r!   r"   r>        zPSInterpreter.do_literalc                 C   s   t |dd S )Nr   r.   )r   r   r!   r!   r"   r:     r   zPSInterpreter.do_stringc              	   C   sv   d |dd  }t|d r|d }g }tdt|dD ]}|tt|||d  d qd |}t|S )Nr?   r   r.      0r      )joinsplitr(   r   appendchrr   r   )r,   rG   ZhexStrZcleanstrr   r!   r!   r"   r<     s   "
zPSInterpreter.do_hexstringc                 C   s   |dkr| j d | _ | jS |dkr2g }	 |  }|| jkrn|| q| j d | _ |  t|S |dkr9| jS |dkrAtdS td)N{r   }r`   rb   zhuh?)	r\   r]   popr   reverser   ra   r   r   )r,   rG   r   	topobjectr!   r!   r"   r6   )  s&   

zPSInterpreter.do_specialc                 C   s   | j | d S rL   )r[   r   r   r!   r!   r"   r~   >  r   zPSInterpreter.pushc                 G   sH   | j }|s	td|d }|r|j|vrtdt||jf |d= |S )Nzstack underflowr.   z typecheck, expected %s, found %s)r[   r$   r{   repr)r,   typesr[   rw   r!   r!   r"   r   A  s   
zPSInterpreter.popc                 C   s@   g }	 |   }|| jkrn|| q|  | t| d S rL   )r   ra   r   r   r~   r   )r,   Zarrayr   r!   r!   r"   re   L  s   

zPSInterpreter.do_makearrayc                 C   s   | ` | `dS )zRemove circular references.N)r[   rZ   r4   r!   r!   r"   r5   V  s   zPSInterpreter.closeNr&   )r   r   r    r-   r^   rf   rj   rx   rs   r   r|   r   r   r   r   r   rr   r8   r>   r:   r<   r6   r~   r   re   r5   r!   r!   r!   r"   rY      s.    


	 


rY   c                 C   s   t | j}|tkri }| j D ]
\}}t|||< q|S |tkrGd gt| j }tt| jD ]}t| j| ||< q0| j dkrEt|}|S | j}|S )Nry   )	r{   r}   dictitemsunpack_itemlistr(   r   tuple)r   tpZnewitemkeyr}   r   r!   r!   r"   r   \  s   
	
r   r&   c                 C   s   t d| }|r|d}| }nd }t|d}|d ||  |jd d j}||v r4|| }nt|	 }t
|dkrE|d |  ||d  }|  t|S )Ns    /FontName\s+/([^ \t\n\r]+)\s+defr   r@   sC   /Helvetica 4 dict dup /Encoding StandardEncoding put definefont popr   rd   Z	Helvetica)researchgroupdecoderY   rx   rZ   r}   r   keysr(   removesortr5   r   )rv   r+   rJ   ZfontNameZinterpreterZfontdirZrawfontZ	fontNamesr!   r!   r"   suckfontl  s$   






r   r   )3ZfontTools.misc.textToolsr   r   r   r   r   ZfontTools.miscr   ZpsOperatorsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   Zcollections.abcr   stringr   ZloggingZ	getLoggerr   rt   rC   compilerX   ZendofthingPatrW   rV   Z	stringPatr   r   rS   rU   	Exceptionr   r$   rw   r%   rY   r   r   r!   r!   r!   r"   <module>   s0    @



g <