B
    Sc%                 @   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               @   s   e Zd ZdS )PSTokenErrorN)__name__
__module____qualname__ r   r   3lib/python3.7/site-packages/fontTools/misc/psLib.pyr   6   s    r   c               @   s   e Zd ZdS )PSErrorN)r   r   r   r   r   r   r    r!   7   s    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k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 )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|| }	|	|kr|	dkrPd}
|	}n|	dkr|d}
||| \}}||| }n|	dkrd}
|||}|d krtd| | \}}||| }nR|	d	krd
}
|||}|d krtd| | \}}||| }ntd| nZ|	dkr2d}
|||d }nd}
|||}|d krVt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&   r=   )r)   Z
whitematchrC   rD   r   r   r    r<      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 )NrH   )hasattrrH   r$   )r)   r   r   r    	stopeexec   s    
zPSTokenizer.stopeexecN)r   r#   )r+   )r   r   r   r*   r0   r1   r%   r>   stringREmatchhexstringRE	commentREendofthingRErF   skipwhiteREr<   rJ   rL   r   r   r   r    r"   :   s   
	
/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)rT   r   r[   r   do_makearrayr   r   r
   r   suckoperators	__class__)r)   rY   r   r   r    rX      s    
zPSInterpreter.fillsystemdictc             C   sp   xNt |D ]B}t| |}t|tr
|d d dkr
|dd  }t||||< q
W x|jD ]}| || qXW d S )N   Zps_)dirgetattr
isinstancer   r   	__bases__r`   )r)   rY   klassnameattrZ	baseclassr   r   r    r`      s    
zPSInterpreter.suckoperatorsc             C   s   t || j }| _|j}| j}| j}yXxD| \}}|s8P |rP|| |}	|	|}
n||}
|
d k	r(||
 q(W |  d | _W nV   | jd k	rtd| jj	| jj
d | jj
 | jj	| jj
| jj
d    Y nX d S )Nz/ps error:
- - - - - - -
%s
>>>
%s
- - - - - - -2   )r"   r(   	tokenizerrF   do_tokenhandle_objectr1   logdebugr$   r&   )r)   datard   rk   rF   rl   rm   rA   rB   Zhandlerobjectr   r   r    	interpret   s0    




zPSInterpreter.interpretc             C   sl   | j s^|js^|jdks^|jdkr,| |j}|jr>| | qh|jdkrT| | qh|  n
| | d S )NproceduretypeZoperatortype)rV   literaltyperesolve_namevaluepushcall_procedureZfunction)r)   rq   r   r   r    rm      s    


zPSInterpreter.handle_objectc             C   s"   | j }x|jD ]}|| qW d S )N)rm   rw   )r)   procrm   itemr   r   r    ry      s    zPSInterpreter.call_procedurec             C   sP   | j }x4tt|d ddD ]}||| kr|| | S qW tdt| d S )Nr   r+   zname error: )rT   ranger%   r!   str)r)   rh   rT   ir   r   r    rv      s
    zPSInterpreter.resolve_namec       
      C   s   y||}W n t tfk
r   y||}W n t tfk
r   d|kr|d}y*||d | }	|||d d  |	}W n t tfk
r   ||S X ||S n||S Y n
X ||S Y n
X ||S d S )N#r   )r,   OverflowErrorfind)
r)   rB   intfloatr   r   r   ZnumZhashposbaser   r   r    rl      s"    


zPSInterpreter.do_tokenc             C   s   d S )Nr   )r)   rB   r   r   r    r4     s    zPSInterpreter.do_commentc             C   s   t |dd  S )Nr   )r   )r)   rB   r   r   r    r:     s    zPSInterpreter.do_literalc             C   s   t |dd S )Nr   r+   )r   )r)   rB   r   r   r    r6     s    zPSInterpreter.do_stringc          	   C   sz   d |dd  }t|d r*|d }g }x8tdt|dD ]$}|tt|||d  d q@W d |}t|S )Nr;   r   r+      0r      )joinsplitr%   r|   appendchrr   r   )r)   rB   ZhexStrZcleanstrr~   r   r   r    r8     s    $
zPSInterpreter.do_hexstringc             C   s   |dkr| j d | _ | jS |dkrfg }x"|  }|| jkr<P || q(W | j d | _ |  t|S |dkrt| jS |dkrtdS tdd S )N{r   }rZ   r\   zhuh?)	rV   rW   popr   reverser   r[   r   r   )r)   rB   rz   	topobjectr   r   r    r2   )  s$    
zPSInterpreter.do_specialc             C   s   | j | d S )N)rU   r   )r)   rq   r   r   r    rx   >  s    zPSInterpreter.pushc             G   sH   | j }|std|d }|r>|j|kr>tdt||jf |d= |S )Nzstack underflowr+   z typecheck, expected %s, found %s)rU   r!   ru   repr)r)   typesrU   rq   r   r   r    r   A  s    
zPSInterpreter.popc             C   sB   g }x"|   }|| jkrP || qW |  | t| d S )N)r   r[   r   r   rx   r   )r)   Zarrayr   r   r   r    r_   L  s    
zPSInterpreter.do_makearrayc             C   s   | ` | `dS )zRemove circular references.N)rU   rT   )r)   r   r   r    r1   V  s    zPSInterpreter.closeN)r#   )r   r   r   r*   rX   r`   rd   rr   rm   ry   rv   r   r   r   r   r   rl   r4   r:   r6   r8   r2   rx   r   r_   r1   r   r   r   r    rS      s*   


	 

rS   c             C   s   t | j}|tkr<i }x| j D ]\}}t|||< q"W n\|tkrd gt| j }x(tt| jD ]}t| j| ||< qdW | j dkrt|}n| j}|S )Nrs   )	ru   rw   dictitemsunpack_itemlistr%   r|   tuple)r{   tpnewitemkeyrw   r~   r   r   r    r   \  s    


r   r#   c             C   s   t d| }|r$|d}| }nd }t|d}|d ||  |jd d j}||krh|| }n6t|	 }t
|dkr|d |  ||d  }|  t|S )Ns    /FontName\s+/([^ \t\n\r]+)\s+defr   )r(   sC   /Helvetica 4 dict dup /Encoding StandardEncoding put definefont popr   r^   Z	Helvetica)researchgroupdecoderS   rr   rT   rw   r   keysr%   removesortr1   r   )rp   r(   rE   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   rn   r>   compilerR   ZendofthingPatrQ   rP   Z	stringPatr   r   rM   rO   	Exceptionr   r!   rq   r"   rS   r   r   r   r   r   r    <module>   s.   @



g <