o
    V۷i                     @   s  d Z ddlmZ ddlZddlmZmZmZ e Ze	d e
edZdZdZdZdZdZd	Zd
d Zededdd Zededdd Zededdd Zededdd Zededdd Zededdd Zededdd Zed ed!d"d! Zeded#d$d# Zeded%d&d% Zeded'd(d' ZeeejejeeeeeeefZ eeeeejeeeeeefZ!d2d*d+Z"d,d- Z#G d.d/ d/Z$ej%d0d1 Z&e'e(  dS )3z.
CFFI-Wrapper for YAJL C library version 2.x.
    )FFIN)commonbackendsutilsa  
typedef void * (*yajl_malloc_func)(void *ctx, size_t sz);
typedef void (*yajl_free_func)(void *ctx, void * ptr);
typedef void * (*yajl_realloc_func)(void *ctx, void * ptr, size_t sz);
typedef struct
{
    yajl_malloc_func malloc;
    yajl_realloc_func realloc;
    yajl_free_func free;
    void * ctx;
} yajl_alloc_funcs;
typedef struct yajl_handle_t * yajl_handle;
typedef enum {
    yajl_status_ok,
    yajl_status_client_canceled,
    yajl_status_error
} yajl_status;
typedef enum {
    yajl_allow_comments = 0x01,
    yajl_dont_validate_strings     = 0x02,
    yajl_allow_trailing_garbage = 0x04,
    yajl_allow_multiple_values = 0x08,
    yajl_allow_partial_values = 0x10
} yajl_option;
typedef struct {
    int (* yajl_null)(void * ctx);
    int (* yajl_boolean)(void * ctx, int boolVal);
    int (* yajl_integer)(void * ctx, long long integerVal);
    int (* yajl_double)(void * ctx, double doubleVal);
    int (* yajl_number)(void * ctx, const char * numberVal,
                        size_t numberLen);
    int (* yajl_string)(void * ctx, const unsigned char * stringVal,
                        size_t stringLen);
    int (* yajl_start_map)(void * ctx);
    int (* yajl_map_key)(void * ctx, const unsigned char * key,
                         size_t stringLen);
    int (* yajl_end_map)(void * ctx);
    int (* yajl_start_array)(void * ctx);
    int (* yajl_end_array)(void * ctx);
} yajl_callbacks;
int yajl_version(void);
yajl_handle yajl_alloc(const yajl_callbacks *callbacks, yajl_alloc_funcs *afs, void *ctx);
int yajl_config(yajl_handle h, yajl_option opt, ...);
yajl_status yajl_parse(yajl_handle hand, const unsigned char *jsonText, size_t jsonTextLength);
yajl_status yajl_complete_parse(yajl_handle hand);
unsigned char* yajl_get_error(yajl_handle hand, int verbose, const unsigned char *jsonText, size_t jsonTextLength);
void yajl_free_error(yajl_handle hand, unsigned char * str);
void yajl_free(yajl_handle handle);
            c                    s    fdd}|S )Nc                    s   t   fdd}|S )Nc                    s(   |i |}t | }| |f dS )Nr   )ffifrom_handle)ctxargskwargsvaluesend)eventfunc O/home/ubuntu/vllm_env/lib/python3.10/site-packages/ijson/backends/yajl2_cffi.pywrappedM   s   
z5append_event_to_ctx.<locals>.wrapper.<locals>.wrapped)	functoolswraps)r   r   r   )r   r   wrapperL   s   z$append_event_to_ctx.<locals>.wrapperr   )r   r   r   r   r   append_event_to_ctxK   s   r   zint(void *ctx)nullc                   C      d S Nr   r   r   r   r   r   W      zint(void *ctx, int val)booleanc                 C      t | S r   )boolvalr   r   r   r   ]      z$int(void *ctx, long long integerVal)numberc                 C   r    r   )intr"   r   r   r   integerc   r$   r'   z!int(void * ctx, double doubleVal)c                 C   s   | S r   r   r"   r   r   r   doublei   r   r(   z7int(void *ctx, const char *numberVal, size_t numberLen)c                 C   s   t tj| |ddS N)maxlenzutf-8)r   integer_or_decimalr
   stringdecoder#   lengthr   r   r   r%   o   s   z@int(void *ctx, const unsigned char *stringVal, size_t stringLen)r,   c                 C      t j| |ddS r)   r
   r,   r-   r.   r   r   r   r,   u      	start_mapc                   C   r   r   r   r   r   r   r   r3   {   r   z:int(void *ctx, const unsigned char *key, size_t stringLen)map_keyc                 C   r0   r)   r1   )keyr/   r   r   r   r4      r2   end_mapc                   C   r   r   r   r   r   r   r   r6      r   start_arrayc                   C   r   r   r   r   r   r   r   r7      r   	end_arrayc                   C   r   r   r   r   r   r   r   r8      r   Fc                 C   sz   t || _|rt dt| _nt dt| _t| jt j	| j}|r.t
|tt dd |r;t
|tt dd |S )Nzyajl_callbacks*r&   r   )r
   
new_handler   new_float_callback_data	callbacks_decimal_callback_datayajl
yajl_allocNULLyajl_configYAJL_ALLOW_COMMENTScastYAJL_MULTIPLE_VALUES)scoper   allow_commentsmultiple_values	use_floathandler   r   r   	yajl_init   s   rJ   c                 C   s   |rt | |t|}nt | }|tkrIt | d|t|}t|}z|d}W n	 t	y4   Y nw t 
| | |tkrBtjntj}||d S )Nr   utf8)r>   
yajl_parselenyajl_complete_parseYAJL_OKyajl_get_errorr
   r,   r-   UnicodeDecodeErroryajl_free_errorYAJL_INSUFFICIENT_DATAr   IncompleteJSONError	JSONError)rI   bufferresultperrorerror	exceptionr   r   r   rL      s   

rL   c                   @   s   e Zd ZdS )	ContainerN)__name__
__module____qualname__r   r   r   r   r[      s    r[   c              	   k   sp    t  }t|| jfi |}z#	 zdV }W n ty    d}Y nw t|| |s)nqW t| dS t| w )z
    Coroutine dispatching unprefixed events.

    Parameters:

    - allow_comments: tells parser to allow comments in JSON input
    - multiple_values: allows the parser to parse multiple JSON objects
    TN    )r[   rJ   r   GeneratorExitrL   r>   	yajl_free)targetconfigrE   rI   rV   r   r   r   basic_parse_basecoro   s    

rd   )FFF))__doc__cffir   r   ijsonr   r   r   r
   cdeffind_yajl_cffir>   rO   YAJL_CANCELLEDrS   
YAJL_ERRORrB   rD   r   callbackr   r   r'   r(   r%   r,   r3   r4   r6   r7   r8   r@   r=   r;   rJ   rL   r[   	coroutinerd   enrich_backendglobalsr   r   r   r   <module>   sv    
3



