
    jkeC/                     R   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j:                  e      ZdZ  ejB                   ed	ed
g            Z" eded
g      Z# ejB                  e#      Z$ ejB                  d      Z%dZ&djO                  e&jQ                               Z& ejB                  e&      Z) ejB                   ededg            Z* G d de+      Z, G d de+      Z- G d de.      Z/ G d de	      Z0d Z1ddZ2y)    )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y)PSTokenErrorN__name__
__module____qualname__ r   6/usr/lib/python3/dist-packages/fontTools/misc/psLib.pyr   r   7       r   r   c                       e Zd Zy)PSErrorNr   r"   r   r#   r&   r&   ;   r$   r   r&   c                       e Zd Zd	dZd
dZd Zeeej                  e
j                  ej                  ej                  fdZej                  fdZd Zd Zy)PSTokenizerc                 r    t        |      }|| _        t        |      | _        d| _        d| _        || _        y )Nr   F)r   buflenposclosedencoding)selfr*   r.   s      r#   __init__zPSTokenizer.__init__@   s2    cls8 r   c                     | j                   rt        d      ||dk  r| j                  }n#t        | j                  |z   | 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 filer   )r-   
ValueErrorr+   minr,   r*   )r/   nnewposrs       r#   readzPSTokenizer.readI   sc    
 ;;;<<9AXXFAtxx0FHHTXX'r   c                 4    | j                   sd| _         | `| `y y )NT)r-   r*   r,   r/   s    r#   closezPSTokenizer.closeX   s    {{DK$( r   c                     | j                          | j                  | j                  k\  ry| j                  }| j                  }t	        t        ||               }	|	|v r|	dv rd}
|	}n|	dk(  r"d}
 |||      j                         \  }}||| }n|	dk(  r4d}
 |||      }|t        d|z        |j                         \  }}||| }n|	d	k(  r4d
}
 |||      }|t        d|z        |j                         \  }}||| }nUt        d|z        |	dk(  rd}
 |||dz         }nd}
 |||      }|t        d|z        |j                         \  }}||| }| ||      z   | _        t        || j                        }|
|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_specialstringmatchhexstringmatchcommentmatchendmatchr,   r*   char	tokentypetoken_nextposms                  r#   getnexttokenzPSTokenizer.getnexttoken]   s    	88txxhhhhws3x():w(	(	)#s388:
7C('	S)9&'Cc'IJJVVX
7C(*	"3,9&'F'LMMVVX
7C("#>#DEEt|(	S#'*	S#&y"#>#DEEJAwG$EU#edmm4%r   c                 n     || j                   | j                        j                         \  }}|| _        y N)r*   r,   rH   )r/   
whitematchrQ   rR   s       r#   rG   zPSTokenizer.skipwhite   s*    $((388:
7r   c                     | j                   dz   | _         | j                  | j                   d  | _        t        j                  | j                  d      \  | _        }t        | j                        | _        d| _         y )Nr	   iq     )r,   r*   dirtybufr   decryptr+   )r/   Rs     r#   
starteexeczPSTokenizer.starteexec   sW    88a<,mmDMM59!txx=r   c                 D    t        | d      sy | j                  | _        | `y )NrZ   )hasattrrZ   r*   r9   s    r#   	stopeexeczPSTokenizer.stopeexec   s    tZ(==Mr   N)r   ascii))r   r    r!   r0   r7   r:   r+   rI   stringREmatchhexstringRE	commentREendofthingRErT   skipwhiteRErG   r]   r`   r"   r   r#   r(   r(   ?   sY    !# NN"((__##5 n $/#4#4 r   r(   c                       e Zd ZddZd Zd ZefdZd Zd Z	d Z
eeeeefdZd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zy)PSInterpreterc                     i }i }|| _         ||g| _        g | _        d| _        t	               | _        | j                          y )Nr   )r.   	dictstackstack	proclevelr   procmarkfillsystemdict)r/   r.   
systemdictuserdicts       r#   r0   zPSInterpreter.__init__   sB    
 $h/
#r   c                 6   | j                   d   }t               x|d<   x|d<   | _        t        d| j                        |d<   t        d      |d<   t        d      |d<   t        t              |d<   t        i       |d	<   | j                  || j                         y )
Nr   [mark]r	   truefalseStandardEncodingFontDirectory)rl   r   ru   r   do_makearrayr   r   r   r   suckoperators	__class__)r/   rq   s     r#   rp   zPSInterpreter.fillsystemdict   s    ^^A&
;B9D
3D*V,ty%c4+<+<=
3']
6(m
7)12E)F
%&&-bk
?#:t~~6r   c                     t        |      D ]<  }t        | |      }t        |t              s |d d dk(  s)|dd  }t	        ||      ||<   > |j
                  D ]  }| j                  ||        y )N   ps_)dirgetattr
isinstancer   r   	__bases__r|   )r/   rq   klassnameattr	baseclasss         r#   r|   zPSInterpreter.suckoperators   sy    J 	;D4&D$)d2Ah%.?ABx#.tT#:
4 		;
  	6Iz95	6r   c           	      z   t        || j                        x}| _        |j                  }| j                  }| j
                  }	 	  |       \  }}|sn'|r || |      }	 |	|      }
n ||      }
|
 ||
       4|j                          d | _        y #  | j                  t        j                  d| j                  j                  | j                  j                  dz
  | j                  j                   | j                  j                  | j                  j                  | j                  j                  dz            xY w)Nz/ps error:
- - - - - - -
%s
>>>
%s
- - - - - - -2   )r(   r.   	tokenizerrT   do_tokenhandle_objectr:   logdebugr*   r,   )r/   datar   r   rT   r   r   rO   rP   handlerobjects              r#   	interpretzPSInterpreter.interpret   s   %0t}}%EE	DN --==**	#/> 	5%dI6G$U^F%e_F%!&)  OO!DN	~~)		$ NN&&t~~'9'9B'>ASASTNN&&t~~'9'9DNN<N<NQS<ST	 s   AB B*D:c                 h   | j                   s|j                  s|j                  dk(  sz|j                  dk7  r| j                  |j                        }|j                  r| j                  |       y |j                  dk(  r| j                  |       y |j                          y | j                  |       y )Nproceduretypeoperatortype)rn   literaltyperesolve_namevaluepushcall_procedurefunctionr/   r   s     r#   r   zPSInterpreter.handle_object   s}    &..FKK?4R{{n,**6<<8~~		&!;;/1''/OO%IIfr   c                 N    | j                   }|j                  D ]
  } ||        y rV   )r   r   )r/   procr   items       r#   r   zPSInterpreter.call_procedure   s(    **JJ 	 D$	 r   c                     | j                   }t        t        |      dz
  dd      D ]  }|||   v s||   |   c S  t        dt	        |      z         )Nr	   rb   zname error: )rl   ranger+   r&   str)r/   r   rl   is       r#   r   zPSInterpreter.resolve_name   s]    NN	s9~)2r2 	*Ay|# |D))	* ns4y011r   c                 h   	  ||      } ||      S # t         t        f$ r 	  ||      } ||      cY S # t         t        f$ rj d|v rY|j                  d      }	  ||d |       }	 |||dz   d  |	      } ||      cY cY S # t         t        f$ r  ||      cY cY cY S w xY w ||      cY cY S w xY ww xY w)N#r	   )r2   OverflowErrorfind)
r/   rP   intfloatr   r   r   numhashposbases
             r#   r   zPSInterpreter.do_token   s    	#e*C& c?"% M* 	$$El s|# . *%<#jjoG/"5'?3!%!"6=  *#. '6 .&u~-.
 #5>)*	$sY    B14B1$B-A?3B-;B1?BB-B1BB-(B1,B--B1c                      y rV   r"   r/   rP   s     r#   r>   zPSInterpreter.do_comment  s    r   c                     t        |dd        S )Nr	   )r   r   s     r#   rD   zPSInterpreter.do_literal!  s    %)$$r   c                     t        |dd       S )Nr	   rb   )r   r   s     r#   r@   zPSInterpreter.do_string$  s    q%%r   c                 2   dj                  |dd j                               }t        |      dz  r|dz   }g }t        dt        |      d      D ],  }|j	                  t        t        |||dz    d                   . dj                  |      }t        |      S )NrE   r	   rb      0r      )joinsplitr+   r   appendchrr   r   )r/   rP   hexStrcleanstrr   s        r#   rB   zPSInterpreter.do_hexstring'  s    q**,-v;?c\Fq#f+q) 	=AOOCF1q1u$5r :;<	=778$""r   c                 v   |dk(  r | j                   dz   | _         | j                  S |dk(  rdg }	 | j                         }|| j                  k(  rn|j                  |       2| j                   dz
  | _         |j	                          t        |      S |dk(  r| j                  S |dk(  rt        d      S t        d      )N{r	   }rt   rv   zhuh?)	rn   ro   popr   reverser   ru   r   r   )r/   rP   r   	topobjects       r#   r<   zPSInterpreter.do_special1  s    C<!^^a/DN== c\D HHJ	-I&	 
 "^^a/DNLLN%%c\99c\3<v&&r   c                 :    | j                   j                  |       y rV   )rm   r   r   s     r#   r   zPSInterpreter.pushF  s    

&!r   c                     | j                   }|st        d      |d   }|r2|j                  |vr$t        dt        |      d|j                        |d= |S )Nzstack underflowrb   ztypecheck, expected z, found )rm   r&   r   repr)r/   typesrm   r   s       r#   r   zPSInterpreter.popI  s]    

+,,r{{%':>u+v{{S  "Ir   c                     g }	 | j                         }|| j                  k(  rn|j                  |       2|j                          | j	                  t        |             y rV   )r   ru   r   r   r   r   )r/   arrayr   s      r#   r{   zPSInterpreter.do_makearrayV  sP    
IDII%LL#	 
 			(5/"r   c                     | ` | `y)zRemove circular references.N)rm   rl   r9   s    r#   r:   zPSInterpreter.close`  s    JNr   Nra   )r   r    r!   r0   rp   r|   r   r   r   r   r   r   r   r   r   r   r   r>   rD   r@   rB   r<   r   r   r{   r:   r"   r   r#   rj   rj      sn    76 '. B 
2 #>%&#'*"#r   rj   c                    t        | j                        }|t        k(  r4i }| j                  j                         D ]  \  }}t	        |      ||<    |S |t
        k(  rsd gt        | j                        z  }t        t        | j                              D ]  }t	        | j                  |         ||<    | j                   dk(  rt        |      }|S | j                  }|S )Nr   )	r   r   dictitemsunpack_itemlistr+   r   tuple)r   tpnewitemkeyr   r   s         r#   r   r   f  s    	djj	B	Tz****, 	.JC&u-GCL	. N 
t&3tzz?*s4::' 	4A$TZZ]3GAJ	499'GnG N **Nr   c                    t        j                  d|       }|r"|j                  d      }|j                         }nd }t	        |      }|j                  d       |j                  |        |j                  d   d   j                  }||v r||   }nPt        |j                               }t        |      dkD  r|j                  d       |j                          ||d      }|j                          t        |      S )Ns    /FontName\s+/([^ \t\n\r]+)\s+defr	   rF   sC   /Helvetica 4 dict dup /Encoding StandardEncoding put definefont popr   rz   	Helvetica)researchgroupdecoderj   r   rl   r   r   keysr+   removesortr:   r   )r   r.   rS   fontNameinterpreterfontdirrawfont	fontNamess           r#   suckfontr   w  s    
		6=A771:??$2KN $##A&7==G7(# (	y>A[))A,'wr   r   )3fontTools.misc.textToolsr   r   r   r   r   fontTools.miscr   psOperatorsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   collections.abcr   stringr   logging	getLoggerr   r   rI   compilerh   endofthingPatrg   rf   	stringPatr   r   rc   re   	Exceptionr   r&   r   r(   rj   r   r   r"   r   r#   <module>r      s    P P       
 $   g!
bjjD*e#<=>?J>?rzz-(BJJ|$		 HHY__&'	2::i bjjE:#GHI	9 		i 	d& dN}K }@" r   