ó
åÓ"Tc           @   s”  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z e j j	 e j
 e j ƒ  ƒ e j j d e j j d e j j d ƒ Z x3 e  j D]( Z e j d ƒ rµ e e d ƒ Z qµ qµ Wd Z x9 e  j D]. Z e j d ƒ rñ e e e d ƒ ƒ Z qñ qñ Wd Z e j d k rAd Z n  x3 e  j D]( Z e j d	 ƒ rKe e d	 ƒ Z qKqKWd
 d d „  ƒ  YZ d „  Z d „  Z d d  d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e  d k rd Z" d Z# d Z$ d Z% xû e  j D]ð Z e" d k r:e d k r:d Z" qe" d k r[e d k r[d Z" qe" d k r|e d k r|d Z" qe" d k re# d k re Z# qe" d k rÊe# d k rÊe$ d k rÊe Z$ qe" d k re# d k re$ d k re% d k re Z% qqWe" d k r e d ƒ qe" d k rfe e# ƒ Z& xRe& D]  Z' e  j( j) e* e' ƒ d ƒ q?Wqe" d k r¬e e# ƒ Z& xe& D]  Z' e  j( j) e* e' ƒ d ƒ q…Wqe" d k rd Z+ e% rìe, e% d ƒ Z- e- j. ƒ  Z+ e- j/ ƒ  n  e e# e+ ƒ \ Z0 Z' e' r<e e' j1 ƒ  ƒ d k r<e  j( j) e' j1 ƒ  d ƒ n  e0 rqe$ rqe, e$ d ƒ Z- e- j) e0 ƒ e- j/ ƒ  qe0 re  j2 j) e0 ƒ qqn  d S(!   iÿÿÿÿNs   ..s   --kumirdir=i   s
   --timeout=t   utf8t   ntt   cp1251s   --encoding=t   CompileErrorc           B   s,   e  Z d  Z d „  Z d d „ Z d „  Z RS(   s˜   
    line: line number (start from 1)
    pos: error position start in line (start from 1)
    end: error position end in line
    text: error text
    c         C   s4   t  ƒ  |  _ t ƒ  |  _ t  ƒ  |  _ t  ƒ  |  _ d  S(   N(   t   intt   linet   strt   textt   post   end(   t   self(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   __init__*   s    t    c         C   sË   t  ƒ  |  _ |  _ |  _ t ƒ  |  _ t | ƒ d k rÇ | j d d ƒ } t | ƒ d k rÇ t  | d ƒ |  _ | d j d ƒ } t  | d ƒ |  _ t  | d ƒ |  _ t | d ƒ j ƒ  |  _ qÇ n  d S(	   s   Creates error from error stringi    t   :i   i   i   t   -i   N(	   R   R   R   R	   R   R   t   lent   splitt   strip(   R
   t
   err_stringt   lexemst   linepos(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyR   0   s    c         C   sb   d t  |  j ƒ d } | d t  |  j ƒ d 7} | d t  |  j ƒ d 7} | d |  j 7} | S(   Ns   L: s   , s   S: s   E: s   T: (   R   R   R   R	   R   (   R
   t   s(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   __str__>   s
    (   t   __name__t
   __module__t   __doc__R   R   (    (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyR   "   s   	c         C   sr   t  t j j d t j j |  } t j d k r> | d 7} n  t j d k rn t  t j j t j j |  } n  | S(   s'   Returns absolute file path to execuablet   binR   s   .exet   posix(   t	   KUMIR_DIRt   ost   patht   sept   name(   t   utilt   res(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   __binary_pathF   s    "!c      
   C   s  t  j j d t |  ƒ d ƒ t j j ƒ  } y4 t j |  d t j	 d t j	 d t j	 d | ƒ} Wn/ t  j j d t
 j |  ƒ d ƒ d g  f SX| j ƒ  \ } } | j ƒ  } | j d	 k  rÓ t  j j d
 ƒ n  t | ƒ d	 k r÷ | j d ƒ } n g  } | | f S(   s1   Starts a process and returns what process returnss	   Starting s   
t   stdint   stdoutt   stderrt   envs   Error starting R   i    s	   CRASHED!
(   t   sysR&   t   writeR   R   t   environt   copyt
   subprocesst   Popent   PIPEt   stringt   joint   communicateR   t
   returncodeR   R   (   t   argsR'   t   proct   outt   errt   errors(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt
   __run_utilP   s    4!t   __TimeableProcessc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   s:   d  |  _ d \ |  _ |  _ d  |  _ d  |  _ d  |  _ d  S(   N(   NN(   t   NoneR4   R5   R6   t   indataR3   t   workdir(   R
   (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyR   e   s
    			c      
   C   sÔ   |  j  r |  j  } n t j ƒ  } y: t j |  j d t j d t j d t j d | ƒ|  _ Wn, t j	 j
 d t j |  j ƒ d ƒ d  SX|  j j |  j ƒ \ |  _ |  _ |  j j d k  rÐ t j	 j
 d ƒ n  d  S(	   NR$   R%   R&   t   cwds   Error staring s   
i    s	   CRASHED!
(   R<   R   t   getcwdR,   R-   R3   R.   R4   R(   R&   R)   R/   R0   R1   R;   R5   R6   R2   (   R
   R=   (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   __thread_runl   s    	!$!c         C   s   | |  _  | |  _ | |  _ t j d |  j ƒ } | j ƒ  | j t ƒ | j	 ƒ  r} |  j
 j ƒ  t j j d ƒ | j ƒ  n  |  j |  j f S(   Nt   targets   KILLED BY TIMEOUT!
(   R3   R;   R<   t	   threadingt   Threadt   _TimeableProcess__thread_runt   startR0   t   TIMEOUTt   is_aliveR4   t   killR(   R&   R)   R5   R6   (   R
   R3   R;   R<   t   thread(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyRD   {   s    			
(   R   R   R   RC   RD   (    (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyR9   d   s   		c         C   s   t  ƒ  } | j |  | | ƒ S(   sK   Starts a process, passes indata and returns when process returns or timeout(   R9   RD   (   R3   R;   R<   t   tp(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   __run_program‰   s    	c         C   s@   t  t d ƒ |  g ƒ \ } } t d „  | ƒ } t d „  | ƒ S(   s6   Compiles a kumir program file into kumir bytecode files	   kumir2-bcc         S   s   |  j  d ƒ S(   Ns   ÐžÑˆÐ¸Ð±ÐºÐ°: (   t
   startswith(   t   x(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   <lambda>”   s    c         S   s
   t  |  ƒ S(   N(   R   (   RL   (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyRM   •   s    (   R8   R#   t   filtert   map(   t   kumfileR5   R7   (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   compile_to_bytecode   s    c         C   s@   t  t d ƒ |  g ƒ \ } } t d „  | ƒ } t d „  | ƒ S(   s8   Compiles a kumir program file into native execuable files   kumir2-llvmcc         S   s   |  j  d ƒ S(   Ns   ÐžÑˆÐ¸Ð±ÐºÐ°: (   RK   (   RL   (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyRM   ›   s    c         S   s
   t  |  ƒ S(   N(   R   (   RL   (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyRM   œ   s    (   R8   R#   RN   RO   (   RP   R5   R7   (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   compile_to_native˜   s    c         C   sC   t  j j t  j j |  ƒ ƒ \ } } t t d ƒ d |  g | | ƒ S(   s7   Evaluates kumir bytecode and returns output, then inputs
   kumir2-runR   (   R   R   R   t   abspathRJ   R#   (   t   kodfileR;   R<   t   _(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   run_bytecodeŸ   s    $c         C   s7   t  j j t  j j |  ƒ ƒ \ } } t |  g | | ƒ S(   N(   R   R   R   RS   RJ   (   t
   nativefileR;   R<   RU   (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt
   run_native¥   s    $c         C   sC   t  j j d t  j d t  j d t  j d f ƒ t  j |  ƒ d  S(   NsÉ   Usage:
    %s [--kumirdir=KUMIR_DIR] bc FILENAME.kum
or:
    %s [--kumirdir=KUMIR_DIR] cc FILENAME.kum
or:
    %s [--kumirdir=KUMIR_DIR] [--timeout=TIMEOUT] run FILENAME.kum [OUTFILE.txt] [INFILE.txt]
i    (   R(   R&   R)   t   argvt   exit(   t   errcode(    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   print_usage_and_exitª   s    	)t   __main__t   bct   cct   runi   s   
t   ri    t   w(    (    (3   R(   t   os.pathR   R,   t   inspectRA   t   jsonR/   R   RS   t   getfilet   currentframeR   R   RY   t   argRK   R   RE   R   t   SYSTEMENCODINGR    R   R#   R8   R9   RJ   RQ   RR   RV   RX   R\   R   R:   t   modet   filenamet   outfilet   infilet   errsR6   R&   R)   R   R;   t   opent   ft   readt   closeR5   R   R%   (    (    (    s8   /Volumes/HDD/Kumir2SRC/testing/prg/scripts/kumirutils.pyt   <module>   s–   	B	$	
	%											$	0!!