a oe&;@sdZddlZddlZGdddeZGdddeZdZdZGdddZGd d d eZ Gd d d eZ Gd ddeZ GdddeZ Gddde Z Gddde ZGddde ZGddde ZGddde ZGddde ZGddde ZGdd d e ZGd!d"d"e ZGd#d$d$e ZGd%d&d&eZGd'd(d(e ZGd)d*d*e Zd+d,d-d.d/d0d1d2d3d4d5d3d3d3d3d3d3d3d3d3d3d6ZGd7d8d8eZedd9fedd9fedd9fed9d9fed9d9fed9d9fed9d9fed9d9fed9d9fed9d9fedfe d9dfedfedfedfedfedfedfedfedfedfedfedfed9d9fed9d9fedfedfedfedfedfedfe dfe dfe dfe dfe dfe d9fe d9fe d9fe d9fe d9fe d9fe d9fe d9fe dfe dfedd9fedd9fedd9fedd9fedd9fedd9fed:d:feddfedd9fedd9fedd9fd;9ZeD]Zedfee<q.dd?d?Z Gd@dAdAZ!GdBdCdCZ"dDdEZ#dFdGZ$dHdIZ%dJdKZ&dS)LaUtilities for makegw - Parse a header file to build an interface This module contains the core code for parsing a header file describing a COM interface, and building it into an "Interface" structure. Each Interface has methods, and each method has arguments. Each argument knows how to use Py_BuildValue or Py_ParseTuple to exchange itself with Python. See the @win32com.makegw@ module for information in building a COM interface NcseZdZdfdd ZZS)error_not_found%The requested item could not be foundcstt||dSN)superr__init__selfmsg __class__r/rr$r;r r r GetBuildForGatewayPostCodes  z'ArgFormatter.GetBuildForGatewayPostCodecCsd||jj|jjfS)Nz$// @pyparm %s|%s||Description for %s)_GetPythonTypeDescrr$r'r r r GetAutoduckStrings zArgFormatter.GetAutoduckStringcCsdS)zJReturns a string with the description of the type. Used for doco purposesNr r'r r r r@szArgFormatter._GetPythonTypeDesccCsdS)z5Determines if this arg forces a USES_CONVERSION macrorr r'r r r NeedUSES_CONVERSIONsz ArgFormatter.NeedUSES_CONVERSIONN)r)rrr__doc__rr"r%r(r)r-r0r1r,r4r#r6r7r8r=r>r?rAr@rBr r r r r$s*   rc@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS)ArgFormatterFloatcCsdS)Nfr r'r r r GetFormatCharszArgFormatterFloat.GetFormatCharcCs d|jjS)Nz double dbl%s; r&r'r r r r6sz4ArgFormatterFloat.DeclareParseArgTupleInputConvertercCs d|jjSNz&dblr&r'r r r r)sz"ArgFormatterFloat.GetParseTupleArgcCsdS)Nfloatr r'r r r r@sz$ArgFormatterFloat._GetPythonTypeDesccCs d|jjSrGr&r'r r r r(sz"ArgFormatterFloat.GetBuildValueArgcCsd|jjd|jjdS)Nz dbl = ; r&r'r r r r8sz-ArgFormatterFloat.GetBuildForInterfacePreCodecCs(d|jj||d|jjdS)Nz dbl%s = rrJrr$r"r#r'r r r r=s z+ArgFormatterFloat.GetBuildForGatewayPreCodecCs>d}|jr|||d}||jj}|d|jj}|S)N rz = (float)dbl%s; rr"r#rr$r;r r r r7s  z"ArgFormatterFloat.GetParsePostCodeN rrrrFr6r)r@r(r8r=r7r r r r rDsrDc@sLeZdZddZddZddZddZd d Zd d Zd dZ ddZ dS)ArgFormatterShortcCsdS)Nir r'r r r rFszArgFormatterShort.GetFormatCharcCs d|jjS)Nz INT i%s; r&r'r r r r6sz4ArgFormatterShort.DeclareParseArgTupleInputConvertercCs d|jjSNz&ir&r'r r r r)sz"ArgFormatterShort.GetParseTupleArgcCsdS)Nintr r'r r r r@sz$ArgFormatterShort._GetPythonTypeDesccCs d|jjSrQr&r'r r r r( sz"ArgFormatterShort.GetBuildValueArgcCsd|jjd|jjdS)Nz irIrJr&r'r r r r8sz-ArgFormatterShort.GetBuildForInterfacePreCodecCs(d|jj||d|jjdS)Nz i%s = rrJrKr'r r r r=s z+ArgFormatterShort.GetBuildForGatewayPreCodecCs>d}|jr|||d}||jj}|d|jj}|S)NrLrz = i%s; rMr;r r r r7s  z"ArgFormatterShort.GetParsePostCodeNrNr r r r rOsrOc@sTeZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ dS)ArgFormatterLONG_PTRcCsdSNOr r'r r r rF$sz"ArgFormatterLONG_PTR.GetFormatCharcCs d|jjSNz PyObject *ob%s; r&r'r r r r6'sz7ArgFormatterLONG_PTR.DeclareParseArgTupleInputConvertercCs d|jjSNz&obr&r'r r r r)+sz%ArgFormatterLONG_PTR.GetParseTupleArgcCsdS)Nzint/longr r'r r r r@.sz'ArgFormatterLONG_PTR._GetPythonTypeDesccCs d|jjSNobr&r'r r r r(1sz%ArgFormatterLONG_PTR.GetBuildValueArgcCs d|jjSNz Py_XDECREF(ob%s); r&r'r r r r>4sz1ArgFormatterLONG_PTR.GetBuildForInterfacePostCodecCsd|jj|ddfS)Nz^ if (bPythonIsHappy && !PyWinLong_AsULONG_PTR(ob%s, (ULONG_PTR *)%s)) bPythonIsHappy = FALSE; rr$r%r'r r r r77sz%ArgFormatterLONG_PTR.GetParsePostCodecCs|dd}d|jj|fS)Nrz' ob%s = PyWinObject_FromULONG_PTR(%s); r%rr$rZ notdirectedr r r r8=s  z0ArgFormatterLONG_PTR.GetBuildForInterfacePreCodecCs d|jjSrZr&r'r r r r?Dsz/ArgFormatterLONG_PTR.GetBuildForGatewayPostCodeN) rrrrFr6r)r@r(r>r7r8r?r r r r rS#srSc@s@eZdZdZddZddZddZdd Zd d Zd d Z dS)ArgFormatterPythonCOMz:An arg formatter for types exposed in the PythonCOM modulecCsdSrTr r'r r r rFKsz#ArgFormatterPythonCOM.GetFormatCharcCs d|jjSrVr&r'r r r r6Qsz8ArgFormatterPythonCOM.DeclareParseArgTupleInputConvertercCs d|jjSrWr&r'r r r r)Usz&ArgFormatterPythonCOM.GetParseTupleArgcCs d|jjS)Nzrtyper'r r r r@Xsz(ArgFormatterPythonCOM._GetPythonTypeDesccCs d|jjSrXr&r'r r r r([sz&ArgFormatterPythonCOM.GetBuildValueArgcCs d|jjSrZr&r'r r r r>^sz2ArgFormatterPythonCOM.GetBuildForInterfacePostCodeN) rrrrCrFr6r)r@r(r>r r r r r_Hsr_c@s4eZdZddZddZddZddZd d Zd S) ArgFormatterBSTRcCsdSNz r r'r r r r@csz#ArgFormatterBSTR._GetPythonTypeDesccCsd|jj|ddfSNzN if (bPythonIsHappy && !PyWinObject_AsBstr(ob%s, %s)) bPythonIsHappy = FALSE; r[r\r'r r r r7fsz!ArgFormatterBSTR.GetParsePostCodecCs|dd}d|jj|fS)Nrz ob%s = MakeBstrToObj(%s); r]r^r r r r8ls z,ArgFormatterBSTR.GetBuildForInterfacePreCodecCsd|jjft|S)N SysFreeString(%s); rr$r_r>r'r r r r>ps z-ArgFormatterBSTR.GetBuildForInterfacePostCodecCs d|jjSrZr&r'r r r r?usz+ArgFormatterBSTR.GetBuildForGatewayPostCodeN)rrrr@r7r8r>r?r r r r rbbs rbc@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)ArgFormatterOLECHARcCsdSrcr r'r r r r@zsz&ArgFormatterOLECHAR._GetPythonTypeDesccCs@|jjdddkr4|jjdd|jjddS|jjSdSNZLPCr[rrar2r'r r r r,}s z"ArgFormatterOLECHAR.GetUnconstTypecCsd|jj|ddfSrdr\r'r r r r7sz$ArgFormatterOLECHAR.GetParsePostCodecCsd|ddS)Nrerr%r'r r r r0sz*ArgFormatterOLECHAR.GetInterfaceArgCleanupcCs||jd}d|jj|fS)Nrz ob%s = MakeOLECHARToObj(%s); r%rrr$r^r r r r8sz/ArgFormatterOLECHAR.GetBuildForInterfacePreCodecCsd|jjft|S)N CoTaskMemFree(%s); rfr'r r r r>s z0ArgFormatterOLECHAR.GetBuildForInterfacePostCodecCs d|jjSrZr&r'r r r r?sz.ArgFormatterOLECHAR.GetBuildForGatewayPostCodeN rrrr@r,r7r0r8r>r?r r r r rgysrgc@sDeZdZddZddZddZddZd d Zd d Zd dZ dS)ArgFormatterTCHARcCsdS)Nzstring/r r'r r r r@sz$ArgFormatterTCHAR._GetPythonTypeDesccCs@|jjdddkr4|jjdd|jjddS|jjSdSrhrjr'r r r r,s z ArgFormatterTCHAR.GetUnconstTypecCsd|jj|ddfS)NzO if (bPythonIsHappy && !PyWinObject_AsTCHAR(ob%s, %s)) bPythonIsHappy = FALSE; r[r\r'r r r r7sz"ArgFormatterTCHAR.GetParsePostCodecCsd|ddS)Nz PyWinObject_FreeTCHAR(%s); rrkr'r r r r0sz(ArgFormatterTCHAR.GetInterfaceArgCleanupcCs||jd}d|jj|fS)Nrz# ob%s = PyWinObject_FromTCHAR(%s); rlr^r r r r8sz-ArgFormatterTCHAR.GetBuildForInterfacePreCodecCsdS)Nz// ??? - TCHAR post code r r'r r r r>sz.ArgFormatterTCHAR.GetBuildForInterfacePostCodecCs d|jjSrZr&r'r r r r?sz,ArgFormatterTCHAR.GetBuildForGatewayPostCodeNrnr r r r rosroc@s,eZdZddZddZddZddZd S) ArgFormatterIIDcCsdS)Nz r r'r r r r@sz"ArgFormatterIID._GetPythonTypeDesccCsd|jj|jjfS)Nz< if (!PyWinObject_AsIID(ob%s, &%s)) bPythonIsHappy = FALSE; r&r'r r r r7sz ArgFormatterIID.GetParsePostCodecCs|dd}d|jj|fS)Nrz! ob%s = PyWinObject_FromIID(%s); r]r^r r r r8s z+ArgFormatterIID.GetBuildForInterfacePreCodecCs|jjd|jjfS)NzIID %sr&r'r r r r-sz)ArgFormatterIID.GetInterfaceCppObjectInfoN)rrrr@r7r8r-r r r r rpsrpc@s6eZdZd ddZddZddZdd Zd d Zd S)ArgFormatterTimercCsP|jdkr<|jdddkr<|jdd|_|jd|_d}t||||dS)Nrr[ZLPr)r+r2r_rrr r r rs zArgFormatterTime.__init__cCsdS)Nzr r'r r r r@sz#ArgFormatterTime._GetPythonTypeDesccCs d|jj|jj||jdfS)Nz if (!PyTime_Check(ob%s)) { PyErr_SetString(PyExc_TypeError, "The argument must be a PyTime object"); bPythonIsHappy = FALSE; } if (!((PyTime *)ob%s)->GetTime(%s)) bPythonIsHappy = FALSE; r)rr$r%rr'r r r r7s z!ArgFormatterTime.GetParsePostCodecCs||jd}d|jj|fS)Nrz ob%s = new PyTime(%s); rlr^r r r r8sz,ArgFormatterTime.GetBuildForInterfacePreCodecCs0d}|j|jjdkr"d|jj}|t|S)Nrrrm)rrr+r$r_r>rretr r r r>s z-ArgFormatterTime.GetBuildForInterfacePostCodeN)r)rrrrr@r7r8r>r r r r rqs   rqc@s$eZdZddZddZddZdS)ArgFormatterSTATSTGcCsdS)Nz r r'r r r r@sz&ArgFormatterSTATSTG._GetPythonTypeDesccCsd|jj|ddfS)NzM if (!PyCom_PyObjectAsSTATSTG(ob%s, %s, 0/*flags*/)) bPythonIsHappy = FALSE; rr\r'r r r r7sz$ArgFormatterSTATSTG.GetParsePostCodecCs(|dd}d|jj|dd||fS)Nrz ob%s = PyCom_PyObjectFromSTATSTG(%s); // STATSTG doco says our responsibility to free if ((%s).pwcsName) CoTaskMemFree((%s).pwcsName); r]r^r r r r8s  z/ArgFormatterSTATSTG.GetBuildForInterfacePreCodeNrrrr@r7r8r r r r rtsrtc@s,eZdZddZddZddZddZd S) ArgFormatterGenericcCs d|jjSNzr`r'r r r r@sz&ArgFormatterGeneric._GetPythonTypeDesccCsd|jj|jj|ddfS)Nz7 if (!PyObject_As%s(ob%s, &%s) bPythonIsHappy = FALSE; r)rrar$r%r'r r r r7s  z$ArgFormatterGeneric.GetParsePostCodecCsd|jj|jjfS)Nz PyObject_Free%s(%s); )rrar$r'r r r r0sz*ArgFormatterGeneric.GetInterfaceArgCleanupcCs*|dd}d|jj|jj|ddfS)Nrz ob%s = PyObject_From%s(%s); )r%rr$rar^r r r r8s   z/ArgFormatterGeneric.GetBuildForInterfacePreCodeNrrrr@r7r0r8r r r r rv srvc@s,eZdZddZddZddZddZd S) ArgFormatterIDLISTcCsdS)Nz r r'r r r r@%sz%ArgFormatterIDLIST._GetPythonTypeDesccCsd|jj|ddfS)NzL if (bPythonIsHappy && !PyObject_AsPIDL(ob%s, &%s)) bPythonIsHappy = FALSE; rr\r'r r r r7(sz#ArgFormatterIDLIST.GetParsePostCodecCsd|jjfS)Nz PyObject_FreePIDL(%s); r&r'r r r r0.sz)ArgFormatterIDLIST.GetInterfaceArgCleanupcCs$|dd}d|jj|ddfS)Nrz ob%s = PyObject_FromPIDL(%s); r]r^r r r r81s   z.ArgFormatterIDLIST.GetBuildForInterfacePreCodeNrxr r r r ry$sryc@s$eZdZddZddZddZdS)ArgFormatterHANDLEcCsdS)Nz r r'r r r r@:sz%ArgFormatterHANDLE._GetPythonTypeDesccCsd|jj|ddfS)NzE if (!PyWinObject_AsHANDLE(ob%s, &%s, FALSE) bPythonIsHappy = FALSE; rr\r'r r r r7=sz#ArgFormatterHANDLE.GetParsePostCodecCs$|dd}d|jj|ddfS)Nrz$ ob%s = PyWinObject_FromHANDLE(%s); rr]r^r r r r8Cs   z.ArgFormatterHANDLE.GetBuildForInterfacePreCodeNrur r r r rz9srzc@s,eZdZddZddZddZddZd S) ArgFormatterLARGE_INTEGERcCsdS)N LARGE_INTEGERr r'r r r GetKeyNameLsz$ArgFormatterLARGE_INTEGER.GetKeyNamecCs d|Srw)r}r'r r r r@Osz,ArgFormatterLARGE_INTEGER._GetPythonTypeDesccCsd||jj|ddfS)Nz: if (!PyWinObject_As%s(ob%s, %s)) bPythonIsHappy = FALSE; r)r}rr$r%r'r r r r7Rs  z*ArgFormatterLARGE_INTEGER.GetParsePostCodecCs"|dd}d|jj||fS)Nrz ob%s = PyWinObject_From%s(%s); )r%rr$r}r^r r r r8Ys  z5ArgFormatterLARGE_INTEGER.GetBuildForInterfacePreCodeN)rrrr}r@r7r8r r r r r{Ksr{c@seZdZddZdS)ArgFormatterULARGE_INTEGERcCsdS)NULARGE_INTEGERr r'r r r r}csz%ArgFormatterULARGE_INTEGER.GetKeyNameN)rrrr}r r r r r~bsr~c@s4eZdZddZddZddZddZd d Zd S) ArgFormatterInterfacecCs$|d|jjd||jjffS)Nrz%s * %s)r%rr+r,r$r'r r r r-hsz/ArgFormatterInterface.GetInterfaceCppObjectInfocCs6|jr|dd}n |dd}d|jj|jj|fS)Nr[rz if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(ob%s, IID_%s, (void **)%s, TRUE /* bNoneOK */)) bPythonIsHappy = FALSE; )rr%rr$ra)rZsArgr r r r7ns z&ArgFormatterInterface.GetParsePostCodecCsd|jj|jj|jjfS)Nz7 ob%s = PyCom_PyObjectFromIUnknown(%s, IID_%s, FALSE); )rr$rar'r r r r8zs z1ArgFormatterInterface.GetBuildForInterfacePreCodecCs,||d}d|jj||jj|jjfS)Nrz8 ob%s = PyCom_PyObjectFromIUnknown(%s%s, IID_%s, TRUE); )r"r#rr$ra)rZsPrefixr r r r=sz/ArgFormatterInterface.GetBuildForGatewayPreCodecCsd|jj|jjfS)Nz if (%s) %s->Release(); r&r'r r r r0sz,ArgFormatterInterface.GetInterfaceArgCleanupN)rrrr-r7r8r=r0r r r r rgs   rc@s$eZdZddZddZddZdS)ArgFormatterVARIANTcCsd|jj|ddfS)NzG if ( !PyCom_VariantFromPyObject(ob%s, %s) ) bPythonIsHappy = FALSE; rr\r'r r r r7sz$ArgFormatterVARIANT.GetParsePostCodecCs|dd}d|jj|fS)Nrz' ob%s = PyCom_PyObjectFromVariant(%s); r]r^r r r r=s  z-ArgFormatterVARIANT.GetBuildForGatewayPreCodecCs d|jjSrZr&r'r r r r?sz.ArgFormatterVARIANT.GetBuildForGatewayPostCodeN)rrrr7r=r?r r r r rsr)BOOLrRrP)UINTrRrP)BYTErRrP)INTrRrP)DWORDrRl)HRESULTrRr)ULONGrRr)LONGrRr)rRrRrP)longrRr)DISPIDrr)rrrrrrrrrRrrZ APPBREAKFLAGSZBREAKRESUMEACTIONZERRORRESUMEACTIONZ BREAKREASONZBREAKPOINT_STATEZBREAKRESUME_ACTIONZSOURCE_TEXT_ATTRZ TEXT_DOC_ATTRZ QUERYOPTIONZ PARSEACTIONc@s eZdZdZddZddZdS)ArgFormatterSimplez-An arg formatter for simple integer etc typescCst|jjdS)Nr[ConvertSimpleTypesrrar'r r r rFsz ArgFormatterSimple.GetFormatCharcCst|jjdSr3rr'r r r r@sz%ArgFormatterSimple._GetPythonTypeDescN)rrrrCrFr@r r r r rsrrr[)9z const OLECHARZWCHARZOLECHARZ LPCOLESTRZLPOLESTRZLPCWSTRZLPWSTRZLPCSTRZLPTSTRZLPCTSTRZHANDLEZBSTR const IIDZCLSIDZIIDZGUIDz const GUIDrZREFCLSIDZREFIIDZREFGUIDzconst FILETIMEzconst SYSTEMTIMEzconst LPSYSTEMTIMEZ LPSYSTEMTIMEZFILETIMEZ SYSTEMTIMEZSTATSTGr|rZVARIANTrHZsingleZshortZWORDZ VARIANT_BOOLZHWNDZHMENUZHOLEMENUZHICONZHDCZLPARAMZWPARAMZLRESULTrZSVSIFZControlZ DataObjectZ _PropertyBagZ AsyncPropZ DataSourceZ DataFormatzvoid **Z ITEMIDLISTZ LPITEMIDLISTZ LPCITEMIDLISTzconst ITEMIDLISTcCszNt|jd}t|jd}d}tt|jdkrBt|jd}||||WSty|jddkrzt|ddYStd|j|jfYn0dS)Nrrr[IzThe type '%s' (%s) is unknown.) AllConvertersralenKeyErrorrrr$)rZclzbinZdeclr r r make_arg_converters rc@s:eZdZdZedZddZddZddZ d d Z d S) ArgumentzA representation of an argument to a COM method This class contains information about a specific argument to a method. In addition, methods exist so that an argument knows how to convert itself to/from Python arguments. z6/\* \[([^\]]*.*?)] \*/[ \t](.*[* ]+)(\w+)(\[ *])?[\),]cCs(||_d|_|_|_d|_d|_dSr)good_interface_namesinoutr$raconst arrayDeclrrr r r r&szArgument.__init__cCsP|}|j|}|st|d|_|dd|_|d}||_ d|_ |drd|_ z*| d}|j d|_ |d|}Wnt yYn0|dd }z*| d }|j d|_ |d|}Wqt yYqYq0q||_|jdd d kr|jd d|_n|j|_trLtd |j|jd |j |jfdS)zParse and build my data from a file Reads the next line in the file, and matches it as an argument description. If not a valid argument line, an error_not_found exception is raised. rirz][r[rr9Z __RPC_FARNrr zconst z Arg %s of type %s%s (%s))readlineregexsearchrgroupr$splitrstripraw_typer+rrindex ValueErrorreplacerar2VERBOSEr5)rfilelinemotypposr r r BuildFromFile,sD           zArgument.BuildFromFilecCs ||jvS)aDetermines if the argument has the specific attribute. Argument attributes are specified in the header file, such as "[in][out][retval]" etc. You can pass a specific string (eg "out") to find if this attribute was specified for the argument )r)rrr r r HasAttributeYszArgument.HasAttributecCs"d|j|jf}|jr|d}|S)Nr*z[])rr$rrrr r r GetRawDeclarationbszArgument.GetRawDeclarationN) rrrrCrecompilerrrrrr r r r rs  - rc@s*eZdZdZedZddZddZdS)MethodzA representation of a C++ method on a COM interface This class contains information about a specific method, as well as a list of all @Argument@s z+virtual (/\*.*?\*/ )?(.*?) (.*?) (.*?)\(\w?cCs"||_d|_|_|_g|_dSr)rr$resultZcallconvargsrr r r rtszMethod.__init__cCs|}|j|}|st|d|_|d|_|jdkrt|jdkrRtdntd|jtd|j|jft|j }z| ||j |WqttyYqYqt0qtdS) zParse and build my data from a file Reads the next line in the file, and matches it as a method description. If not a valid method line, an error_not_found exception is raised. r9r[rrzBWarning: Old style interface detected - compilation errors likely!z4Method %s - Only HRESULT return types are supported.z Method %s %s(N) rrrrrr$rr5rrrrappend)rrrrrr r r rys*        zMethod.BuildFromFileN) rrrrCrrrrrr r r r ris rc@s*eZdZdZedZddZddZdS) InterfacezA representation of a C++ COM Interface This class contains information about a specific interface, as well as a list of all @Method@s z#(interface|) ([^ ]*) : public (.*)$cCs:g|_|d|_|d|_tr6td|j|jfdS)Nr[rizInterface %s : public %s)methodsrr$baserr5)rrr r r rs   zInterface.__init__cCsT||z&t|jg}|||j|WqtyLYqPYq0qdS)z(Build all sub-methods for this interfaceN)rrr$rrrr)rrmethodr r r BuildMethodss   zInterface.BuildMethodsN) rrrrCrrrrrr r r r rs rcCstd}|}|rdtj|}|rZ|d}t|tddft|<||krZt|}|||}q |rl|St dS)zFind and return an interface in a file Given an interface name and file, search for the specified interface. Upon return, the interface itself has been built, but not the methods. Nr[rr) rrrrrr5rrrr) interfaceNamerZ interfacerrr$r r r find_interfaces    rcCs6z t||WStjy0ttdYn0dS)zFind, parse and return an interface in a file Given an interface name and file, search for the specified interface. Upon return, the interface itself is fully built, zCThe interface could not be built, as the regular expression failed!N)rrerror traceback print_excr5)rrr r r parse_interface_infos  rcCs.td}ztd|W|n |0dS)Nzd:\msdev\include\objidl.hZIPersistStream)openrclose)rEr r r tests rc CsP||d}|dkrtdn.td||d|d|d|dfdS) Nrrz ** Not foundz%d %s %s %s %srr[rir9)rr5r)rtextresr r r test_regexs   (r)'rCrr Exceptionrrrr/rrDrOrSr_rbrgrorprqrtrvryrzr{r~rrrrrkeyskeyrrrrrrrrr r r r s 3'&%")' = O1