/*
 * Copyright 2013 Piotr Caban for CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#pragma makedep regtypelib

import "oaidl.idl";

#include "vbscript_defs.h"

[
    helpstring("Microsoft VBScript Regular Expressions 1.0"),
    id(2),
    uuid(3f4daca7-160d-11d2-a8e9-00104b365c9f),
    version(1.0)
]
library VBScript_RegExp_10
{
    importlib("stdole2.tlb");

    [
        dual,
        hidden,
        nonextensible,
        odl,
        oleautomation,
        uuid(3f4daca0-160d-11d2-a8e9-00104b365c9f),
    ]
    interface IRegExp : IDispatch
    {
        [id(DISPID_REGEXP_PATTERN), propget]
        HRESULT Pattern([out, retval] BSTR *pPattern);

        [id(DISPID_REGEXP_PATTERN), propput]
        HRESULT Pattern([in] BSTR pPattern);

        [id(DISPID_REGEXP_IGNORECASE), propget]
        HRESULT IgnoreCase([out, retval] VARIANT_BOOL *pIgnoreCase);

        [id(DISPID_REGEXP_IGNORECASE), propput]
        HRESULT IgnoreCase([in] VARIANT_BOOL pIgnoreCase);

        [id(DISPID_REGEXP_GLOBAL), propget]
        HRESULT Global([out, retval] VARIANT_BOOL *pGlobal);

        [id(DISPID_REGEXP_GLOBAL), propput]
        HRESULT Global([in] VARIANT_BOOL pGlobal);

        [id(DISPID_REGEXP_EXECUTE)]
        HRESULT Execute(
                [in] BSTR sourceString,
                [out, retval] IDispatch **ppMatches);

        [id(DISPID_REGEXP_TEST)]
        HRESULT Test(
                [in] BSTR sourceString,
                [out, retval] VARIANT_BOOL *pMatch);

        [id(DISPID_REGEXP_REPLACE)]
        HRESULT Replace(
                [in] BSTR sourceString,
                [in] BSTR replaceString,
                [out, retval] BSTR *pDestString);
    }

    [
        dual,
        hidden,
        nonextensible,
        odl,
        oleautomation,
        uuid(3f4daca1-160d-11d2-a8e9-00104b365c9f)
    ]
    interface IMatch : IDispatch
    {
        [id(DISPID_VALUE), propget]
        HRESULT Value([out, retval] BSTR *pValue);

        [id(DISPID_MATCH_FIRSTINDEX), propget]
        HRESULT FirstIndex([out, retval] LONG *pFirstIndex);

        [id(DISPID_MATCH_LENGTH), propget]
        HRESULT Length([out, retval] LONG *pLength);
    }

    [
        dual,
        hidden,
        nonextensible,
        odl,
        oleautomation,
        uuid(3f4daca2-160d-11d2-a8e9-00104b365c9f)
    ]
    interface IMatchCollection : IDispatch
    {
        [id(DISPID_VALUE), propget]
        HRESULT Item(
                [in] LONG index,
                [out, retval] IDispatch **ppMatch);

        [id(DISPID_MATCHCOLLECTION_COUNT), propget]
        HRESULT Count([out, retval] LONG *pCount);

        [id(DISPID_NEWENUM), propget]
        HRESULT _NewEnum([out, retval] IUnknown **ppEnum);
    }

    [
        uuid(3f4daca4-160d-11d2-a8e9-00104b365c9f)
    ]
    coclass RegExp
    {
        [default] interface IRegExp;
    }

    [
        noncreatable,
        uuid(3f4daca5-160d-11d2-a8e9-00104b365c9f)
    ]
    coclass Match
    {
        [default] interface IMatch;
    }

    [
        noncreatable,
        uuid(3f4daca6-160d-11d2-a8e9-00104b365c9f)
    ]
    coclass MatchCollection
    {
        [default] interface IMatchCollection;
    }
}
