a
    LgV,                     @   sV  d dl mZ d dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
 ddlmZmZmZmZmZ ddlmZmZmZmZmZ ddlmZ e	e edd	d
ZG dd dZeeeedddZd"ee eee edddZG dd deZG dd deZ G dd de Z!G dd deZ"eeeed dddZ#G dd deZ$G d d! d!eZ%dS )#    )contextmanagerN)DictIteratorOptionalSequenceTuple   )c_fnamec_nameguardend
guardstartmcgen)QAPISchemaFeatureQAPISchemaIfCondQAPISchemaModuleQAPISchemaObjectTypeQAPISchemaVisitor)QAPISourceInfo)featuresreturnc                 C   s   dd | D }d |pdS )Nc                 S   s$   g | ]}|  rd |j  qS )z1u << QAPI_)Z
is_specialnameupper).0Zfeat r   ;/home2/Puru_Virtio_Blk/virtio-demo/qemu/scripts/qapi/gen.py
<listcomp>,   s   
z(gen_special_features.<locals>.<listcomp>z | 0)join)r   Zspecial_featuresr   r   r   gen_special_features+   s    r   c                   @   st   e Zd ZedddZeddddZedddd	Zed
ddZed
ddZed
ddZ	eddddZ
dS )QAPIGenfnamec                 C   s   || _ d| _d| _d S N )r!   	_preamble_bodyselfr!   r   r   r   __init__2   s    zQAPIGen.__init__N)textr   c                 C   s   |  j |7  _ d S N)r$   r'   r)   r   r   r   preamble_add7   s    zQAPIGen.preamble_addc                 C   s   |  j |7  _ d S r*   )r%   r+   r   r   r   add:   s    zQAPIGen.addr   c                 C   s   |   | j | j |   S r*   )_topr$   r%   _bottomr'   r   r   r   get_content=   s    zQAPIGen.get_contentc                 C   s   dS r"   r   r1   r   r   r   r/   @   s    zQAPIGen._topc                 C   s   dS r"   r   r1   r   r   r   r0   D   s    zQAPIGen._bottom
output_dirr   c                 C   s   | j drd S tj|| j }tj|}|r>tj|dd t|tjtj	B d}tj
|dddP}|  }|t|d }||kr|d	 |d	 || W d    n1 s0    Y  d S )
Nz../T)exist_oki  zr+zutf-8)encodingr   r   )r!   
startswithospathr   dirnamemakedirsopenO_RDWRO_CREATfdopenr2   readlenseektruncatewrite)r'   r4   pathnameZodirfdfpr)   Zoldtextr   r   r   rD   H   s    

zQAPIGen.write)__name__
__module____qualname__strr(   r,   r-   r2   r/   r0   rD   r   r   r   r   r   1   s   r   )ifcondbeforeafterr   c                 C   sr   ||kr|S | |sJ |}|t|d  }|d dkrN|d7 }|dd  }||  7 }||7 }||  7 }|S )Nr   
r   )r7   rA   gen_if	gen_endif)rL   rM   rN   outZaddedr   r   r   _wrap_ifcond_   s    rS   )arg_typeboxedextrar   c                 C   s   d}d}|r*| sJ |d|    7 }d}nj| r| jr8J | jD ]T}|j rPJ ||7 }d}| rv|dt|j 7 }|d|j  t|jf 7 }q>|r||| 7 }|r|S dS )Nr#   z%s argz, zbool has_%s, z%s %svoid)	Zc_param_typebranchesmembersrL   
is_presentneed_hasr
   r   type)rT   rU   rV   retsepmembr   r   r   build_paramso   s(    


r`   c                       sR   e Zd Zed fddZeddddZddd	d
Zed fddZ  Z	S )QAPIGenCCoder    c                    s   t  | d | _d S r*   )superr(   	_start_ifr&   	__class__r   r   r(      s    zQAPIGenCCode.__init__N)rL   r   c                 C   s"   | j d u sJ || j| jf| _ d S r*   )rc   r%   r$   )r'   rL   r   r   r   start_if   s    zQAPIGenCCode.start_ifr.   c                 C   sP   | j d usJ t| j d | j d | j| _t| j d | j d | j| _d | _ d S )Nr   r      )rc   rS   r%   r$   r1   r   r   r   end_if   s    

zQAPIGenCCode.end_ifc                    s   | j d u sJ t  S r*   )rc   rb   r2   r1   rd   r   r   r2      s    zQAPIGenCCode.get_content)
rH   rI   rJ   rK   r(   r   rf   rh   r2   __classcell__r   r   rd   r   ra      s   ra   c                       sB   e Zd Zeeed fddZedddZedddZ  ZS )	QAPIGenC)r!   blurbpydocc                    s.   t  | || _dtd|tj| _d S )Nz
 * z^Copyright .*)rb   r(   _blurbr   refindall	MULTILINE
_copyright)r'   r!   rk   rl   rd   r   r   r(      s
    zQAPIGenC.__init__r.   c                 C   s"   t dtjtjd | j| jdS )Nz
/* AUTOMATICALLY GENERATED by %(tool)s DO NOT MODIFY */

/*
%(blurb)s
 *
 * %(copyright)s
 *
 * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
 * See the COPYING.LIB file in the top-level directory.
 */

r   )Ztoolrk   	copyright)r   r8   r9   basenamesysargvrm   rq   r1   r   r   r   r/      s    zQAPIGenC._topc                 C   s   t dt| jdS )NzM

/* Dummy declaration to prevent empty .o file */
char qapi_dummy_%(name)s;
r   )r   r	   r!   r1   r   r   r   r0      s    zQAPIGenC._bottom)rH   rI   rJ   rK   r(   r/   r0   ri   r   r   rd   r   rj      s   rj   c                       s0   e Zd Zed fddZedddZ  ZS )QAPIGenHr.   c                    s   t   t| j S r*   )rb   r/   r   r!   r1   rd   r   r   r/      s    zQAPIGenH._topc                 C   s
   t | jS r*   )r   r!   r1   r   r   r   r0      s    zQAPIGenH._bottom)rH   rI   rJ   rK   r/   r0   ri   r   r   rd   r   rw      s   rw   c                       s"   e Zd Zed fddZ  ZS )QAPIGenTracer.   c                    s$   t   d tjtjd  d S )Nz# AUTOMATICALLY GENERATED by r   z, DO NOT MODIFY

)rb   r/   r8   r9   rs   rt   ru   r1   rd   r   r   r/      s    zQAPIGenTrace._top)rH   rI   rJ   rK   r/   ri   r   r   rd   r   rx      s   rx   )rL   argsr   c                 g   s0   |D ]}| |  qdV  |D ]}|  qdS )a  
    A with-statement context manager that wraps with `start_if()` / `end_if()`.

    :param ifcond: A sequence of conditionals, passed to `start_if()`.
    :param args: any number of `QAPIGenCCode`.

    Example::

        with ifcontext(ifcond, self._genh, self._genc):
            modify self._genh and self._genc ...

    Is equivalent to calling::

        self._genh.start_if(ifcond)
        self._genc.start_if(ifcond)
        modify self._genh and self._genc ...
        self._genh.end_if()
        self._genc.end_if()
    N)rf   rh   )rL   ry   argr   r   r   	ifcontext   s
    r{   c                   @   s0   e Zd ZeeeedddZeddddZdS )QAPISchemaMonolithicCVisitor)prefixwhatrk   rl   c                 C   sD   || _ || _t| j | j d ||| _t| j | j d ||| _d S )N.c.h)_prefix_whatrj   _gencrw   _genh)r'   r}   r~   rk   rl   r   r   r   r(      s    z%QAPISchemaMonolithicCVisitor.__init__Nr3   c                 C   s   | j | | j| d S r*   )r   rD   r   )r'   r4   r   r   r   rD      s    z"QAPISchemaMonolithicCVisitor.write)rH   rI   rJ   rK   r(   rD   r   r   r   r   r|      s   r|   c                   @   s  e Zd Zd&eeeee eedddZeedddZ	ee
ddd	Zeedd
dZeeedddZeeedddZeeedddZeeddddZeeed dddZd'eeddddZddddZedddd Zeddd!d"Zeee dd#d$d%ZdS )(QAPISchemaModularCVisitorF)r}   r~   
user_blurbbuiltin_blurbrl   gen_tracingc                 C   s:   || _ || _|| _|| _|| _d | _i | _d | _|| _d S r*   )	r   r   _user_blurb_builtin_blurb_pydoc_current_module_module_main_module_gen_tracing)r'   r}   r~   r   r   rl   r   r   r   r   r(      s    z"QAPISchemaModularCVisitor.__init__r.   c                 C   s   | j d usJ | j| j  d S )Nr   r   r   r1   r   r   r   r     s    zQAPISchemaModularCVisitor._gencc                 C   s   | j d usJ | j| j  d S )Nr   r   r1   r   r   r   r     s    zQAPISchemaModularCVisitor._genhc                 C   s8   | j s
J | jd usJ | j| j d }|d us4J |S )Nrg   )r   r   r   )r'   gentr   r   r   _gen_trace_events  s
    
z+QAPISchemaModularCVisitor._gen_trace_events)r   r   c                 C   s   t | rtj| S dS r"   )r   is_user_moduler8   r9   r:   rv   r   r   r   _module_dirname!  s    
z)QAPISchemaModularCVisitor._module_dirname)r~   r   r   c                 C   s   t |rdn| j}t |rVtj|}||7 }|| jkr|dtj|d  7 }n0t 	|sdJ |t
dd|dd   d |7 }|S )Nr#   -r   rg   )r   is_builtin_moduler   r   r8   r9   rs   r   splitextZis_system_modulern   sub)r'   r~   r   r]   rs   r   r   r   _module_basename'  s    

"z*QAPISchemaModularCVisitor._module_basenamec                 C   s   t j| || ||S r*   )r8   r9   r   r   r   )r'   r~   r   r   r   r   _module_filename3  s    
z*QAPISchemaModularCVisitor._module_filenameN)r   rk   r   c                 C   s|   t |r| jd u r|| _| | j|}t|d || j}t|d || j}d }| jrbt	|d }|||f| j
|< || _d S )Nr   r   z.trace-events)r   r   r   r   r   rj   r   rw   r   rx   r   r   )r'   r   rk   rs   gencgenhr   r   r   r   _add_module7  s    

z%QAPISchemaModularCVisitor._add_modulec                 c   s   | j }|| _ d V  || _ d S r*   )r   )r'   r   Z
old_moduler   r   r   _temp_moduleF  s    z&QAPISchemaModularCVisitor._temp_module)r4   opt_builtinsr   c                 C   sT   | j  D ]D\}\}}}t|r(|s(q
|| || |d ur
|| q
d S r*   )r   itemsr   r   rD   )r'   r4   r   r   r   r   r   r   r   r   rD   M  s    

zQAPISchemaModularCVisitor.writec                 C   s   d S r*   r   r1   r   r   r   _begin_builtin_moduleV  s    z/QAPISchemaModularCVisitor._begin_builtin_modulec                 C   s   d S r*   r   r'   r   r   r   r   _begin_user_moduleY  s    z,QAPISchemaModularCVisitor._begin_user_modulec                 C   sZ   t |r0| jr(| || j |   qVd | _n&t |s>J | || j | | d S r*   )	r   r   r   r   r   r   r   r   r   r   r   r   r   visit_module\  s    

z&QAPISchemaModularCVisitor.visit_module)r   infor   c                 C   s<   t j| | j|t j| jj}| jt	d|d d S )Nz
#include "%(relname)s.h"
)relname)
r8   r9   relpathr   r   r:   r   r!   r,   r   )r'   r   r   r   r   r   r   visit_includej  s    
z'QAPISchemaModularCVisitor.visit_include)F)F)rH   rI   rJ   rK   r   boolr(   propertyrj   r   rw   r   rx   r   staticmethodr   r   r   r   r   r   r   rD   r   r   r   r   r   r   r   r   r   r      s6    	r   )N)&
contextlibr   r8   rn   rt   typingr   r   r   r   r   commonr	   r
   r   r   r   schemar   r   r   r   r   sourcer   rK   r   r   rS   r   r`   ra   rj   rw   rx   r{   r|   r   r   r   r   r   <module>   s.   . !