§
    Ü+ög2l  ã                   óð  — d Z ddlZddlZddlZddlmZmZmZ  G d„ dej        ¦  «        Z	dZ
dZdZ	 dZ	 d	Z	 d
dgZej        rg ZdZ	 dZddddddddddddœZ	  ej        dej        ej        z  ¦  «        Z	  ej        d¦  «        Z	  ej        d¦  «        Z	  ej        dej        ¦  «        Z	  ej        dej        ¦  «        Z	  ej        dej        ej        z  ¦  «        Z	 d„  edd¦  «        D ¦   «         Z	 dd d!d"d#d$d%d&d'd(d)œ
Z 	 d*Z!	 d+Z"	 d,Z#	 d-Z$	 d.Z%	 e!e$e#e"gZ&	 g d/¢Z'	  ej        d (                    d0„  ee&e'¦  «        D ¦   «         ¦  «        ej)        ¦  «        Z*	 d1Z+	 d*Z,	 d2Z-	 d-Z.	 d3„ Z/i Z0	 g d4¢Z1 e2e1¦  «        D ]!\  Z3Z4e4 5                    ¦   «         D ]Z6e3e0e6<   ŒŒ"d5„ Z7d6„ Z8d7„ Z9d8„ Z:d9„ Z;d:„ Z<g fd;„Z=d<„ Z>d=„ Z? ej        d>¦  «        Z@d?„ ZAd@„ ZBdA„ ZCdB„ ZDdC„ ZE G dD„ dEeF¦  «        ZGdF„ ZHdS )GaÁ  
C/C++ preprocessor for finding dependencies

Reasons for using the Waf preprocessor by default

#. Some c/c++ extensions (Qt) require a custom preprocessor for obtaining the dependencies (.moc files)
#. Not all compilers provide .d files for obtaining the dependencies (portability)
#. A naive file scanner will not catch the constructs such as "#include foo()"
#. A naive file scanner will catch unnecessary dependencies (change an unused header -> recompile everything)

Regarding the speed concerns:

* the preprocessing is performed only when files must be compiled
* the macros are evaluated only for #if/#elif/#include
* system headers are not scanned by default

Now if you do not want the Waf preprocessor, the tool +gccdeps* uses the .d files produced
during the compilation to track the dependencies (useful when used with the boost libraries).
It only works with gcc >= 4.4 though.

A dumb preprocessor is also available in the tool *c_dumbpreproc*
é    N)ÚLogsÚUtilsÚErrorsc                   ó   — e Zd ZdS )ÚPreprocErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    ú+/git_repos/avwlv2/waflib/Tools/c_preproc.pyr   r       s   € € € € € Ø€r   r   i † ú-é–   Fz/usr/local/includez/usr/includeú!ú&&z&=ú||z|=ú^z^=ú&ú|ú~)ÚnotÚnot_eqÚandÚand_eqÚorÚor_eqÚxorÚxor_eqÚbitandÚbitorÚcomplzc^[ 	]*(?:#|%:)[ 	]*(ifdef|ifndef|if|else|elif|endif|include|import|define|undef|pragma)[ 	]*(.*)*$z^[a-zA-Z_]\w*z^[a-zA-Z_][a-zA-Z0-9_]*[(]z^\s*once\s*z\\*
z7//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"c                 ó"   — g | ]\  }}d |z   |f‘ŒS )z??r   )Ú.0ÚaÚbs      r   ú
<listcomp>r&   ]   s$   € ÐCÐCÐC™D˜A˜qˆT�!‰V�QˆKÐCÐCÐCr   z	=-/!'()<>z	#~\|^[]{}é   é   é	   é
   é   é   é   é\   é'   )
Ú0r$   r%   ÚtÚnÚfÚvÚrú\ú'ÚiÚOÚTÚsÚc)a$  0[xX](?P<hex>[a-fA-F0-9]+)(?P<qual1>[uUlL]*)|L*?'(?P<char>(\\.|[^\\'])+)'|(?P<n1>\d+)[Ee](?P<exp0>[+-]*?\d+)(?P<float0>[fFlL]*)|(?P<n2>\d*\.\d+)([Ee](?P<exp1>[+-]*?\d+))?(?P<float1>[fFlL]*)|(?P<n4>\d+\.\d*)([Ee](?P<exp2>[+-]*?\d+))?(?P<float2>[fFlL]*)|(?P<oct>0*)(?P<n0>\d+)(?P<qual2>[uUlL]*)zL?"([^"\\]|\\.)*"z[a-zA-Z_]\w*z’%:%:|<<=|>>=|\.\.\.|<<|<%|<:|<=|>>|>=|\+\+|\+=|--|->|-=|\*=|/=|%:|%=|%>|==|&&|&=|\|\||\|=|\^=|:>|!=|##|[\(\)\{\}\[\]<>\?\|\^\*\+&=:!#;,%/\-\?\~\.]c                 ó&   — g | ]\  }}d |›d|›d�‘ŒS )z(?P<ú>ú)r   )r#   ÚnameÚparts      r   r&   r&   }   s+   € Ð iÐ iÐ iÁÀÀtÀt°°°°t°t°tÐ!<Ð iÐ iÐ ir   r$   Úuc                 óJ   — |                       ¦   «         }|d         dk    rdS |S )zCReplace function used with :py:attr:`waflib.Tools.c_preproc.re_cpp`r   ú/ú )Úgroup)Úmr;   s     r   ÚreplrH   Œ   s&   € à‡W‚W�Y„Y€Ø€a„DˆC‚K€KØ	ˆØ	€r   )z* / %z+ -z<< >>z	< <= >= >z== !=z& | ^z&& ||ú,c                 ó¸  — 	 d| z   }n# t           $ r t          | ¦  «        }Y nw xY w	 d|z   }n# t           $ r t          |¦  «        }Y nw xY w|}|dk    r||z  }�n~|dk    r||z   }�nq|dk    r||z
  }�nd|dk    r||z  }�nW|dk    r||z  }�nJ|dk    r||z  }�n=|dk    rt          ||k    ¦  «        }�n"|d	k    s|d
k    r||z  }�n|dk    s|dk    rt          |p|¦  «        }nñ|dk    s|dk    r||z  }nß|dk    s|dk    rt          |o|¦  «        }nÁ|dk    s|dk    rt          ||k    ¦  «        }n¡|dk    s|dk    rt          ||z  ¦  «        }n‚|dk    rt          ||k    ¦  «        }nh|dk    rt          ||k     ¦  «        }nN|dk    rt          ||k    ¦  «        }n4|dk    rt          ||k    ¦  «        }n|dk    r||z  }n|dk    r||z	  }nd}|S )zõ
	Apply arithmetic rules to compute a result

	:param val1: input parameter
	:type val1: int or string
	:param val2: input parameter
	:type val2: int or string
	:param val_op: C operator in *+*, */*, *-*, etc
	:type val_op: string
	:rtype: int
	r   ú%ú+r   Ú*rD   r   z==r   r    r   r   r   r   r   r   z!=r   r   z<=ú<r>   z>=z<<z>>)Ú	TypeErrorÚint)Úval_1Úval_2Úval_opr$   r%   Údr<   s          r   Úreduce_numsrU   ž   si  € ðØˆ%�i€!€!øÝð ð ð Ý	ˆ%�j„j€!€!€!ðøøøðØˆ%�i€!€!øÝð ð ð Ý	ˆ%�j„j€!€!€!ðøøøð €Øˆ‚H€HØˆ!�e€!�!Øˆ‚f€fØˆ!�e€!�!Øˆ‚f€fØˆ!�e€!�!Øˆ‚f€fØˆ!�e€!�!Øˆ‚f€fØˆ!�e€!�!Øˆ‚f€fØˆ!�e€!�!Øˆ‚g€gÝ	ˆ!ˆqŠ&�k„k€!�!Øˆ‚f€f��g’�Øˆ!�e€!�!Øˆ‚g€g��d’�Ý	ˆ!ˆ&ˆq�k„k€!€!Øˆ‚f€f��h’�Øˆ!�e€!€!Øˆ‚g€g��e’�Ý	ˆ!ˆ'��l„l€!€!Øˆ‚g€g��h’�Ý	ˆ!ˆqŠ&�k„k€!€!Øˆ‚f€f��e’�Ý	ˆ!ˆA‰#�h„h€!€!Øˆ‚g€gÝ	ˆ!ˆqŠ&�k„k€!€!Øˆ‚f€fÝ	ˆ!ˆaŠ%�j„j€!€!Øˆ‚f€fÝ	ˆ!ˆaŠ%�j„j€!€!Øˆ‚g€gÝ	ˆ!ˆqŠ&�k„k€!€!Øˆ‚g€gØˆ1�f€!€!Øˆ‚g€gØˆ1�f€!€!à€!Ø	€s   ‚ ˆ$£$¨. ®A
Á	A
c                 óÀ  — | st          d¦  «        ‚| d         \  }}|t          k    �rw|dk    ržd}d}|t          | ¦  «        k     rL| |         \  }}|t          k    r|dk    r|dz  }|dk    rn6n|dk    r|dz  }|dz  }|t          | ¦  «        k     °Lt          d| z  ¦  «        ‚t          | d|…         ¦  «        \  }}|| |dz   d…         fS |dk    rt	          | dd…         ¦  «        S |d	k    r-t	          | dd…         ¦  «        \  }} t          d
|d¦  «        | fS |dk    r9t	          | dd…         ¦  «        \  }} t          t          |¦  «         ¦  «        | fS |dk    r,t	          | dd…         ¦  «        \  }} t          |¦  «         | fS t          d| z  ¦  «        ‚|t          k    r|| dd…         fS |t          k    rd| dd…         fS t          d| z  ¦  «        ‚)a-  
	Try to obtain a number from a list of tokens. The token types are defined in :py:attr:`waflib.Tools.ccroot.tok_types`.

	:param lst: list of preprocessor tokens
	:type lst: list of tuple (tokentype, value)
	:return: a pair containing the number and the rest of the list
	:rtype: tuple(value, list)
	zempty list for get_numr   ú(é   r?   úrparen expected %rNrL   r   z-1rM   r   r   zInvalid op token %r for get_numzInvalid token %r for get_num)	r   ÚOPÚlenÚget_termÚget_numrU   rP   ÚNUMÚIDENT)ÚlstÚpr4   Ú	count_parr8   ÚnumÚ_s          r   r]   r]   á   s&  € ð 	ð /ÝÐ-Ñ.Ô.Ð.Ø
ˆaŒ&�€!€QØ�‚G�GØˆ#‚X€XØ€9Ø€1Ø	
�S�‰XŒXŠˆØ�ŒV�F€Qˆà�B‚w€wØ	ˆSŠˆØ�1�n€iØ	�aŠˆØð 
à
ˆsŠ(ˆ(Ø�1�n€iØˆ�F€Að 
�S�‰XŒXŠˆõ Ð+¨cÑ1Ñ
2Ô
2Ð2å�s˜1˜Q˜3”xÑ Ô �8€CˆØ��A�a‘C�D�D”	Ð
ÐàˆC‚x€xÝ
�#�a�b�b”'Ñ
Ô
ÐØˆC‚x€xÝ�c˜!˜"˜"”gÑÔ�8€3ˆÝ�t˜S #Ñ&Ô&¨Ð
,Ð,ØˆC‚x€xÝ�c˜!˜"˜"”gÑÔ�8€3ˆÝ•3�s‘8”8ˆ|ÑÔ˜cÐ
"Ð"ØˆC‚x€xÝ�c˜!˜"˜"”gÑÔ�8€3ˆÝ�‰XŒXˆ:�sÐ
Ðå	Ð7¸#Ñ=Ñ	>Ô	>Ð>Ø�3‚h€hØ	
ˆC���ŒGˆÐØ�5‚j€jà	
ˆC���ŒGˆÐåÐ3°cÑ9Ñ:Ô:Ð:r   c                 óp  — | st          d¦  «        ‚t          | ¦  «        \  }} | s|g fS | d         \  }}|t          k    �rå|dk    rt          | dd…         ¦  «        S |dk    r¼d}d}|t	          | ¦  «        k     rS| |         \  }}|t          k    r%|dk    r|dz  }n|dk    r|dz  }n|d	k    r|dk    rn*|dz  }|t	          | ¦  «        k     °St          d
| z  ¦  «        ‚t          |¦  «        rt          | d|…         ¦  «        S t          | |dz   d…         ¦  «        S t          | dd…         ¦  «        \  }} | s+t          |||¦  «        }t          t          |fg| z   ¦  «        S | d         \  }}|t          k    rt          d| z  ¦  «        ‚t          |         t          |         k    r+t          |||¦  «        }t          t          |fg| z   ¦  «        S t          | dd…         ¦  «        \  }	} t          ||	|¦  «        }	t          t          |f||ft          |	fg| z   ¦  «        S t          d| z  ¦  «        ‚)zÑ
	Evaluate an expression recursively, for example::

		1+1+1 -> 2+1 -> 3

	:param lst: list of tokens
	:type lst: list of tuple(token, value)
	:return: the value and the remaining tokens
	:rtype: value, list
	zempty list for get_termr   rI   rX   Nú?r?   rW   ú:rY   zop expected %rzcannot reduce %r)	r   r]   rZ   r\   r[   rP   rU   r^   Úprec)
r`   rc   ra   r4   rb   r8   Únum2Úp2Úv2Únum3s
             r   r\   r\     sp  € ð 	ð 0ÝÐ.Ñ/Ô/Ð/Ý�C‰LŒL�€€cØð Ø
ˆrˆÐØ
ˆaŒ&�€!€QØ�‚G�GØˆ#‚X€Xå
�3�q�r�r”7Ñ
Ô
ÐØˆC‚x€xØ€9Ø€1Ø	
�S�‰XŒXŠˆØ�ŒV�F€Qˆà�B‚w€wØ	ˆSŠˆØ�1�n€i€iØ
ˆsŠ(ˆ(Ø�1�n€i€iØ
ˆsŠ(ˆ(Ø	�aŠˆØØˆ�F€Að 
�S�‰XŒXŠˆõ Ð+¨cÑ1Ñ
2Ô
2Ð2å	ˆ#�h„hð Ý�C˜˜!˜”HÑÔÐå�C˜˜!™˜˜”IÑÔÐõ �s˜1˜2˜2”wÑÔ�9€4ˆà
ð )å�s˜D !Ñ$Ô$€DÝ•c˜4�[�M CÑ'Ñ(Ô(Ð(ð �ŒF�6€2€rØ�B‚h€hÝ
Ð'¨#Ñ-Ñ
.Ô
.Ð.å
ˆ2„h•$�q”'ÒÐÝ�s˜D !Ñ$Ô$€DÝ•c˜4�[�M CÑ'Ñ(Ô(Ð(å˜˜A˜B˜BœÑ Ô �I€Dˆ#Ý�t˜T 2Ñ&Ô&€DÝ•c˜3�Z ! Q ­#¨t¨Ð5¸Ñ;Ñ<Ô<Ð<õ Ð&¨Ñ,Ñ-Ô-Ð-r   c                 ó8   — t          | ¦  «        \  }} t          |fS )z¾
	Take a list of tokens and output true or false for #if/#elif conditions.

	:param lst: a list of tokens
	:type lst: list of tuple(token, value)
	:return: a token
	:rtype: tuple(NUM, int)
	)r\   r^   )r`   rc   s     r   Úreduce_evalrn   \  s   € õ �S‰MŒM�€€cÝ	ˆcˆ
Ðr   c                 óD   — d„ | D ¦   «         } d                      | ¦  «        S )z
	Merge a list of tokens into a string

	:param lst: a list of tokens
	:type lst: list of tuple(token, value)
	:rtype: string
	c                 ó2   — g | ]\  }}t          |¦  «        ‘ŒS r   )Ústr)r#   rj   rk   s      r   r&   zstringize.<locals>.<listcomp>p  s"   € Ð$Ð$Ð$‘H�R˜�ˆB‰ŒÐ$Ð$Ð$r   Ú )Újoin)r`   s    r   Ú	stringizert   h  s'   € ð %Ð$ Ð$Ñ$Ô$€Ø
�Š�‰ŒÐr   c                 óv  — d}| d         t           k    r|d         t           k    rt           }nd| d         t          k    r*|d         t          k    s|d         t          k    rt          }n)| d         t          k    r|d         t          k    rt          }|st          d| ›d|›�¦  «        ‚|| d         |d         z   fS )zõ
	Token pasting works between identifiers, particular operators, and identifiers and numbers::

		a ## b  ->  ab
		> ## =  ->  >=
		a ## 2  ->  a2

	:param t1: token
	:type t1: tuple(type, value)
	:param t2: token
	:type t2: tuple(type, value)
	Nr   z!tokens do not make a valid paste z and rX   )rZ   r_   r^   r   )Út1Út2Úp1s      r   Úpaste_tokensry   s  s®   € ð €Ø€q„E�R‚K€K�B�q”E�R’K�KÝ	€"€"Øˆ„e�u‚n€n˜"˜Qœ%¥5š.˜.¨B¨q¬EµSªL¨LÝ€"€"Øˆ„e�s‚l€l�r˜!”u¥’|�|Ý
€"Ø
ð NÝˆÀRÀRÀRÈÈÐLÑMÔMÐMØ	ˆR�ŒU�R˜”U‰]ÐÐr   c                 ó  — d}|t          | ¦  «        k     �rè| |         \  }}|t          k    r¨|dk    r¢| |= |t          | ¦  «        k     rŠ| |         \  }}|t          k    r ||v rt          df| |<   �nst          df| |<   �ne|t          k    r7|dk    r1| |= | |         \  }}| |= ||v rt          df| |<   �n1t          df| |<   �n#t	          d| z  ¦  «        ‚�n|t          k    �r||v �rþt          ||         t          ¦  «        rt          ||         ¦  «        \  }}	|	||<   ||         }
|
d         }t          |
d         t          ¦  «        rD| |= |dd…         }t          ||||gz   ¦  «         |D ]}|  
                    ||¦  «         |dz  }Œ�nWg }| |= |t          | ¦  «        k    rt	          d|z  ¦  «        ‚| |         \  }}|t          k    s|dk    rt	          d|z  ¦  «        ‚| |= g }d}|t          | ¦  «        k     rë| |         \  }}| |= |t          k    r‘|dk    r‹|dk    r|                     ||f¦  «         |dz  }n–|d	k    r|r|                     |¦  «         nš|d
k    r,|st	          d|z  ¦  «        ‚|                     |¦  «         g }nF|                     ||f¦  «         n.|                     ||f¦  «         |dk    r|dz  }n|d	k    r|dz  }|t          | ¦  «        k     °ët	          d¦  «        ‚g }|
d         }d}|t          |¦  «        k     �rv||         \  }}|t          k    r¯|dk    r©|dz   t          |¦  «        k     rz||dz            d         t          k    r`||dz            d         |v rM||||dz            d                           }|                     t          t          |¦  «        f¦  «         |dz  }�n±|                     ||f¦  «         �n˜|t          k    �r-|dk    �r&|�r|dz   t          |¦  «        k     �rô|d         }||dz            d         t          k    r˜||dz            d         |v r…||||dz            d                           }|r8t          ||d         ¦  «        |d<   |                     |dd…         ¦  «         �nb|                     ||f¦  «         |                     |¦  «         �n4||dz            d         t          k    rþ||dz            d         dk    rég }t          |
d         ¦  «        }t          |¦  «        }|||z
  dz   d…         D ]3}|                     |¦  «         |                     t          d
f¦  «         Œ4|r|                     ¦   «          t          |¦  «        dk    rP|d         \  }}|d         \  }}|dk    r4|                     ¦   «          |d
k    r||k     r|                     ¦   «          ||z  }nt          |||dz            ¦  «        |d<   |dz  }nw|                     ||f¦  «         n_|t          k    r=||v r9|||                  }t          ||||gz   ¦  «         |                     |¦  «         n|                     ||f¦  «         |dz  }|t          |¦  «        k     �°vt          ||||gz   ¦  «         t#          t          |¦  «        dz
  dd¦  «        D ]}|  
                    |||         ¦  «         Œ|dz  }|t          | ¦  «        k     �°ædS dS )a‚  
	Replace the tokens in lst, using the macros provided in defs, and a list of macros that cannot be re-applied

	:param lst: list of tokens
	:type lst: list of tuple(token, value)
	:param defs: macro definitions
	:type defs: dict
	:param ban: macros that cannot be substituted (recursion is not allowed)
	:type ban: list of string
	:return: the new list of tokens
	:rtype: value, list
	r   ÚdefinedrX   rW   úInvalid define expression %rNz!expected ( after %r (got nothing)zexpected ( after %rr?   rI   zempty param in funcall %rzmalformed macroú#ú##éÿÿÿÿÚ__VA_ARGS__éþÿÿÿ)r[   r_   r^   rZ   r   Ú
isinstancerq   Úextract_macroÚlistÚreduce_tokensÚinsertÚappendÚSTRrt   ry   ÚextendÚpopÚrange)r`   ÚdefsÚbanr8   ra   r4   rj   rk   r$   r%   Ú	macro_defÚto_addÚaccuÚtmpÚargsÚ	one_paramÚcount_parenÚ	arg_tableÚjÚtoksrv   Úva_toksÚstÚptÚxÚp3Úv3Úp4Úv4s                                r   r…   r…   ‹  s•  € ð €Ø�3ˆs‰8Œ8‚|�|ØˆqŒ6�&€1€aà�%‚Z€Z�A˜’N�NØ
ˆ1€vØ�#ˆc‰(Œ(‚l€lØ�1Œv�H€RˆØ	�U‚{€{Ø
ˆdˆ
ˆ
Ý�Qˆx€cˆ!�f�få�Qˆx€cˆ!�f�fØ	�rŠˆ�b˜C’i�iØ	ˆQˆØ�A”�X€bˆ"Ø	ˆQˆØ
ˆdˆ
ˆ
Ý�Qˆx€cˆ!�f�få�Qˆx€cˆ!�f�fåÐ6¸Ñ<Ñ=Ô=Ð=ñ! ð$ 	�E‚z�z�a˜4�i‘iå��a”�#ÑÔð Ý˜˜aœÑ!Ô!�D€A€qØ€Dˆ�GØ�AŒw€9Ø�aŒL€6å�˜1”�tÑ$Ô$ð ~àˆAˆØ�!�!�!Œ9€DÝ�$˜˜c 1 #™gÑ&Ô&Ð&Øð ð ˆØ‡Z‚Z��3ÑÔÐØˆ!�V€Q€Qñð €DØˆAˆà�C�‰HŒH‚}€}ÝÐ;¸aÑ?Ñ@Ô@Ð@à�1Œv�H€RˆØ	�R‚x€x�2˜’9�9ÝÐ-°Ñ1Ñ2Ô2Ð2àˆAˆà€IØ€KØ
�c�#‰hŒhŠ,ˆ,Ø�!Œf�V€Rˆà	ˆQˆØ
�bŠˆ�[ AÒ%Ð%Ø	ˆsŠˆØ×Ò˜˜R˜Ñ!Ô!Ð!Ø�aÑ€{€{Ø�Š9ˆ9Ø
ð Ø�Š�IÑÔÐØØ�Š9ˆ9Øð <ÝÐ6¸Ñ:Ñ;Ô;Ð;Ø‡{‚{�9ÑÔÐØ€y€yà×Ò˜˜R˜Ñ!Ô!Ð!Ð!à×Ò˜˜B�xÑ Ô Ð Ø�Š9ˆ9Ø�aÑ€{€{Ø�Š9ˆ9Ø�aÑ€{ð1 �c�#‰hŒhŠ,ˆ,õ4 Ð)Ñ*Ô*Ð*ð €DØ˜!”€IØ	€AØ
�c�&‰kŒkŠ/‰/Ø�q”	�X€bˆ"à
�bŠˆ�R˜3’Y�Yà	
ˆ1‰�s�6‰{Œ{Ò	Ð	˜v a¨¡cœ{¨1œ~µÒ6Ð6¸6À!ÀAÁ#¼;Àq¼>ÈYÐ;VÐ;VØ�9˜V A a¡Cœ[¨œ^Ô,Ô-€tØ‡{‚{•C� 4™œÐ)Ñ*Ô*Ð*ØˆA�v€q�qà‡{‚{�B˜�8ÑÔÐÑØ
•Š(‰(�r˜T’z‘zà	ñ )�!�A‘#�˜F™œÒ#Ñ#ð �ŒH€rà
��1‘Œ+�aŒ.�EÒ
!Ð
! f¨Q¨q©S¤k°!¤n¸	Ð&AÐ&AØ�I˜f Q q¡Sœk¨!œnÔ-Ô.ˆàð 	Ý   T¨!¤WÑ-Ô-ˆˆb‰Ø	�Š�T˜!˜"˜"”XÑ	Ô	Ð	Ñ	ð 
�Š�b˜"�XÑ	Ô	Ð	Ø	�Š�TÑ	Ô	Ð	Ñ	Ø�1�Q‘3ŒK˜ŒN�eÒ#Ð#¨¨q°©s¬°A¬¸-Ò(GÐ(GàˆÝ�˜1”ÑÔˆÝ�‰YŒYˆØ�b˜‘e˜A‘g�h�h”ð 	#ð 	#ˆAØ	�Š˜Ñ	Ô	Ð	Ø	�Š�˜S˜	Ñ	"Ô	"Ð	"Ð	"Øð 	Ø	�Š‰ŒˆÝˆt‰9Œ9�QŠ;ˆ;Ø˜”H‰ˆ"ˆbØ˜”H‰ˆ"ˆbØ�$ŠJˆJà
�(Š(‰*Œ*ˆ*Ø�3ŠYˆY˜2 š7˜7à�8Š8‰:Œ:ˆ:Ø�‰ˆˆå  F¨1¨Q©3¤KÑ0Ô0ˆˆR‰àˆA�v€q€qð ‡{‚{�B˜�8ÑÔÐÐà
•Š+ˆ+˜" 	˜/˜/Ø�)˜B”-Ô €dÝ�D˜$  Q C¡Ñ(Ô(Ð(Ø
‡k‚k�$ÑÔÐÐà
‡k‚k�2�r�(ÑÔÐàˆ!�V€Qð �c�&‰kŒkŠ/‰/õD �$˜˜c 1 #™gÑ&Ô&Ð&å•3�t‘9”9˜Q‘;  BÑ'Ô'ð ð ˆØ‡Z‚Z��4˜”7ÑÔÐÐà€q�&€!ð 	�3ˆs‰8Œ8‚|�|€|€|€|€|r   c                 óì   — t          | |g ¦  «         | st          d¦  «        ‚| r,| d         \  }}|t          k    r||vrt          d| z  ¦  «        ‚t          | ¦  «        \  }}t	          |¦  «        dk    S )a  
	Reduce the tokens by :py:func:`waflib.Tools.c_preproc.reduce_tokens` and try to return a 0/1 result by :py:func:`waflib.Tools.c_preproc.reduce_eval`.

	:param lst: list of tokens
	:type lst: list of tuple(token, value)
	:param defs: macro definitions
	:type defs: dict
	:rtype: int
	zmissing tokens to evaluater   zmissing macro %r)r…   r   r_   rn   rP   )r`   rŒ   ra   r4   s       r   Ú
eval_macror¡   <  sˆ   € õ ˆs�D˜"ÑÔÐØð 3ÝÐ1Ñ2Ô2Ð2àð 0Ø	ˆQŒ�$€!€QØ�%‚Z€Z�A˜T�M�MÝ	Ð(¨3Ñ.Ñ	/Ô	/Ð/å�CÑÔ�€€AÝˆA‰Œ�!ŠÐr   c                 óT  — t          | ¦  «        }t                               | ¦  «        �rL|d         \  }}|d         \  }}|t          k    rt	          d¦  «        ‚d}d}i }d}	 |dz  }||         \  }}|dk    r9|t
          k    r|||<   |dz  }|}nÒ|t          k    r|dk    rnÂt	          d¦  «        ‚|t
          k    r5|t          k    r	|dk    r|}n’|t          k    r|dk    rn‚t	          d¦  «        ‚|dk    rG|t
          k    r|||<   |dz  }|}nS|t          k    r|d	k    rt	          d
¦  «        ‚t	          d¦  «        ‚|d	k    rt	          d¦  «        ‚t	          d¦  «        ‚�Œ||||dz   d…         gfS |d         \  }}t          |¦  «        dk    r|g |dd…         gfS |g dggfS )a>  
	Process a macro definition of the form::
		 #define f(x, y) x * y

	into a function or a simple macro without arguments

	:param txt: expression to exact a macro definition from
	:type txt: string
	:return: a tuple containing the name, the list of arguments and the replacement
	:rtype: tuple(string, [list, list])
	r   rX   z
expected (rW   r?   zunexpected token (3)rI   zcomma or ... expectedz...znot implemented (1)zcomma or ... expected (2)znot implemented (2)zunexpected elseN)r:   rr   )ÚtokenizeÚre_funÚsearchrZ   r   r_   r[   )	Útxtr1   ra   r@   r4   r8   ÚpindexÚparamsÚprevs	            r   rƒ   rƒ   R  s  € õ ˆc�]„]€Ý
‡M‚M�#ÑÔñ 6 ØˆaŒD�'€!€Tà	
ˆ1Œ�$€!€QØ�"‚W€WÝ	�lÑ	#Ô	#Ð#à€!Ø€&Ø€&Ø	€$ð *Øˆ�6€1Ø
ˆAŒ$�4€1€aà
ˆc‚k€kØ�E‚z€zØ€VˆA�YØˆq�[€VØ€T€TØ	
�bŠˆ�Q˜#’X�XØ
åÐ.Ñ/Ô/Ð/Ø•ŠˆØ�B‚w€w�1˜’8�8Ø€T€TØ	
�bŠˆ�Q˜#’X�XØ
åÐ/Ñ0Ô0Ð0Ø�ŠˆØ�E‚z€zØ€VˆA�YØˆq�[€VØ€T€TØ	
�bŠˆ�Q˜%’Z�ZÝÐ-Ñ.Ô.Ð.åÐ3Ñ4Ô4Ð4Ø�ŠˆÝ
Ð,Ñ
-Ô
-Ð-å
Ð(Ñ
)Ô
)Ð)ñA *ðF �˜˜1˜Q™3˜4˜4œÐ!Ð	"Ð"àˆQŒ4�&€1€aÝˆ�V„Vˆa‚Z€ZØˆr�1�Q�R�R”5ˆkÐ
Ðð ˆr�H�:ÐÐ
Ðr   z^\s*(<(?:.*)>|"(?:.*)")c                 óF  — t                                | ¦  «        }|r'|                     d¦  «        } | d         | dd…         fS t          | ¦  «        }t	          ||dg¦  «         |st          d| z  ¦  «        ‚t          |¦  «        dk    r(|d         d         t          k    rd|d         d         fS n]|d         d         dk    rK|d         d         dk    r9dt          |¦  «         	                    d¦  «         
                    d¦  «        f}|S t          d| z  ¦  «        ‚)	zÃ
	Process a line in the form::

		#include foo

	:param txt: include line to process
	:type txt: string
	:param defs: macro definitions
	:type defs: dict
	:return: the file name
	:rtype: string
	rX   r   r   Úwaf_includezcould not parse include %rú"rN   r>   )Ú
re_includer¥   rF   r£   r…   r   r[   rˆ   rt   ÚlstripÚrstrip)r¦   rŒ   rG   r—   Úrets        r   Úextract_includer±   ˜  s'  € õ ×Ò�sÑÔ€Øð Ø	�Š�‰
Œ
€#Ø	ˆQŒ��Q�r�T”Ð	Ðõ 	�‰Œ€Ýˆt�T˜M˜?Ñ+Ô+Ð+àð 9ÝÐ1°CÑ7Ñ8Ô8Ð8åˆ�I„I�‚N€NØ	ˆ!„WˆQ„Z•3ÒÐØ
ˆt�AŒw�qŒzˆ/Ðð ð 
ˆ!„WˆQ„Z�3ÒÐ˜4 œ8 Aœ;¨#Ò-Ð-Ø	�i˜‰oŒo×$Ò$ SÑ)Ô)×0Ò0°Ñ5Ô5Ð	5€3Ø
€:åÐ0°3Ñ6Ñ7Ô7Ð7r   c                 ó”  — | st          d¦  «        ‚| d         dk    rt          | ¦  «        S | d         }|dk    rWt          | ¦  «        dk    r,| d         t          j        v rt          | dd	…         d
¦  «        S t          | dd	…         d
¦  «        S |                     ¦   «         rv|dk    rt          | ¦  «        dk    rdS dD ]V}t          | ¦  «        |k    rA| dd|z   …                              ¦   «         r"d|z   t          | dd|z   …         d¦  «        fc S ŒWd	S 	 t          |         S # t          $ r t          d| z  ¦  «        ‚w xY w)zy
	Parse a c character

	:param txt: character to parse
	:type txt: string
	:return: a character literal
	:rtype: string
	zattempted to parse a null charr   r6   rX   r›   é   é   é   Né   r0   )r´   rµ   rX   r(   zcould not parse char literal %r)	r   Úordr[   ÚstringÚ	hexdigitsrP   ÚisdigitÚchr_escÚKeyError)r¦   r<   r8   s      r   Ú
parse_charr½   »  so  € ð 	ð 7ÝÐ5Ñ6Ô6Ð6Øˆ„Fˆd‚N€NÝ	ˆS‰Œ€/Øˆ„V€Øˆ‚H€HÝˆ�X„X�‚]€]�s˜1”v¥Ô!1Ð1Ð1Ý
ˆc�!�"�"Œg�rÑ
Ô
ÐÝ	ˆS���ŒW�bÑ	Ô	ÐØ‡i‚i�k„kð 
?Øˆ#‚X€X•#�c‘(”(˜A’+�+Ø
ˆ!Øð %ð %€aÝ	ˆ#�h„h�‚l€l�s˜1˜Q˜q™S˜5”z×)Ò)Ñ+Ô+€lØˆa‰C•�S˜˜1˜Q™3˜”Z Ñ#Ô#Ð$Ð$Ð$Ð$øð%ð %ð?Ý
�!Œ*ÐøÝ	ð ?ð ?ð ?Ý	Ð7¸#Ñ=Ñ	>Ô	>Ð>ð?øøøs   ÄD* Ä*Ec                 ó0   — t          | ¦  «        dd…         S )zÁ
	Convert a string into a list of tokens (shlex.split does not apply to c/c++/d)

	:param s: input to tokenize
	:type s: string
	:return: a list of tokens
	:rtype: list of tuple(token, value)
	N)Útokenize_private)r;   s    r   r£   r£   Ú  s   € õ 	˜ÑÔ˜A˜A˜AÔÐr   c                 ó  — g }t                                | ¦  «        D �]g}|j        }t          D �]T} ||¦  «        }|�rC|t          k    rV|t
          v r	t          }�n|                     ¦   «         dk    r
d}t          }në|                     ¦   «         dk    r	d}t          }nÉ|t          k    rŒ |d¦  «        rt          |d¦  «        }n¢ |d¦  «        rt           |d¦  «        d¦  «        }n} |d	¦  «        r |d	¦  «        }nf |d
¦  «        }|rt          |¦  «        }nI |d¦  «        p
 |d¦  «        }n2|t          k    r|dk    rd}n|dk    rd}n|t          k    r
|dd…         }|                     ||f¦  «          n�ŒV�Œi|S )NÚtruerX   Úfalser   Úoctr(   Úhexr¶   Ún0ÚcharÚn2Ún4z%:r}   z%:%:r~   r   )Ú	re_clexerÚfinditerrF   Ú	tok_typesr_   Ú	g_optransrZ   Úlowerr^   rP   r½   rˆ   r‡   )r;   r°   ÚmatchrG   r@   r4   s         r   r¿   r¿   å  s»  € Ø	€Ý× Ò  Ñ#Ô#ð $
ñ $
€UØ„k€!Ýð "
ñ "
€dØ€qˆ�w„w€1Øñ  
Ø�u‚}€}Ø	�YˆˆÝ€d�dØ
�'Š'‰)Œ)�vÒ
Ð
Ø
€aÝ€d€dØ
�'Š'‰)Œ)�wÒ
Ð
Ø
€aÝ€døØ	•ŠˆØ	ˆˆ%‰Œð Ý
ˆa�‰)Œ)€a€aØ
ˆ!ˆE‰(Œ(ð 	Ý
ˆaˆa�‰hŒh˜Ñ
Ô
€a€aØ
ˆ!ˆD‰'Œ'ð Ø
ˆ!ˆD‰'Œ'€a€aà
ˆ!ˆF‰)Œ)€aØ	
ð Ý�a‰=Œ=€q€qàˆ1ˆT‰7Œ7Ð�a�a˜‘g”g€q€qØ	•ŠˆØ	ˆTŠ	ˆ	Ø
€a€aØ
ˆvŠ+ˆ+Ø
€aøØ	•Šˆà	
ˆ1ˆRˆ4Œ€QØ‡J‚J��aˆyÑÔÐØ	€EñA 
ùðB 	€r   c                 ó  — g }| D ]{}|rw|                      d¦  «        }|dk    r|                     |¦  «         Œ5|dk    r.|                     |d |…         ›d||dz   d …         ›�¦  «         Œit          d|z  ¦  «        ‚Œ||S )Nú=r   r   rE   rX   r|   )Úfindr‡   Ú
ValueError)r`   r°   ÚyÚposs       r   Úformat_definesrÕ     s¤   € Ø	€Ø
ð 
9ð 
9€QØð 	9Ø	
�Š�‰Œ€3Ø	ˆR‚i€ià‡J‚Jˆq�M„M€M€MØˆaŠˆà‡J‚J˜!˜D˜S˜Dœ'˜'˜' 1 S¨¡U V V¤9 9Ð-Ñ.Ô.Ð.Ð.å
Ð3°aÑ7Ñ
8Ô
8Ð8ð	9ð 	€r   c                   óF   — e Zd ZdZdd„Zd„ Zdd„Zd„ Zd„ Zd	„ Z	d
„ Z
d„ ZdS )Úc_parserz~
	Used by :py:func:`waflib.Tools.c_preproc.scan` to parse c/h files. Note that by default,
	only project headers are parsed.
	Nc                 ó  — g | _         	 |€i | _        nt          |¦  «        | _        g | _        d| _        g | _        |pg | _        	 g | _        	 g | _        	 d| _	        	 t          ¦   «         | _        	 t          ¦   «         | _        d S )Nr   rr   )ÚlinesrŒ   ÚdictÚstateÚcount_filesÚcurrentnode_stackÚ	nodepathsÚnodesÚnamesÚcurfileÚsetÚban_includesÚlisted)ÚselfrÞ   Údefiness      r   Ú__init__zc_parser.__init__"  sŠ   € Ø€$„*Øà€_Ø€4„9€9å�W‘”€4„9Ø€$„*à€$ÔØ€$Ôà�? €$„.Øà€$„*Ø9à€$„*Ø@à€$„,Øå‘e”e€$ÔØ5å‘”€$„+ØWÐWr   c                 ó  — 	 |j         j        }n5# t          $ r( t          j        t
          ¦  «        x}|j         _        Y nw xY w||f}	 ||         S # t          $ r¥ |                     |¦  «        }|r„t          |dd¦  «        rd}np| 	                    |j         j
        ¦  «        rQ|j         j                             |                     |j         j
        ¦  «        ¦  «        }|rt          |dd¦  «        rd}|||<   |cY S w xY w)z÷
		Find a file from the input directory

		:param node: directory
		:type node: :py:class:`waflib.Node.Node`
		:param filename: header to find
		:type filename: string
		:return: the node if found, or None
		:rtype: :py:class:`waflib.Node.Node`
		ÚchildrenN)ÚctxÚpreproc_cache_nodeÚAttributeErrorr   Ú	lru_cacheÚFILE_CACHE_SIZEr¼   Úfind_resourceÚgetattrÚis_child_ofÚbldnodeÚsrcnodeÚsearch_nodeÚ	path_from)rå   ÚnodeÚfilenameÚcacheÚkeyr°   r‘   s          r   Úcached_find_resourcezc_parser.cached_find_resourceA  s2  € ðJØŒ8Ô&€5€5øÝ	ð Jð Jð JÝ).¬½Ñ)IÔ)IÐI€5ˆ4Œ8Ô&Ð&Ð&ðJøøøð 
ˆxÐ€#ðØ
�Œ*ÐøÝ	ð 
ð 
ð 
Ø	×	Ò	˜HÑ	%Ô	%€3Ø	ð Ýˆs�J Ñ%Ô%ð Ø€S€SØ	�Š˜œÔ)Ñ	*Ô	*ð ØŒ8Ô×'Ò'¨¯ª°d´hÔ6FÑ(GÔ(GÑHÔH€SØð •˜˜Z¨Ñ.Ô.ð Ø€cØ€5ˆ�:Ø
€:€:€:ð
øøøs"   ‚ �/AÁ AÁ	A ÁB,D Ã?D r¬   c                 ó¢  — |                      d¦  «        r| j                             |¦  «         dS || _        d}|dk    rZ|j        r2t          | j        ¦  «        D ]}|                      ||¦  «        }|r nŒn!|                      | j        d         |¦  «        }|s$| j        D ]}|                      ||¦  «        }|r nŒ| j	        }|rR|| j
        vrI||vr/|                     |¦  «         | j                             |¦  «         |                      |¦  «         n3||vr/|                     |¦  «         | j                             |¦  «         |S )aÀ  
		Try to obtain a node from the filename based from the include paths. Will add
		the node found to :py:attr:`waflib.Tools.c_preproc.c_parser.nodes` or the file name to
		:py:attr:`waflib.Tools.c_preproc.c_parser.names` if no corresponding file is found. Called by
		:py:attr:`waflib.Tools.c_preproc.c_parser.start`.

		:param filename: header to find
		:type filename: string
		:return: the node if found
		:rtype: :py:class:`waflib.Node.Node`
		z.mocNr¬   r   )Úendswithrà   r‡   rá   ÚMSVC_VERSIONÚreversedrÝ   rú   rÞ   rä   rã   Úaddrß   Úaddlines)rå   r÷   ÚkindÚenvÚfoundr2   rä   s          r   Útryfindzc_parser.tryfind`  s—  € ð ×Ò�vÑÔð ð „:×Ò�XÑÔÐØ
ˆ$à€$„,à
€%Ø	ˆS‚[€[Ø	Ôð LÝ�dÔ,Ñ-Ô-ð ð ˆØ×&Ò& q¨(Ñ3Ô3€UØð Ø€eðøð ×%Ò% dÔ&<¸RÔ&@À(ÑKÔK€Eà	ð ØŒNð ð €qØ×%Ò% a¨Ñ2Ô2€EØð Ø
€Uðð Œ;€&Ø
ð  �5˜DÔ-Ð-Ð-Ø�6ÐÐØ
‡J‚JˆuÑÔÐØ„J×Ò�eÑÔÐØ‡=‚=�ÑÔÐÐà�fÐÐØ
‡J‚JˆxÑÔÐØ„J×Ò�hÑÔÐØ	€,r   c                 óL  — |                      ¦   «         }t          r5t          D ]-\  }}|                     |¦  «                             |¦  «        }Œ.t
                               d|¦  «        }t                               t          |¦  «        }t           
                    |¦  «        S )aW  
		Filter the comments from a c/h file, and return the preprocessor lines.
		The regexps :py:attr:`waflib.Tools.c_preproc.re_cpp`, :py:attr:`waflib.Tools.c_preproc.re_nl` and :py:attr:`waflib.Tools.c_preproc.re_lines` are used internally.

		:return: the preprocessor directives as a list of (keyword, line)
		:rtype: a list of string pairs
		rr   )ÚreadÚuse_trigraphsÚtrig_defÚsplitrs   Úre_nlÚsubÚre_cpprH   Úre_linesÚfindall)rå   rö   Úcoder$   r%   s        r   Úfilter_commentszc_parser.filter_comments�  s…   € ð 
�Š‰Œ€$Ýð !Ýð !ð !�vˆˆ1Ø�:Š:�a‰=Œ=×Ò˜aÑ Ô €D€DÝ	�Š�2�tÑ	Ô	€$Ý	�Š•D˜$Ñ	Ô	€$Ý	×	Ò	˜$Ñ	Ô	Ðr   c                 óR  — 	 |j         j        }n5# t          $ r( t          j        t
          ¦  «        x}|j         _        Y nw xY w	 ||         S # t          $ rO |                      |¦  «        x||<   }|                     t          df¦  «         | 
                    ¦   «          |cY S w xY w)Nrr   )rê   Úpreproc_cache_linesrì   r   rí   ÚLINE_CACHE_SIZEr¼   r  r‡   ÚPOPFILEÚreverse)rå   rö   rø   rÙ   s       r   Úparse_lineszc_parser.parse_lines¡  sÄ   € ðKØŒ8Ô'€5€5øÝ	ð Kð Kð KÝ*/¬/½/Ñ*JÔ*JÐJ€5ˆ4Œ8Ô'Ð'Ð'ðKøøøðØ
�Œ+ÐøÝ	ð ð ð Ø×-Ò-¨dÑ3Ô3Ð3€5ˆ�;�Ø‡<‚<•˜"�ÑÔÐØ‡=‚=�?„?€?Ø
€<€<€<ð	øøøs"   ‚ �/AÁ AÁA ÁAB&Â%B&c                 ó  — | j                              |j        ¦  «         | xj        dz  c_        | j        t          k    rt          d¦  «        ‚t          j        rt          j        d|¦  «         	 |  	                    |¦  «        }| j
                             |¦  «         dS # t          $ r t          d|z  ¦  «        ‚t          $ r> t          j        dk    r*t          j        d|t          j        ¦   «         ¦  «         Y dS Y dS w xY w)zŽ
		Add the lines from a header in the list of preprocessor lines to parse

		:param node: header
		:type node: :py:class:`waflib.Node.Node`
		rX   zrecursion limit exceededzpreproc: reading file %rzcould not read the file %rr   zparsing %r failed %sN)rÝ   r‡   ÚparentrÜ   Úrecursion_limitr   r   ÚverboseÚdebugr  rÙ   r‰   ÚEnvironmentErrorÚ	ExceptionÚerrorÚ	tracebackÚ
format_exc)rå   rö   rÙ   s      r   r   zc_parser.addlines®  s'  € ð Ô×Ò ¤Ñ,Ô,Ð,àÐÔ�aÑÐÔØ	Ô�Ò'Ð'å	Ð0Ñ	1Ô	1Ð1å	„\ð 0Ý„:Ð(¨$Ñ/Ô/Ð/ðØ×Ò˜DÑ!Ô!€5ð „:×Ò�UÑÔÐÐÐøõ 
ð ;ð ;ð ;Ý	Ð2°TÑ9Ñ	:Ô	:Ð:Ý	ð Eð Eð EÝ
„l�QÒÐÝ„JÐ% t­YÔ-AÑ-CÔ-CÑDÔDÐDÐDÐDÐDð ÐÐðEøøøs   Á1B" Â"ADÄDc                 ó^	  — t          j        d|j        |j        j        ¦  «         || _        |                      |¦  «         |j        rLt          |j        ¦  «        }|                     ¦   «          | j	         
                    d„ |D ¦   «         ¦  «         | j	        �r| j	                             ¦   «         \  }}|t          k    r*| xj        dz  c_        | j                             ¦   «          ŒY	 | j        }|dd…         dk    r|                     t"          ¦  «         n|dk    r|                     ¦   «          |d         d	k    rt$          | j        v st&          | j        v rŒÍ|dk    r<t)          t+          |¦  «        | j        ¦  «        }|rt.          |d
<   �n¿t&          |d
<   �n³|dk    rOt0                               |¦  «        }|r'|                     ¦   «         | j        v rt.          |d
<   �njt&          |d
<   �n^|dk    rOt0                               |¦  «        }|r'|                     ¦   «         | j        v rt&          |d
<   �nt.          |d
<   �n	|dk    s|dk    r[t7          || j        ¦  «        \  }	}
|                      |
|	|¦  «        | _        |dk    r| j                             | j        ¦  «         �n¢|dk    r\|d
         t.          k    rt$          |d
<   �n|d
         t&          k    r,t)          t+          |¦  «        | j        ¦  «        r
t.          |d
<   �n@|dk    r:|d
         t.          k    rt$          |d
<   �n|d
         t&          k    r
t.          |d
<   �n |dk    r?	 || j        |                      |¦  «        <   nÛ# t@          $ r tC          d|z  ¦  «        ‚w xY w|dk    rdt0                               |¦  «        }|rG|                     ¦   «         | j        v r,| j         "                    |                     ¦   «         ¦  «         nQ|dk    rKtF                               | $                    ¦   «         ¦  «        r| j                             | j        ¦  «         nK# tJ          $ r>}t           j&        r(t          j        d||tO          j(        ¦   «         ¦  «         Y d}~nd}~ww xY w| j	        �°dS dS )aƒ  
		Preprocess a source file to obtain the dependencies, which are accumulated to :py:attr:`waflib.Tools.c_preproc.c_parser.nodes`
		and :py:attr:`waflib.Tools.c_preproc.c_parser.names`.

		:param node: source file
		:type node: :py:class:`waflib.Node.Node`
		:param env: config set containing additional defines to take into account
		:type env: :py:class:`waflib.ConfigSet.ConfigSet`
		zpreproc: scanning %s (in %s)c                 ó   — g | ]}d |f‘ŒS )Údefiner   ©r#   r›   s     r   r&   z"c_parser.start.<locals>.<listcomp>Ü  s   € Ð1Ð1Ð1¨�x �mÐ1Ð1Ð1r   rX   Nrµ   ÚifÚendifr   Úer   ÚifdefÚifndefÚincludeÚimportÚelifÚelser#  zInvalid define line %rÚundefÚpragmaz(preproc: line parsing failed (%s): %s %s))r   r  r@   r  Úcurrent_filer   ÚDEFINESrÕ   r  rÙ   r‰   rŠ   r  rÜ   rÝ   rÛ   r‡   Ú	undefinedÚskippedÚignoredr¡   r£   rŒ   ÚacceptedÚre_macrÎ   rF   r±   r  rã   rÿ   Údefine_namerì   r   Ú__delitem__Úre_pragma_oncerÍ   r  r  r  r   )rå   rö   r  r`   ÚtokenÚlinerÛ   r°   rG   r  Úincr'  s               r   Ústartzc_parser.startÉ  s¢  € õ „*Ð+¨T¬Y¸¼Ô8HÑIÔIÐIà€$ÔØ‡-‚-�ÑÔÐð 	„[ð 3Ý	˜œÑ	$Ô	$€3Ø‡;‚;�=„=€=Ø„:×ÒÐ1Ð1¨SÐ1Ñ1Ô1Ñ2Ô2Ð2àŒ
ñ F]Ø”:—>’>Ñ#Ô#�=€Eˆ4Ø�wÒÐØÐÔ˜ÑÐÔØÔ×ÒÑ Ô Ð Øð?]ØŒJ€Eð ˆRˆaˆR„y�DÒÐØ
‡\‚\•)ÑÔÐÐØ	�'Ò	Ð	Ø
‡Y‚Y�[„[€[ð ˆQ„x�3‚€Ý�4”:ÐÐ¥¨D¬JÐ!6Ð!6Øà�‚}€}Ý•h˜t‘n”n d¤iÑ0Ô0€SØð Ý€eˆB�i�iå€eˆB�i�iØ	�'Ò	Ð	Ý	�Š�dÑ	Ô	€QØ	ð ˆa�gŠg‰iŒi˜4œ9Ð$Ð$Ý€eˆB�i�iå€eˆB�i�iØ	�(Ò	Ð	Ý	�Š�dÑ	Ô	€QØ	ð ˆa�gŠg‰iŒi˜4œ9Ð$Ð$Ý€eˆB�i�iå€eˆB�i�iØ	�)Ò	Ð	˜u¨Ò0Ð0Ý" 4¨¬Ñ3Ô3�[€dˆCØŸš c¨4°Ñ5Ô5€TÔØ�ÒÐØ
Ô×Ò˜DÔ-Ñ.Ô.Ð.ùØ	�&ŠˆØˆbŒ	•XÒÐÝ€eˆB�i�iØ
�Œ)•wÒ
Ð
Ý	•H˜T‘N”N D¤IÑ	.Ô	.ð Ý€uˆR�yùØ	�&ŠˆØˆbŒ	•XÒÐÝ€eˆB�i�iØ
�Œ)•wÒ
Ð
Ý€eˆB�iùØ	�(Ò	Ð	ð:Ø*.€d„i�× Ò  Ñ&Ô&Ñ'Ð'øÝð :ð :ð :ÝÐ1°DÑ8Ñ9Ô9Ð9ð:øøøà	�'Ò	Ð	Ý	�Š�dÑ	Ô	€QØ	ð 'ˆa�gŠg‰iŒi˜4œ9Ð$Ð$Ø
„i×Ò˜AŸGšG™IœIÑ&Ô&Ð&øà	�(Ò	Ð	Ý×Ò˜TŸZšZ™\œ\Ñ*Ô*ð /Ø
Ô×Ò˜DÔ-Ñ.Ô.Ð.øøÝ
ð ]ð ]ð ]Ý„|ð ]Ý	„ZÐ:¸A¸tÅYÔEYÑE[ÔE[Ñ\Ô\Ð\øøøøøøøøøð]øøøðI 	Œ
ñ F]ð F]ð F]ð F]ð F]s9   Ã/A2Q Å"G;Q ÍM< Í;Q Í<NÎB>Q Ñ
R Ñ"4RÒR c                 óZ   — t                                |¦  «                             ¦   «         S )z_
		:param line: define line
		:type line: string
		:rtype: string
		:return: the define name
		)r6  rÎ   rF   )rå   r;  s     r   r7  zc_parser.define_name&  s"   € õ 
�Š�dÑ	Ô	×	!Ò	!Ñ	#Ô	#Ð#r   )NN)r¬   N)r   r	   r
   Ú__doc__rç   rú   r  r  r  r   r=  r7  r   r   r   r×   r×     s¬   € € € € € ðð ðXð Xð Xð Xð>ð ð ð>.ð .ð .ð .ð` ð  ð  ð"ð ð ðð ð ð6[]ð []ð []ðz$ð $ð $ð $ð $r   r×   c                 óN  ‡ — 	 ‰ j         j        }n*# t          $ r t          j        d‰ j         z  ¦  «        ‚w xY wt
          r|ˆ fd„t          D ¦   «         z   }nd„ |D ¦   «         }t          |¦  «        }|                     ‰ j	        d         ‰ j
        ¦  «         |j        |j        fS )a   
	Get the dependencies using a c/c++ preprocessor, this is required for finding dependencies of the kind::

		#include some_macro()

	This function is bound as a task method on :py:class:`waflib.Tools.c.c` and :py:class:`waflib.Tools.cxx.cxx` for example
	z:%r is missing a feature such as "c", "cxx" or "includes": c                 óX   •— g | ]&}‰j         j        j                             |¦  «        ‘Œ'S r   )Ú	generatorÚbldÚrootÚfind_dir)r#   r›   Útasks     €r   r&   zscan.<locals>.<listcomp>=  s/   ø€ ÐUÐUÐU¸a�d”nÔ(Ô-×6Ò6°qÑ9Ô9ÐUÐUÐUr   c                 óŽ   — g | ]B}|                      |j        j        ¦  «        s|                      |j        j        ¦  «        ¯@|‘ŒCS r   )rñ   rê   ró   rò   r$  s     r   r&   zscan.<locals>.<listcomp>?  sE   € Ð_Ð_Ð_�Q !§-¢-°´´Ñ">Ô">Ð_À!Ç-Â-ÐPQÔPUÔP]ÑB^ÔB^Ð_ˆqÐ_Ð_Ð_r   r   )rB  Úincludes_nodesrì   r   ÚWafErrorÚgo_absoluteÚstandard_includesr×   r=  Úinputsr  rß   rà   )rF  ÚincnrÞ   r‘   s   `   r   ÚscanrN  /  sÆ   ø€ ðgØ	ŒÔ	&€$€$øÝð gð gð gÝŒÐTÐW[ÔWeÑeÑfÔfÐfðgøøøõ ð `ØÐUÐUÐUÐUÕCTÐUÑUÔUÑU€)€)à_Ð_˜$Ð_Ñ_Ô_€)å�	ÑÔ€Ø‡‚ˆ4Œ;�qŒ>˜4œ8Ñ$Ô$Ð$Ø	Œ�C”IÐÐs   ƒ �'7)Ir?  Úrer¸   r  Úwaflibr   r   r   rI  r   rî   r  r  r  rJ  rK  Úis_win32r  Ústrict_quotesrÌ   ÚcompileÚ
IGNORECASEÚ	MULTILINEr  r6  r¤   r9  r
  ÚDOTALLr  Úzipr  r»   r^   rZ   r_   rˆ   ÚCHARrË   Ú	exp_typesrs   ÚMrÉ   r5  r4  r2  r3  rH   rh   ÚopsÚ	enumerater›   Úsymsr	  rB   rU   r]   r\   rn   rt   ry   r…   r¡   rƒ   r­   r±   r½   r£   r¿   rÕ   Úobjectr×   rN  r   r   r   ú<module>r_     s[  ðð
ð ð0 Ð Ð Ð Ð Ð Ð Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &ðð ð ð ð �6”?ñ ô ð ð €Ø€à
€ð Qà€Ø @à€Ø sà)¨>Ð:Ð Ø„>ð ØÐà€Ø -ð €ð 
Ø	Ø
Ø	Ø	ØØ	Ø	Ø	ØØðð €	ð Jð ˆ2Œ:ØjØ„�”Ññô €ð à	ˆŒ�OÑ	$Ô	$€Ø à	ˆŒÐ0Ñ	1Ô	1€Ø à�”˜M¨2¬=Ñ9Ô9€Ø #àˆŒ
�; ¤Ñ-Ô-€Ø à	ˆŒÐNÐPRÔPYÐ\^Ô\hÑPhÑ	jÔ	j€Ø àCÐC C C¨°\Ñ$BÔ$BÐCÑCÔC€Ø à�a˜Q A¨2°2¸2À2ÈBÐTVÐ
WÐ
W€Ø à€Ø à€Ø à€Ø à€Ø à€Ø à�#�u˜bÐ!€	Ø ðð ð €	ð àˆBŒJ�s—x’xÐ iÐ iÈsÈsÐS\Ð^gÑOhÔOhÐ iÑ iÔ iÑjÔjÐlnÔlpÑqÔq€	Ø #à€Ø  à€Ø Qà€	Ø /à€Ø Rð
ð 
ð 
ð 
€ðð
 MÐLÐL€Øˆy˜‰~Œ~ð ð �G€A€tØ
�*Š*‰,Œ,ð ð €QØ€$€q�'€'ððA
ð A
ð A
ðF4;ð 4;ð 4;ðlC.ð C.ð C.ðJ
ð 
ð 
ð	ð 	ð 	ðð ð ð0 "$ð n	ð n	ð n	ð n	ðbð ð ð,C ð C ð C ðJ ˆRŒZÐ1Ñ2Ô2€
ð!8ð !8ð !8ðF?ð ?ð ?ð>	ð 	ð 	ð'ð 'ð 'ðRð ð ðP$ð P$ð P$ð P$ð P$ˆvñ P$ô P$ð P$ðdð ð ð ð r   