
Xc           @` s  d  Z  d d l 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 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# m$ Z$ m% Z% d d l m& Z& e j' Z( i d d 6d	 d
 6d d g d 6d d 6d d 6d d 6d d 6d d 6Z) i i d d 6d d 6d d 6d d 6d d 6d d  6d d! 6d d" 6d d# 6d d$ 6d d% 6d& d' 6d d( 6d d) 6d d* 6d d+ 6d d, 6d- 6d. d 6d/ d 6d0 d$ 6g  d 6d d 6d d1 6d d2 6d3 d 6g  d  6d d! 6d d4 6g  d" 6d d# 6d d5 6d d6 6d7 d% 6d d' 6d d( 6d8 d9 6d: d; 6d< d= 6d> d? 6d d@ 6d dA 6d dB 6dC d) 6dD d* 6dE d+ 6dF d, 6i dG e 6d e  e  6dH 6i dI d 6i dJ e	 6dK i dL e	 6g d$ 6dM i d e	 6dN g d 6dO d1 6e e e  e  e  e   dP 6i i dQ e	 6d 6dR d 6dS d" 6dT d  6i dU e	 6dV i dW e	 6g d$ 6dM i d e	 6dX dY g d 6dZ d1 6e dP 6i d[ d 6d\ d# 6d] d! 6d^ d 6i dJ e	 6d_ i d` e	 6g d$ 6da d1 6dM i d e	 6dX dN db g d 6e dP 6i dc d= 6dd i dG e 6g d+ 6de d@ 6e dP 6i e dP 6dZ d1 6g Z* i	 i df e e e  6d; 6i df e e e  6d9 6i dc e 6d= 6i dg i dG e 6g e e e  6d* 6i dg i dG e 6g e e e  6d) 6i dd i dG e e e  6dh e e e  6g e 6d+ 6i di e e e  6dA 6i di e e e  6dB 6d dj 6i i dk e e e  6dl e e e  e   6dm e 6dk e 6d 6i dn e e e  6do e e e  e   6dn e 6dn e 6d" 6i db e e e  6dp e e e  e   6dp e 6db e 6d  6i dq e 6d2 6i dr e 6d4 6i ds e 6d5 6i i dt e  e  6d 6i d e e e e% du   6dv 6i dw e	 6i dx e 6i dy e e	 e e  e  e   6i dz e e	 e e  e  e  e    6i d{ e e	 e e e   6i d| e e	 e e e  e    6g d$ 6i dM dN g e 6i d e	 6g d 6e dP 6i i d} e 6i d~ e 6g d 6i d e 6i d e 6i db e 6g d 6e e e  dP 6d d 6i i d e	 6d i d e	 6g d$ 6db dY i d e	 6dX g d 6e e e  dP 6i i d e	 6i d e 6i d e 6g d 6i d e 6i d e 6g d 6e e e  dP 6d d 6i d d 6d d% 6e dP 6d d 6i i d e	 6i d e 6d e  e  6d g d 6e e e e! e e   dP 6d d 6i i dw e	 6d i d e 6d i d e	 6g d$ 6d i db e 6g d 6e e e  dP 6i di d@ 6e dP 6g
 Z+ i  a, d   Z- d   Z. d S(   sK  

Build call-back mechanism for f2py2e.

Copyright 2000 Pearu Peterson all rights reserved,
Pearu Peterson <pearu@ioc.ee>
Permission to use, modify, and distribute this software is given under the
terms of the NumPy License.

NO WARRANTY IS EXPRESSED OR IMPLIED.  USE AT YOUR OWN RISK.
$Date: 2005/07/20 11:27:58 $
Pearu Peterson

i    (   t   divisiont   absolute_importt   print_functioni   (   t   __version__(   t
   applyrulest	   debugcapit
   dictappendt   errmesst   getargst   hasnotet   isarrayt	   iscomplext   iscomplexarrayt   iscomplexfunctiont
   isfunctiont
   isintent_ct   isintent_hidet   isintent_int   isintent_inoutt   isintent_nothidet   isintent_outt
   isoptionalt
   isrequiredt   isscalart   isstringt   isstringfunctiont   issubroutinet   l_andt   l_nott   l_ort   outmesst   replacet
   stripcommat   throw_error(   t   cfuncssP   typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);t
   cbtypedefss
  
#begintitle#
PyObject *#name#_capi = NULL;/*was Py_None*/
PyTupleObject *#name#_args_capi = NULL;
int #name#_nofargs = 0;
jmp_buf #name#_jmpbuf;
/*typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);*/
#static# #rctype# #callbackname# (#optargs##args##strarglens##noargs#) {
	PyTupleObject *capi_arglist = #name#_args_capi;
	PyObject *capi_return = NULL;
	PyObject *capi_tmp = NULL;
	int capi_j,capi_i = 0;
	int capi_longjmp_ok = 1;
#decl#
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_start_clock();
#endif
	CFUNCSMESS("cb:Call-back function #name# (maxnofargs=#maxnofargs#(-#nofoptargs#))\n");
	CFUNCSMESSPY("cb:#name#_capi=",#name#_capi);
	if (#name#_capi==NULL) {
		capi_longjmp_ok = 0;
		#name#_capi = PyObject_GetAttrString(#modulename#_module,"#argname#");
	}
	if (#name#_capi==NULL) {
		PyErr_SetString(#modulename#_error,"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\n");
		goto capi_fail;
	}
	if (F2PyCapsule_Check(#name#_capi)) {
	#name#_typedef #name#_cptr;
	#name#_cptr = F2PyCapsule_AsVoidPtr(#name#_capi);
	#returncptr#(*#name#_cptr)(#optargs_nm##args_nm##strarglens_nm#);
	#return#
	}
	if (capi_arglist==NULL) {
		capi_longjmp_ok = 0;
		capi_tmp = PyObject_GetAttrString(#modulename#_module,"#argname#_extra_args");
		if (capi_tmp) {
			capi_arglist = (PyTupleObject *)PySequence_Tuple(capi_tmp);
			if (capi_arglist==NULL) {
				PyErr_SetString(#modulename#_error,"Failed to convert #modulename#.#argname#_extra_args to tuple.\n");
				goto capi_fail;
			}
		} else {
			PyErr_Clear();
			capi_arglist = (PyTupleObject *)Py_BuildValue("()");
		}
	}
	if (capi_arglist == NULL) {
		PyErr_SetString(#modulename#_error,"Callback #argname# argument list is not set.\n");
		goto capi_fail;
	}
#setdims#
#pyobjfrom#
	CFUNCSMESSPY("cb:capi_arglist=",capi_arglist);
	CFUNCSMESS("cb:Call-back calling Python function #argname#.\n");
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_start_call_clock();
#endif
	capi_return = PyObject_CallObject(#name#_capi,(PyObject *)capi_arglist);
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_stop_call_clock();
#endif
	CFUNCSMESSPY("cb:capi_return=",capi_return);
	if (capi_return == NULL) {
		fprintf(stderr,"capi_return is NULL\n");
		goto capi_fail;
	}
	if (capi_return == Py_None) {
		Py_DECREF(capi_return);
		capi_return = Py_BuildValue("()");
	}
	else if (!PyTuple_Check(capi_return)) {
		capi_return = Py_BuildValue("(N)",capi_return);
	}
	capi_j = PyTuple_Size(capi_return);
	capi_i = 0;
#frompyobj#
	CFUNCSMESS("cb:#name#:successful\n");
	Py_DECREF(capi_return);
#ifdef F2PY_REPORT_ATEXIT
f2py_cb_stop_clock();
#endif
	goto capi_return_pt;
capi_fail:
	fprintf(stderr,"Call-back #name# failed.\n");
	Py_XDECREF(capi_return);
	if (capi_longjmp_ok)
		longjmp(#name#_jmpbuf,-1);
capi_return_pt:
	;
#return#
}
#endtitle#
t   bodys   setjmp.ht
   CFUNCSMESSt   needs   #maxnofargs#t
   maxnofargss   #nofoptargs#t
   nofoptargssC   	def #argname#(#docsignature#): return #docreturn#\n\
#docstrsigns#t   docstrsc   
{{}\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}}
#routnote#

#latexdocstrsigns#t   latexdocstrs1   def #argname#(#docsignature#): return #docreturn#t   docstrshorts   
t   declt   ,t   argst    t   optargst	   pyobjfromt   freememt   args_tdt
   optargs_tdt   args_nmt
   optargs_nmt	   frompyobjt   setdimss   \n"
"t   docstrsignst   latexdocstrsignst   latexdocstrreqt   latexdocstroptt   latexdocstroutt   latexdocstrcbst   separatorsfors   /*decl*/s   /*pyobjfrom*/s   /*frompyobj*/t   returnt
   strarglenss   /*freemem*/t   strarglens_tdt   strarglens_nmt   noargss   /*setdims*/s   	Required arguments:t	   docstrreqs   	Optional arguments:t	   docstropts   	Return objects:t	   docstrouts   	Call-back functions:t	   docstrcbst	   docreturnt   docsignt
   docsignopts   \noindent Required arguments:s   \noindent Optional arguments:s   \noindent Return objects:s   \noindent Call-back functions:s
   --- #note#t   routnotes   	#ctype# return_value;s)   	CFUNCSMESS("cb:Getting return_value->");s   	if (capi_j>capi_i)
		GETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\n");s5   	fprintf(stderr,"#showvalueformat#.\n",return_value);s   #ctype#_from_pyobjt   GETSCALARFROMPYTUPLEs   	return return_value;t   _checks?   	fprintf(stderr,"debug-capi:cb:#name#:%d:\n",return_value_len);s)   #ctype# return_value,int return_value_lens   return_value,&return_value_lens   #ctype# ,ints+   	CFUNCSMESS("cb:Getting return_value->\"");s\   	if (capi_j>capi_i)
		GETSTRFROMPYTUPLE(capi_return,capi_i++,return_value,return_value_len);s7   	fprintf(stderr,"#showvalueformat#\".\n",return_value);s   string.ht   GETSTRFROMPYTUPLEs   return;s<   
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *return_value
#endif
s3   
#ifndef F2PY_CB_RETURNCOMPLEX
return_value
#endif
s0   
#ifndef F2PY_CB_RETURNCOMPLEX
#ctype# *
#endif
s<   
#ifdef F2PY_CB_RETURNCOMPLEX
	#ctype# return_value;
#endif
s  	if (capi_j>capi_i)
#ifdef F2PY_CB_RETURNCOMPLEX
		GETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\n");
#else
		GETSCALARFROMPYTUPLE(capi_return,capi_i++,return_value,#ctype#,"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\n");
#endif
s   
#ifdef F2PY_CB_RETURNCOMPLEX
	fprintf(stderr,"#showvalueformat#.\n",(return_value).r,(return_value).i);
#else
	fprintf(stderr,"#showvalueformat#.\n",(*return_value).r,(*return_value).i);
#endif

sJ   
#ifdef F2PY_CB_RETURNCOMPLEX
	return return_value;
#else
	return;
#endif
s   #ctype#s   		#pydocsignout#s"   \item[]{{}\verb@#pydocsignout#@{}}s   #rname#,s   		#pydocsign#s   \item[]{{}\verb@#pydocsign#@{}}s   --- See above.s
   #varname#,t   depends   #ctype# #varname_i#s   #ctype# *#varname_i#_cb_capis   #ctype# *#varname_i#s   #varname_i#s   #varname_i#_cb_capis	   #ctype# *s   ,int #varname_i#_cb_lens   ,ints   ,#varname_i#_cb_lens,   	#ctype# #varname_i#=(*#varname_i#_cb_capi);s8   intent(c,out) is forbidden for callback scalar argumentst   errors&   	CFUNCSMESS("cb:Getting #varname#->");s   	if (capi_j>capi_i)
		GETSCALARFROMPYTUPLE(capi_return,capi_i++,#varname_i#_cb_capi,#ctype#,"#ctype#_from_pyobj failed in converting argument #varname# of call-back function #name# to C #ctype#\n");s4   	fprintf(stderr,"#showvalueformat#.\n",#varname_i#);s=   	fprintf(stderr,"#showvalueformat#.\n",*#varname_i#_cb_capi);sH   	fprintf(stderr,"#showvalueformat#.\n",(#varname_i#).r,(#varname_i#).i);sZ   	fprintf(stderr,"#showvalueformat#.\n",(*#varname_i#_cb_capi).r,(*#varname_i#_cb_capi).i);s   	if (#name#_nofargs>capi_i)
		if (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1(#varname_i#)))
			goto capi_fail;s   	if (#name#_nofargs>capi_i)
		if (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname_i#_cb_capi)))
			goto capi_fail;s   pyobj_from_#ctype#1s   pyarr_from_p_#ctype#1t	   _optionals(   	CFUNCSMESS("cb:Getting #varname#->\"");s]   	if (capi_j>capi_i)
		GETSTRFROMPYTUPLE(capi_return,capi_i++,#varname_i#,#varname_i#_cb_len);sM   	fprintf(stderr,"#showvalueformat#\":%d:.\n",#varname_i#,#varname_i#_cb_len);sf   	fprintf(stderr,"debug-capi:cb:#varname#=\"#showvalueformat#\":%d:\n",#varname_i#,#varname_i#_cb_len);s   	if (#name#_nofargs>capi_i)
		if (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1size(#varname_i#,#varname_i#_cb_len)))
			goto capi_fail;s   	if (#name#_nofargs>capi_i) {
		int #varname_i#_cb_dims[] = {#varname_i#_cb_len};
		if (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname_i#,#varname_i#_cb_dims)))
			goto capi_fail;
	}s   pyobj_from_#ctype#1sizes3   	npy_intp #varname_i#_Dims[#rank#] = {#rank*[-1]#};s   	#cbsetdims#;t   _depends-   	fprintf(stderr,"debug-capi:cb:#varname#\n");s   	if (#name#_nofargs>capi_i) {
		PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,0,NPY_ARRAY_CARRAY,NULL); /*XXX: Hmm, what will destroy this array??? */
s   	if (#name#_nofargs>capi_i) {
		PyArrayObject *tmp_arr = (PyArrayObject *)PyArray_New(&PyArray_Type,#rank#,#varname_i#_Dims,#atype#,NULL,(char*)#varname_i#,0,NPY_ARRAY_FARRAY,NULL); /*XXX: Hmm, what will destroy this array??? */
s   
		if (tmp_arr==NULL)
			goto capi_fail;
		if (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,(PyObject *)tmp_arr))
			goto capi_fail;
}s   	if (capi_j>capi_i) {
		PyArrayObject *rv_cb_arr = NULL;
		if ((capi_tmp = PyTuple_GetItem(capi_return,capi_i++))==NULL) goto capi_fail;
		rv_cb_arr =  array_from_pyobj(#atype#,#varname_i#_Dims,#rank#,F2PY_INTENT_INs   |F2PY_INTENT_Cs   ,capi_tmp);
		if (rv_cb_arr == NULL) {
			fprintf(stderr,"rv_cb_arr is NULL\n");
			goto capi_fail;
		}
		MEMCOPY(#varname_i#,PyArray_DATA(rv_cb_arr),PyArray_NBYTES(rv_cb_arr));
		if (capi_tmp != (PyObject *)rv_cb_arr) {
			Py_DECREF(rv_cb_arr);
		}
	}s   	fprintf(stderr,"<-.\n");t   MEMCOPYc         C` s{   g  t  |  d <xf |  d D]Z } | d d k r xA | d D]2 } | rZ t | |  d  q: t d |  d  q: Wq q Wd  S(   Nt   nameR$   t   blockt	   interfaces   warning: empty body for %s
(   t   cb_mapt   buildcallbackR   (   t   mt   bit   b(    (    s2   /tmp/pip-build-X4mzal/numpy/numpy/f2py/cb_rules.pyt   buildcallbacks  s    c         C` s&  d d l  m } t d |  d | f  t |   \ } } | | _ |  d } | j |  |  } t i  |  } t | j |  d | d g  xZ t	 D]R } d | k r | d |   s d | k r t
 | | |   }	 t | |	  } q q Wi  }
 x t |  D] \ } } | j | | | d | } | |
 | <x t D] } d | k rNq6n  d	 | k rpt | |  rpq6n  d | k r| d | |  sd | k r6t
 | | | |  }	 t | |	  } d
 | k rPqq6q6Wq Wx | D] } |
 | } x t D] } d | k rqn  d	 | k sd	 | k r@t | |  r@qn  d | k r`| d | |  sld | k rt
 | | | |  }	 t | |	  } d
 | k rPqqqWqWx | D] } |
 | } x t D] } d | k rqn  d	 | k rqn  d | k r| d | |  s d | k rt
 | | | |  }	 t | |	  } d
 | k rXPqXqqWqWd | k rd | k rt | d t  r| d d g | d <| d d g | d <| d d g | d <qn  t | d t  r
t t d i | d d 6  | d <n  t t d i | d d 6  } | d k r]t t d i | d d 6  | d <n% t d i | d d 6| d 6 | d <| d j d d  | d <| d j d d  | d <g  | d <g  | d <x d  d! d" d# g D] } | | k rt | | t  r| d | | | d <n  d$ | } | | k rt | | t  r| d | | d% d !d& g | | d d' g | d <qqWd | k rd | d <d | d( <d | d) <n  | j d  p| j d  p| j d*  sd+ | d, <n  t
 t |  }	 |	 d- t j | d <t |	 d. t  r4|	 d. g |	 d. <n  d. | k rx> t j j   D]* } | | d. k rP|	 d. j |  qPqPWn  |	 d/ t j | d d0 <|	 d. j | d d0  |	 d. t j | d <i |	 d1 d1 6|	 d2 d2 6|	 d3 d3 6|	 d4 d4 6| d5 d5 6| j | d <t d6 |	 d7  d  S(8   Ni   (   t	   capi_mapss/   	Constructing call-back function "cb_%s_in_%s"
RU   t   varsRN   t   indexRS   RR   t   _breakR.   R0   s(   
#ifndef F2PY_CB_RETURNCOMPLEX
,
#endif
R6   R4   RI   s   #docreturn#s   #docsignopt#RK   R/   s	   #docsign#RJ   t   docsignatures   #docsign#[#docsignopt#]t   _s   \_t   latexdocsignatureR-   s   , R9   R:   RE   RF   RG   RH   t   latexi    s   \begin{description}s   \end{description}R3   R5   RA   t   voidRD   R$   R&   R#   t   _typedefR'   R(   R)   R*   t   argnames   	  %s
R+   (   R/   R^   R   R   t   depargst   cb_routsign2mapR   RX   t   appendt   cb_rout_rulesR   t	   enumeratet   cb_sign2mapt   cb_arg_rulesR   R   t
   isinstancet   listR    R   t   gett   cb_routine_rulesR"   t	   callbackst   strt   typedefst   keyst   typedefs_generatedt   needst   lcb2_map(   t   routt   umR^   R.   Ri   t   vart   vrdt   rdt   rt   art   savevrdt   it   aR0   t   kt   t(    (    s2   /tmp/pip-build-X4mzal/numpy/numpy/f2py/cb_rules.pyRY     s    	
(
,
(,
,$	$


)

-N(/   t   __doc__t
   __future__R    R   R   R/   R   t   auxfuncsR   R   R   R   R   R	   R
   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R    R!   R"   t   versiont   f2py_versionRs   Rl   Ro   RX   R]   RY   (    (    (    s2   /tmp/pip-build-X4mzal/numpy/numpy/f2py/cb_rules.pyt   <module>   sx  	^

#




%&









	