Changeset 6648 for trunk/src/oleaut32


Ignore:
Timestamp:
Sep 5, 2001, 3:19:02 PM (24 years ago)
Author:
bird
Message:

Added $Id:$ keyword.

Location:
trunk/src/oleaut32
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/oleaut32/connpt.c

    r4837 r6648  
     1/* $Id: connpt.c,v 1.2 2001-09-05 13:18:59 bird Exp $ */
    12/*
    23 * Implementation of a generic ConnectionPoint object.
     
    7273  CONNECTDATA *pCD;
    7374  DWORD nConns;
    74  
     75
    7576  /* Next connection to enumerate from */
    7677  DWORD nCur;
     
    7980
    8081static EnumConnectionsImpl *EnumConnectionsImpl_Construct(IUnknown *pUnk,
    81                                                           DWORD nSinks,
    82                                                           CONNECTDATA *pCD);
     82                              DWORD nSinks,
     83                              CONNECTDATA *pCD);
    8384
    8485
     
    8788 */
    8889static ConnectionPointImpl *ConnectionPointImpl_Construct(IUnknown *pUnk,
    89                                                           REFIID riid)
     90                              REFIID riid)
    9091{
    9192  ConnectionPointImpl *Obj;
     
    9798  Obj->iid =  *riid;
    9899  Obj->maxSinks = MAXSINKS;
    99   Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
    100                         sizeof(IUnknown*) * MAXSINKS);
     100  Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
     101            sizeof(IUnknown*) * MAXSINKS);
    101102  Obj->nSinks = 0;
    102103  return Obj;
     
    139140  if ( (This==0) || (ppvObject==0) )
    140141    return E_INVALIDARG;
    141  
     142
    142143  /*
    143144   * Initialize the return parameter.
    144145   */
    145146  *ppvObject = 0;
    146  
     147
    147148  /*
    148149   * Compare the riid with the interface IDs implemented by this object.
    149150   */
    150   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 
     151  if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
    151152  {
    152153    *ppvObject = (IConnectionPoint*)This;
    153154  }
    154   else if (memcmp(&IID_IConnectionPoint, riid, sizeof(IID_IConnectionPoint)) == 0) 
     155  else if (memcmp(&IID_IConnectionPoint, riid, sizeof(IID_IConnectionPoint)) == 0)
    155156  {
    156157    *ppvObject = (IConnectionPoint*)This;
    157158  }
    158  
     159
    159160  /*
    160161   * Check that we obtained an interface.
     
    165166    return E_NOINTERFACE;
    166167  }
    167  
     168
    168169  /*
    169170   * Query Interface always increases the reference count by one when it is
     
    189190  return This->ref;
    190191}
    191        
     192
    192193/************************************************************************
    193194 * ConnectionPointImpl_Release (IUnknown)
     
    195196 * See Windows documentation for more details on IUnknown methods.
    196197 */
    197 static ULONG WINAPI ConnectionPointImpl_Release( 
     198static ULONG WINAPI ConnectionPointImpl_Release(
    198199      IConnectionPoint* iface)
    199200{
     
    215216    return 0;
    216217  }
    217  
     218
    218219  return This->ref;
    219220}
     
    224225 */
    225226static HRESULT WINAPI ConnectionPointImpl_GetConnectionInterface(
    226                                                IConnectionPoint *iface,
    227                                                IID              *piid)
     227                           IConnectionPoint *iface,
     228                           IID              *piid)
    228229{
    229230  ICOM_THIS(ConnectionPointImpl, iface);
     
    238239 */
    239240static HRESULT WINAPI ConnectionPointImpl_GetConnectionPointContainer(
    240                                       IConnectionPoint           *iface,
    241                                       IConnectionPointContainer  **ppCPC)
     241                      IConnectionPoint           *iface,
     242                      IConnectionPointContainer  **ppCPC)
    242243{
    243244  ICOM_THIS(ConnectionPointImpl, iface);
     
    245246
    246247  return IUnknown_QueryInterface(This->Obj,
    247                                 &IID_IConnectionPointContainer,
    248                                 (LPVOID)ppCPC);
     248                &IID_IConnectionPointContainer,
     249                (LPVOID)ppCPC);
    249250}
    250251
     
    254255 */
    255256static HRESULT WINAPI ConnectionPointImpl_Advise(IConnectionPoint *iface,
    256                                                 IUnknown *lpUnk,
    257                                                 DWORD *pdwCookie)
     257                        IUnknown *lpUnk,
     258                        DWORD *pdwCookie)
    258259{
    259260  DWORD i;
     
    273274    This->maxSinks += MAXSINKS;
    274275    This->sinks = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->sinks,
    275                               This->maxSinks * sizeof(IUnknown *));
     276                  This->maxSinks * sizeof(IUnknown *));
    276277  }
    277278  This->sinks[i] = lpSink;
     
    287288 */
    288289static HRESULT WINAPI ConnectionPointImpl_Unadvise(IConnectionPoint *iface,
    289                                                    DWORD dwCookie)
     290                           DWORD dwCookie)
    290291{
    291292  ICOM_THIS(ConnectionPointImpl, iface);
     
    307308 */
    308309static HRESULT WINAPI ConnectionPointImpl_EnumConnections(
    309                                                     IConnectionPoint *iface,
    310                                                     LPENUMCONNECTIONS *ppEnum)
    311 { 
     310                            IConnectionPoint *iface,
     311                            LPENUMCONNECTIONS *ppEnum)
     312{
    312313  ICOM_THIS(ConnectionPointImpl, iface);
    313314  CONNECTDATA *pCD;
     
    317318
    318319  TRACE("(%p)->(%p)\n", This, ppEnum);
    319  
     320
    320321  *ppEnum = NULL;
    321322
     
    339340  EnumObj = EnumConnectionsImpl_Construct((IUnknown*)This, This->nSinks, pCD);
    340341  hr = IEnumConnections_QueryInterface((IEnumConnections*)EnumObj,
    341                                   &IID_IEnumConnections, (LPVOID)ppEnum);
     342                  &IID_IEnumConnections, (LPVOID)ppEnum);
    342343  IEnumConnections_Release((IEnumConnections*)EnumObj);
    343344
     
    367368 */
    368369static EnumConnectionsImpl *EnumConnectionsImpl_Construct(IUnknown *pUnk,
    369                                                           DWORD nSinks,
    370                                                           CONNECTDATA *pCD)
     370                              DWORD nSinks,
     371                              CONNECTDATA *pCD)
    371372{
    372373  EnumConnectionsImpl *Obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*Obj));
     
    420421  if ( (This==0) || (ppvObject==0) )
    421422    return E_INVALIDARG;
    422  
     423
    423424  /*
    424425   * Initialize the return parameter.
    425426   */
    426427  *ppvObject = 0;
    427  
     428
    428429  /*
    429430   * Compare the riid with the interface IDs implemented by this object.
    430431   */
    431   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 
     432  if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
    432433  {
    433434    *ppvObject = (IEnumConnections*)This;
    434435  }
    435   else if (memcmp(&IID_IEnumConnections, riid, sizeof(IID_IEnumConnections)) == 0) 
     436  else if (memcmp(&IID_IEnumConnections, riid, sizeof(IID_IEnumConnections)) == 0)
    436437  {
    437438    *ppvObject = (IEnumConnections*)This;
    438439  }
    439  
     440
    440441  /*
    441442   * Check that we obtained an interface.
     
    446447    return E_NOINTERFACE;
    447448  }
    448  
     449
    449450  /*
    450451   * Query Interface always increases the reference count by one when it is
     
    470471  return This->ref;
    471472}
    472        
     473
    473474/************************************************************************
    474475 * EnumConnectionsImpl_Release (IUnknown)
     
    497498    return 0;
    498499  }
    499  
     500
    500501  return This->ref;
    501502}
     
    506507 */
    507508static HRESULT WINAPI EnumConnectionsImpl_Next(IEnumConnections* iface,
    508                                                ULONG cConn, LPCONNECTDATA pCD,
    509                                                ULONG *pEnum)
     509                           ULONG cConn, LPCONNECTDATA pCD,
     510                           ULONG *pEnum)
    510511{
    511512  ICOM_THIS(EnumConnectionsImpl, iface);
     
    542543 */
    543544static HRESULT WINAPI EnumConnectionsImpl_Skip(IEnumConnections* iface,
    544                                                ULONG cSkip)
     545                           ULONG cSkip)
    545546{
    546547  ICOM_THIS(EnumConnectionsImpl, iface);
     
    576577 */
    577578static HRESULT WINAPI EnumConnectionsImpl_Clone(IEnumConnections* iface,
    578                                                 LPENUMCONNECTIONS *ppEnum)
     579                        LPENUMCONNECTIONS *ppEnum)
    579580{
    580581  ICOM_THIS(EnumConnectionsImpl, iface);
    581582  EnumConnectionsImpl *newObj;
    582583  TRACE("(%p)->(%p)\n", This, ppEnum);
    583  
     584
    584585  newObj = EnumConnectionsImpl_Construct(This->pUnk, This->nConns, This->pCD);
    585586  newObj->nCur = This->nCur;
     
    588589  return S_OK;
    589590}
    590  
     591
    591592static ICOM_VTABLE(IEnumConnections) EnumConnectionsImpl_VTable =
    592593{
     
    616617 */
    617618HRESULT CreateConnectionPoint(IUnknown *pUnk, REFIID riid,
    618                               IConnectionPoint **pCP)
     619                  IConnectionPoint **pCP)
    619620{
    620621  ConnectionPointImpl *Obj;
     
    624625  if(!Obj) return E_OUTOFMEMORY;
    625626
    626   hr = IConnectionPoint_QueryInterface((IConnectionPoint *)Obj, 
    627                                        &IID_IConnectionPoint, (LPVOID)pCP);
     627  hr = IConnectionPoint_QueryInterface((IConnectionPoint *)Obj,
     628                       &IID_IConnectionPoint, (LPVOID)pCP);
    628629  IConnectionPoint_Release((IConnectionPoint *)Obj);
    629630  return hr;
  • trunk/src/oleaut32/dispatch.c

    r4837 r6648  
     1/* $Id: dispatch.c,v 1.2 2001-09-05 13:19:00 bird Exp $ */
    12/**
    23 * Dispatch API functions
     
    3738 *
    3839 * NOTES
    39  *              - Defer method invocation to ITypeInfo::Invoke()
     40 *      - Defer method invocation to ITypeInfo::Invoke()
    4041 *
    4142 * RETURNS
    4243 *
    43  *              S_OK on success.
     44 *      S_OK on success.
    4445 */
    4546HRESULT WINAPI
     
    7677 *         DispGetIDsOfNames (OLEAUT32.29)
    7778 *
    78  * Convert a set of names to dispids, based on information 
     79 * Convert a set of names to dispids, based on information
    7980 * contained in object's type library.
    80  * 
     81 *
    8182 * NOTES
    82  *              - Defers to ITypeInfo::GetIDsOfNames()
     83 *      - Defers to ITypeInfo::GetIDsOfNames()
    8384 *
    8485 * RETURNS
    8586 *
    86  *              S_OK on success.
     87 *      S_OK on success.
    8788 */
    8889HRESULT WINAPI
     
    109110 *
    110111 * NOTES
    111  *              Coercion is done using system (0) locale.
     112 *      Coercion is done using system (0) locale.
    112113 *
    113114 * RETURNS
    114115 *
    115  *              S_OK on success.
     116 *      S_OK on success.
    116117 */
    117118HRESULT WINAPI DispGetParam(DISPPARAMS* pdispparams, UINT position,
  • trunk/src/oleaut32/initterm.cpp

    r5135 r6648  
     1/* $Id: initterm.cpp,v 1.10 2001-09-05 13:19:00 bird Exp $ */
    12/*
    23 * DLL entry point
     
    5960   {
    6061   case DLL_PROCESS_ATTACH:
    61         return TRUE;
     62    return TRUE;
    6263
    6364   case DLL_THREAD_ATTACH:
    6465   case DLL_THREAD_DETACH:
    65         return TRUE;
     66    return TRUE;
    6667
    6768   case DLL_PROCESS_DETACH:
    68         ctordtorTerm();
    69         ClosePrivateLogFiles();
    70         return TRUE;
     69    ctordtorTerm();
     70    ClosePrivateLogFiles();
     71    return TRUE;
    7172   }
    7273   return FALSE;
     
    9596      case 0 :
    9697      {
    97         loadNr = globLoadNr++;
     98    loadNr = globLoadNr++;
    9899
    99         DosQueryModuleName(hModule, sizeof(oleaut32Path), oleaut32Path);
    100         char *endofpath = strrchr(oleaut32Path, '\\');
    101         *(endofpath+1) = 0;
     100    DosQueryModuleName(hModule, sizeof(oleaut32Path), oleaut32Path);
     101    char *endofpath = strrchr(oleaut32Path, '\\');
     102    *(endofpath+1) = 0;
    102103
    103104         ctordtorInit();
     
    105106         CheckVersionFromHMOD(PE2LX_VERSION, hModule); /*PLF Wed  98-03-18 05:28:48*/
    106107
    107         dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
    108          if(dllHandle == 0) 
    109                 return 0UL;
     108    dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
     109         if(dllHandle == 0)
     110        return 0UL;
    110111
    111112#ifdef DEFAULT_LOGGING_OFF
    112         if(getenv("WIN32LOG_ENABLED")) {
     113        if(getenv("WIN32LOG_ENABLED")) {
    113114#else
    114         if(!getenv("NOWIN32LOG")) {
     115        if(!getenv("NOWIN32LOG")) {
    115116#endif
    116                 OpenPrivateLogFiles();
    117         }
     117            OpenPrivateLogFiles();
     118    }
    118119         Hash_Initialise();
    119120
     
    122123      case 1 :
    123124         if(dllHandle) {
    124                 UnregisterLxDll(dllHandle);
     125        UnregisterLxDll(dllHandle);
    125126         }
    126127         break;
  • trunk/src/oleaut32/ole2disp.c

    r4837 r6648  
     1/* $Id: ole2disp.c,v 1.2 2001-09-05 13:19:00 bird Exp $ */
    12/*
    2  *      OLE2DISP library
     3 *  OLE2DISP library
    34 *
    4  *      Copyright 1995  Martin von Loewis
     5 *  Copyright 1995  Martin von Loewis
    56 */
    67#ifdef __WIN32OS2__
     
    3132
    3233/******************************************************************************
    33  *              BSTR_AllocBytes [Internal]
     34 *      BSTR_AllocBytes [Internal]
    3435 */
    3536static BSTR16 BSTR_AllocBytes(int n)
     
    5657
    5758/******************************************************************************
    58  *              SysAllocString16        [OLE2DISP.2]
     59 *      SysAllocString16    [OLE2DISP.2]
    5960 */
    6061BSTR16 WINAPI SysAllocString16(LPCOLESTR16 in)
    6162{
    62         BSTR16 out;
    63    
    64         if (!in) return 0;
    65    
    66         out = BSTR_AllocBytes(strlen(in)+1);
    67         if(!out)return 0;
    68         strcpy(BSTR_GetAddr(out),in);
    69         return out;
    70 }
    71 #endif
    72 
    73 /******************************************************************************
    74  *              SysAllocString  [OLEAUT32.2]
     63    BSTR16 out;
     64
     65    if (!in) return 0;
     66
     67    out = BSTR_AllocBytes(strlen(in)+1);
     68    if(!out)return 0;
     69    strcpy(BSTR_GetAddr(out),in);
     70    return out;
     71}
     72#endif
     73
     74/******************************************************************************
     75 *      SysAllocString  [OLEAUT32.2]
    7576 */
    7677BSTR WINAPI SysAllocString(LPCOLESTR in)
    7778{
    7879    if (!in) return 0;
    79    
     80
    8081    /* Delegate this to the SysAllocStringLen32 method. */
    8182    return SysAllocStringLen(in, lstrlenW(in));
     
    8485#ifndef __WIN32OS2__
    8586/******************************************************************************
    86  *              SysReAllocString16      [OLE2DISP.3]
     87 *      SysReAllocString16  [OLE2DISP.3]
    8788 */
    8889INT16 WINAPI SysReAllocString16(LPBSTR16 old,LPCOLESTR16 in)
    8990{
    90         BSTR16 new=SysAllocString16(in);
    91         BSTR_Free(*old);
    92         *old=new;
    93         return 1;
    94 }
    95 #endif
    96 
    97 /******************************************************************************
    98  *              SysReAllocString        [OLEAUT32.3]
     91    BSTR16 new=SysAllocString16(in);
     92    BSTR_Free(*old);
     93    *old=new;
     94    return 1;
     95}
     96#endif
     97
     98/******************************************************************************
     99 *      SysReAllocString    [OLEAUT32.3]
    99100 */
    100101INT WINAPI SysReAllocString(LPBSTR old,LPCOLESTR in)
     
    103104     * Sanity check
    104105     */
    105     if (old==NULL) 
     106    if (old==NULL)
    106107      return 0;
    107108
     
    109110     * Make sure we free the old string.
    110111     */
    111     if (*old!=NULL)     
     112    if (*old!=NULL)
    112113      SysFreeString(*old);
    113114
     
    122123#ifndef __WIN32OS2__
    123124/******************************************************************************
    124  *              SysAllocStringLen16     [OLE2DISP.4]
     125 *      SysAllocStringLen16 [OLE2DISP.4]
    125126 */
    126127BSTR16 WINAPI SysAllocStringLen16(const char *in, int len)
    127128{
    128         BSTR16 out=BSTR_AllocBytes(len+1);
    129 
    130         if (!out)
    131                 return 0;
     129    BSTR16 out=BSTR_AllocBytes(len+1);
     130
     131    if (!out)
     132        return 0;
    132133
    133134    /*
     
    137138     */
    138139    if (in != 0)
    139         strcpy(BSTR_GetAddr(out),in);
     140    strcpy(BSTR_GetAddr(out),in);
    140141    else
    141142      memset(BSTR_GetAddr(out), 0, len+1);
    142143
    143         return out;
     144    return out;
    144145}
    145146#endif
     
    152153 * he describes it as a "DWORD count of characters". By experimenting with
    153154 * a windows application, this count seems to be a DWORD count of bytes in
    154  * the string. Meaning that the count is double the number of wide 
     155 * the string. Meaning that the count is double the number of wide
    155156 * characters in the string.
    156157 */
     
    214215#ifndef __WIN32OS2__
    215216/******************************************************************************
    216  *              SysReAllocStringLen16   [OLE2DISP.5]
     217 *      SysReAllocStringLen16   [OLE2DISP.5]
    217218 */
    218219int WINAPI SysReAllocStringLen16(BSTR16 *old,const char *in,int len)
    219220{
    220         BSTR16 new=SysAllocStringLen16(in,len);
    221         BSTR_Free(*old);
    222         *old=new;
    223         return 1;
    224 }
    225 #endif
    226 
    227  
     221    BSTR16 new=SysAllocStringLen16(in,len);
     222    BSTR_Free(*old);
     223    *old=new;
     224    return 1;
     225}
     226#endif
     227
     228
    228229/******************************************************************************
    229230 *             SysReAllocStringLen   [OLEAUT32.5]
     
    234235     * Sanity check
    235236     */
    236     if (old==NULL) 
     237    if (old==NULL)
    237238      return 0;
    238239
     
    240241     * Make sure we free the old string.
    241242     */
    242     if (*old!=NULL)     
     243    if (*old!=NULL)
    243244      SysFreeString(*old);
    244245
     
    253254#ifndef __WIN32OS2__
    254255/******************************************************************************
    255  *              SysFreeString16 [OLE2DISP.6]
     256 *      SysFreeString16 [OLE2DISP.6]
    256257 */
    257258void WINAPI SysFreeString16(BSTR16 in)
    258259{
    259         BSTR_Free(in);
    260 }
    261 #endif
    262 
    263 /******************************************************************************
    264  *              SysFreeString   [OLEAUT32.6]
     260    BSTR_Free(in);
     261}
     262#endif
     263
     264/******************************************************************************
     265 *      SysFreeString   [OLEAUT32.6]
    265266 */
    266267void WINAPI SysFreeString(BSTR in)
    267268{
    268269    DWORD* bufferPointer;
    269    
     270
    270271    /* NULL is a valid parameter */
    271272    if(!in) return;
     
    288289#ifndef __WIN32OS2__
    289290/******************************************************************************
    290  *              SysStringLen16  [OLE2DISP.7]
     291 *      SysStringLen16  [OLE2DISP.7]
    291292 */
    292293int WINAPI SysStringLen16(BSTR16 str)
    293294{
    294         return strlen(BSTR_GetAddr(str));
     295    return strlen(BSTR_GetAddr(str));
    295296}
    296297#endif
     
    310311     if (!str) return 0;
    311312    /*
    312      * The length of the string (in bytes) is contained in a DWORD placed 
     313     * The length of the string (in bytes) is contained in a DWORD placed
    313314     * just before the BSTR pointer
    314315     */
     
    334335     if (!str) return 0;
    335336    /*
    336      * The length of the string (in bytes) is contained in a DWORD placed 
     337     * The length of the string (in bytes) is contained in a DWORD placed
    337338     * just before the BSTR pointer
    338339     */
     
    349350 */
    350351HRESULT WINAPI CreateDispTypeInfo16(
    351         INTERFACEDATA *pidata,
    352         LCID lcid,
    353         ITypeInfo **pptinfo)
    354 {
    355         FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
    356         return 0;
     352    INTERFACEDATA *pidata,
     353    LCID lcid,
     354    ITypeInfo **pptinfo)
     355{
     356    FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
     357    return 0;
    357358}
    358359#endif
     
    362363 */
    363364HRESULT WINAPI CreateDispTypeInfo(
    364         INTERFACEDATA *pidata,
    365         LCID lcid,
    366         ITypeInfo **pptinfo)
    367 {
    368         FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
    369         return 0;
     365    INTERFACEDATA *pidata,
     366    LCID lcid,
     367    ITypeInfo **pptinfo)
     368{
     369    FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
     370    return 0;
    370371}
    371372
     
    377378        IUnknown* punkOuter,
    378379        void* pvThis,
    379         ITypeInfo* ptinfo,
    380         IUnknown** ppunkStdDisp)
    381 {
    382         FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,
     380    ITypeInfo* ptinfo,
     381    IUnknown** ppunkStdDisp)
     382{
     383    FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,
    383384               ppunkStdDisp);
    384         return 0;
     385    return 0;
    385386}
    386387#endif
     
    392393        IUnknown* punkOuter,
    393394        void* pvThis,
    394         ITypeInfo* ptinfo,
    395         IUnknown** ppunkStdDisp)
    396 {
    397         FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,
     395    ITypeInfo* ptinfo,
     396    IUnknown** ppunkStdDisp)
     397{
     398    FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,
    398399               ppunkStdDisp);
    399         return 0;
     400    return 0;
    400401}
    401402
     
    405406 */
    406407HRESULT WINAPI RegisterActiveObject16(
    407         IUnknown *punk, REFCLSID rclsid, DWORD dwFlags, unsigned long *pdwRegister
     408    IUnknown *punk, REFCLSID rclsid, DWORD dwFlags, unsigned long *pdwRegister
    408409) {
    409         FIXME("(%p,%s,0x%08lx,%p):stub\n",punk,debugstr_guid(rclsid),dwFlags,pdwRegister);
    410         return 0;
    411 }
    412 #endif
    413 
    414 /******************************************************************************
    415  *              OleTranslateColor       [OLEAUT32.421]
     410    FIXME("(%p,%s,0x%08lx,%p):stub\n",punk,debugstr_guid(rclsid),dwFlags,pdwRegister);
     411    return 0;
     412}
     413#endif
     414
     415/******************************************************************************
     416 *      OleTranslateColor   [OLEAUT32.421]
    416417 *
    417418 * Converts an OLE_COLOR to a COLORREF.
    418419 * See the documentation for conversion rules.
    419  * pColorRef can be NULL. In that case the user only wants to test the 
     420 * pColorRef can be NULL. In that case the user only wants to test the
    420421 * conversion.
    421422 */
  • trunk/src/oleaut32/oleaut.c

    r6311 r6648  
     1/* $Id: oleaut.c,v 1.2 2001-09-05 13:19:00 bird Exp $ */
    12/*
    2  *      OLEAUT32
     3 *  OLEAUT32
    34 *
    45 */
     
    1718DEFAULT_DEBUG_CHANNEL(ole);
    1819
    19 static WCHAR    _delimiter[2] = {'!',0}; /* default delimiter apparently */
    20 static WCHAR    *pdelimiter = &_delimiter[0];
     20static WCHAR    _delimiter[2] = {'!',0}; /* default delimiter apparently */
     21static WCHAR    *pdelimiter = &_delimiter[0];
    2122
    2223/***********************************************************************
    23  *              RegisterActiveObject (OLEAUT32.33)
     24 *      RegisterActiveObject (OLEAUT32.33)
    2425 */
    2526HRESULT WINAPI RegisterActiveObject(
    26         LPUNKNOWN punk,REFCLSID rcid,DWORD dwFlags,LPDWORD pdwRegister
     27    LPUNKNOWN punk,REFCLSID rcid,DWORD dwFlags,LPDWORD pdwRegister
    2728) {
    28         WCHAR                   guidbuf[80];
    29         HRESULT                 ret;
    30         LPRUNNINGOBJECTTABLE    runobtable;
    31         LPMONIKER               moniker;
     29    WCHAR           guidbuf[80];
     30    HRESULT         ret;
     31    LPRUNNINGOBJECTTABLE    runobtable;
     32    LPMONIKER       moniker;
    3233
    33         StringFromGUID2(rcid,guidbuf,39);
     34    StringFromGUID2(rcid,guidbuf,39);
    3435#ifdef __WIN32OS2__
    3536        dprintf(("RegisterActiveObject %x %ls (%x) %x %x", punk, guidbuf, rcid, dwFlags, pdwRegister));
    3637#endif
    37         ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker);
    38         if (FAILED(ret))
    39                 return ret;
    40         ret = GetRunningObjectTable(0,&runobtable);
    41         if (FAILED(ret)) {
    42                 IMoniker_Release(moniker);
    43                 return ret;
    44         }
    45         ret = IRunningObjectTable_Register(runobtable,dwFlags,punk,moniker,pdwRegister);
    46         IRunningObjectTable_Release(runobtable);
    47         IMoniker_Release(moniker);
    48         return ret;
     38    ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker);
     39    if (FAILED(ret))
     40        return ret;
     41    ret = GetRunningObjectTable(0,&runobtable);
     42    if (FAILED(ret)) {
     43        IMoniker_Release(moniker);
     44        return ret;
     45    }
     46    ret = IRunningObjectTable_Register(runobtable,dwFlags,punk,moniker,pdwRegister);
     47    IRunningObjectTable_Release(runobtable);
     48    IMoniker_Release(moniker);
     49    return ret;
    4950}
    5051
    5152/***********************************************************************
    52  *              RevokeActiveObject (OLEAUT32.34)
     53 *      RevokeActiveObject (OLEAUT32.34)
    5354 */
    5455HRESULT WINAPI RevokeActiveObject(DWORD xregister,LPVOID reserved)
    5556{
    56         LPRUNNINGOBJECTTABLE    runobtable;
    57         HRESULT                 ret;
     57    LPRUNNINGOBJECTTABLE    runobtable;
     58    HRESULT         ret;
    5859
    5960#ifdef __WIN32OS2__
     
    6162#endif
    6263
    63         ret = GetRunningObjectTable(0,&runobtable);
    64         if (FAILED(ret)) return ret;
    65         ret = IRunningObjectTable_Revoke(runobtable,xregister);
    66         if (SUCCEEDED(ret)) ret = S_OK;
    67         IRunningObjectTable_Release(runobtable);
    68         return ret;
     64    ret = GetRunningObjectTable(0,&runobtable);
     65    if (FAILED(ret)) return ret;
     66    ret = IRunningObjectTable_Revoke(runobtable,xregister);
     67    if (SUCCEEDED(ret)) ret = S_OK;
     68    IRunningObjectTable_Release(runobtable);
     69    return ret;
    6970}
    7071
    7172/***********************************************************************
    72  *              GetActiveObject (OLEAUT32.35)
     73 *      GetActiveObject (OLEAUT32.35)
    7374 */
    7475HRESULT WINAPI GetActiveObject(REFCLSID rcid,LPVOID preserved,LPUNKNOWN *ppunk)
    7576{
    76         WCHAR                   guidbuf[80];
    77         HRESULT                 ret;
    78         LPRUNNINGOBJECTTABLE    runobtable;
    79         LPMONIKER               moniker;
     77    WCHAR           guidbuf[80];
     78    HRESULT         ret;
     79    LPRUNNINGOBJECTTABLE    runobtable;
     80    LPMONIKER       moniker;
    8081
    81         StringFromGUID2(rcid,guidbuf,39);
     82    StringFromGUID2(rcid,guidbuf,39);
    8283#ifdef __WIN32OS2__
    8384        dprintf(("GetActiveObject %ls (%x) %x %x", guidbuf, rcid, preserved, ppunk));
    8485#endif
    85         ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker);
    86         if (FAILED(ret))
    87                 return ret;
    88         ret = GetRunningObjectTable(0,&runobtable);
    89         if (FAILED(ret)) {
    90                 IMoniker_Release(moniker);
    91                 return ret;
    92         }
    93         ret = IRunningObjectTable_GetObject(runobtable,moniker,ppunk);
    94         IRunningObjectTable_Release(runobtable);
    95         IMoniker_Release(moniker);
    96         return ret;
     86    ret = CreateItemMoniker(pdelimiter,guidbuf,&moniker);
     87    if (FAILED(ret))
     88        return ret;
     89    ret = GetRunningObjectTable(0,&runobtable);
     90    if (FAILED(ret)) {
     91        IMoniker_Release(moniker);
     92        return ret;
     93    }
     94    ret = IRunningObjectTable_GetObject(runobtable,moniker,ppunk);
     95    IRunningObjectTable_Release(runobtable);
     96    IMoniker_Release(moniker);
     97    return ret;
    9798}
    9899
     
    101102 *
    102103 * known OLEAUT32.DLL versions:
    103  * OLE 2.1  NT                          1993-95 10     3023
    104  * OLE 2.1                                      10     3027
    105  * OLE 2.20 W95/NT                      1993-96 20     4112
    106  * OLE 2.20 W95/NT                      1993-96 20     4118
    107  * OLE 2.20 W95/NT                      1993-96 20     4122
    108  * OLE 2.30 W95/NT                      1993-98 30     4265
    109  * OLE 2.40 NT??                        1993-98 40     4267
    110  * OLE 2.40 W98 SE orig. file           1993-98 40     4275
     104 * OLE 2.1  NT              1993-95 10     3023
     105 * OLE 2.1                  10     3027
     106 * OLE 2.20 W95/NT          1993-96 20     4112
     107 * OLE 2.20 W95/NT          1993-96 20     4118
     108 * OLE 2.20 W95/NT          1993-96 20     4122
     109 * OLE 2.30 W95/NT          1993-98 30     4265
     110 * OLE 2.40 NT??            1993-98 40     4267
     111 * OLE 2.40 W98 SE orig. file       1993-98 40     4275
    111112 */
    112113UINT WINAPI OaBuildVersion()
     
    120121    {
    121122    case 0x80000a03:  /* WIN31 */
    122                 return MAKELONG(4049, 20); /* from Win32s 1.1e */
     123        return MAKELONG(4049, 20); /* from Win32s 1.1e */
    123124    case 0x80000004:  /* WIN95 */
    124                 return MAKELONG(4265, 30);
     125        return MAKELONG(4265, 30);
    125126    case 0x80000a04:  /* WIN98 */
    126                 return MAKELONG(4275, 40); /* value of W98 SE; orig. W98 AFAIK has 4265, 30 just as W95 */
     127        return MAKELONG(4275, 40); /* value of W98 SE; orig. W98 AFAIK has 4265, 30 just as W95 */
    127128    case 0x00003303:  /* NT351 */
    128                 return MAKELONG(4265, 30); /* value borrowed from Win95 */
     129        return MAKELONG(4265, 30); /* value borrowed from Win95 */
    129130    case 0x00000004:  /* NT40 */
    130131#ifdef __WIN32OS2__
    131132                return 0x2810b5; //returned by NT4, SP6
    132133#else
    133                 return MAKELONG(4122, 20); /* ouch ! Quite old, I guess */
     134        return MAKELONG(4122, 20); /* ouch ! Quite old, I guess */
    134135#endif
    135136    default:
    136                 ERR("Version value not known yet. Please investigate it !\n");
    137                 return 0x0;
     137        ERR("Version value not known yet. Please investigate it !\n");
     138        return 0x0;
    138139    }
    139140}
     
    141142#ifndef __WIN32OS2__
    142143/***********************************************************************
    143  *              DllRegisterServer
     144 *      DllRegisterServer
    144145 */
    145 HRESULT WINAPI OLEAUT32_DllRegisterServer() { 
     146HRESULT WINAPI OLEAUT32_DllRegisterServer() {
    146147    FIXME("stub!\n");
    147148    return S_OK;
     
    149150
    150151/***********************************************************************
    151  *              DllUnregisterServer
     152 *      DllUnregisterServer
    152153 */
    153154HRESULT WINAPI OLEAUT32_DllUnregisterServer() {
  • trunk/src/oleaut32/olefont.c

    r6575 r6648  
     1/* $Id: olefont.c,v 1.3 2001-09-05 13:19:00 bird Exp $ */
    12/*
    23 * OLE Font encapsulation implementation
     
    4647{
    4748  /*
    48    * This class supports many interfaces. IUnknown, IFont, 
     49   * This class supports many interfaces. IUnknown, IFont,
    4950   * IDispatch, IDispFont IPersistStream and IConnectionPointContainer.
    5051   * The first two are supported by the first vtable, the next two are
     
    8586
    8687/*
    87  * Here, I define utility macros to help with the casting of the 
     88 * Here, I define utility macros to help with the casting of the
    8889 * "this" parameter.
    8990 * There is a version to accomodate all of the VTables implemented
     
    9192 */
    9293#define _ICOM_THIS(class,name) class* this = (class*)name;
    93 #define _ICOM_THIS_From_IDispatch(class, name) class* this = (class*)(((char*)name)-sizeof(void*)); 
    94 #define _ICOM_THIS_From_IPersistStream(class, name) class* this = (class*)(((char*)name)-2*sizeof(void*)); 
    95 #define _ICOM_THIS_From_IConnectionPointContainer(class, name) class* this = (class*)(((char*)name)-3*sizeof(void*)); 
     94#define _ICOM_THIS_From_IDispatch(class, name) class* this = (class*)(((char*)name)-sizeof(void*));
     95#define _ICOM_THIS_From_IPersistStream(class, name) class* this = (class*)(((char*)name)-2*sizeof(void*));
     96#define _ICOM_THIS_From_IConnectionPointContainer(class, name) class* this = (class*)(((char*)name)-3*sizeof(void*));
    9697
    9798
     
    134135 * interface
    135136 */
    136 static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(IDispatch* iface, 
    137                                                     REFIID     riid,
    138                                                     VOID**     ppvoid);
     137static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(IDispatch* iface,
     138                            REFIID     riid,
     139                            VOID**     ppvoid);
    139140static ULONG   WINAPI OLEFontImpl_IDispatch_AddRef(IDispatch* iface);
    140141static ULONG   WINAPI OLEFontImpl_IDispatch_Release(IDispatch* iface);
    141 static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(IDispatch*    iface, 
    142                                                    unsigned int* pctinfo);
    143 static HRESULT WINAPI OLEFontImpl_GetTypeInfo(IDispatch*  iface, 
    144                                               UINT      iTInfo,
    145                                               LCID        lcid,
    146                                               ITypeInfo** ppTInfo);
     142static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(IDispatch*    iface,
     143                               unsigned int* pctinfo);
     144static HRESULT WINAPI OLEFontImpl_GetTypeInfo(IDispatch*  iface,
     145                              UINT      iTInfo,
     146                              LCID        lcid,
     147                              ITypeInfo** ppTInfo);
    147148static HRESULT WINAPI OLEFontImpl_GetIDsOfNames(IDispatch*  iface,
    148                                                 REFIID      riid,
    149                                                 LPOLESTR* rgszNames,
    150                                                 UINT      cNames,
    151                                                 LCID        lcid,
    152                                                 DISPID*     rgDispId);
     149                            REFIID      riid,
     150                            LPOLESTR* rgszNames,
     151                            UINT      cNames,
     152                            LCID        lcid,
     153                            DISPID*     rgDispId);
    153154static HRESULT WINAPI OLEFontImpl_Invoke(IDispatch*  iface,
    154                                          DISPID      dispIdMember,
    155                                          REFIID      riid,
    156                                          LCID        lcid,
    157                                          WORD        wFlags,
    158                                          DISPPARAMS* pDispParams,
    159                                          VARIANT*    pVarResult,
    160                                          EXCEPINFO*  pExepInfo,
    161                                          UINT*     puArgErr);
     155                         DISPID      dispIdMember,
     156                         REFIID      riid,
     157                         LCID        lcid,
     158                         WORD        wFlags,
     159                         DISPPARAMS* pDispParams,
     160                         VARIANT*    pVarResult,
     161                         EXCEPINFO*  pExepInfo,
     162                         UINT*     puArgErr);
    162163
    163164/***********************************************************************
     
    165166 * interface
    166167 */
    167 static HRESULT WINAPI OLEFontImpl_IPersistStream_QueryInterface(IPersistStream* iface, 
    168                                                     REFIID     riid,
    169                                                     VOID**     ppvoid);
     168static HRESULT WINAPI OLEFontImpl_IPersistStream_QueryInterface(IPersistStream* iface,
     169                            REFIID     riid,
     170                            VOID**     ppvoid);
    170171static ULONG   WINAPI OLEFontImpl_IPersistStream_AddRef(IPersistStream* iface);
    171172static ULONG   WINAPI OLEFontImpl_IPersistStream_Release(IPersistStream* iface);
    172 static HRESULT WINAPI OLEFontImpl_GetClassID(IPersistStream* iface, 
    173                                              CLSID*                pClassID);
     173static HRESULT WINAPI OLEFontImpl_GetClassID(IPersistStream* iface,
     174                         CLSID*                pClassID);
    174175static HRESULT WINAPI OLEFontImpl_IsDirty(IPersistStream*  iface);
    175176static HRESULT WINAPI OLEFontImpl_Load(IPersistStream*  iface,
    176                                        IStream*         pLoadStream);
     177                       IStream*         pLoadStream);
    177178static HRESULT WINAPI OLEFontImpl_Save(IPersistStream*  iface,
    178                                        IStream*         pOutStream,
    179                                        BOOL             fClearDirty);
     179                       IStream*         pOutStream,
     180                       BOOL             fClearDirty);
    180181static HRESULT WINAPI OLEFontImpl_GetSizeMax(IPersistStream*  iface,
    181                                              ULARGE_INTEGER*  pcbSize);
     182                         ULARGE_INTEGER*  pcbSize);
    182183
    183184/***********************************************************************
     
    186187 */
    187188static HRESULT WINAPI OLEFontImpl_IConnectionPointContainer_QueryInterface(
    188                                             IConnectionPointContainer* iface,
    189                                             REFIID     riid,
    190                                             VOID**     ppvoid);
     189                        IConnectionPointContainer* iface,
     190                        REFIID     riid,
     191                        VOID**     ppvoid);
    191192static ULONG   WINAPI OLEFontImpl_IConnectionPointContainer_AddRef(
    192                                             IConnectionPointContainer* iface);
     193                        IConnectionPointContainer* iface);
    193194static ULONG   WINAPI OLEFontImpl_IConnectionPointContainer_Release(
    194                                             IConnectionPointContainer* iface);
     195                        IConnectionPointContainer* iface);
    195196static HRESULT WINAPI OLEFontImpl_EnumConnectionPoints(
    196                                             IConnectionPointContainer* iface,
    197                                             IEnumConnectionPoints **ppEnum);
     197                        IConnectionPointContainer* iface,
     198                        IEnumConnectionPoints **ppEnum);
    198199static HRESULT WINAPI OLEFontImpl_FindConnectionPoint(
    199                                             IConnectionPointContainer* iface,
    200                                             REFIID riid,
    201                                             IConnectionPoint **ppCp);
     200                        IConnectionPointContainer* iface,
     201                        REFIID riid,
     202                        IConnectionPoint **ppCp);
    202203
    203204/*
     
    227228  OLEFontImpl_put_Charset,
    228229  OLEFontImpl_get_hFont,
    229   OLEFontImpl_Clone, 
     230  OLEFontImpl_Clone,
    230231  OLEFontImpl_IsEqual,
    231232  OLEFontImpl_SetRatio,
     
    273274
    274275/******************************************************************************
    275  *              OleCreateFontIndirect   [OLEAUT32.420]
     276 *      OleCreateFontIndirect   [OLEAUT32.420]
    276277 */
    277278HRESULT WINAPI OleCreateFontIndirect(
     
    331332
    332333  IConnectionPoint_EnumConnections(this->pCP, &pEnum);
    333  
     334
    334335  while(IEnumConnections_Next(pEnum, 1, &CD, NULL) == S_OK) {
    335336    IPropertyNotifySink *sink;
     
    343344  return;
    344345}
    345  
     346
    346347/************************************************************************
    347348 * OLEFontImpl_Construct
     
    364365  if (newObject==0)
    365366    return newObject;
    366  
     367
    367368  /*
    368369   * Initialize the virtual function table.
     
    372373  newObject->lpvtbl3 = &OLEFontImpl_IPersistStream_VTable;
    373374  newObject->lpvtbl4 = &OLEFontImpl_IConnectionPointContainer_VTable;
    374  
    375   /*
    376    * Start with one reference count. The caller of this function 
     375
     376  /*
     377   * Start with one reference count. The caller of this function
    377378   * must release the interface pointer when it is done.
    378379   */
     
    386387  newObject->description.cbSizeofstruct = sizeof(FONTDESC);
    387388  newObject->description.lpstrName = HeapAlloc(GetProcessHeap(),
    388                                                0,
    389                                                (lstrlenW(fontDesc->lpstrName)+1) * sizeof(WCHAR));
     389                           0,
     390                           (lstrlenW(fontDesc->lpstrName)+1) * sizeof(WCHAR));
    390391  strcpyW(newObject->description.lpstrName, fontDesc->lpstrName);
    391392  newObject->description.cySize         = fontDesc->cySize;
     
    448449  if ( (this==0) || (ppvObject==0) )
    449450    return E_INVALIDARG;
    450  
     451
    451452  /*
    452453   * Initialize the return parameter.
    453454   */
    454455  *ppvObject = 0;
    455  
     456
    456457  /*
    457458   * Compare the riid with the interface IDs implemented by this object.
    458459   */
    459   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 
     460  if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
    460461  {
    461462    *ppvObject = (IFont*)this;
    462463  }
    463   else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0) 
     464  else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0)
    464465  {
    465466    *ppvObject = (IFont*)this;
    466467  }
    467   else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 
     468  else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0)
    468469  {
    469470    *ppvObject = (IDispatch*)&(this->lpvtbl2);
    470471  }
    471   else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0) 
     472  else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0)
    472473  {
    473474    *ppvObject = (IDispatch*)&(this->lpvtbl2);
    474475  }
    475   else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 
     476  else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0)
    476477  {
    477478    *ppvObject = (IPersistStream*)&(this->lpvtbl3);
    478479  }
    479480  else if (memcmp(&IID_IConnectionPointContainer, riid,
    480                   sizeof(IID_IConnectionPointContainer)) == 0)
     481          sizeof(IID_IConnectionPointContainer)) == 0)
    481482  {
    482483    *ppvObject = (IPersistStream*)&(this->lpvtbl4);
    483484  }
    484  
     485
    485486  /*
    486487   * Check that we obtained an interface.
     
    491492    return E_NOINTERFACE;
    492493  }
    493  
     494
    494495  /*
    495496   * Query Interface always increases the reference count by one when it is
     
    500501  return S_OK;;
    501502}
    502        
     503
    503504/************************************************************************
    504505 * OLEFontImpl_AddRef (IUnknown)
     
    506507 * See Windows documentation for more details on IUnknown methods.
    507508 */
    508 ULONG WINAPI OLEFontImpl_AddRef( 
     509ULONG WINAPI OLEFontImpl_AddRef(
    509510  IFont* iface)
    510511{
     
    515516  return this->ref;
    516517}
    517        
     518
    518519/************************************************************************
    519520 * OLEFontImpl_Release (IUnknown)
     
    521522 * See Windows documentation for more details on IUnknown methods.
    522523 */
    523 ULONG WINAPI OLEFontImpl_Release( 
     524ULONG WINAPI OLEFontImpl_Release(
    524525      IFont* iface)
    525526{
     
    541542    return 0;
    542543  }
    543  
     544
    544545  return this->ref;
    545546}
    546        
     547
    547548/************************************************************************
    548549 * OLEFontImpl_get_Name (IFont)
     
    551552 */
    552553static HRESULT WINAPI OLEFontImpl_get_Name(
    553   IFont*  iface, 
     554  IFont*  iface,
    554555  BSTR* pname)
    555556{
     
    576577 */
    577578static HRESULT WINAPI OLEFontImpl_put_Name(
    578   IFont* iface, 
     579  IFont* iface,
    579580  BSTR name)
    580581{
     
    585586  {
    586587    this->description.lpstrName = HeapAlloc(GetProcessHeap(),
    587                                             0,
    588                                             (lstrlenW(name)+1) * sizeof(WCHAR));
     588                        0,
     589                        (lstrlenW(name)+1) * sizeof(WCHAR));
    589590  }
    590591  else
    591592  {
    592593    this->description.lpstrName = HeapReAlloc(GetProcessHeap(),
    593                                               0,
    594                                               this->description.lpstrName,
    595                                               (lstrlenW(name)+1) * sizeof(WCHAR));
     594                          0,
     595                          this->description.lpstrName,
     596                          (lstrlenW(name)+1) * sizeof(WCHAR));
    596597  }
    597598
     
    611612 */
    612613static HRESULT WINAPI OLEFontImpl_get_Size(
    613   IFont* iface, 
     614  IFont* iface,
    614615  CY*    psize)
    615616{
     
    635636 */
    636637static HRESULT WINAPI OLEFontImpl_put_Size(
    637   IFont* iface, 
     638  IFont* iface,
    638639  CY     size)
    639640{
     
    653654 */
    654655static HRESULT WINAPI OLEFontImpl_get_Bold(
    655   IFont*  iface, 
     656  IFont*  iface,
    656657  BOOL* pbold)
    657658{
     
    692693 */
    693694static HRESULT WINAPI OLEFontImpl_get_Italic(
    694   IFont*  iface, 
     695  IFont*  iface,
    695696  BOOL* pitalic)
    696697{
     
    714715 */
    715716static HRESULT WINAPI OLEFontImpl_put_Italic(
    716   IFont* iface, 
     717  IFont* iface,
    717718  BOOL italic)
    718719{
     
    732733 */
    733734static HRESULT WINAPI OLEFontImpl_get_Underline(
    734   IFont*  iface, 
     735  IFont*  iface,
    735736  BOOL* punderline)
    736737{
     
    773774 */
    774775static HRESULT WINAPI OLEFontImpl_get_Strikethrough(
    775   IFont*  iface, 
     776  IFont*  iface,
    776777  BOOL* pstrikethrough)
    777778{
     
    796797 */
    797798static HRESULT WINAPI OLEFontImpl_put_Strikethrough(
    798  IFont* iface, 
     799 IFont* iface,
    799800 BOOL strikethrough)
    800801{
     
    814815 */
    815816static HRESULT WINAPI OLEFontImpl_get_Weight(
    816   IFont* iface, 
     817  IFont* iface,
    817818  short* pweight)
    818819{
     
    837838 */
    838839static HRESULT WINAPI OLEFontImpl_put_Weight(
    839   IFont* iface, 
     840  IFont* iface,
    840841  short  weight)
    841842{
     
    855856 */
    856857static HRESULT WINAPI OLEFontImpl_get_Charset(
    857   IFont* iface, 
     858  IFont* iface,
    858859  short* pcharset)
    859860{
     
    878879 */
    879880static HRESULT WINAPI OLEFontImpl_put_Charset(
    880   IFont* iface, 
     881  IFont* iface,
    881882  short charset)
    882883{
     
    912913    INT      fontHeight;
    913914    CY       cySize;
    914    
     915
    915916    /*
    916917     * The height of the font returned by the get_Size property is the
     
    982983   */
    983984  newObject->description.lpstrName = HeapAlloc(
    984         GetProcessHeap(),0,
    985         (1+strlenW(this->description.lpstrName))*2
     985    GetProcessHeap(),0,
     986    (1+strlenW(this->description.lpstrName))*2
    986987  );
    987988  /* We need to clone the HFONT too. This is just cut & paste from above */
     
    994995
    995996  logFont.lfHeight          = ((fontHeight%10000L)>5000L) ? (-fontHeight/10000L)-1 :
    996                                                             (-fontHeight/10000L);
     997                                (-fontHeight/10000L);
    997998  logFont.lfItalic          = this->description.fItalic;
    998999  logFont.lfUnderline       = this->description.fUnderline;
     
    10231024 */
    10241025static HRESULT WINAPI OLEFontImpl_IsEqual(
    1025   IFont* iface, 
     1026  IFont* iface,
    10261027  IFont* pFontOther)
    10271028{
     
    10551056 */
    10561057static HRESULT      WINAPI OLEFontImpl_QueryTextMetrics(
    1057   IFont*         iface, 
     1058  IFont*         iface,
    10581059  TEXTMETRICOLE* ptm)
    10591060{
     
    10681069 */
    10691070static HRESULT WINAPI OLEFontImpl_AddRefHfont(
    1070   IFont*  iface, 
     1071  IFont*  iface,
    10711072  HFONT hfont)
    10721073{
     
    11071108  {
    11081109    DeleteObject(this->gdiFont);
    1109     this->gdiFont = 0; 
     1110    this->gdiFont = 0;
    11101111  }
    11111112
     
    11741175 */
    11751176static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(
    1176   IDispatch*    iface, 
     1177  IDispatch*    iface,
    11771178  unsigned int* pctinfo)
    11781179{
     
    11891190 */
    11901191static HRESULT WINAPI OLEFontImpl_GetTypeInfo(
    1191   IDispatch*  iface, 
     1192  IDispatch*  iface,
    11921193  UINT      iTInfo,
    1193   LCID        lcid, 
     1194  LCID        lcid,
    11941195  ITypeInfo** ppTInfo)
    11951196{
     
    12071208static HRESULT WINAPI OLEFontImpl_GetIDsOfNames(
    12081209  IDispatch*  iface,
    1209   REFIID      riid, 
    1210   LPOLESTR* rgszNames, 
    1211   UINT      cNames, 
     1210  REFIID      riid,
     1211  LPOLESTR* rgszNames,
     1212  UINT      cNames,
    12121213  LCID        lcid,
    12131214  DISPID*     rgDispId)
     
    12261227static HRESULT WINAPI OLEFontImpl_Invoke(
    12271228  IDispatch*  iface,
    1228   DISPID      dispIdMember, 
    1229   REFIID      riid, 
    1230   LCID        lcid, 
     1229  DISPID      dispIdMember,
     1230  REFIID      riid,
     1231  LCID        lcid,
    12311232  WORD        wFlags,
    12321233  DISPPARAMS* pDispParams,
    1233   VARIANT*    pVarResult, 
     1234  VARIANT*    pVarResult,
    12341235  EXCEPINFO*  pExepInfo,
    12351236  UINT*     puArgErr)
     
    12891290 */
    12901291static HRESULT WINAPI OLEFontImpl_GetClassID(
    1291   IPersistStream* iface, 
     1292  IPersistStream* iface,
    12921293  CLSID*                pClassID)
    12931294{
     
    13431344
    13441345  _ICOM_THIS_From_IPersistStream(OLEFontImpl, iface);
    1345  
     1346
    13461347  /*
    13471348   * Read the version byte
     
    13721373  this->description.fStrikethrough = (bAttributes & FONTPERSIST_STRIKETHROUGH) != 0;
    13731374  this->description.fUnderline     = (bAttributes & FONTPERSIST_UNDERLINE) != 0;
    1374    
     1375
    13751376  /*
    13761377   * Weight
     
    14081409    HeapFree(GetProcessHeap(), 0, this->description.lpstrName);
    14091410
    1410   this->description.lpstrName = HEAP_strdupAtoW(GetProcessHeap(), 
    1411                                                     HEAP_ZERO_MEMORY,
    1412                                                     readBuffer);
     1411  this->description.lpstrName = HEAP_strdupAtoW(GetProcessHeap(),
     1412                            HEAP_ZERO_MEMORY,
     1413                            readBuffer);
    14131414
    14141415  return S_OK;
     
    14301431  BYTE  bAttributes;
    14311432  BYTE  bStringSize;
    1432  
     1433
    14331434  _ICOM_THIS_From_IPersistStream(OLEFontImpl, iface);
    14341435
     
    14591460  if (this->description.fStrikethrough)
    14601461    bAttributes |= FONTPERSIST_STRIKETHROUGH;
    1461  
     1462
    14621463  if (this->description.fUnderline)
    14631464    bAttributes |= FONTPERSIST_UNDERLINE;
     
    14671468  if (cbWritten!=1)
    14681469    return E_FAIL;
    1469  
     1470
    14701471  /*
    14711472   * Weight
     
    14991500  if (bStringSize!=0)
    15001501  {
    1501     writeBuffer = HEAP_strdupWtoA(GetProcessHeap(), 
    1502                                   HEAP_ZERO_MEMORY,
    1503                                   this->description.lpstrName);
     1502    writeBuffer = HEAP_strdupWtoA(GetProcessHeap(),
     1503                  HEAP_ZERO_MEMORY,
     1504                  this->description.lpstrName);
    15041505
    15051506    if (writeBuffer==0)
     
    15071508
    15081509    IStream_Write(pOutStream, writeBuffer, bStringSize, &cbWritten);
    1509    
     1510
    15101511    HeapFree(GetProcessHeap(), 0, writeBuffer);
    15111512
     
    16201621  if(memcmp(riid, &IID_IPropertyNotifySink, sizeof(IID_IPropertyNotifySink)) == 0) {
    16211622    return IConnectionPoint_QueryInterface(this->pCP, &IID_IConnectionPoint,
    1622                                            (LPVOID)ppCp);
     1623                       (LPVOID)ppCp);
    16231624  } else {
    16241625    FIXME("Tried to find connection point on %s\n", debugstr_guid(riid));
     
    16371638} IClassFactoryImpl;
    16381639
    1639 static HRESULT WINAPI 
     1640static HRESULT WINAPI
    16401641SFCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
    1641         ICOM_THIS(IClassFactoryImpl,iface);
    1642 
    1643         FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
    1644         return E_NOINTERFACE;
     1642    ICOM_THIS(IClassFactoryImpl,iface);
     1643
     1644    FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
     1645    return E_NOINTERFACE;
    16451646}
    16461647
    16471648static ULONG WINAPI
    16481649SFCF_AddRef(LPCLASSFACTORY iface) {
    1649         ICOM_THIS(IClassFactoryImpl,iface);
    1650         return ++(This->ref);
     1650    ICOM_THIS(IClassFactoryImpl,iface);
     1651    return ++(This->ref);
    16511652}
    16521653
    16531654static ULONG WINAPI SFCF_Release(LPCLASSFACTORY iface) {
    1654         ICOM_THIS(IClassFactoryImpl,iface);
    1655         /* static class, won't be  freed */
    1656         return --(This->ref);
     1655    ICOM_THIS(IClassFactoryImpl,iface);
     1656    /* static class, won't be  freed */
     1657    return --(This->ref);
    16571658}
    16581659
    16591660static HRESULT WINAPI SFCF_CreateInstance(
    1660         LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj
     1661    LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj
    16611662) {
    1662         ICOM_THIS(IClassFactoryImpl,iface);
    1663 
    1664         if (IsEqualGUID(riid,&IID_IFont)) {
    1665             FONTDESC fd;
    1666 
    1667             WCHAR fname[] = { 'S','y','s','t','e','m',0 };
    1668 
    1669             fd.cbSizeofstruct = sizeof(fd);
    1670             fd.lpstrName      = fname;
    1671             fd.cySize.s.Lo    = 80000;
    1672             fd.cySize.s.Hi    = 0;
    1673             fd.sWeight        = 0;
    1674             fd.sCharset       = 0;
    1675             fd.fItalic        = 0;
    1676             fd.fUnderline     = 0;
    1677             fd.fStrikethrough = 0;
    1678             return OleCreateFontIndirect(&fd,riid,ppobj);
    1679         }
    1680 
    1681         FIXME("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
    1682         return E_NOINTERFACE;
     1663    ICOM_THIS(IClassFactoryImpl,iface);
     1664
     1665    if (IsEqualGUID(riid,&IID_IFont)) {
     1666        FONTDESC fd;
     1667
     1668        WCHAR fname[] = { 'S','y','s','t','e','m',0 };
     1669
     1670        fd.cbSizeofstruct = sizeof(fd);
     1671        fd.lpstrName      = fname;
     1672        fd.cySize.s.Lo    = 80000;
     1673        fd.cySize.s.Hi    = 0;
     1674        fd.sWeight        = 0;
     1675        fd.sCharset       = 0;
     1676        fd.fItalic        = 0;
     1677        fd.fUnderline     = 0;
     1678        fd.fStrikethrough = 0;
     1679        return OleCreateFontIndirect(&fd,riid,ppobj);
     1680    }
     1681
     1682    FIXME("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
     1683    return E_NOINTERFACE;
    16831684}
    16841685
    16851686static HRESULT WINAPI SFCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
    1686         ICOM_THIS(IClassFactoryImpl,iface);
    1687         FIXME("(%p)->(%d),stub!\n",This,dolock);
    1688         return S_OK;
     1687    ICOM_THIS(IClassFactoryImpl,iface);
     1688    FIXME("(%p)->(%d),stub!\n",This,dolock);
     1689    return S_OK;
    16891690}
    16901691
    16911692static ICOM_VTABLE(IClassFactory) SFCF_Vtbl = {
    1692         ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
    1693         SFCF_QueryInterface,
    1694         SFCF_AddRef,
    1695         SFCF_Release,
    1696         SFCF_CreateInstance,
    1697         SFCF_LockServer
     1693    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1694    SFCF_QueryInterface,
     1695    SFCF_AddRef,
     1696    SFCF_Release,
     1697    SFCF_CreateInstance,
     1698    SFCF_LockServer
    16981699};
    16991700static IClassFactoryImpl STDFONT_CF = {&SFCF_Vtbl, 1 };
  • trunk/src/oleaut32/olepicture.c

    r6575 r6648  
     1/* $Id: olepicture.c,v 1.5 2001-09-05 13:19:01 bird Exp $ */
    12/*
    23 * OLE Picture object
     
    5051#ifdef HAVE_LIBJPEG
    5152/* This is a hack, so jpeglib.h does not redefine INT32 and the like*/
    52 #define XMD_H 
     53#define XMD_H
    5354#ifdef HAVE_JPEGLIB_H
    5455# include <jpeglib.h>
     
    9091  /* We own the object and must destroy it ourselves */
    9192    BOOL fOwn;
    92  
     93
    9394  /* Picture description */
    9495    PICTDESC desc;
     
    105106
    106107    BOOL keepOrigFormat;
    107     HDC hDCCur;
     108    HDC hDCCur;
    108109} OLEPictureImpl;
    109110
     
    174175  if (newObject==0)
    175176    return newObject;
    176  
     177
    177178  /*
    178179   * Initialize the virtual function table.
     
    186187
    187188  /*
    188    * Start with one reference count. The caller of this function 
     189   * Start with one reference count. The caller of this function
    189190   * must release the interface pointer when it is done.
    190191   */
    191   newObject->ref        = 1;
    192   newObject->hDCCur     = 0;
    193 
    194   newObject->fOwn       = fOwn;
     192  newObject->ref    = 1;
     193  newObject->hDCCur = 0;
     194
     195  newObject->fOwn   = fOwn;
    195196
    196197  /* dunno about original value */
     
    199200  if (pictDesc) {
    200201      if(pictDesc->cbSizeofstruct != sizeof(PICTDESC)) {
    201           FIXME("struct size = %d\n", pictDesc->cbSizeofstruct);
     202      FIXME("struct size = %d\n", pictDesc->cbSizeofstruct);
    202203      }
    203204      memcpy(&newObject->desc, pictDesc, sizeof(PICTDESC));
     
    206207      switch(pictDesc->picType) {
    207208      case PICTYPE_BITMAP:
    208         OLEPictureImpl_SetBitmap(newObject);
    209         break;
     209    OLEPictureImpl_SetBitmap(newObject);
     210    break;
    210211
    211212      case PICTYPE_METAFILE:
    212         TRACE("metafile handle %08x\n", pictDesc->u.wmf.hmeta);
    213         newObject->himetricWidth = pictDesc->u.wmf.xExt;
    214         newObject->himetricHeight = pictDesc->u.wmf.yExt;
    215         break;
     213    TRACE("metafile handle %08x\n", pictDesc->u.wmf.hmeta);
     214    newObject->himetricWidth = pictDesc->u.wmf.xExt;
     215    newObject->himetricHeight = pictDesc->u.wmf.yExt;
     216    break;
    216217
    217218      case PICTYPE_ICON:
    218219      case PICTYPE_ENHMETAFILE:
    219220      default:
    220         FIXME("Unsupported type %d\n", pictDesc->picType);
    221         newObject->himetricWidth = newObject->himetricHeight = 0;
    222         break;
     221    FIXME("Unsupported type %d\n", pictDesc->picType);
     222    newObject->himetricWidth = newObject->himetricHeight = 0;
     223    break;
    223224      }
    224225  } else {
    225226      newObject->desc.picType = PICTYPE_UNINITIALIZED;
    226227  }
    227    
     228
    228229  TRACE("returning %p\n", newObject);
    229230  return newObject;
     
    237238 * this object.  */
    238239static void OLEPictureImpl_Destroy(OLEPictureImpl* Obj)
    239 { 
     240{
    240241  TRACE("(%p)\n", Obj);
    241242
     
    282283  if ( (This==0) || (ppvObject==0) )
    283284    return E_INVALIDARG;
    284  
     285
    285286  /*
    286287   * Initialize the return parameter.
    287288   */
    288289  *ppvObject = 0;
    289  
     290
    290291  /*
    291292   * Compare the riid with the interface IDs implemented by this object.
    292293   */
    293   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 
     294  if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
    294295  {
    295296    *ppvObject = (IPicture*)This;
    296297  }
    297   else if (memcmp(&IID_IPicture, riid, sizeof(IID_IPicture)) == 0) 
     298  else if (memcmp(&IID_IPicture, riid, sizeof(IID_IPicture)) == 0)
    298299  {
    299300    *ppvObject = (IPicture*)This;
    300301  }
    301   else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 
     302  else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0)
    302303  {
    303304    *ppvObject = (IDispatch*)&(This->lpvtbl2);
    304305  }
    305   else if (memcmp(&IID_IPictureDisp, riid, sizeof(IID_IPictureDisp)) == 0) 
     306  else if (memcmp(&IID_IPictureDisp, riid, sizeof(IID_IPictureDisp)) == 0)
    306307  {
    307308    *ppvObject = (IDispatch*)&(This->lpvtbl2);
    308309  }
    309   else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 
     310  else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0)
    310311  {
    311312  *ppvObject = (IPersistStream*)&(This->lpvtbl3);
    312313  }
    313   else if (memcmp(&IID_IConnectionPointContainer, riid, sizeof(IID_IConnectionPointContainer)) == 0) 
     314  else if (memcmp(&IID_IConnectionPointContainer, riid, sizeof(IID_IConnectionPointContainer)) == 0)
    314315  {
    315316  *ppvObject = (IConnectionPointContainer*)&(This->lpvtbl4);
     
    323324    return E_NOINTERFACE;
    324325  }
    325  
     326
    326327  /*
    327328   * Query Interface always increases the reference count by one when it is
     
    362363 * See Windows documentation for more details on IUnknown methods.
    363364 */
    364 static ULONG WINAPI OLEPictureImpl_AddRef( 
     365static ULONG WINAPI OLEPictureImpl_AddRef(
    365366  IPicture* iface)
    366367{
     
    371372  return This->ref;
    372373}
    373        
     374
    374375/************************************************************************
    375376 * OLEPictureImpl_Release (IUnknown)
     
    377378 * See Windows documentation for more details on IUnknown methods.
    378379 */
    379 static ULONG WINAPI OLEPictureImpl_Release( 
     380static ULONG WINAPI OLEPictureImpl_Release(
    380381      IPicture* iface)
    381382{
     
    397398    return 0;
    398399  }
    399  
     400
    400401  return This->ref;
    401402}
     
    404405/************************************************************************
    405406 * OLEPictureImpl_get_Handle
    406  */ 
     407 */
    407408static HRESULT WINAPI OLEPictureImpl_get_Handle(IPicture *iface,
    408                                                 OLE_HANDLE *phandle)
     409                        OLE_HANDLE *phandle)
    409410{
    410411  ICOM_THIS(OLEPictureImpl, iface);
     
    433434/************************************************************************
    434435 * OLEPictureImpl_get_hPal
    435  */ 
     436 */
    436437static HRESULT WINAPI OLEPictureImpl_get_hPal(IPicture *iface,
    437                                               OLE_HANDLE *phandle)
     438                          OLE_HANDLE *phandle)
    438439{
    439440  ICOM_THIS(OLEPictureImpl, iface);
     
    444445/************************************************************************
    445446 * OLEPictureImpl_get_Type
    446  */ 
     447 */
    447448static HRESULT WINAPI OLEPictureImpl_get_Type(IPicture *iface,
    448                                               short *ptype)
     449                          short *ptype)
    449450{
    450451  ICOM_THIS(OLEPictureImpl, iface);
     
    456457/************************************************************************
    457458 * OLEPictureImpl_get_Width
    458  */ 
     459 */
    459460static HRESULT WINAPI OLEPictureImpl_get_Width(IPicture *iface,
    460                                                OLE_XSIZE_HIMETRIC *pwidth)
     461                           OLE_XSIZE_HIMETRIC *pwidth)
    461462{
    462463  ICOM_THIS(OLEPictureImpl, iface);
     
    468469/************************************************************************
    469470 * OLEPictureImpl_get_Height
    470  */ 
     471 */
    471472static HRESULT WINAPI OLEPictureImpl_get_Height(IPicture *iface,
    472                                                 OLE_YSIZE_HIMETRIC *pheight)
     473                        OLE_YSIZE_HIMETRIC *pheight)
    473474{
    474475  ICOM_THIS(OLEPictureImpl, iface);
     
    480481/************************************************************************
    481482 * OLEPictureImpl_Render
    482  */ 
     483 */
    483484static HRESULT WINAPI OLEPictureImpl_Render(IPicture *iface, HDC hdc,
    484                                             long x, long y, long cx, long cy,
    485                                             OLE_XPOS_HIMETRIC xSrc,
    486                                             OLE_YPOS_HIMETRIC ySrc,
    487                                             OLE_XSIZE_HIMETRIC cxSrc,
    488                                             OLE_YSIZE_HIMETRIC cySrc,
    489                                             LPCRECT prcWBounds)
     485                        long x, long y, long cx, long cy,
     486                        OLE_XPOS_HIMETRIC xSrc,
     487                        OLE_YPOS_HIMETRIC ySrc,
     488                        OLE_XSIZE_HIMETRIC cxSrc,
     489                        OLE_YSIZE_HIMETRIC cySrc,
     490                        LPCRECT prcWBounds)
    490491{
    491492  ICOM_THIS(OLEPictureImpl, iface);
    492493  TRACE("(%p)->(%08x, (%ld,%ld), (%ld,%ld) <- (%ld,%ld), (%ld,%ld), %p)\n",
    493         This, hdc, x, y, cx, cy, xSrc, ySrc, cxSrc, cySrc, prcWBounds);
     494    This, hdc, x, y, cx, cy, xSrc, ySrc, cxSrc, cySrc, prcWBounds);
    494495  if(prcWBounds)
    495496    TRACE("prcWBounds (%d,%d) - (%d,%d)\n", prcWBounds->left, prcWBounds->top,
    496           prcWBounds->right, prcWBounds->bottom);
     497      prcWBounds->right, prcWBounds->bottom);
    497498
    498499  /*
     
    542543/************************************************************************
    543544 * OLEPictureImpl_set_hPal
    544  */ 
     545 */
    545546static HRESULT WINAPI OLEPictureImpl_set_hPal(IPicture *iface,
    546                                               OLE_HANDLE hpal)
     547                          OLE_HANDLE hpal)
    547548{
    548549  ICOM_THIS(OLEPictureImpl, iface);
     
    554555/************************************************************************
    555556 * OLEPictureImpl_get_CurDC
    556  */ 
     557 */
    557558static HRESULT WINAPI OLEPictureImpl_get_CurDC(IPicture *iface,
    558                                                HDC *phdc)
     559                           HDC *phdc)
    559560{
    560561  ICOM_THIS(OLEPictureImpl, iface);
     
    566567/************************************************************************
    567568 * OLEPictureImpl_SelectPicture
    568  */ 
     569 */
    569570static HRESULT WINAPI OLEPictureImpl_SelectPicture(IPicture *iface,
    570                                                    HDC hdcIn,
    571                                                    HDC *phdcOut,
    572                                                    OLE_HANDLE *phbmpOut)
     571                           HDC hdcIn,
     572                           HDC *phdcOut,
     573                           OLE_HANDLE *phbmpOut)
    573574{
    574575  ICOM_THIS(OLEPictureImpl, iface);
     
    578579
    579580      if (phdcOut)
    580           *phdcOut = This->hDCCur;
     581      *phdcOut = This->hDCCur;
    581582      This->hDCCur = hdcIn;
    582583      if (phbmpOut)
    583           *phbmpOut = This->desc.u.bmp.hbitmap;
     584      *phbmpOut = This->desc.u.bmp.hbitmap;
    584585      return S_OK;
    585586  } else {
     
    591592/************************************************************************
    592593 * OLEPictureImpl_get_KeepOriginalFormat
    593  */ 
     594 */
    594595static HRESULT WINAPI OLEPictureImpl_get_KeepOriginalFormat(IPicture *iface,
    595                                                             BOOL *pfKeep)
     596                                BOOL *pfKeep)
    596597{
    597598  ICOM_THIS(OLEPictureImpl, iface);
     
    605606/************************************************************************
    606607 * OLEPictureImpl_put_KeepOriginalFormat
    607  */ 
     608 */
    608609static HRESULT WINAPI OLEPictureImpl_put_KeepOriginalFormat(IPicture *iface,
    609                                                             BOOL keep)
     610                                BOOL keep)
    610611{
    611612  ICOM_THIS(OLEPictureImpl, iface);
     
    618619/************************************************************************
    619620 * OLEPictureImpl_PictureChanged
    620  */ 
     621 */
    621622static HRESULT WINAPI OLEPictureImpl_PictureChanged(IPicture *iface)
    622623{
     
    629630/************************************************************************
    630631 * OLEPictureImpl_SaveAsFile
    631  */ 
     632 */
    632633static HRESULT WINAPI OLEPictureImpl_SaveAsFile(IPicture *iface,
    633                                                 IStream *pstream,
    634                                                 BOOL SaveMemCopy,
    635                                                 LONG *pcbSize)
     634                        IStream *pstream,
     635                        BOOL SaveMemCopy,
     636                        LONG *pcbSize)
    636637{
    637638  ICOM_THIS(OLEPictureImpl, iface);
     
    642643/************************************************************************
    643644 * OLEPictureImpl_get_Attributes
    644  */ 
     645 */
    645646static HRESULT WINAPI OLEPictureImpl_get_Attributes(IPicture *iface,
    646                                                     DWORD *pdwAttr)
     647                            DWORD *pdwAttr)
    647648{
    648649  ICOM_THIS(OLEPictureImpl, iface);
     
    650651  *pdwAttr = 0;
    651652  switch (This->desc.picType) {
    652   case PICTYPE_BITMAP:  break;  /* not 'truely' scalable, see MSDN. */
     653  case PICTYPE_BITMAP:  break;  /* not 'truely' scalable, see MSDN. */
    653654  case PICTYPE_ICON: *pdwAttr     = PICTURE_TRANSPARENT;break;
    654655  case PICTYPE_METAFILE: *pdwAttr = PICTURE_TRANSPARENT|PICTURE_SCALABLE;break;
     
    706707  ICOM_THIS_From_IConnectionPointContainer(OLEPictureImpl, iface);
    707708  TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppCP);
    708   if (!ppCP) 
     709  if (!ppCP)
    709710      return E_POINTER;
    710711  *ppCP = NULL;
     
    805806 * Loads the binary data from the IStream. Starts at current position.
    806807 * There appears to be an 2 DWORD header:
    807  *      DWORD magic;
    808  *      DWORD len;
     808 *  DWORD magic;
     809 *  DWORD len;
    809810 *
    810811 * Currently implemented: BITMAP, ICON, JPEG.
    811812 */
    812813static HRESULT WINAPI OLEPictureImpl_Load(IPersistStream* iface,IStream*pStm) {
    813   HRESULT       hr = E_FAIL;
    814   ULONG         xread;
    815   BYTE          *xbuf;
    816   DWORD         header[2];
    817   WORD          magic;
     814  HRESULT   hr = E_FAIL;
     815  ULONG     xread;
     816  BYTE      *xbuf;
     817  DWORD     header[2];
     818  WORD      magic;
    818819  ICOM_THIS_From_IPersistStream(OLEPictureImpl, iface);
    819820
     
    828829  xbuf = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,header[1]);
    829830  while (xread < header[1]) {
    830     ULONG nread; 
     831    ULONG nread;
    831832    hr = IStream_Read(pStm,xbuf+xread,header[1]-xread,&nread);
    832833    xread+=nread;
     
    841842  case 0xd8ff: { /* JPEG */
    842843#ifdef HAVE_LIBJPEG
    843     struct jpeg_decompress_struct       jd;
    844     struct jpeg_error_mgr               jerr;
    845     int                                 ret;
    846     JDIMENSION                          x;
    847     JSAMPROW                            samprow;
    848     BITMAPINFOHEADER                    bmi;
    849     LPBYTE                              bits;
    850     HDC                                 hdcref;
    851     struct jpeg_source_mgr              xjsm;
     844    struct jpeg_decompress_struct   jd;
     845    struct jpeg_error_mgr       jerr;
     846    int                 ret;
     847    JDIMENSION              x;
     848    JSAMPROW                samprow;
     849    BITMAPINFOHEADER            bmi;
     850    LPBYTE              bits;
     851    HDC                 hdcref;
     852    struct jpeg_source_mgr      xjsm;
    852853
    853854    /* This is basically so we can use in-memory data for jpeg decompression.
    854855     * We need to have all the functions.
    855856     */
    856     xjsm.next_input_byte        = xbuf;
    857     xjsm.bytes_in_buffer        = xread;
    858     xjsm.init_source            = _jpeg_init_source;
    859     xjsm.fill_input_buffer      = _jpeg_fill_input_buffer;
    860     xjsm.skip_input_data        = _jpeg_skip_input_data;
    861     xjsm.resync_to_restart      = _jpeg_resync_to_restart;
    862     xjsm.term_source            = _jpeg_term_source;
     857    xjsm.next_input_byte    = xbuf;
     858    xjsm.bytes_in_buffer    = xread;
     859    xjsm.init_source        = _jpeg_init_source;
     860    xjsm.fill_input_buffer  = _jpeg_fill_input_buffer;
     861    xjsm.skip_input_data    = _jpeg_skip_input_data;
     862    xjsm.resync_to_restart  = _jpeg_resync_to_restart;
     863    xjsm.term_source        = _jpeg_term_source;
    863864
    864865    jd.err = jpeg_std_error(&jerr);
     
    868869    jpeg_start_decompress(&jd);
    869870    if (ret != JPEG_HEADER_OK) {
    870         ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret);
    871         HeapFree(GetProcessHeap(),0,xbuf);
    872         return E_FAIL;
     871    ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret);
     872    HeapFree(GetProcessHeap(),0,xbuf);
     873    return E_FAIL;
    873874    }
    874875    bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(jd.output_height+1)*jd.output_width*jd.output_components);
     
    877878      x = jpeg_read_scanlines(&jd,&samprow,1);
    878879      if (x != 1) {
    879         FIXME("failed to read current scanline?\n");
    880         break;
     880    FIXME("failed to read current scanline?\n");
     881    break;
    881882      }
    882883      memcpy( bits+jd.output_scanline*jd.output_width*jd.output_components,
    883               samprow,
    884               jd.output_width*jd.output_components
     884          samprow,
     885              jd.output_width*jd.output_components
    885886      );
    886887    }
    887     bmi.biSize          = sizeof(bmi);
    888     bmi.biWidth         =  jd.output_width;
    889     bmi.biHeight        = -jd.output_height;
    890     bmi.biPlanes        = 1;
    891     bmi.biBitCount      = jd.output_components<<3;
    892     bmi.biCompression   = BI_RGB;
    893     bmi.biSizeImage     = jd.output_height*jd.output_width*jd.output_components;
    894     bmi.biXPelsPerMeter = 0;
    895     bmi.biYPelsPerMeter = 0;
    896     bmi.biClrUsed       = 0;
    897     bmi.biClrImportant  = 0;
     888    bmi.biSize      = sizeof(bmi);
     889    bmi.biWidth     =  jd.output_width;
     890    bmi.biHeight    = -jd.output_height;
     891    bmi.biPlanes    = 1;
     892    bmi.biBitCount  = jd.output_components<<3;
     893    bmi.biCompression   = BI_RGB;
     894    bmi.biSizeImage = jd.output_height*jd.output_width*jd.output_components;
     895    bmi.biXPelsPerMeter = 0;
     896    bmi.biYPelsPerMeter = 0;
     897    bmi.biClrUsed   = 0;
     898    bmi.biClrImportant  = 0;
    898899
    899900    HeapFree(GetProcessHeap(),0,samprow);
     
    902903    hdcref = GetDC(0);
    903904    This->desc.u.bmp.hbitmap=CreateDIBitmap(
    904             hdcref,
    905             &bmi,
    906             CBM_INIT,
    907             bits,
    908             (BITMAPINFO*)&bmi,
    909             DIB_RGB_COLORS
     905        hdcref,
     906        &bmi,
     907        CBM_INIT,
     908        bits,
     909        (BITMAPINFO*)&bmi,
     910        DIB_RGB_COLORS
    910911    );
    911912    DeleteDC(hdcref);
     
    921922  }
    922923  case 0x4d42: { /* Bitmap */
    923     BITMAPFILEHEADER    *bfh = (BITMAPFILEHEADER*)xbuf;
    924     BITMAPINFO          *bi = (BITMAPINFO*)(bfh+1);
    925     HDC                 hdcref;
     924    BITMAPFILEHEADER    *bfh = (BITMAPFILEHEADER*)xbuf;
     925    BITMAPINFO      *bi = (BITMAPINFO*)(bfh+1);
     926    HDC         hdcref;
    926927
    927928    /* Does not matter whether this is a coreheader or not, we only use
     
    930931    hdcref = GetDC(0);
    931932    This->desc.u.bmp.hbitmap = CreateDIBitmap(
    932         hdcref,
    933         &(bi->bmiHeader),
    934         CBM_INIT,
    935         xbuf+bfh->bfOffBits,
    936         bi,
    937         (bi->bmiHeader.biBitCount<=8)?DIB_PAL_COLORS:DIB_RGB_COLORS
     933    hdcref,
     934    &(bi->bmiHeader),
     935    CBM_INIT,
     936    xbuf+bfh->bfOffBits,
     937    bi,
     938    (bi->bmiHeader.biBitCount<=8)?DIB_PAL_COLORS:DIB_RGB_COLORS
    938939    );
    939940    DeleteDC(hdcref);
     
    945946  case 0x0000: { /* ICON , first word is dwReserved */
    946947    HICON hicon;
    947     CURSORICONFILEDIR   *cifd = (CURSORICONFILEDIR*)xbuf;
    948     int i;
     948    CURSORICONFILEDIR   *cifd = (CURSORICONFILEDIR*)xbuf;
     949    int i;
    949950
    950951    /*
     
    954955
    955956    for (i=0;i<cifd->idCount;i++) {
    956         FIXME("[%d] width %d\n",i,cifd->idEntries[i].bWidth);
    957         FIXME("[%d] height %d\n",i,cifd->idEntries[i].bHeight);
    958         FIXME("[%d] bColorCount %d\n",i,cifd->idEntries[i].bColorCount);
    959         FIXME("[%d] bReserved %d\n",i,cifd->idEntries[i].bReserved);
    960         FIXME("[%d] xHotspot %d\n",i,cifd->idEntries[i].xHotspot);
    961         FIXME("[%d] yHotspot %d\n",i,cifd->idEntries[i].yHotspot);
    962         FIXME("[%d] dwDIBSize %d\n",i,cifd->idEntries[i].dwDIBSize);
    963         FIXME("[%d] dwDIBOffset %d\n",i,cifd->idEntries[i].dwDIBOffset);
     957    FIXME("[%d] width %d\n",i,cifd->idEntries[i].bWidth);
     958    FIXME("[%d] height %d\n",i,cifd->idEntries[i].bHeight);
     959    FIXME("[%d] bColorCount %d\n",i,cifd->idEntries[i].bColorCount);
     960    FIXME("[%d] bReserved %d\n",i,cifd->idEntries[i].bReserved);
     961    FIXME("[%d] xHotspot %d\n",i,cifd->idEntries[i].xHotspot);
     962    FIXME("[%d] yHotspot %d\n",i,cifd->idEntries[i].yHotspot);
     963    FIXME("[%d] dwDIBSize %d\n",i,cifd->idEntries[i].dwDIBSize);
     964    FIXME("[%d] dwDIBOffset %d\n",i,cifd->idEntries[i].dwDIBOffset);
    964965    }
    965966    */
     
    969970     */
    970971    if (cifd->idCount!=1) {
    971         for (i=0;i<cifd->idCount;i++) {
    972             if (cifd->idEntries[i].bWidth == 32)
    973                 break;
    974         }
    975         if (i==cifd->idCount) i=0;
     972    for (i=0;i<cifd->idCount;i++) {
     973        if (cifd->idEntries[i].bWidth == 32)
     974        break;
    976975    }
     976    if (i==cifd->idCount) i=0;
     977    }
    977978
    978979    hicon = CreateIconFromResourceEx(
    979                 xbuf+cifd->idEntries[i].dwDIBOffset,
    980                 cifd->idEntries[i].dwDIBSize,
    981                 TRUE, /* is icon */
    982                 0x00030000,
    983                 cifd->idEntries[i].bWidth,
    984                 cifd->idEntries[i].bHeight,
    985                 0
     980        xbuf+cifd->idEntries[i].dwDIBOffset,
     981        cifd->idEntries[i].dwDIBSize,
     982        TRUE, /* is icon */
     983        0x00030000,
     984        cifd->idEntries[i].bWidth,
     985        cifd->idEntries[i].bHeight,
     986        0
    986987    );
    987988    if (!hicon) {
    988         FIXME("CreateIcon failed.\n");
    989         hr = E_FAIL;
     989    FIXME("CreateIcon failed.\n");
     990    hr = E_FAIL;
    990991    } else {
    991         This->desc.picType = PICTYPE_ICON;
    992         This->desc.u.icon.hicon = hicon;
    993         hr = S_OK;
     992    This->desc.picType = PICTYPE_ICON;
     993    This->desc.u.icon.hicon = hicon;
     994    hr = S_OK;
    994995    }
    995996    break;
     
    10741075 */
    10751076static HRESULT WINAPI OLEPictureImpl_GetTypeInfoCount(
    1076   IDispatch*    iface, 
     1077  IDispatch*    iface,
    10771078  unsigned int* pctinfo)
    10781079{
     
    10881089 */
    10891090static HRESULT WINAPI OLEPictureImpl_GetTypeInfo(
    1090   IDispatch*  iface, 
     1091  IDispatch*  iface,
    10911092  UINT      iTInfo,
    1092   LCID        lcid, 
     1093  LCID        lcid,
    10931094  ITypeInfo** ppTInfo)
    10941095{
     
    11051106static HRESULT WINAPI OLEPictureImpl_GetIDsOfNames(
    11061107  IDispatch*  iface,
    1107   REFIID      riid, 
    1108   LPOLESTR* rgszNames, 
    1109   UINT      cNames, 
     1108  REFIID      riid,
     1109  LPOLESTR* rgszNames,
     1110  UINT      cNames,
    11101111  LCID        lcid,
    11111112  DISPID*     rgDispId)
     
    11231124static HRESULT WINAPI OLEPictureImpl_Invoke(
    11241125  IDispatch*  iface,
    1125   DISPID      dispIdMember, 
    1126   REFIID      riid, 
    1127   LCID        lcid, 
     1126  DISPID      dispIdMember,
     1127  REFIID      riid,
     1128  LCID        lcid,
    11281129  WORD        wFlags,
    11291130  DISPPARAMS* pDispParams,
    1130   VARIANT*    pVarResult, 
     1131  VARIANT*    pVarResult,
    11311132  EXCEPINFO*  pExepInfo,
    11321133  UINT*     puArgErr)
     
    12021203 */
    12031204HRESULT WINAPI OleCreatePictureIndirect(LPPICTDESC lpPictDesc, REFIID riid,
    1204                             BOOL fOwn, LPVOID *ppvObj )
     1205                    BOOL fOwn, LPVOID *ppvObj )
    12051206{
    12061207  OLEPictureImpl* newPict = NULL;
     
    12441245 */
    12451246HRESULT WINAPI OleLoadPicture( LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
    1246                             REFIID riid, LPVOID *ppvObj )
     1247                    REFIID riid, LPVOID *ppvObj )
    12471248{
    12481249  LPPERSISTSTREAM ps;
    1249   IPicture      *newpic;
     1250  IPicture  *newpic;
    12501251  HRESULT hr;
    12511252
    12521253  TRACE("(%p,%ld,%d,%s,%p), partially implemented.\n",
    1253         lpstream, lSize, fRunmode, debugstr_guid(riid), ppvObj);
     1254    lpstream, lSize, fRunmode, debugstr_guid(riid), ppvObj);
    12541255
    12551256  hr = OleCreatePictureIndirect(NULL,riid,!fRunmode,(LPVOID*)&newpic);
     
    12761277 */
    12771278HRESULT WINAPI OleLoadPictureEx( LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
    1278                             REFIID reed, DWORD xsiz, DWORD ysiz, DWORD flags, LPVOID *ppvObj )
     1279                    REFIID reed, DWORD xsiz, DWORD ysiz, DWORD flags, LPVOID *ppvObj )
    12791280{
    12801281  FIXME("(%p,%ld,%d,%p,%lx,%lx,%lx,%p), not implemented\n",
    1281         lpstream, lSize, fRunmode, reed, xsiz, ysiz, flags, ppvObj);
     1282    lpstream, lSize, fRunmode, reed, xsiz, ysiz, flags, ppvObj);
    12821283  return S_OK;
    12831284}
    1284  
     1285
    12851286#ifdef __WIN32OS2__
    12861287
     
    13081309// ----------------------------------------------------------------------
    13091310HRESULT WIN32API OleLoadPicturePath
    1310    (LPOLESTR            szURLorPath,
    1311     LPUNKNOWN           punkCaller,
    1312     DWORD               dwReserved,
    1313     OLE_COLOR           clrReserved,
    1314     REFIID              riid,
    1315     LPVOID *            ppvRet )
     1311   (LPOLESTR        szURLorPath,
     1312    LPUNKNOWN       punkCaller,
     1313    DWORD           dwReserved,
     1314    OLE_COLOR       clrReserved,
     1315    REFIID          riid,
     1316    LPVOID *        ppvRet )
    13161317{
    13171318    dprintf(("OLEAUT32: OleLoadPicturePath - stub"));
  • trunk/src/oleaut32/parsedt.c

    r4837 r6648  
     1/* $Id: parsedt.c,v 1.2 2001-09-05 13:19:01 bird Exp $ */
    12/*
    23PostgreSQL Data Base Management System (formerly known as Postgres, then
     
    2627 *
    2728 * dt.c--
    28  *        Functions for the built-in type "dt".
     29 *    Functions for the built-in type "dt".
    2930 *
    3031 * Copyright (c) 1994, Regents of the University of California
     
    4546
    4647static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel);
    47 static int      DecodeDate(char *str, int fmask, int *tmask, struct tm * tm);
     48static int  DecodeDate(char *str, int fmask, int *tmask, struct tm * tm);
    4849static int DecodeNumber(int flen, char *field,
    49                         int fmask, int *tmask, struct tm * tm, double *fsec);
     50            int fmask, int *tmask, struct tm * tm, double *fsec);
    5051static int DecodeNumberField(int len, char *str,
    51                                   int fmask, int *tmask, struct tm * tm, double *fsec);
    52 static int      DecodeSpecial(int field, char *lowtoken, int *val);
     52                  int fmask, int *tmask, struct tm * tm, double *fsec);
     53static int  DecodeSpecial(int field, char *lowtoken, int *val);
    5354static int DecodeTime(char *str, int fmask, int *tmask,
    54                    struct tm * tm, double *fsec);
    55 static int      DecodeTimezone(char *str, int *tzp);
     55           struct tm * tm, double *fsec);
     56static int  DecodeTimezone(char *str, int *tzp);
    5657
    5758#define USE_DATE_CACHE 1
     
    6667"Thursday", "Friday", "Saturday", NULL};
    6768
    68 /* those three vars are useless, and not even initialized, so 
     69/* those three vars are useless, and not even initialized, so
    6970 * I'd rather remove them all (EPP)
    7071 */
    71 int     DateStyle;
    72 bool    EuroDates;
    73 int     CTimeZone;
     72int DateStyle;
     73bool    EuroDates;
     74int CTimeZone;
    7475
    7576#define UTIME_MINYEAR (1901)
     
    9192
    9293/*****************************************************************************
    93  *       PRIVATE ROUTINES                                                                                                                *
     94 *   PRIVATE ROUTINES                                                        *
    9495 *****************************************************************************/
    9596
    9697/* definitions for squeezing values into "value" */
    97 #define ABS_SIGNBIT             (char) 0200
    98 #define VALMASK                 (char) 0177
    99 #define NEG(n)                  ((n)|ABS_SIGNBIT)
    100 #define SIGNEDCHAR(c)   ((c)&ABS_SIGNBIT? -((c)&VALMASK): (c))
    101 #define FROMVAL(tp)             (-SIGNEDCHAR((tp)->value) * 10) /* uncompress */
    102 #define TOVAL(tp, v)    ((tp)->value = ((v) < 0? NEG((-(v))/10): (v)/10))
     98#define ABS_SIGNBIT     (char) 0200
     99#define VALMASK         (char) 0177
     100#define NEG(n)          ((n)|ABS_SIGNBIT)
     101#define SIGNEDCHAR(c)   ((c)&ABS_SIGNBIT? -((c)&VALMASK): (c))
     102#define FROMVAL(tp)     (-SIGNEDCHAR((tp)->value) * 10) /* uncompress */
     103#define TOVAL(tp, v)    ((tp)->value = ((v) < 0? NEG((-(v))/10): (v)/10))
    103104
    104105/*
     
    108109 */
    109110static datetkn datetktbl[] = {
    110 /*              text                    token   lexval */
    111         {EARLY, RESERV, DTK_EARLY}, /* "-infinity" reserved for "early time" */
    112         {"acsst", DTZ, 63},                     /* Cent. Australia */
    113         {"acst", TZ, 57},                       /* Cent. Australia */
    114         {DA_D, ADBC, AD},                       /* "ad" for years >= 0 */
    115         {"abstime", IGNOREFIELD, 0},            /* "abstime" for pre-v6.1 "Invalid
    116                                                                 * Abstime" */
    117         {"adt", DTZ, NEG(18)},          /* Atlantic Daylight Time */
    118         {"aesst", DTZ, 66},                     /* E. Australia */
    119         {"aest", TZ, 60},                       /* Australia Eastern Std Time */
    120         {"ahst", TZ, 60},                       /* Alaska-Hawaii Std Time */
    121         {"allballs", RESERV, DTK_ZULU},         /* 00:00:00 */
    122         {"am", AMPM, AM},
    123         {"apr", MONTH, 4},
    124         {"april", MONTH, 4},
    125         {"ast", TZ, NEG(24)},           /* Atlantic Std Time (Canada) */
    126         {"at", IGNOREFIELD, 0},                 /* "at" (throwaway) */
    127         {"aug", MONTH, 8},
    128         {"august", MONTH, 8},
    129         {"awsst", DTZ, 54},                     /* W. Australia */
    130         {"awst", TZ, 48},                       /* W. Australia */
    131         {DB_C, ADBC, BC},                       /* "bc" for years < 0 */
    132         {"bst", TZ, 6},                         /* British Summer Time */
    133         {"bt", TZ, 18},                         /* Baghdad Time */
    134         {"cadt", DTZ, 63},                      /* Central Australian DST */
    135         {"cast", TZ, 57},                       /* Central Australian ST */
    136         {"cat", TZ, NEG(60)},           /* Central Alaska Time */
    137         {"cct", TZ, 48},                        /* China Coast */
    138         {"cdt", DTZ, NEG(30)},          /* Central Daylight Time */
    139         {"cet", TZ, 6},                         /* Central European Time */
    140         {"cetdst", DTZ, 12},            /* Central European Dayl.Time */
    141         {"cst", TZ, NEG(36)},           /* Central Standard Time */
    142         {DCURRENT, RESERV, DTK_CURRENT},        /* "current" is always now */
    143         {"dec", MONTH, 12},
    144         {"december", MONTH, 12},
    145         {"dnt", TZ, 6},                         /* Dansk Normal Tid */
    146         {"dow", RESERV, DTK_DOW},       /* day of week */
    147         {"doy", RESERV, DTK_DOY},       /* day of year */
    148         {"dst", DTZMOD, 6},
    149         {"east", TZ, NEG(60)},          /* East Australian Std Time */
    150         {"edt", DTZ, NEG(24)},          /* Eastern Daylight Time */
    151         {"eet", TZ, 12},                        /* East. Europe, USSR Zone 1 */
    152         {"eetdst", DTZ, 18},            /* Eastern Europe */
    153         {EPOCH, RESERV, DTK_EPOCH}, /* "epoch" reserved for system epoch time */
     111/*      text            token   lexval */
     112    {EARLY, RESERV, DTK_EARLY}, /* "-infinity" reserved for "early time" */
     113    {"acsst", DTZ, 63},         /* Cent. Australia */
     114    {"acst", TZ, 57},           /* Cent. Australia */
     115    {DA_D, ADBC, AD},           /* "ad" for years >= 0 */
     116    {"abstime", IGNOREFIELD, 0},        /* "abstime" for pre-v6.1 "Invalid
     117                                * Abstime" */
     118    {"adt", DTZ, NEG(18)},      /* Atlantic Daylight Time */
     119    {"aesst", DTZ, 66},         /* E. Australia */
     120    {"aest", TZ, 60},           /* Australia Eastern Std Time */
     121    {"ahst", TZ, 60},           /* Alaska-Hawaii Std Time */
     122    {"allballs", RESERV, DTK_ZULU},     /* 00:00:00 */
     123    {"am", AMPM, AM},
     124    {"apr", MONTH, 4},
     125    {"april", MONTH, 4},
     126    {"ast", TZ, NEG(24)},       /* Atlantic Std Time (Canada) */
     127    {"at", IGNOREFIELD, 0},         /* "at" (throwaway) */
     128    {"aug", MONTH, 8},
     129    {"august", MONTH, 8},
     130    {"awsst", DTZ, 54},         /* W. Australia */
     131    {"awst", TZ, 48},           /* W. Australia */
     132    {DB_C, ADBC, BC},           /* "bc" for years < 0 */
     133    {"bst", TZ, 6},             /* British Summer Time */
     134    {"bt", TZ, 18},             /* Baghdad Time */
     135    {"cadt", DTZ, 63},          /* Central Australian DST */
     136    {"cast", TZ, 57},           /* Central Australian ST */
     137    {"cat", TZ, NEG(60)},       /* Central Alaska Time */
     138    {"cct", TZ, 48},            /* China Coast */
     139    {"cdt", DTZ, NEG(30)},      /* Central Daylight Time */
     140    {"cet", TZ, 6},             /* Central European Time */
     141    {"cetdst", DTZ, 12},        /* Central European Dayl.Time */
     142    {"cst", TZ, NEG(36)},       /* Central Standard Time */
     143    {DCURRENT, RESERV, DTK_CURRENT},    /* "current" is always now */
     144    {"dec", MONTH, 12},
     145    {"december", MONTH, 12},
     146    {"dnt", TZ, 6},             /* Dansk Normal Tid */
     147    {"dow", RESERV, DTK_DOW},   /* day of week */
     148    {"doy", RESERV, DTK_DOY},   /* day of year */
     149    {"dst", DTZMOD, 6},
     150    {"east", TZ, NEG(60)},      /* East Australian Std Time */
     151    {"edt", DTZ, NEG(24)},      /* Eastern Daylight Time */
     152    {"eet", TZ, 12},            /* East. Europe, USSR Zone 1 */
     153    {"eetdst", DTZ, 18},        /* Eastern Europe */
     154    {EPOCH, RESERV, DTK_EPOCH}, /* "epoch" reserved for system epoch time */
    154155#if USE_AUSTRALIAN_RULES
    155         {"est", TZ, 60},                        /* Australia Eastern Std Time */
     156    {"est", TZ, 60},            /* Australia Eastern Std Time */
    156157#else
    157         {"est", TZ, NEG(30)},           /* Eastern Standard Time */
    158 #endif
    159         {"feb", MONTH, 2},
    160         {"february", MONTH, 2},
    161         {"fri", DOW, 5},
    162         {"friday", DOW, 5},
    163         {"fst", TZ, 6},                         /* French Summer Time */
    164         {"fwt", DTZ, 12},                       /* French Winter Time  */
    165         {"gmt", TZ, 0},                         /* Greenwish Mean Time */
    166         {"gst", TZ, 60},                        /* Guam Std Time, USSR Zone 9 */
    167         {"hdt", DTZ, NEG(54)},          /* Hawaii/Alaska */
    168         {"hmt", DTZ, 18},                       /* Hellas ? ? */
    169         {"hst", TZ, NEG(60)},           /* Hawaii Std Time */
    170         {"idle", TZ, 72},                       /* Intl. Date Line, East */
    171         {"idlw", TZ, NEG(72)},          /* Intl. Date Line,,    est */
    172         {LATE, RESERV, DTK_LATE},       /* "infinity" reserved for "late time" */
    173         {INVALID, RESERV, DTK_INVALID},         /* "invalid" reserved for invalid
    174                                                                                 * time */
    175         {"ist", TZ, 12},                        /* Israel */
    176         {"it", TZ, 22},                         /* Iran Time */
    177         {"jan", MONTH, 1},
    178         {"january", MONTH, 1},
    179         {"jst", TZ, 54},                        /* Japan Std Time,USSR Zone 8 */
    180         {"jt", TZ, 45},                         /* Java Time */
    181         {"jul", MONTH, 7},
    182         {"july", MONTH, 7},
    183         {"jun", MONTH, 6},
    184         {"june", MONTH, 6},
    185         {"kst", TZ, 54},                        /* Korea Standard Time */
    186         {"ligt", TZ, 60},                       /* From Melbourne, Australia */
    187         {"mar", MONTH, 3},
    188         {"march", MONTH, 3},
    189         {"may", MONTH, 5},
    190         {"mdt", DTZ, NEG(36)},          /* Mountain Daylight Time */
    191         {"mest", DTZ, 12},                      /* Middle Europe Summer Time */
    192         {"met", TZ, 6},                         /* Middle Europe Time */
    193         {"metdst", DTZ, 12},            /* Middle Europe Daylight Time */
    194         {"mewt", TZ, 6},                        /* Middle Europe Winter Time */
    195         {"mez", TZ, 6},                         /* Middle Europe Zone */
    196         {"mon", DOW, 1},
    197         {"monday", DOW, 1},
    198         {"mst", TZ, NEG(42)},           /* Mountain Standard Time */
    199         {"mt", TZ, 51},                         /* Moluccas Time */
    200         {"ndt", DTZ, NEG(15)},          /* Nfld. Daylight Time */
    201         {"nft", TZ, NEG(21)},           /* Newfoundland Standard Time */
    202         {"nor", TZ, 6},                         /* Norway Standard Time */
    203         {"nov", MONTH, 11},
    204         {"november", MONTH, 11},
    205         {NOW, RESERV, DTK_NOW},         /* current transaction time */
    206         {"nst", TZ, NEG(21)},           /* Nfld. Standard Time */
    207         {"nt", TZ, NEG(66)},            /* Nome Time */
    208         {"nzdt", DTZ, 78},                      /* New Zealand Daylight Time */
    209         {"nzst", TZ, 72},                       /* New Zealand Standard Time */
    210         {"nzt", TZ, 72},                        /* New Zealand Time */
    211         {"oct", MONTH, 10},
    212         {"october", MONTH, 10},
    213         {"on", IGNOREFIELD, 0},                 /* "on" (throwaway) */
    214         {"pdt", DTZ, NEG(42)},          /* Pacific Daylight Time */
    215         {"pm", AMPM, PM},
    216         {"pst", TZ, NEG(48)},           /* Pacific Standard Time */
    217         {"sadt", DTZ, 63},                      /* S. Australian Dayl. Time */
    218         {"sast", TZ, 57},                       /* South Australian Std Time */
    219         {"sat", DOW, 6},
    220         {"saturday", DOW, 6},
    221         {"sep", MONTH, 9},
    222         {"sept", MONTH, 9},
    223         {"september", MONTH, 9},
    224         {"set", TZ, NEG(6)},            /* Seychelles Time ?? */
    225         {"sst", DTZ, 12},                       /* Swedish Summer Time */
    226         {"sun", DOW, 0},
    227         {"sunday", DOW, 0},
    228         {"swt", TZ, 6},                         /* Swedish Winter Time  */
    229         {"thu", DOW, 4},
    230         {"thur", DOW, 4},
    231         {"thurs", DOW, 4},
    232         {"thursday", DOW, 4},
    233         {TODAY, RESERV, DTK_TODAY}, /* midnight */
    234         {TOMORROW, RESERV, DTK_TOMORROW},       /* tomorrow midnight */
    235         {"tue", DOW, 2},
    236         {"tues", DOW, 2},
    237         {"tuesday", DOW, 2},
    238         {"undefined", RESERV, DTK_INVALID}, /* "undefined" pre-v6.1 invalid
    239                                                                                 * time */
    240         {"ut", TZ, 0},
    241         {"utc", TZ, 0},
    242         {"wadt", DTZ, 48},                      /* West Australian DST */
    243         {"wast", TZ, 42},                       /* West Australian Std Time */
    244         {"wat", TZ, NEG(6)},            /* West Africa Time */
    245         {"wdt", DTZ, 54},                       /* West Australian DST */
    246         {"wed", DOW, 3},
    247         {"wednesday", DOW, 3},
    248         {"weds", DOW, 3},
    249         {"wet", TZ, 0},                         /* Western Europe */
    250         {"wetdst", DTZ, 6},                     /* Western Europe */
    251         {"wst", TZ, 48},                        /* West Australian Std Time */
    252         {"ydt", DTZ, NEG(48)},          /* Yukon Daylight Time */
    253         {YESTERDAY, RESERV, DTK_YESTERDAY}, /* yesterday midnight */
    254         {"yst", TZ, NEG(54)},           /* Yukon Standard Time */
    255         {"zp4", TZ, NEG(24)},           /* GMT +4  hours. */
    256         {"zp5", TZ, NEG(30)},           /* GMT +5  hours. */
    257         {"zp6", TZ, NEG(36)},           /* GMT +6  hours. */
    258         {"z", RESERV, DTK_ZULU},        /* 00:00:00 */
    259         {ZULU, RESERV, DTK_ZULU},       /* 00:00:00 */
     158    {"est", TZ, NEG(30)},       /* Eastern Standard Time */
     159#endif
     160    {"feb", MONTH, 2},
     161    {"february", MONTH, 2},
     162    {"fri", DOW, 5},
     163    {"friday", DOW, 5},
     164    {"fst", TZ, 6},             /* French Summer Time */
     165    {"fwt", DTZ, 12},           /* French Winter Time  */
     166    {"gmt", TZ, 0},             /* Greenwish Mean Time */
     167    {"gst", TZ, 60},            /* Guam Std Time, USSR Zone 9 */
     168    {"hdt", DTZ, NEG(54)},      /* Hawaii/Alaska */
     169    {"hmt", DTZ, 18},           /* Hellas ? ? */
     170    {"hst", TZ, NEG(60)},       /* Hawaii Std Time */
     171    {"idle", TZ, 72},           /* Intl. Date Line, East */
     172    {"idlw", TZ, NEG(72)},      /* Intl. Date Line,,    est */
     173    {LATE, RESERV, DTK_LATE},   /* "infinity" reserved for "late time" */
     174    {INVALID, RESERV, DTK_INVALID},     /* "invalid" reserved for invalid
     175                                        * time */
     176    {"ist", TZ, 12},            /* Israel */
     177    {"it", TZ, 22},             /* Iran Time */
     178    {"jan", MONTH, 1},
     179    {"january", MONTH, 1},
     180    {"jst", TZ, 54},            /* Japan Std Time,USSR Zone 8 */
     181    {"jt", TZ, 45},             /* Java Time */
     182    {"jul", MONTH, 7},
     183    {"july", MONTH, 7},
     184    {"jun", MONTH, 6},
     185    {"june", MONTH, 6},
     186    {"kst", TZ, 54},            /* Korea Standard Time */
     187    {"ligt", TZ, 60},           /* From Melbourne, Australia */
     188    {"mar", MONTH, 3},
     189    {"march", MONTH, 3},
     190    {"may", MONTH, 5},
     191    {"mdt", DTZ, NEG(36)},      /* Mountain Daylight Time */
     192    {"mest", DTZ, 12},          /* Middle Europe Summer Time */
     193    {"met", TZ, 6},             /* Middle Europe Time */
     194    {"metdst", DTZ, 12},        /* Middle Europe Daylight Time */
     195    {"mewt", TZ, 6},            /* Middle Europe Winter Time */
     196    {"mez", TZ, 6},             /* Middle Europe Zone */
     197    {"mon", DOW, 1},
     198    {"monday", DOW, 1},
     199    {"mst", TZ, NEG(42)},       /* Mountain Standard Time */
     200    {"mt", TZ, 51},             /* Moluccas Time */
     201    {"ndt", DTZ, NEG(15)},      /* Nfld. Daylight Time */
     202    {"nft", TZ, NEG(21)},       /* Newfoundland Standard Time */
     203    {"nor", TZ, 6},             /* Norway Standard Time */
     204    {"nov", MONTH, 11},
     205    {"november", MONTH, 11},
     206    {NOW, RESERV, DTK_NOW},     /* current transaction time */
     207    {"nst", TZ, NEG(21)},       /* Nfld. Standard Time */
     208    {"nt", TZ, NEG(66)},        /* Nome Time */
     209    {"nzdt", DTZ, 78},          /* New Zealand Daylight Time */
     210    {"nzst", TZ, 72},           /* New Zealand Standard Time */
     211    {"nzt", TZ, 72},            /* New Zealand Time */
     212    {"oct", MONTH, 10},
     213    {"october", MONTH, 10},
     214    {"on", IGNOREFIELD, 0},         /* "on" (throwaway) */
     215    {"pdt", DTZ, NEG(42)},      /* Pacific Daylight Time */
     216    {"pm", AMPM, PM},
     217    {"pst", TZ, NEG(48)},       /* Pacific Standard Time */
     218    {"sadt", DTZ, 63},          /* S. Australian Dayl. Time */
     219    {"sast", TZ, 57},           /* South Australian Std Time */
     220    {"sat", DOW, 6},
     221    {"saturday", DOW, 6},
     222    {"sep", MONTH, 9},
     223    {"sept", MONTH, 9},
     224    {"september", MONTH, 9},
     225    {"set", TZ, NEG(6)},        /* Seychelles Time ?? */
     226    {"sst", DTZ, 12},           /* Swedish Summer Time */
     227    {"sun", DOW, 0},
     228    {"sunday", DOW, 0},
     229    {"swt", TZ, 6},             /* Swedish Winter Time  */
     230    {"thu", DOW, 4},
     231    {"thur", DOW, 4},
     232    {"thurs", DOW, 4},
     233    {"thursday", DOW, 4},
     234    {TODAY, RESERV, DTK_TODAY}, /* midnight */
     235    {TOMORROW, RESERV, DTK_TOMORROW},   /* tomorrow midnight */
     236    {"tue", DOW, 2},
     237    {"tues", DOW, 2},
     238    {"tuesday", DOW, 2},
     239    {"undefined", RESERV, DTK_INVALID}, /* "undefined" pre-v6.1 invalid
     240                                        * time */
     241    {"ut", TZ, 0},
     242    {"utc", TZ, 0},
     243    {"wadt", DTZ, 48},          /* West Australian DST */
     244    {"wast", TZ, 42},           /* West Australian Std Time */
     245    {"wat", TZ, NEG(6)},        /* West Africa Time */
     246    {"wdt", DTZ, 54},           /* West Australian DST */
     247    {"wed", DOW, 3},
     248    {"wednesday", DOW, 3},
     249    {"weds", DOW, 3},
     250    {"wet", TZ, 0},             /* Western Europe */
     251    {"wetdst", DTZ, 6},         /* Western Europe */
     252    {"wst", TZ, 48},            /* West Australian Std Time */
     253    {"ydt", DTZ, NEG(48)},      /* Yukon Daylight Time */
     254    {YESTERDAY, RESERV, DTK_YESTERDAY}, /* yesterday midnight */
     255    {"yst", TZ, NEG(54)},       /* Yukon Standard Time */
     256    {"zp4", TZ, NEG(24)},       /* GMT +4  hours. */
     257    {"zp5", TZ, NEG(30)},       /* GMT +5  hours. */
     258    {"zp6", TZ, NEG(36)},       /* GMT +6  hours. */
     259    {"z", RESERV, DTK_ZULU},    /* 00:00:00 */
     260    {ZULU, RESERV, DTK_ZULU},   /* 00:00:00 */
    260261};
    261262
     
    275276 * Calendar time to Julian date conversions.
    276277 * Julian date is commonly used in astronomical applications,
    277  *      since it is numerically accurate and computationally simple.
     278 *  since it is numerically accurate and computationally simple.
    278279 * The algorithms here will accurately convert between Julian day
    279  *      and calendar date for all non-negative Julian days
    280  *      (i.e. from Nov 23, -4713 on).
     280 *  and calendar date for all non-negative Julian days
     281 *  (i.e. from Nov 23, -4713 on).
    281282 *
    282283 * Ref: Explanatory Supplement to the Astronomical Almanac, 1992.
    283  *      University Science Books, 20 Edgehill Rd. Mill Valley CA 94941.
     284 *  University Science Books, 20 Edgehill Rd. Mill Valley CA 94941.
    284285 *
    285286 * Use the algorithm by Henry Fliegel, a former NASA/JPL colleague
    286  *      now at Aerospace Corp. (hi, Henry!)
     287 *  now at Aerospace Corp. (hi, Henry!)
    287288 *
    288289 * These routines will be used by other date/time packages - tgl 97/02/25
     
    290291
    291292/* Set the minimum year to one greater than the year of the first valid day
    292  *      to avoid having to check year and day both. - tgl 97/05/08
     293 *  to avoid having to check year and day both. - tgl 97/05/08
    293294 */
    294295
     
    304305date2j(int y, int m, int d)
    305306{
    306         int                     m12 = (m - 14) / 12;
    307 
    308         return ((1461 * (y + 4800 + m12)) / 4 + (367 * (m - 2 - 12 * (m12))) / 12
    309                         - (3 * ((y + 4900 + m12) / 100)) / 4 + d - 32075);
    310 }       /* date2j() */
     307    int         m12 = (m - 14) / 12;
     308
     309    return ((1461 * (y + 4800 + m12)) / 4 + (367 * (m - 2 - 12 * (m12))) / 12
     310            - (3 * ((y + 4900 + m12) / 100)) / 4 + d - 32075);
     311}   /* date2j() */
    311312
    312313void
    313314j2date(int jd, int *year, int *month, int *day)
    314315{
    315         int                     j,
    316                                 y,
    317                                 m,
    318                                 d;
    319 
    320         int                     i,
    321                                 l,
    322                                 n;
    323 
    324         l = jd + 68569;
    325         n = (4 * l) / 146097;
    326         l -= (146097 * n + 3) / 4;
    327         i = (4000 * (l + 1)) / 1461001;
    328         l += 31 - (1461 * i) / 4;
    329         j = (80 * l) / 2447;
    330         d = l - (2447 * j) / 80;
    331         l = j / 11;
    332         m = (j + 2) - (12 * l);
    333         y = 100 * (n - 49) + i + l;
    334 
    335         *year = y;
    336         *month = m;
    337         *day = d;
    338         return;
    339 }       /* j2date() */
     316    int         j,
     317                y,
     318                m,
     319                d;
     320
     321    int         i,
     322                l,
     323                n;
     324
     325    l = jd + 68569;
     326    n = (4 * l) / 146097;
     327    l -= (146097 * n + 3) / 4;
     328    i = (4000 * (l + 1)) / 1461001;
     329    l += 31 - (1461 * i) / 4;
     330    j = (80 * l) / 2447;
     331    d = l - (2447 * j) / 80;
     332    l = j / 11;
     333    m = (j + 2) - (12 * l);
     334    y = 100 * (n - 49) + i + l;
     335
     336    *year = y;
     337    *month = m;
     338    *day = d;
     339    return;
     340}   /* j2date() */
    340341
    341342
     
    353354int
    354355ParseDateTime(char *timestr, char *lowstr,
    355                           char **field, int *ftype, int maxfields, int *numfields)
     356              char **field, int *ftype, int maxfields, int *numfields)
    356357{
    357         int                     nf = 0;
    358         char       *cp = timestr;
    359         char       *lp = lowstr;
    360 
    361 #ifdef DATEDEBUG
    362         printf("ParseDateTime- input string is %s\n", timestr);
    363 #endif
    364         /* outer loop through fields */
    365         while (*cp != '\0')
    366         {
    367                 field[nf] = lp;
    368 
    369                 /* leading digit? then date or time */
    370                 if (isdigit(*cp) || (*cp == '.'))
    371                 {
    372                         *lp++ = *cp++;
    373                         while (isdigit(*cp))
    374                                 *lp++ = *cp++;
    375                         /* time field? */
    376                         if (*cp == ':')
    377                         {
    378                                 ftype[nf] = DTK_TIME;
    379                                 while (isdigit(*cp) || (*cp == ':') || (*cp == '.'))
    380                                         *lp++ = *cp++;
    381 
    382                         }
    383                         /* date field? allow embedded text month */
    384                         else if ((*cp == '-') || (*cp == '/') || (*cp == '.'))
    385                         {
    386                                 ftype[nf] = DTK_DATE;
    387                                 while (isalnum(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.'))
    388                                         *lp++ = tolower(*cp++);
    389 
    390                         }
    391 
    392                         /*
    393                         * otherwise, number only and will determine year, month, or
    394                         * day later
    395                         */
    396                         else
    397                                 ftype[nf] = DTK_NUMBER;
    398 
    399                 }
    400 
    401                 /*
    402                 * text? then date string, month, day of week, special, or
    403                 * timezone
    404                 */
    405                 else if (isalpha(*cp))
    406                 {
    407                         ftype[nf] = DTK_STRING;
    408                         *lp++ = tolower(*cp++);
    409                         while (isalpha(*cp))
    410                                 *lp++ = tolower(*cp++);
    411 
    412                         /* full date string with leading text month? */
    413                         if ((*cp == '-') || (*cp == '/') || (*cp == '.'))
    414                         {
    415                                 ftype[nf] = DTK_DATE;
    416                                 while (isdigit(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.'))
    417                                         *lp++ = tolower(*cp++);
    418                         }
    419 
    420                         /* skip leading spaces */
    421                 }
    422                 else if (isspace(*cp))
    423                 {
    424                         cp++;
    425                         continue;
    426 
    427                         /* sign? then special or numeric timezone */
    428                 }
    429                 else if ((*cp == '+') || (*cp == '-'))
    430                 {
    431                         *lp++ = *cp++;
    432                         /* soak up leading whitespace */
    433                         while (isspace(*cp))
    434                                 cp++;
    435                         /* numeric timezone? */
    436                         if (isdigit(*cp))
    437                         {
    438                                 ftype[nf] = DTK_TZ;
    439                                 *lp++ = *cp++;
    440                                 while (isdigit(*cp) || (*cp == ':'))
    441                                         *lp++ = *cp++;
    442 
    443                                 /* special? */
    444                         }
    445                         else if (isalpha(*cp))
    446                         {
    447                                 ftype[nf] = DTK_SPECIAL;
    448                                 *lp++ = tolower(*cp++);
    449                                 while (isalpha(*cp))
    450                                         *lp++ = tolower(*cp++);
    451 
    452                                 /* otherwise something wrong... */
    453                         }
    454                         else
    455                                 return -1;
    456 
    457                         /* ignore punctuation but use as delimiter */
    458                 }
    459                 else if (ispunct(*cp))
    460                 {
    461                         cp++;
    462                         continue;
    463 
    464                 }
    465                 else
    466                         return -1;
    467 
    468                 /* force in a delimiter */
    469                 *lp++ = '\0';
    470                 nf++;
    471                 if (nf > MAXDATEFIELDS)
    472                         return -1;
    473 #ifdef DATEDEBUG
    474                 printf("ParseDateTime- set field[%d] to %s type %d\n", (nf - 1), field[nf - 1], ftype[nf - 1]);
    475 #endif
    476         }
    477 
    478         *numfields = nf;
    479 
    480         return 0;
    481 }       /* ParseDateTime() */
     358    int         nf = 0;
     359    char       *cp = timestr;
     360    char       *lp = lowstr;
     361
     362#ifdef DATEDEBUG
     363    printf("ParseDateTime- input string is %s\n", timestr);
     364#endif
     365    /* outer loop through fields */
     366    while (*cp != '\0')
     367    {
     368        field[nf] = lp;
     369
     370        /* leading digit? then date or time */
     371        if (isdigit(*cp) || (*cp == '.'))
     372        {
     373            *lp++ = *cp++;
     374            while (isdigit(*cp))
     375                *lp++ = *cp++;
     376            /* time field? */
     377            if (*cp == ':')
     378            {
     379                ftype[nf] = DTK_TIME;
     380                while (isdigit(*cp) || (*cp == ':') || (*cp == '.'))
     381                    *lp++ = *cp++;
     382
     383            }
     384            /* date field? allow embedded text month */
     385            else if ((*cp == '-') || (*cp == '/') || (*cp == '.'))
     386            {
     387                ftype[nf] = DTK_DATE;
     388                while (isalnum(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.'))
     389                    *lp++ = tolower(*cp++);
     390
     391            }
     392
     393            /*
     394            * otherwise, number only and will determine year, month, or
     395            * day later
     396            */
     397            else
     398                ftype[nf] = DTK_NUMBER;
     399
     400        }
     401
     402        /*
     403        * text? then date string, month, day of week, special, or
     404        * timezone
     405        */
     406        else if (isalpha(*cp))
     407        {
     408            ftype[nf] = DTK_STRING;
     409            *lp++ = tolower(*cp++);
     410            while (isalpha(*cp))
     411                *lp++ = tolower(*cp++);
     412
     413            /* full date string with leading text month? */
     414            if ((*cp == '-') || (*cp == '/') || (*cp == '.'))
     415            {
     416                ftype[nf] = DTK_DATE;
     417                while (isdigit(*cp) || (*cp == '-') || (*cp == '/') || (*cp == '.'))
     418                    *lp++ = tolower(*cp++);
     419            }
     420
     421            /* skip leading spaces */
     422        }
     423        else if (isspace(*cp))
     424        {
     425            cp++;
     426            continue;
     427
     428            /* sign? then special or numeric timezone */
     429        }
     430        else if ((*cp == '+') || (*cp == '-'))
     431        {
     432            *lp++ = *cp++;
     433            /* soak up leading whitespace */
     434            while (isspace(*cp))
     435                cp++;
     436            /* numeric timezone? */
     437            if (isdigit(*cp))
     438            {
     439                ftype[nf] = DTK_TZ;
     440                *lp++ = *cp++;
     441                while (isdigit(*cp) || (*cp == ':'))
     442                    *lp++ = *cp++;
     443
     444                /* special? */
     445            }
     446            else if (isalpha(*cp))
     447            {
     448                ftype[nf] = DTK_SPECIAL;
     449                *lp++ = tolower(*cp++);
     450                while (isalpha(*cp))
     451                    *lp++ = tolower(*cp++);
     452
     453                /* otherwise something wrong... */
     454            }
     455            else
     456                return -1;
     457
     458            /* ignore punctuation but use as delimiter */
     459        }
     460        else if (ispunct(*cp))
     461        {
     462            cp++;
     463            continue;
     464
     465        }
     466        else
     467            return -1;
     468
     469        /* force in a delimiter */
     470        *lp++ = '\0';
     471        nf++;
     472        if (nf > MAXDATEFIELDS)
     473            return -1;
     474#ifdef DATEDEBUG
     475        printf("ParseDateTime- set field[%d] to %s type %d\n", (nf - 1), field[nf - 1], ftype[nf - 1]);
     476#endif
     477    }
     478
     479    *numfields = nf;
     480
     481    return 0;
     482}   /* ParseDateTime() */
    482483
    483484
     
    485486 * Interpret previously parsed fields for general date and time.
    486487 * Return 0 if full date, 1 if only time, and -1 if problems.
    487  *              External format(s):
    488  *                              "<weekday> <month>-<day>-<year> <hour>:<minute>:<second>"
    489  *                              "Fri Feb-7-1997 15:23:27"
    490  *                              "Feb-7-1997 15:23:27"
    491  *                              "2-7-1997 15:23:27"
    492  *                              "1997-2-7 15:23:27"
    493  *                              "1997.038 15:23:27"             (day of year 1-366)
    494  *              Also supports input in compact time:
    495  *                              "970207 152327"
    496  *                              "97038 152327"
     488 *      External format(s):
     489 *              "<weekday> <month>-<day>-<year> <hour>:<minute>:<second>"
     490 *              "Fri Feb-7-1997 15:23:27"
     491 *              "Feb-7-1997 15:23:27"
     492 *              "2-7-1997 15:23:27"
     493 *              "1997-2-7 15:23:27"
     494 *              "1997.038 15:23:27"     (day of year 1-366)
     495 *      Also supports input in compact time:
     496 *              "970207 152327"
     497 *              "97038 152327"
    497498 *
    498499 * Use the system-provided functions to get the current time zone
    499  *      if not specified in the input string.
     500 *  if not specified in the input string.
    500501 * If the date is outside the time_t system-supported time range,
    501  *      then assume GMT time zone. - tgl 97/05/27
     502 *  then assume GMT time zone. - tgl 97/05/27
    502503 */
    503504int
    504505DecodeDateTime(char **field, int *ftype, int nf,
    505                            int *dtype, struct tm * tm, double *fsec, int *tzp)
     506               int *dtype, struct tm * tm, double *fsec, int *tzp)
    506507{
    507         int                     fmask = 0,
    508                                 tmask,
    509                                 type;
    510         int                     i;
    511         int                     flen,
    512                                 val;
    513         int                     mer = HR24;
    514         int                     bc = FALSE;
    515 
    516         *dtype = DTK_DATE;
    517         tm->tm_hour = 0;
    518         tm->tm_min = 0;
    519         tm->tm_sec = 0;
    520         *fsec = 0;
    521         tm->tm_isdst = -1;                      /* don't know daylight savings time status
    522                                                                 * apriori */
    523         if (tzp != NULL)
    524                 *tzp = 0;
    525 
    526         for (i = 0; i < nf; i++)
    527         {
    528 #ifdef DATEDEBUG
    529                 printf("DecodeDateTime- field[%d] is %s (type %d)\n", i, field[i], ftype[i]);
    530 #endif
    531                 switch (ftype[i])
    532                 {
    533                         case DTK_DATE:
    534                                 if (DecodeDate(field[i], fmask, &tmask, tm) != 0)
    535                                         return -1;
    536                                 break;
    537 
    538                         case DTK_TIME:
    539                                 if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0)
    540                                         return -1;
    541 
    542                                 /*
    543                                 * check upper limit on hours; other limits checked in
    544                                 * DecodeTime()
    545                                 */
    546                                 if (tm->tm_hour > 23)
    547                                         return -1;
    548                                 break;
    549 
    550                         case DTK_TZ:
    551                                 if (tzp == NULL)
    552                                         return -1;
    553                                 if (DecodeTimezone(field[i], tzp) != 0)
    554                                         return -1;
    555                                 tmask = DTK_M(TZ);
    556                                 break;
    557 
    558                         case DTK_NUMBER:
    559                                 flen = strlen(field[i]);
    560 
    561                                 if (flen > 4)
    562                                 {
    563                                         if (DecodeNumberField(flen, field[i], fmask, &tmask, tm, fsec) != 0)
    564                                                 return -1;
    565 
    566                                 }
    567                                 else
    568                                 {
    569                                         if (DecodeNumber(flen, field[i], fmask, &tmask, tm, fsec) != 0)
    570                                                 return -1;
    571                                 }
    572                                 break;
    573 
    574                         case DTK_STRING:
    575                         case DTK_SPECIAL:
    576                                 type = DecodeSpecial(i, field[i], &val);
    577 #ifdef DATEDEBUG
    578                                 printf("DecodeDateTime- special field[%d] %s type=%d value=%d\n", i, field[i], type, val);
    579 #endif
    580                                 if (type == IGNOREFIELD)
    581                                         continue;
    582 
    583                                 tmask = DTK_M(type);
    584                                 switch (type)
    585                                 {
    586                                         case RESERV:
    587 #ifdef DATEDEBUG
    588                                                 printf("DecodeDateTime- RESERV field %s value is %d\n", field[i], val);
    589 #endif
    590                                                 switch (val)
    591                                                 {
    592 
    593                                                         default:
    594                                                                 *dtype = val;
    595                                                 }
    596 
    597                                                 break;
    598 
    599                                         case MONTH:
    600 #ifdef DATEDEBUG
    601                                                 printf("DecodeDateTime- month field %s value is %d\n", field[i], val);
    602 #endif
    603                                                 tm->tm_mon = val;
    604                                                 break;
    605 
    606                                                 /*
    607                                                 * daylight savings time modifier (solves "MET
    608                                                 * DST" syntax)
    609                                                 */
    610                                         case DTZMOD:
    611                                                 tmask |= DTK_M(DTZ);
    612                                                 tm->tm_isdst = 1;
    613                                                 if (tzp == NULL)
    614                                                         return -1;
    615                                                 *tzp += val * 60;
    616                                                 break;
    617 
    618                                         case DTZ:
    619 
    620                                                 /*
    621                                                 * set mask for TZ here _or_ check for DTZ later
    622                                                 * when getting default timezone
    623                                                 */
    624                                                 tmask |= DTK_M(TZ);
    625                                                 tm->tm_isdst = 1;
    626                                                 if (tzp == NULL)
    627                                                         return -1;
    628                                                 *tzp = val * 60;
    629                                                 break;
    630 
    631                                         case TZ:
    632                                                 tm->tm_isdst = 0;
    633                                                 if (tzp == NULL)
    634                                                         return -1;
    635                                                 *tzp = val * 60;
    636                                                 break;
    637 
    638                                         case IGNOREFIELD:
    639                                                 break;
    640 
    641                                         case AMPM:
    642                                                 mer = val;
    643                                                 break;
    644 
    645                                         case ADBC:
    646                                                 bc = (val == BC);
    647                                                 break;
    648 
    649                                         case DOW:
    650                                                 tm->tm_wday = val;
    651                                                 break;
    652 
    653                                         default:
    654                                                 return -1;
    655                                 }
    656                                 break;
    657 
    658                         default:
    659                                 return -1;
    660                 }
    661 
    662 #ifdef DATEDEBUG
    663                 printf("DecodeDateTime- field[%d] %s (%08x/%08x) value is %d\n",
    664                            i, field[i], fmask, tmask, val);
    665 #endif
    666 
    667                 if (tmask & fmask)
    668                         return -1;
    669                 fmask |= tmask;
    670         }
    671 
    672         /* there is no year zero in AD/BC notation; i.e. "1 BC" == year 0 */
    673         if (bc)
    674                 tm->tm_year = -(tm->tm_year - 1);
    675 
    676         if ((mer != HR24) && (tm->tm_hour > 12))
    677                 return -1;
    678         if ((mer == AM) && (tm->tm_hour == 12))
    679                 tm->tm_hour = 0;
    680         else if ((mer == PM) && (tm->tm_hour != 12))
    681                 tm->tm_hour += 12;
    682 
    683 #ifdef DATEDEBUG
    684         printf("DecodeDateTime- mask %08x (%08x)", fmask, DTK_DATE_M);
    685         printf(" set y%04d m%02d d%02d", tm->tm_year, tm->tm_mon, tm->tm_mday);
    686         printf(" %02d:%02d:%02d\n", tm->tm_hour, tm->tm_min, tm->tm_sec);
    687 #endif
    688 
    689         if ((*dtype == DTK_DATE) && ((fmask & DTK_DATE_M) != DTK_DATE_M))
    690                 return ((fmask & DTK_TIME_M) == DTK_TIME_M) ? 1 : -1;
    691 
    692         /* timezone not specified? then find local timezone if possible */
    693         if ((*dtype == DTK_DATE) && ((fmask & DTK_DATE_M) == DTK_DATE_M)
    694                 && (tzp != NULL) && (!(fmask & DTK_M(TZ))))
    695         {
    696 
    697                 /*
    698                 * daylight savings time modifier but no standard timezone? then
    699                 * error
    700                 */
    701                 if (fmask & DTK_M(DTZMOD))
    702                         return -1;
    703 
    704                 if (IS_VALID_UTIME(tm->tm_year, tm->tm_mon, tm->tm_mday))
    705                 {
     508    int         fmask = 0,
     509                tmask,
     510                type;
     511    int         i;
     512    int         flen,
     513                val;
     514    int         mer = HR24;
     515    int         bc = FALSE;
     516
     517    *dtype = DTK_DATE;
     518    tm->tm_hour = 0;
     519    tm->tm_min = 0;
     520    tm->tm_sec = 0;
     521    *fsec = 0;
     522    tm->tm_isdst = -1;          /* don't know daylight savings time status
     523                                * apriori */
     524    if (tzp != NULL)
     525        *tzp = 0;
     526
     527    for (i = 0; i < nf; i++)
     528    {
     529#ifdef DATEDEBUG
     530        printf("DecodeDateTime- field[%d] is %s (type %d)\n", i, field[i], ftype[i]);
     531#endif
     532        switch (ftype[i])
     533        {
     534            case DTK_DATE:
     535                if (DecodeDate(field[i], fmask, &tmask, tm) != 0)
     536                    return -1;
     537                break;
     538
     539            case DTK_TIME:
     540                if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0)
     541                    return -1;
     542
     543                /*
     544                * check upper limit on hours; other limits checked in
     545                * DecodeTime()
     546                */
     547                if (tm->tm_hour > 23)
     548                    return -1;
     549                break;
     550
     551            case DTK_TZ:
     552                if (tzp == NULL)
     553                    return -1;
     554                if (DecodeTimezone(field[i], tzp) != 0)
     555                    return -1;
     556                tmask = DTK_M(TZ);
     557                break;
     558
     559            case DTK_NUMBER:
     560                flen = strlen(field[i]);
     561
     562                if (flen > 4)
     563                {
     564                    if (DecodeNumberField(flen, field[i], fmask, &tmask, tm, fsec) != 0)
     565                        return -1;
     566
     567                }
     568                else
     569                {
     570                    if (DecodeNumber(flen, field[i], fmask, &tmask, tm, fsec) != 0)
     571                        return -1;
     572                }
     573                break;
     574
     575            case DTK_STRING:
     576            case DTK_SPECIAL:
     577                type = DecodeSpecial(i, field[i], &val);
     578#ifdef DATEDEBUG
     579                printf("DecodeDateTime- special field[%d] %s type=%d value=%d\n", i, field[i], type, val);
     580#endif
     581                if (type == IGNOREFIELD)
     582                    continue;
     583
     584                tmask = DTK_M(type);
     585                switch (type)
     586                {
     587                    case RESERV:
     588#ifdef DATEDEBUG
     589                        printf("DecodeDateTime- RESERV field %s value is %d\n", field[i], val);
     590#endif
     591                        switch (val)
     592                        {
     593
     594                            default:
     595                                *dtype = val;
     596                        }
     597
     598                        break;
     599
     600                    case MONTH:
     601#ifdef DATEDEBUG
     602                        printf("DecodeDateTime- month field %s value is %d\n", field[i], val);
     603#endif
     604                        tm->tm_mon = val;
     605                        break;
     606
     607                        /*
     608                        * daylight savings time modifier (solves "MET
     609                        * DST" syntax)
     610                        */
     611                    case DTZMOD:
     612                        tmask |= DTK_M(DTZ);
     613                        tm->tm_isdst = 1;
     614                        if (tzp == NULL)
     615                            return -1;
     616                        *tzp += val * 60;
     617                        break;
     618
     619                    case DTZ:
     620
     621                        /*
     622                        * set mask for TZ here _or_ check for DTZ later
     623                        * when getting default timezone
     624                        */
     625                        tmask |= DTK_M(TZ);
     626                        tm->tm_isdst = 1;
     627                        if (tzp == NULL)
     628                            return -1;
     629                        *tzp = val * 60;
     630                        break;
     631
     632                    case TZ:
     633                        tm->tm_isdst = 0;
     634                        if (tzp == NULL)
     635                            return -1;
     636                        *tzp = val * 60;
     637                        break;
     638
     639                    case IGNOREFIELD:
     640                        break;
     641
     642                    case AMPM:
     643                        mer = val;
     644                        break;
     645
     646                    case ADBC:
     647                        bc = (val == BC);
     648                        break;
     649
     650                    case DOW:
     651                        tm->tm_wday = val;
     652                        break;
     653
     654                    default:
     655                        return -1;
     656                }
     657                break;
     658
     659            default:
     660                return -1;
     661        }
     662
     663#ifdef DATEDEBUG
     664        printf("DecodeDateTime- field[%d] %s (%08x/%08x) value is %d\n",
     665               i, field[i], fmask, tmask, val);
     666#endif
     667
     668        if (tmask & fmask)
     669            return -1;
     670        fmask |= tmask;
     671    }
     672
     673    /* there is no year zero in AD/BC notation; i.e. "1 BC" == year 0 */
     674    if (bc)
     675        tm->tm_year = -(tm->tm_year - 1);
     676
     677    if ((mer != HR24) && (tm->tm_hour > 12))
     678        return -1;
     679    if ((mer == AM) && (tm->tm_hour == 12))
     680        tm->tm_hour = 0;
     681    else if ((mer == PM) && (tm->tm_hour != 12))
     682        tm->tm_hour += 12;
     683
     684#ifdef DATEDEBUG
     685    printf("DecodeDateTime- mask %08x (%08x)", fmask, DTK_DATE_M);
     686    printf(" set y%04d m%02d d%02d", tm->tm_year, tm->tm_mon, tm->tm_mday);
     687    printf(" %02d:%02d:%02d\n", tm->tm_hour, tm->tm_min, tm->tm_sec);
     688#endif
     689
     690    if ((*dtype == DTK_DATE) && ((fmask & DTK_DATE_M) != DTK_DATE_M))
     691        return ((fmask & DTK_TIME_M) == DTK_TIME_M) ? 1 : -1;
     692
     693    /* timezone not specified? then find local timezone if possible */
     694    if ((*dtype == DTK_DATE) && ((fmask & DTK_DATE_M) == DTK_DATE_M)
     695        && (tzp != NULL) && (!(fmask & DTK_M(TZ))))
     696    {
     697
     698        /*
     699        * daylight savings time modifier but no standard timezone? then
     700        * error
     701        */
     702        if (fmask & DTK_M(DTZMOD))
     703            return -1;
     704
     705        if (IS_VALID_UTIME(tm->tm_year, tm->tm_mon, tm->tm_mday))
     706        {
    706707#ifdef USE_POSIX_TIME
    707                         tm->tm_year -= 1900;
    708                         tm->tm_mon -= 1;
    709                         tm->tm_isdst = -1;
    710                         mktime(tm);
    711                         tm->tm_year += 1900;
    712                         tm->tm_mon += 1;
     708            tm->tm_year -= 1900;
     709            tm->tm_mon -= 1;
     710            tm->tm_isdst = -1;
     711            mktime(tm);
     712            tm->tm_year += 1900;
     713            tm->tm_mon += 1;
    713714
    714715#ifdef HAVE_INT_TIMEZONE
    715                         *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
    716 
    717 #else                                                   /* !HAVE_INT_TIMEZONE */
    718                         *tzp = -(tm->tm_gmtoff);        /* tm_gmtoff is Sun/DEC-ism */
    719 #endif
    720 
    721 #else                                                   /* !USE_POSIX_TIME */
    722                         *tzp = CTimeZone;
    723 #endif
    724                 }
    725                 else
    726                 {
    727                         tm->tm_isdst = 0;
    728                         *tzp = 0;
    729                 }
    730         }
    731 
    732         return 0;
    733 }       /* DecodeDateTime() */
     716            *tzp = ((tm->tm_isdst > 0) ? (timezone - 3600) : timezone);
     717
     718#else                           /* !HAVE_INT_TIMEZONE */
     719            *tzp = -(tm->tm_gmtoff);    /* tm_gmtoff is Sun/DEC-ism */
     720#endif
     721
     722#else                           /* !USE_POSIX_TIME */
     723            *tzp = CTimeZone;
     724#endif
     725        }
     726        else
     727        {
     728            tm->tm_isdst = 0;
     729            *tzp = 0;
     730        }
     731    }
     732
     733    return 0;
     734}   /* DecodeDateTime() */
    734735
    735736
     
    740741DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct tm * tm, double *fsec)
    741742{
    742         int                     fmask,
    743                                 tmask,
    744                                 type;
    745         int                     i;
    746         int                     flen,
    747                                 val;
    748         int                     mer = HR24;
    749 
    750         *dtype = DTK_TIME;
    751         tm->tm_hour = 0;
    752         tm->tm_min = 0;
    753         tm->tm_sec = 0;
    754         tm->tm_isdst = -1;                      /* don't know daylight savings time status
    755                                                                 * apriori */
    756         *fsec = 0;
    757 
    758         fmask = DTK_DATE_M;
    759 
    760         for (i = 0; i < nf; i++)
    761         {
    762 #ifdef DATEDEBUG
    763                 printf("DecodeTimeOnly- field[%d] is %s (type %d)\n", i, field[i], ftype[i]);
    764 #endif
    765                 switch (ftype[i])
    766                 {
    767                         case DTK_TIME:
    768                                 if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0)
    769                                         return -1;
    770                                 break;
    771 
    772                         case DTK_NUMBER:
    773                                 flen = strlen(field[i]);
    774 
    775                                 if (DecodeNumberField(flen, field[i], fmask, &tmask, tm, fsec) != 0)
    776                                         return -1;
    777                                 break;
    778 
    779                         case DTK_STRING:
    780                         case DTK_SPECIAL:
    781                                 type = DecodeSpecial(i, field[i], &val);
    782 #ifdef DATEDEBUG
    783                                 printf("DecodeTimeOnly- special field[%d] %s type=%d value=%d\n", i, field[i], type, val);
    784 #endif
    785                                 if (type == IGNOREFIELD)
    786                                         continue;
    787 
    788                                 tmask = DTK_M(type);
    789                                 switch (type)
    790                                 {
    791                                         case RESERV:
    792 #ifdef DATEDEBUG
    793                                                 printf("DecodeTimeOnly- RESERV field %s value is %d\n", field[i], val);
    794 #endif
    795                                                 switch (val)
    796                                                 {
    797 
    798                                                         default:
    799                                                                 return -1;
    800                                                 }
    801 
    802                                                 break;
    803 
    804                                         case IGNOREFIELD:
    805                                                 break;
    806 
    807                                         case AMPM:
    808                                                 mer = val;
    809                                                 break;
    810 
    811                                         default:
    812                                                 return -1;
    813                                 }
    814                                 break;
    815 
    816                         default:
    817                                 return -1;
    818                 }
    819 
    820                 if (tmask & fmask)
    821                         return -1;
    822                 fmask |= tmask;
    823 
    824 #ifdef DATEDEBUG
    825                 printf("DecodeTimeOnly- field[%d] %s value is %d\n", i, field[i], val);
    826 #endif
    827         }
    828 
    829 #ifdef DATEDEBUG
    830         printf("DecodeTimeOnly- mask %08x (%08x)", fmask, DTK_TIME_M);
    831         printf(" %02d:%02d:%02d (%f)\n", tm->tm_hour, tm->tm_min, tm->tm_sec, *fsec);
    832 #endif
    833 
    834         if ((mer != HR24) && (tm->tm_hour > 12))
    835                 return -1;
    836         if ((mer == AM) && (tm->tm_hour == 12))
    837                 tm->tm_hour = 0;
    838         else if ((mer == PM) && (tm->tm_hour != 12))
    839                 tm->tm_hour += 12;
    840 
    841         if ((fmask & DTK_TIME_M) != DTK_TIME_M)
    842                 return -1;
    843 
    844         return 0;
    845 }       /* DecodeTimeOnly() */
     743    int         fmask,
     744                tmask,
     745                type;
     746    int         i;
     747    int         flen,
     748                val;
     749    int         mer = HR24;
     750
     751    *dtype = DTK_TIME;
     752    tm->tm_hour = 0;
     753    tm->tm_min = 0;
     754    tm->tm_sec = 0;
     755    tm->tm_isdst = -1;          /* don't know daylight savings time status
     756                                * apriori */
     757    *fsec = 0;
     758
     759    fmask = DTK_DATE_M;
     760
     761    for (i = 0; i < nf; i++)
     762    {
     763#ifdef DATEDEBUG
     764        printf("DecodeTimeOnly- field[%d] is %s (type %d)\n", i, field[i], ftype[i]);
     765#endif
     766        switch (ftype[i])
     767        {
     768            case DTK_TIME:
     769                if (DecodeTime(field[i], fmask, &tmask, tm, fsec) != 0)
     770                    return -1;
     771                break;
     772
     773            case DTK_NUMBER:
     774                flen = strlen(field[i]);
     775
     776                if (DecodeNumberField(flen, field[i], fmask, &tmask, tm, fsec) != 0)
     777                    return -1;
     778                break;
     779
     780            case DTK_STRING:
     781            case DTK_SPECIAL:
     782                type = DecodeSpecial(i, field[i], &val);
     783#ifdef DATEDEBUG
     784                printf("DecodeTimeOnly- special field[%d] %s type=%d value=%d\n", i, field[i], type, val);
     785#endif
     786                if (type == IGNOREFIELD)
     787                    continue;
     788
     789                tmask = DTK_M(type);
     790                switch (type)
     791                {
     792                    case RESERV:
     793#ifdef DATEDEBUG
     794                        printf("DecodeTimeOnly- RESERV field %s value is %d\n", field[i], val);
     795#endif
     796                        switch (val)
     797                        {
     798
     799                            default:
     800                                return -1;
     801                        }
     802
     803                        break;
     804
     805                    case IGNOREFIELD:
     806                        break;
     807
     808                    case AMPM:
     809                        mer = val;
     810                        break;
     811
     812                    default:
     813                        return -1;
     814                }
     815                break;
     816
     817            default:
     818                return -1;
     819        }
     820
     821        if (tmask & fmask)
     822            return -1;
     823        fmask |= tmask;
     824
     825#ifdef DATEDEBUG
     826        printf("DecodeTimeOnly- field[%d] %s value is %d\n", i, field[i], val);
     827#endif
     828    }
     829
     830#ifdef DATEDEBUG
     831    printf("DecodeTimeOnly- mask %08x (%08x)", fmask, DTK_TIME_M);
     832    printf(" %02d:%02d:%02d (%f)\n", tm->tm_hour, tm->tm_min, tm->tm_sec, *fsec);
     833#endif
     834
     835    if ((mer != HR24) && (tm->tm_hour > 12))
     836        return -1;
     837    if ((mer == AM) && (tm->tm_hour == 12))
     838        tm->tm_hour = 0;
     839    else if ((mer == PM) && (tm->tm_hour != 12))
     840        tm->tm_hour += 12;
     841
     842    if ((fmask & DTK_TIME_M) != DTK_TIME_M)
     843        return -1;
     844
     845    return 0;
     846}   /* DecodeTimeOnly() */
    846847
    847848
     
    853854DecodeDate(char *str, int fmask, int *tmask, struct tm * tm)
    854855{
    855         double          fsec;
    856 
    857         int                     nf = 0;
    858         int                     i,
    859                                 len;
    860         int                     type,
    861                                 val,
    862                                 dmask = 0;
    863         char       *field[MAXDATEFIELDS];
    864 
    865         /* parse this string... */
    866         while ((*str != '\0') && (nf < MAXDATEFIELDS))
    867         {
    868                 /* skip field separators */
    869                 while (!isalnum(*str))
    870                         str++;
    871 
    872                 field[nf] = str;
    873                 if (isdigit(*str))
    874                 {
    875                         while (isdigit(*str))
    876                                 str++;
    877                 }
    878                 else if (isalpha(*str))
    879                 {
    880                         while (isalpha(*str))
    881                                 str++;
    882                 }
    883 
    884                 if (*str != '\0')
    885                         *str++ = '\0';
    886                 nf++;
    887         }
    888 
    889         /* don't allow too many fields */
    890         if (nf > 3)
    891                 return -1;
    892 
    893         *tmask = 0;
    894 
    895         /* look first for text fields, since that will be unambiguous month */
    896         for (i = 0; i < nf; i++)
    897         {
    898                 if (isalpha(*field[i]))
    899                 {
    900                         type = DecodeSpecial(i, field[i], &val);
    901                         if (type == IGNOREFIELD)
    902                                 continue;
    903 
    904                         dmask = DTK_M(type);
    905                         switch (type)
    906                         {
    907                                 case MONTH:
    908 #ifdef DATEDEBUG
    909                                         printf("DecodeDate- month field %s value is %d\n", field[i], val);
    910 #endif
    911                                         tm->tm_mon = val;
    912                                         break;
    913 
    914                                 default:
    915 #ifdef DATEDEBUG
    916                                         printf("DecodeDate- illegal field %s value is %d\n", field[i], val);
    917 #endif
    918                                         return -1;
    919                         }
    920                         if (fmask & dmask)
    921                                 return -1;
    922 
    923                         fmask |= dmask;
    924                         *tmask |= dmask;
    925 
    926                         /* mark this field as being completed */
    927                         field[i] = NULL;
    928                 }
    929         }
    930 
    931         /* now pick up remaining numeric fields */
    932         for (i = 0; i < nf; i++)
    933         {
    934                 if (field[i] == NULL)
    935                         continue;
    936 
    937                 if ((len = strlen(field[i])) <= 0)
    938                         return -1;
    939 
    940                 if (DecodeNumber(len, field[i], fmask, &dmask, tm, &fsec) != 0)
    941                         return -1;
    942 
    943                 if (fmask & dmask)
    944                         return -1;
    945 
    946                 fmask |= dmask;
    947                 *tmask |= dmask;
    948         }
    949 
    950         return 0;
    951 }       /* DecodeDate() */
     856    double      fsec;
     857
     858    int         nf = 0;
     859    int         i,
     860                len;
     861    int         type,
     862                val,
     863                dmask = 0;
     864    char       *field[MAXDATEFIELDS];
     865
     866    /* parse this string... */
     867    while ((*str != '\0') && (nf < MAXDATEFIELDS))
     868    {
     869        /* skip field separators */
     870        while (!isalnum(*str))
     871            str++;
     872
     873        field[nf] = str;
     874        if (isdigit(*str))
     875        {
     876            while (isdigit(*str))
     877                str++;
     878        }
     879        else if (isalpha(*str))
     880        {
     881            while (isalpha(*str))
     882                str++;
     883        }
     884
     885        if (*str != '\0')
     886            *str++ = '\0';
     887        nf++;
     888    }
     889
     890    /* don't allow too many fields */
     891    if (nf > 3)
     892        return -1;
     893
     894    *tmask = 0;
     895
     896    /* look first for text fields, since that will be unambiguous month */
     897    for (i = 0; i < nf; i++)
     898    {
     899        if (isalpha(*field[i]))
     900        {
     901            type = DecodeSpecial(i, field[i], &val);
     902            if (type == IGNOREFIELD)
     903                continue;
     904
     905            dmask = DTK_M(type);
     906            switch (type)
     907            {
     908                case MONTH:
     909#ifdef DATEDEBUG
     910                    printf("DecodeDate- month field %s value is %d\n", field[i], val);
     911#endif
     912                    tm->tm_mon = val;
     913                    break;
     914
     915                default:
     916#ifdef DATEDEBUG
     917                    printf("DecodeDate- illegal field %s value is %d\n", field[i], val);
     918#endif
     919                    return -1;
     920            }
     921            if (fmask & dmask)
     922                return -1;
     923
     924            fmask |= dmask;
     925            *tmask |= dmask;
     926
     927            /* mark this field as being completed */
     928            field[i] = NULL;
     929        }
     930    }
     931
     932    /* now pick up remaining numeric fields */
     933    for (i = 0; i < nf; i++)
     934    {
     935        if (field[i] == NULL)
     936            continue;
     937
     938        if ((len = strlen(field[i])) <= 0)
     939            return -1;
     940
     941        if (DecodeNumber(len, field[i], fmask, &dmask, tm, &fsec) != 0)
     942            return -1;
     943
     944        if (fmask & dmask)
     945            return -1;
     946
     947        fmask |= dmask;
     948        *tmask |= dmask;
     949    }
     950
     951    return 0;
     952}   /* DecodeDate() */
    952953
    953954
     
    955956 * Decode time string which includes delimiters.
    956957 * Only check the lower limit on hours, since this same code
    957  *      can be used to represent time spans.
     958 *  can be used to represent time spans.
    958959 */
    959960static int
    960961DecodeTime(char *str, int fmask, int *tmask, struct tm * tm, double *fsec)
    961962{
    962         char       *cp;
    963 
    964         *tmask = DTK_TIME_M;
    965 
    966         tm->tm_hour = strtol(str, &cp, 10);
    967         if (*cp != ':')
    968                 return -1;
    969         str = cp + 1;
    970         tm->tm_min = strtol(str, &cp, 10);
    971         if (*cp == '\0')
    972         {
    973                 tm->tm_sec = 0;
    974                 *fsec = 0;
    975 
    976         }
    977         else if (*cp != ':')
    978         {
    979                 return -1;
    980 
    981         }
    982         else
    983         {
    984                 str = cp + 1;
    985                 tm->tm_sec = strtol(str, &cp, 10);
    986                 if (*cp == '\0')
    987                         *fsec = 0;
    988                 else if (*cp == '.')
    989                 {
    990                         str = cp;
    991                         *fsec = strtod(str, &cp);
    992                         if (cp == str)
    993                                 return -1;
    994                 }
    995                 else
    996                         return -1;
    997         }
    998 
    999         /* do a sanity check */
    1000         if ((tm->tm_hour < 0)
    1001                 || (tm->tm_min < 0) || (tm->tm_min > 59)
    1002                 || (tm->tm_sec < 0) || (tm->tm_sec > 59))
    1003                 return -1;
    1004 
    1005         return 0;
    1006 }       /* DecodeTime() */
     963    char       *cp;
     964
     965    *tmask = DTK_TIME_M;
     966
     967    tm->tm_hour = strtol(str, &cp, 10);
     968    if (*cp != ':')
     969        return -1;
     970    str = cp + 1;
     971    tm->tm_min = strtol(str, &cp, 10);
     972    if (*cp == '\0')
     973    {
     974        tm->tm_sec = 0;
     975        *fsec = 0;
     976
     977    }
     978    else if (*cp != ':')
     979    {
     980        return -1;
     981
     982    }
     983    else
     984    {
     985        str = cp + 1;
     986        tm->tm_sec = strtol(str, &cp, 10);
     987        if (*cp == '\0')
     988            *fsec = 0;
     989        else if (*cp == '.')
     990        {
     991            str = cp;
     992            *fsec = strtod(str, &cp);
     993            if (cp == str)
     994                return -1;
     995        }
     996        else
     997            return -1;
     998    }
     999
     1000    /* do a sanity check */
     1001    if ((tm->tm_hour < 0)
     1002        || (tm->tm_min < 0) || (tm->tm_min > 59)
     1003        || (tm->tm_sec < 0) || (tm->tm_sec > 59))
     1004        return -1;
     1005
     1006    return 0;
     1007}   /* DecodeTime() */
    10071008
    10081009
     
    10131014DecodeNumber(int flen, char *str, int fmask, int *tmask, struct tm * tm, double *fsec)
    10141015{
    1015         int                     val;
    1016         char       *cp;
    1017 
    1018         *tmask = 0;
    1019 
    1020         val = strtol(str, &cp, 10);
    1021         if (cp == str)
    1022                 return -1;
    1023         if (*cp == '.')
    1024         {
    1025                 *fsec = strtod(cp, &cp);
    1026                 if (*cp != '\0')
    1027                         return -1;
    1028         }
    1029 
    1030 #ifdef DATEDEBUG
    1031         printf("DecodeNumber- %s is %d fmask=%08x tmask=%08x\n", str, val, fmask, *tmask);
    1032 #endif
    1033 
    1034         /* enough digits to be unequivocal year? */
    1035         if (flen == 4)
    1036         {
    1037 #ifdef DATEDEBUG
    1038                 printf("DecodeNumber- match %d (%s) as year\n", val, str);
    1039 #endif
    1040                 *tmask = DTK_M(YEAR);
    1041 
    1042                 /* already have a year? then see if we can substitute... */
    1043                 if (fmask & DTK_M(YEAR))
    1044                 {
    1045                         if ((!(fmask & DTK_M(DAY)))
    1046                                 && ((tm->tm_year >= 1) && (tm->tm_year <= 31)))
    1047                         {
    1048 #ifdef DATEDEBUG
    1049                                 printf("DecodeNumber- misidentified year previously; swap with day %d\n", tm->tm_mday);
    1050 #endif
    1051                                 tm->tm_mday = tm->tm_year;
    1052                                 *tmask = DTK_M(DAY);
    1053                         }
    1054                 }
    1055 
    1056                 tm->tm_year = val;
    1057 
    1058                 /* special case day of year? */
    1059         }
    1060         else if ((flen == 3) && (fmask & DTK_M(YEAR))
    1061                         && ((val >= 1) && (val <= 366)))
    1062         {
    1063                 *tmask = (DTK_M(DOY) | DTK_M(MONTH) | DTK_M(DAY));
    1064                 tm->tm_yday = val;
    1065                 j2date((date2j(tm->tm_year, 1, 1) + tm->tm_yday - 1),
    1066                            &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
    1067 
    1068                 /* already have year? then could be month */
    1069         }
    1070         else if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(MONTH)))
    1071                         && ((val >= 1) && (val <= 12)))
    1072         {
    1073 #ifdef DATEDEBUG
    1074                 printf("DecodeNumber- match %d (%s) as month\n", val, str);
    1075 #endif
    1076                 *tmask = DTK_M(MONTH);
    1077                 tm->tm_mon = val;
    1078 
    1079                 /* no year and EuroDates enabled? then could be day */
    1080         }
    1081         else if ((EuroDates || (fmask & DTK_M(MONTH)))
    1082                         && (!(fmask & DTK_M(YEAR)) && !(fmask & DTK_M(DAY)))
    1083                         && ((val >= 1) && (val <= 31)))
    1084         {
    1085 #ifdef DATEDEBUG
    1086                 printf("DecodeNumber- match %d (%s) as day\n", val, str);
    1087 #endif
    1088                 *tmask = DTK_M(DAY);
    1089                 tm->tm_mday = val;
    1090 
    1091         }
    1092         else if ((!(fmask & DTK_M(MONTH)))
    1093                         && ((val >= 1) && (val <= 12)))
    1094         {
    1095 #ifdef DATEDEBUG
    1096                 printf("DecodeNumber- (2) match %d (%s) as month\n", val, str);
    1097 #endif
    1098                 *tmask = DTK_M(MONTH);
    1099                 tm->tm_mon = val;
    1100 
    1101         }
    1102         else if ((!(fmask & DTK_M(DAY)))
    1103                         && ((val >= 1) && (val <= 31)))
    1104         {
    1105 #ifdef DATEDEBUG
    1106                 printf("DecodeNumber- (2) match %d (%s) as day\n", val, str);
    1107 #endif
    1108                 *tmask = DTK_M(DAY);
    1109                 tm->tm_mday = val;
    1110 
    1111         }
    1112         else if (!(fmask & DTK_M(YEAR)))
    1113         {
    1114 #ifdef DATEDEBUG
    1115                 printf("DecodeNumber- (2) match %d (%s) as year\n", val, str);
    1116 #endif
    1117                 *tmask = DTK_M(YEAR);
    1118                 tm->tm_year = val;
    1119                 if (tm->tm_year < 70)
    1120                         tm->tm_year += 2000;
    1121                 else if (tm->tm_year < 100)
    1122                         tm->tm_year += 1900;
    1123 
    1124         }
    1125         else
    1126                 return -1;
    1127 
    1128         return 0;
    1129 }       /* DecodeNumber() */
     1016    int         val;
     1017    char       *cp;
     1018
     1019    *tmask = 0;
     1020
     1021    val = strtol(str, &cp, 10);
     1022    if (cp == str)
     1023        return -1;
     1024    if (*cp == '.')
     1025    {
     1026        *fsec = strtod(cp, &cp);
     1027        if (*cp != '\0')
     1028            return -1;
     1029    }
     1030
     1031#ifdef DATEDEBUG
     1032    printf("DecodeNumber- %s is %d fmask=%08x tmask=%08x\n", str, val, fmask, *tmask);
     1033#endif
     1034
     1035    /* enough digits to be unequivocal year? */
     1036    if (flen == 4)
     1037    {
     1038#ifdef DATEDEBUG
     1039        printf("DecodeNumber- match %d (%s) as year\n", val, str);
     1040#endif
     1041        *tmask = DTK_M(YEAR);
     1042
     1043        /* already have a year? then see if we can substitute... */
     1044        if (fmask & DTK_M(YEAR))
     1045        {
     1046            if ((!(fmask & DTK_M(DAY)))
     1047                && ((tm->tm_year >= 1) && (tm->tm_year <= 31)))
     1048            {
     1049#ifdef DATEDEBUG
     1050                printf("DecodeNumber- misidentified year previously; swap with day %d\n", tm->tm_mday);
     1051#endif
     1052                tm->tm_mday = tm->tm_year;
     1053                *tmask = DTK_M(DAY);
     1054            }
     1055        }
     1056
     1057        tm->tm_year = val;
     1058
     1059        /* special case day of year? */
     1060    }
     1061    else if ((flen == 3) && (fmask & DTK_M(YEAR))
     1062            && ((val >= 1) && (val <= 366)))
     1063    {
     1064        *tmask = (DTK_M(DOY) | DTK_M(MONTH) | DTK_M(DAY));
     1065        tm->tm_yday = val;
     1066        j2date((date2j(tm->tm_year, 1, 1) + tm->tm_yday - 1),
     1067               &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
     1068
     1069        /* already have year? then could be month */
     1070    }
     1071    else if ((fmask & DTK_M(YEAR)) && (!(fmask & DTK_M(MONTH)))
     1072            && ((val >= 1) && (val <= 12)))
     1073    {
     1074#ifdef DATEDEBUG
     1075        printf("DecodeNumber- match %d (%s) as month\n", val, str);
     1076#endif
     1077        *tmask = DTK_M(MONTH);
     1078        tm->tm_mon = val;
     1079
     1080        /* no year and EuroDates enabled? then could be day */
     1081    }
     1082    else if ((EuroDates || (fmask & DTK_M(MONTH)))
     1083            && (!(fmask & DTK_M(YEAR)) && !(fmask & DTK_M(DAY)))
     1084            && ((val >= 1) && (val <= 31)))
     1085    {
     1086#ifdef DATEDEBUG
     1087        printf("DecodeNumber- match %d (%s) as day\n", val, str);
     1088#endif
     1089        *tmask = DTK_M(DAY);
     1090        tm->tm_mday = val;
     1091
     1092    }
     1093    else if ((!(fmask & DTK_M(MONTH)))
     1094            && ((val >= 1) && (val <= 12)))
     1095    {
     1096#ifdef DATEDEBUG
     1097        printf("DecodeNumber- (2) match %d (%s) as month\n", val, str);
     1098#endif
     1099        *tmask = DTK_M(MONTH);
     1100        tm->tm_mon = val;
     1101
     1102    }
     1103    else if ((!(fmask & DTK_M(DAY)))
     1104            && ((val >= 1) && (val <= 31)))
     1105    {
     1106#ifdef DATEDEBUG
     1107        printf("DecodeNumber- (2) match %d (%s) as day\n", val, str);
     1108#endif
     1109        *tmask = DTK_M(DAY);
     1110        tm->tm_mday = val;
     1111
     1112    }
     1113    else if (!(fmask & DTK_M(YEAR)))
     1114    {
     1115#ifdef DATEDEBUG
     1116        printf("DecodeNumber- (2) match %d (%s) as year\n", val, str);
     1117#endif
     1118        *tmask = DTK_M(YEAR);
     1119        tm->tm_year = val;
     1120        if (tm->tm_year < 70)
     1121            tm->tm_year += 2000;
     1122        else if (tm->tm_year < 100)
     1123            tm->tm_year += 1900;
     1124
     1125    }
     1126    else
     1127        return -1;
     1128
     1129    return 0;
     1130}   /* DecodeNumber() */
    11301131
    11311132
     
    11361137DecodeNumberField(int len, char *str, int fmask, int *tmask, struct tm * tm, double *fsec)
    11371138{
    1138         char       *cp;
    1139 
    1140         /* yyyymmdd? */
    1141         if (len == 8)
    1142         {
    1143 #ifdef DATEDEBUG
    1144                 printf("DecodeNumberField- %s is 8 character date fmask=%08x tmask=%08x\n", str, fmask, *tmask);
    1145 #endif
    1146 
    1147                 *tmask = DTK_DATE_M;
    1148 
    1149                 tm->tm_mday = atoi(str + 6);
    1150                 *(str + 6) = '\0';
    1151                 tm->tm_mon = atoi(str + 4);
    1152                 *(str + 4) = '\0';
    1153                 tm->tm_year = atoi(str + 0);
    1154 
    1155                 /* yymmdd or hhmmss? */
    1156         }
    1157         else if (len == 6)
    1158         {
    1159 #ifdef DATEDEBUG
    1160                 printf("DecodeNumberField- %s is 6 characters fmask=%08x tmask=%08x\n", str, fmask, *tmask);
    1161 #endif
    1162                 if (fmask & DTK_DATE_M)
    1163                 {
    1164 #ifdef DATEDEBUG
    1165                         printf("DecodeNumberField- %s is time field fmask=%08x tmask=%08x\n", str, fmask, *tmask);
    1166 #endif
    1167                         *tmask = DTK_TIME_M;
    1168                         tm->tm_sec = atoi(str + 4);
    1169                         *(str + 4) = '\0';
    1170                         tm->tm_min = atoi(str + 2);
    1171                         *(str + 2) = '\0';
    1172                         tm->tm_hour = atoi(str + 0);
    1173 
    1174                 }
    1175                 else
    1176                 {
    1177 #ifdef DATEDEBUG
    1178                         printf("DecodeNumberField- %s is date field fmask=%08x tmask=%08x\n", str, fmask, *tmask);
    1179 #endif
    1180                         *tmask = DTK_DATE_M;
    1181                         tm->tm_mday = atoi(str + 4);
    1182                         *(str + 4) = '\0';
    1183                         tm->tm_mon = atoi(str + 2);
    1184                         *(str + 2) = '\0';
    1185                         tm->tm_year = atoi(str + 0);
    1186                 }
    1187 
    1188         }
    1189         else if (strchr(str, '.') != NULL)
    1190         {
    1191 #ifdef DATEDEBUG
    1192                 printf("DecodeNumberField- %s is time field fmask=%08x tmask=%08x\n", str, fmask, *tmask);
    1193 #endif
    1194                 *tmask = DTK_TIME_M;
    1195                 tm->tm_sec = strtod((str + 4), &cp);
    1196                 if (cp == (str + 4))
    1197                         return -1;
    1198                 if (*cp == '.')
    1199                         *fsec = strtod(cp, NULL);
    1200                 *(str + 4) = '\0';
    1201                 tm->tm_min = strtod((str + 2), &cp);
    1202                 *(str + 2) = '\0';
    1203                 tm->tm_hour = strtod((str + 0), &cp);
    1204 
    1205         }
    1206         else
    1207                 return -1;
    1208 
    1209         return 0;
    1210 }       /* DecodeNumberField() */
     1139    char       *cp;
     1140
     1141    /* yyyymmdd? */
     1142    if (len == 8)
     1143    {
     1144#ifdef DATEDEBUG
     1145        printf("DecodeNumberField- %s is 8 character date fmask=%08x tmask=%08x\n", str, fmask, *tmask);
     1146#endif
     1147
     1148        *tmask = DTK_DATE_M;
     1149
     1150        tm->tm_mday = atoi(str + 6);
     1151        *(str + 6) = '\0';
     1152        tm->tm_mon = atoi(str + 4);
     1153        *(str + 4) = '\0';
     1154        tm->tm_year = atoi(str + 0);
     1155
     1156        /* yymmdd or hhmmss? */
     1157    }
     1158    else if (len == 6)
     1159    {
     1160#ifdef DATEDEBUG
     1161        printf("DecodeNumberField- %s is 6 characters fmask=%08x tmask=%08x\n", str, fmask, *tmask);
     1162#endif
     1163        if (fmask & DTK_DATE_M)
     1164        {
     1165#ifdef DATEDEBUG
     1166            printf("DecodeNumberField- %s is time field fmask=%08x tmask=%08x\n", str, fmask, *tmask);
     1167#endif
     1168            *tmask = DTK_TIME_M;
     1169            tm->tm_sec = atoi(str + 4);
     1170            *(str + 4) = '\0';
     1171            tm->tm_min = atoi(str + 2);
     1172            *(str + 2) = '\0';
     1173            tm->tm_hour = atoi(str + 0);
     1174
     1175        }
     1176        else
     1177        {
     1178#ifdef DATEDEBUG
     1179            printf("DecodeNumberField- %s is date field fmask=%08x tmask=%08x\n", str, fmask, *tmask);
     1180#endif
     1181            *tmask = DTK_DATE_M;
     1182            tm->tm_mday = atoi(str + 4);
     1183            *(str + 4) = '\0';
     1184            tm->tm_mon = atoi(str + 2);
     1185            *(str + 2) = '\0';
     1186            tm->tm_year = atoi(str + 0);
     1187        }
     1188
     1189    }
     1190    else if (strchr(str, '.') != NULL)
     1191    {
     1192#ifdef DATEDEBUG
     1193        printf("DecodeNumberField- %s is time field fmask=%08x tmask=%08x\n", str, fmask, *tmask);
     1194#endif
     1195        *tmask = DTK_TIME_M;
     1196        tm->tm_sec = strtod((str + 4), &cp);
     1197        if (cp == (str + 4))
     1198            return -1;
     1199        if (*cp == '.')
     1200            *fsec = strtod(cp, NULL);
     1201        *(str + 4) = '\0';
     1202        tm->tm_min = strtod((str + 2), &cp);
     1203        *(str + 2) = '\0';
     1204        tm->tm_hour = strtod((str + 0), &cp);
     1205
     1206    }
     1207    else
     1208        return -1;
     1209
     1210    return 0;
     1211}   /* DecodeNumberField() */
    12111212
    12121213
     
    12171218DecodeTimezone(char *str, int *tzp)
    12181219{
    1219         int                     tz;
    1220         int                     hr,
    1221                                 min;
    1222         char       *cp;
    1223         int                     len;
    1224 
    1225         /* assume leading character is "+" or "-" */
    1226         hr = strtol((str + 1), &cp, 10);
    1227 
    1228         /* explicit delimiter? */
    1229         if (*cp == ':')
    1230         {
    1231                 min = strtol((cp + 1), &cp, 10);
    1232 
    1233                 /* otherwise, might have run things together... */
    1234         }
    1235         else if ((*cp == '\0') && ((len = strlen(str)) > 3))
    1236         {
    1237                 min = strtol((str + len - 2), &cp, 10);
    1238                 *(str + len - 2) = '\0';
    1239                 hr = strtol((str + 1), &cp, 10);
    1240 
    1241         }
    1242         else
    1243                 min = 0;
    1244 
    1245         tz = (hr * 60 + min) * 60;
    1246         if (*str == '-')
    1247                 tz = -tz;
    1248 
    1249         *tzp = -tz;
    1250         return *cp != '\0';
    1251 }       /* DecodeTimezone() */
     1220    int         tz;
     1221    int         hr,
     1222                min;
     1223    char       *cp;
     1224    int         len;
     1225
     1226    /* assume leading character is "+" or "-" */
     1227    hr = strtol((str + 1), &cp, 10);
     1228
     1229    /* explicit delimiter? */
     1230    if (*cp == ':')
     1231    {
     1232        min = strtol((cp + 1), &cp, 10);
     1233
     1234        /* otherwise, might have run things together... */
     1235    }
     1236    else if ((*cp == '\0') && ((len = strlen(str)) > 3))
     1237    {
     1238        min = strtol((str + len - 2), &cp, 10);
     1239        *(str + len - 2) = '\0';
     1240        hr = strtol((str + 1), &cp, 10);
     1241
     1242    }
     1243    else
     1244        min = 0;
     1245
     1246    tz = (hr * 60 + min) * 60;
     1247    if (*str == '-')
     1248        tz = -tz;
     1249
     1250    *tzp = -tz;
     1251    return *cp != '\0';
     1252}   /* DecodeTimezone() */
    12521253
    12531254
     
    12551256 * Decode text string using lookup table.
    12561257 * Implement a cache lookup since it is likely that dates
    1257  *      will be related in format.
     1258 *  will be related in format.
    12581259 */
    12591260static int
    12601261DecodeSpecial(int field, char *lowtoken, int *val)
    12611262{
    1262         int                     type;
    1263         datetkn    *tp;
     1263    int         type;
     1264    datetkn    *tp;
    12641265
    12651266#if USE_DATE_CACHE
    1266         if ((datecache[field] != NULL)
    1267                 && (strncmp(lowtoken, datecache[field]->token, TOKMAXLEN) == 0))
    1268                 tp = datecache[field];
    1269         else
    1270         {
    1271 #endif
    1272                 tp = datebsearch(lowtoken, datetktbl, szdatetktbl);
     1267    if ((datecache[field] != NULL)
     1268        && (strncmp(lowtoken, datecache[field]->token, TOKMAXLEN) == 0))
     1269        tp = datecache[field];
     1270    else
     1271    {
     1272#endif
     1273        tp = datebsearch(lowtoken, datetktbl, szdatetktbl);
    12731274#if USE_DATE_CACHE
    1274         }
    1275         datecache[field] = tp;
    1276 #endif
    1277         if (tp == NULL)
    1278         {
    1279                 type = IGNOREFIELD;
    1280                 *val = 0;
    1281         }
    1282         else
    1283         {
    1284                 type = tp->type;
    1285                 switch (type)
    1286                 {
    1287                         case TZ:
    1288                         case DTZ:
    1289                         case DTZMOD:
    1290                                 *val = FROMVAL(tp);
    1291                                 break;
    1292 
    1293                         default:
    1294                                 *val = tp->value;
    1295                                 break;
    1296                 }
    1297         }
    1298 
    1299         return type;
    1300 }       /* DecodeSpecial() */
     1275    }
     1276    datecache[field] = tp;
     1277#endif
     1278    if (tp == NULL)
     1279    {
     1280        type = IGNOREFIELD;
     1281        *val = 0;
     1282    }
     1283    else
     1284    {
     1285        type = tp->type;
     1286        switch (type)
     1287        {
     1288            case TZ:
     1289            case DTZ:
     1290            case DTZMOD:
     1291                *val = FROMVAL(tp);
     1292                break;
     1293
     1294            default:
     1295                *val = tp->value;
     1296                break;
     1297        }
     1298    }
     1299
     1300    return type;
     1301}   /* DecodeSpecial() */
    13011302
    13021303
     
    13091310datebsearch(char *key, datetkn *base, unsigned int nel)
    13101311{
    1311         datetkn    *last = base + nel - 1,
    1312                            *position;
    1313         int                     result;
    1314 
    1315         while (last >= base)
    1316         {
    1317                 position = base + ((last - base) >> 1);
    1318                 result = key[0] - position->token[0];
    1319                 if (result == 0)
    1320                 {
    1321                         result = strncmp(key, position->token, TOKMAXLEN);
    1322                         if (result == 0)
    1323                                 return position;
    1324                 }
    1325                 if (result < 0)
    1326                         last = position - 1;
    1327                 else
    1328                         base = position + 1;
    1329         }
    1330         return NULL;
     1312    datetkn    *last = base + nel - 1,
     1313               *position;
     1314    int         result;
     1315
     1316    while (last >= base)
     1317    {
     1318        position = base + ((last - base) >> 1);
     1319        result = key[0] - position->token[0];
     1320        if (result == 0)
     1321        {
     1322            result = strncmp(key, position->token, TOKMAXLEN);
     1323            if (result == 0)
     1324                return position;
     1325        }
     1326        if (result < 0)
     1327            last = position - 1;
     1328        else
     1329            base = position + 1;
     1330    }
     1331    return NULL;
    13311332}
    13321333
  • trunk/src/oleaut32/safearray.c

    r6507 r6648  
     1/* $Id: safearray.c,v 1.3 2001-09-05 13:19:01 bird Exp $ */
    12/*************************************************************************
    23 * OLE Automation
     
    2526
    2627/* Localy used methods */
    27 static INT 
     28static INT
    2829endOfDim(LONG *coor, SAFEARRAYBOUND *mat, LONG dim, LONG realDim);
    2930
    30 static ULONG   
     31static ULONG
    3132calcDisplacement(LONG *coor, SAFEARRAYBOUND *mat, LONG dim);
    3233
    33 static BOOL 
     34static BOOL
    3435isPointer(USHORT feature);
    3536
    36 static INT   
     37static INT
    3738getFeatures(VARTYPE vt);
    3839
    39 static BOOL 
     40static BOOL
    4041validCoordinate(LONG *coor, SAFEARRAY *psa);
    4142
    42 static BOOL 
     43static BOOL
    4344resizeSafeArray(SAFEARRAY *psa, LONG lDelta);
    4445
    45 static BOOL 
     46static BOOL
    4647validArg(SAFEARRAY *psa);
    4748
    48 static ULONG   
     49static ULONG
    4950getArraySize(SAFEARRAY *psa);
    5051
    51 static HRESULT 
     52static HRESULT
    5253duplicateData(SAFEARRAY *psa, SAFEARRAY **ppsaOut);
    5354
     
    5960{
    6061  /* this is taken from wtypes.h.  Only [S]es are supported by the SafeArray */
    61 VARTYPE_NOT_SUPPORTED,  /* VT_EMPTY    [V]   [P]    nothing                     */
    62 VARTYPE_NOT_SUPPORTED,  /* VT_NULL     [V]   [P]    SQL style Nul       */
    63 2,                          /* VT_I2       [V][T][P][S] 2 byte signed int */
    64 4,                          /* VT_I4       [V][T][P][S] 4 byte signed int */
    65 4,                          /* VT_R4       [V][T][P][S] 4 byte real     */
    66 8,                          /* VT_R8       [V][T][P][S] 8 byte real     */
     62VARTYPE_NOT_SUPPORTED,  /* VT_EMPTY    [V]   [P]    nothing         */
     63VARTYPE_NOT_SUPPORTED,  /* VT_NULL     [V]   [P]    SQL style Nul   */
     642,                      /* VT_I2       [V][T][P][S] 2 byte signed int */
     654,                      /* VT_I4       [V][T][P][S] 4 byte signed int */
     664,                      /* VT_R4       [V][T][P][S] 4 byte real */
     678,                      /* VT_R8       [V][T][P][S] 8 byte real */
    67688,                      /* VT_CY       [V][T][P][S] currency */
    68 8,                          /* VT_DATE     [V][T][P][S] date */
    69 4,                          /* VT_BSTR     [V][T][P][S] OLE Automation string*/
    70 4,                          /* VT_DISPATCH [V][T][P][S] IDispatch *     */
    71 4,                      /* VT_ERROR    [V][T]   [S] SCODE       */
    72 4,                          /* VT_BOOL     [V][T][P][S] True=-1, False=0*/
    73 24,                     /* VT_VARIANT  [V][T][P][S] VARIANT *   */
    74 4,                          /* VT_UNKNOWN  [V][T]   [S] IUnknown * */
    75 16,                         /* VT_DECIMAL  [V][T]   [S] 16 byte fixed point     */
     698,                      /* VT_DATE     [V][T][P][S] date */
     704,                      /* VT_BSTR     [V][T][P][S] OLE Automation string*/
     714,                      /* VT_DISPATCH [V][T][P][S] IDispatch * */
     724,                      /* VT_ERROR    [V][T]   [S] SCODE   */
     734,                      /* VT_BOOL     [V][T][P][S] True=-1, False=0*/
     7424,                     /* VT_VARIANT  [V][T][P][S] VARIANT *   */
     754,                      /* VT_UNKNOWN  [V][T]   [S] IUnknown * */
     7616,                     /* VT_DECIMAL  [V][T]   [S] 16 byte fixed point */
    7677VARTYPE_NOT_SUPPORTED,                         /* no VARTYPE here..... */
    77 VARTYPE_NOT_SUPPORTED,  /* VT_I1          [T]       signed char */
    78 1,                          /* VT_UI1      [V][T][P][S] unsigned char                   */
    79 VARTYPE_NOT_SUPPORTED,  /* VT_UI2         [T][P]    unsigned short      */
    80 VARTYPE_NOT_SUPPORTED,  /* VT_UI4         [T][P]    unsigned short      */
    81 VARTYPE_NOT_SUPPORTED,  /* VT_I8          [T][P]    signed 64-bit int                   */
    82 VARTYPE_NOT_SUPPORTED,  /* VT_UI8         [T][P]    unsigned 64-bit int         */
    83 VARTYPE_NOT_SUPPORTED,  /* VT_INT         [T]       signed machine int          */
    84 VARTYPE_NOT_SUPPORTED,  /* VT_UINT        [T]       unsigned machine int        */
    85 VARTYPE_NOT_SUPPORTED,  /* VT_VOID        [T]       C style void                        */
    86 VARTYPE_NOT_SUPPORTED,  /* VT_HRESULT     [T]       Standard return type        */
    87 VARTYPE_NOT_SUPPORTED,  /* VT_PTR         [T]       pointer type                        */
    88 VARTYPE_NOT_SUPPORTED,  /* VT_SAFEARRAY   [T]       (use VT_ARRAY in VARIANT)*/
    89 VARTYPE_NOT_SUPPORTED,  /* VT_CARRAY      [T]       C style array                       */
    90 VARTYPE_NOT_SUPPORTED,  /* VT_USERDEFINED [T]       user defined type                   */
    91 VARTYPE_NOT_SUPPORTED,  /* VT_LPSTR       [T][P]    null terminated string      */
    92 VARTYPE_NOT_SUPPORTED,  /* VT_LPWSTR      [T][P]    wide null term string               */
    93 VARTYPE_NOT_SUPPORTED,  /* VT_FILETIME       [P]    FILETIME                    */
    94 VARTYPE_NOT_SUPPORTED,  /* VT_BLOB           [P]    Length prefixed bytes */
    95 VARTYPE_NOT_SUPPORTED,  /* VT_STREAM         [P]    Name of stream follows              */
    96 VARTYPE_NOT_SUPPORTED,  /* VT_STORAGE        [P]    Name of storage follows     */
    97 VARTYPE_NOT_SUPPORTED,  /* VT_STREAMED_OBJECT[P]    Stream contains an object*/
    98 VARTYPE_NOT_SUPPORTED,  /* VT_STORED_OBJECT  [P]    Storage contains object*/
    99 VARTYPE_NOT_SUPPORTED,  /* VT_BLOB_OBJECT    [P]    Blob contains an object*/
    100 VARTYPE_NOT_SUPPORTED,  /* VT_CF             [P]    Clipboard format                    */
    101 VARTYPE_NOT_SUPPORTED,  /* VT_CLSID          [P]    A Class ID                  */
    102 VARTYPE_NOT_SUPPORTED,  /* VT_VECTOR         [P]    simple counted array                */
    103 VARTYPE_NOT_SUPPORTED,  /* VT_ARRAY    [V]          SAFEARRAY*                  */
    104 VARTYPE_NOT_SUPPORTED   /* VT_BYREF    [V]          void* for local use */
     78VARTYPE_NOT_SUPPORTED,  /* VT_I1          [T]       signed char */
     791,                      /* VT_UI1      [V][T][P][S] unsigned char           */
     80VARTYPE_NOT_SUPPORTED,  /* VT_UI2         [T][P]    unsigned short  */
     81VARTYPE_NOT_SUPPORTED,  /* VT_UI4         [T][P]    unsigned short  */
     82VARTYPE_NOT_SUPPORTED,  /* VT_I8          [T][P]    signed 64-bit int           */
     83VARTYPE_NOT_SUPPORTED,  /* VT_UI8         [T][P]    unsigned 64-bit int     */
     84VARTYPE_NOT_SUPPORTED,  /* VT_INT         [T]       signed machine int      */
     85VARTYPE_NOT_SUPPORTED,  /* VT_UINT        [T]       unsigned machine int    */
     86VARTYPE_NOT_SUPPORTED,  /* VT_VOID        [T]       C style void            */
     87VARTYPE_NOT_SUPPORTED,  /* VT_HRESULT     [T]       Standard return type    */
     88VARTYPE_NOT_SUPPORTED,  /* VT_PTR         [T]       pointer type            */
     89VARTYPE_NOT_SUPPORTED,  /* VT_SAFEARRAY   [T]       (use VT_ARRAY in VARIANT)*/
     90VARTYPE_NOT_SUPPORTED,  /* VT_CARRAY      [T]       C style array           */
     91VARTYPE_NOT_SUPPORTED,  /* VT_USERDEFINED [T]       user defined type           */
     92VARTYPE_NOT_SUPPORTED,  /* VT_LPSTR       [T][P]    null terminated string  */
     93VARTYPE_NOT_SUPPORTED,  /* VT_LPWSTR      [T][P]    wide null term string       */
     94VARTYPE_NOT_SUPPORTED,  /* VT_FILETIME       [P]    FILETIME            */
     95VARTYPE_NOT_SUPPORTED,  /* VT_BLOB           [P]    Length prefixed bytes */
     96VARTYPE_NOT_SUPPORTED,  /* VT_STREAM         [P]    Name of stream follows      */
     97VARTYPE_NOT_SUPPORTED,  /* VT_STORAGE        [P]    Name of storage follows */
     98VARTYPE_NOT_SUPPORTED,  /* VT_STREAMED_OBJECT[P]    Stream contains an object*/
     99VARTYPE_NOT_SUPPORTED,  /* VT_STORED_OBJECT  [P]    Storage contains object*/
     100VARTYPE_NOT_SUPPORTED,  /* VT_BLOB_OBJECT    [P]    Blob contains an object*/
     101VARTYPE_NOT_SUPPORTED,  /* VT_CF             [P]    Clipboard format            */
     102VARTYPE_NOT_SUPPORTED,  /* VT_CLSID          [P]    A Class ID          */
     103VARTYPE_NOT_SUPPORTED,  /* VT_VECTOR         [P]    simple counted array        */
     104VARTYPE_NOT_SUPPORTED,  /* VT_ARRAY    [V]          SAFEARRAY*          */
     105VARTYPE_NOT_SUPPORTED   /* VT_BYREF    [V]          void* for local use */
    105106};
    106107
     
    109110
    110111/*************************************************************************
    111  *              SafeArrayAllocDescriptor
     112 *      SafeArrayAllocDescriptor
    112113 * Allocate the appropriate amount of memory for the SafeArray descriptor
    113114 */
    114 HRESULT WINAPI SafeArrayAllocDescriptor( 
    115   UINT    cDims, 
    116   SAFEARRAY **ppsaOut) 
     115HRESULT WINAPI SafeArrayAllocDescriptor(
     116  UINT    cDims,
     117  SAFEARRAY **ppsaOut)
    117118{
    118119  SAFEARRAYBOUND *sab;
     
    124125
    125126  /* Allocate memory for SAFEARRAY struc */
    126   if(( (*ppsaOut)=HeapAlloc( 
     127  if(( (*ppsaOut)=HeapAlloc(
    127128        GetProcessHeap(), HEAP_ZERO_MEMORY, allocSize)) == NULL){
    128129    return(E_UNEXPECTED);
     
    134135
    135136/*************************************************************************
    136  *              SafeArrayAllocData
     137 *      SafeArrayAllocData
    137138 * Allocate the appropriate amount of data for the SafeArray data
    138139 */
    139140HRESULT WINAPI SafeArrayAllocData(
    140   SAFEARRAY *psa) 
     141  SAFEARRAY *psa)
    141142{
    142143  ULONG  ulWholeArraySize;   /* to store the size of the whole thing */
     
    144145  dprintf(("SafeArrayAllocData %x", psa));
    145146
    146   if(! validArg(psa)) 
     147  if(! validArg(psa))
    147148    return E_INVALIDARG;
    148149
     
    150151
    151152  /* Allocate memory for the data itself */
    152   if((psa->pvData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 
     153  if((psa->pvData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
    153154        psa->cbElements*ulWholeArraySize)) == NULL)
    154155    return(E_UNEXPECTED);
    155156
    156   TRACE("SafeArray: %lu bytes allocated for data at %p (%lu objects).\n", 
     157  TRACE("SafeArray: %lu bytes allocated for data at %p (%lu objects).\n",
    157158    psa->cbElements*ulWholeArraySize, psa->pvData, ulWholeArraySize);
    158159
     
    161162
    162163/*************************************************************************
    163  *              SafeArrayCreate
    164  * Create a SafeArray object by encapsulating AllocDescriptor and AllocData 
     164 *      SafeArrayCreate
     165 * Create a SafeArray object by encapsulating AllocDescriptor and AllocData
    165166 */
    166167SAFEARRAY* WINAPI SafeArrayCreate(
    167   VARTYPE        vt, 
    168   UINT         cDims, 
     168  VARTYPE        vt,
     169  UINT         cDims,
    169170  SAFEARRAYBOUND *rgsabound)
    170171{
     
    184185    return NULL;
    185186
    186   /* setup data members... */ 
     187  /* setup data members... */
    187188  psa->cDims     = cDims;
    188189  psa->fFeatures = getFeatures(vt);
     
    197198  }
    198199
    199   /* allocate memory for the data... */ 
     200  /* allocate memory for the data... */
    200201  if( FAILED( hRes = SafeArrayAllocData(psa))) {
    201     SafeArrayDestroyDescriptor(psa); 
     202    SafeArrayDestroyDescriptor(psa);
    202203    ERR("() : Failed to allocate the Safe Array data\n");
    203204    return NULL;
    204205  }
    205206
    206   return(psa); 
    207 }
    208 
    209 /*************************************************************************
    210  *              SafeArrayDestroyDescriptor
     207  return(psa);
     208}
     209
     210/*************************************************************************
     211 *      SafeArrayDestroyDescriptor
    211212 * Frees the memory associated with the descriptor.
    212213 */
     
    217218
    218219  /* Check for lockness before to free... */
    219   if(psa->cLocks > 0) 
     220  if(psa->cLocks > 0)
    220221    return DISP_E_ARRAYISLOCKED;
    221222
    222223  /* The array is unlocked, then, deallocate memory */
    223   if(HeapFree( GetProcessHeap(), 0, psa) == FALSE) 
     224  if(HeapFree( GetProcessHeap(), 0, psa) == FALSE)
    224225    return E_UNEXPECTED;
    225  
     226
    226227  return(S_OK);
    227228}
     
    229230
    230231/*************************************************************************
    231  *              SafeArrayLock
     232 *      SafeArrayLock
    232233 * Increment the lock counter
    233234 *
    234235 * Doc says (MSDN Library ) that psa->pvData should be made available (!= NULL)
    235  * only when psa->cLocks is > 0... I don't get it since pvData is allocated 
    236  * before the array is locked, therefore 
     236 * only when psa->cLocks is > 0... I don't get it since pvData is allocated
     237 * before the array is locked, therefore
    237238 */
    238239HRESULT WINAPI SafeArrayLock(
     
    241242  dprintf(("SafeArrayLock %x", psa));
    242243
    243   if(! validArg(psa))     
     244  if(! validArg(psa))
    244245    return E_INVALIDARG;
    245246
     
    250251
    251252/*************************************************************************
    252  *              SafeArrayUnlock
     253 *      SafeArrayUnlock
    253254 * Decrement the lock counter
    254255 */
     
    258259  dprintf(("SafeArrayUnlock %x", psa));
    259260
    260   if(! validArg(psa)) 
    261     return E_INVALIDARG;
    262 
    263   if (psa->cLocks > 0) 
     261  if(! validArg(psa))
     262    return E_INVALIDARG;
     263
     264  if (psa->cLocks > 0)
    264265    psa->cLocks--;
    265266
     
    269270
    270271/*************************************************************************
    271  *              SafeArrayPutElement
     272 *      SafeArrayPutElement
    272273 * Set the data at the given coordinate
    273274 */
    274275HRESULT WINAPI SafeArrayPutElement(
    275   SAFEARRAY *psa, 
    276   LONG      *rgIndices, 
     276  SAFEARRAY *psa,
     277  LONG      *rgIndices,
    277278  void      *pv)
    278279{
    279   ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to 
     280  ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to
    280281                                         the desired one... */
    281282  PVOID elementStorageAddress = NULL; /* Adress to store the data */
     
    285286
    286287  /* Validate the index given */
    287   if(! validCoordinate(rgIndices, psa)) 
     288  if(! validCoordinate(rgIndices, psa))
    288289    return DISP_E_BADINDEX;
    289290  if(! validArg(psa))
     
    294295    /* Figure out the number of items to skip */
    295296    stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims);
    296  
     297
    297298    /* Figure out the number of byte to skip ... */
    298299    elementStorageAddress = (char *) psa->pvData+(stepCountInSAData*psa->cbElements);
    299  
     300
    300301    if(isPointer(psa->fFeatures)) { /* increment ref count for this pointer */
    301302
    302       *((VOID**)elementStorageAddress) = *(VOID**)pv; 
     303      *((VOID**)elementStorageAddress) = *(VOID**)pv;
    303304      IUnknown_AddRef( *(IUnknown**)pv);
    304305
    305     } else { 
     306    } else {
    306307
    307308      if(psa->fFeatures == FADF_BSTR) { /* Create a new object */
    308309
    309310        if((pbstrReAllocStr = SysAllocString( (OLECHAR*)pv )) == NULL) {
    310           SafeArrayUnlock(psa); 
     311          SafeArrayUnlock(psa);
    311312          return E_OUTOFMEMORY;
    312         } else 
     313        } else
    313314          *((BSTR*)elementStorageAddress) = pbstrReAllocStr;
    314315
     
    323324
    324325  TRACE("SafeArray: item put at adress %p.\n",elementStorageAddress);
    325   return SafeArrayUnlock(psa); 
    326 }
    327 
    328 
    329 /*************************************************************************
    330  *              SafeArrayGetElement
     326  return SafeArrayUnlock(psa);
     327}
     328
     329
     330/*************************************************************************
     331 *      SafeArrayGetElement
    331332 * Return the data element corresponding the the given coordinate
    332333 */
    333334HRESULT WINAPI SafeArrayGetElement(
    334   SAFEARRAY *psa, 
    335   LONG      *rgIndices, 
     335  SAFEARRAY *psa,
     336  LONG      *rgIndices,
    336337  void      *pv)
    337338{
    338   ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to 
     339  ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to
    339340                                         the desired one... */
    340341  PVOID elementStorageAddress = NULL; /* Adress to store the data */
     
    343344  dprintf(("SafeArrayGetElement %x %x %x", psa, rgIndices, pv));
    344345
    345   if(! validArg(psa)) 
    346     return E_INVALIDARG;
    347  
     346  if(! validArg(psa))
     347    return E_INVALIDARG;
     348
    348349  if(! validCoordinate(rgIndices, psa)) /* Validate the index given */
    349350    return(DISP_E_BADINDEX);
     
    353354    /* Figure out the number of items to skip */
    354355    stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims);
    355  
     356
    356357    /* Figure out the number of byte to skip ... */
    357358    elementStorageAddress = (char *) psa->pvData+(stepCountInSAData*psa->cbElements);
    358  
     359
    359360    if( psa->fFeatures == FADF_BSTR) {           /* reallocate the obj */
    360       if( (pbstrReturnedStr = 
     361      if( (pbstrReturnedStr =
    361362          SysAllocString( *(OLECHAR**)elementStorageAddress )) == NULL) {
    362363        SafeArrayUnlock(psa);
    363364        return E_OUTOFMEMORY;
    364       } else 
    365         *((BSTR*)pv) = pbstrReturnedStr; 
    366        
     365      } else
     366        *((BSTR*)pv) = pbstrReturnedStr;
     367
    367368    } else if( isPointer(psa->fFeatures) )       /* simply copy the pointer */
    368        pv = *((PVOID*)elementStorageAddress); 
     369       pv = *((PVOID*)elementStorageAddress);
    369370    else                                         /* copy the bytes */
    370371      memcpy(pv, elementStorageAddress, SafeArrayGetElemsize(psa) );
     
    375376  }
    376377
    377   return( SafeArrayUnlock(psa) ); 
    378 }
    379 
    380 /*************************************************************************
    381  *              SafeArrayGetUBound
     378  return( SafeArrayUnlock(psa) );
     379}
     380
     381/*************************************************************************
     382 *      SafeArrayGetUBound
    382383 * return the UP bound for a given array dimension
    383384 */
    384385HRESULT WINAPI SafeArrayGetUBound(
    385   SAFEARRAY *psa, 
     386  SAFEARRAY *psa,
    386387  UINT    nDim,
    387388  LONG      *plUbound)
     
    390391  dprintf(("SafeArrayGetUBound %x %x %x", psa, nDim, plUbound));
    391392
    392   if(! validArg(psa))   
    393     return E_INVALIDARG;
    394 
    395   if(nDim > psa->cDims) 
     393  if(! validArg(psa))
     394    return E_INVALIDARG;
     395
     396  if(nDim > psa->cDims)
    396397    return DISP_E_BADINDEX;
    397398
    398   *plUbound = psa->rgsabound[nDim-1].lLbound + 
     399  *plUbound = psa->rgsabound[nDim-1].lLbound +
    399400              psa->rgsabound[nDim-1].cElements - 1;
    400401
     
    403404
    404405/*************************************************************************
    405  *              SafeArrayGetLBound
    406  * Return the LO bound for a given array dimension 
     406 *      SafeArrayGetLBound
     407 * Return the LO bound for a given array dimension
    407408 */
    408409HRESULT WINAPI SafeArrayGetLBound(
    409410  SAFEARRAY *psa,
    410   UINT    nDim, 
     411  UINT    nDim,
    411412  LONG      *plLbound)
    412413{
    413   if(! validArg(psa))   
    414     return E_INVALIDARG;
    415 
    416   if(nDim > psa->cDims) 
     414  if(! validArg(psa))
     415    return E_INVALIDARG;
     416
     417  if(nDim > psa->cDims)
    417418    return DISP_E_BADINDEX;
    418419
     
    422423
    423424/*************************************************************************
    424  *              SafeArrayGetDim
     425 *      SafeArrayGetDim
    425426 * returns the number of dimension in the array
    426427 */
    427428UINT WINAPI SafeArrayGetDim(
    428429  SAFEARRAY * psa)
    429 { 
     430{
    430431  /*
    431432   * A quick test in Windows shows that the behavior here for an invalid
    432433   * pointer is to return 0.
    433434   */
    434   if(! validArg(psa)) 
     435  if(! validArg(psa))
    435436    return 0;
    436437
     
    439440
    440441/*************************************************************************
    441  *              SafeArrayGetElemsize
     442 *      SafeArrayGetElemsize
    442443 * Return the size of the element in the array
    443444 */
    444445UINT WINAPI SafeArrayGetElemsize(
    445446  SAFEARRAY * psa)
    446 { 
     447{
    447448  /*
    448449   * A quick test in Windows shows that the behavior here for an invalid
    449450   * pointer is to return 0.
    450451   */
    451   if(! validArg(psa)) 
     452  if(! validArg(psa))
    452453    return 0;
    453454
     
    456457
    457458/*************************************************************************
    458  *              SafeArrayAccessData
    459  * increment the access count and return the data 
     459 *      SafeArrayAccessData
     460 * increment the access count and return the data
    460461 */
    461462HRESULT WINAPI SafeArrayAccessData(
    462   SAFEARRAY *psa, 
     463  SAFEARRAY *psa,
    463464  void      **ppvData)
    464 { 
     465{
    465466  HRESULT hRes;
    466467
    467   if(! validArg(psa)) 
     468  if(! validArg(psa))
    468469    return E_INVALIDARG;
    469470
     
    471472
    472473  switch (hRes) {
    473     case S_OK: 
     474    case S_OK:
    474475      (*ppvData) = psa->pvData;
    475476      break;
     
    478479      return E_INVALIDARG;
    479480  }
    480  
     481
    481482  return S_OK;
    482483}
     
    484485
    485486/*************************************************************************
    486  *              SafeArrayUnaccessData
     487 *      SafeArrayUnaccessData
    487488 * Decrement the access count
    488489 */
    489490HRESULT WINAPI SafeArrayUnaccessData(
    490491  SAFEARRAY * psa)
    491 { 
    492   if(! validArg(psa)) 
     492{
     493  if(! validArg(psa))
    493494    return E_INVALIDARG;
    494495
     
    496497}
    497498
    498 /************************************************************************ 
    499  *              SafeArrayPtrOfIndex
     499/************************************************************************
     500 *      SafeArrayPtrOfIndex
    500501 * Return a pointer to the element at rgIndices
    501502 */
    502503HRESULT WINAPI SafeArrayPtrOfIndex(
    503   SAFEARRAY *psa, 
    504   LONG      *rgIndices, 
     504  SAFEARRAY *psa,
     505  LONG      *rgIndices,
    505506  void      **ppvData)
    506 { 
    507   ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to 
     507{
     508  ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to
    508509                                         the desired one... */
    509510
    510   if(! validArg(psa))                   
    511     return E_INVALIDARG;
    512 
    513   if(! validCoordinate(rgIndices, psa)) 
     511  if(! validArg(psa))
     512    return E_INVALIDARG;
     513
     514  if(! validCoordinate(rgIndices, psa))
    514515    return DISP_E_BADINDEX;
    515516
    516517  /* Figure out the number of items to skip */
    517518  stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims);
    518  
     519
    519520  *ppvData = (char *) psa->pvData+(stepCountInSAData*psa->cbElements);
    520521
     
    522523}
    523524
    524 /************************************************************************ 
    525  *              SafeArrayDestroyData
     525/************************************************************************
     526 *      SafeArrayDestroyData
    526527 * Frees the memory data bloc
    527528 */
    528529HRESULT WINAPI SafeArrayDestroyData(
    529530  SAFEARRAY *psa)
    530 { 
     531{
    531532  HRESULT  hRes;
    532533  ULONG    ulWholeArraySize; /* count spot in array  */
     
    535536  BSTR   bstr;
    536537
    537   if(! validArg(psa)) 
    538     return E_INVALIDARG;
    539 
    540   if(psa->cLocks > 0) 
     538  if(! validArg(psa))
     539    return E_INVALIDARG;
     540
     541  if(psa->cLocks > 0)
    541542    return DISP_E_ARRAYISLOCKED;
    542543
     
    546547
    547548    for(ulDataIter=0; ulDataIter < ulWholeArraySize; ulDataIter++) {
    548       punk = *(IUnknown**)((char *) psa->pvData+(ulDataIter*(psa->cbElements)));       
    549 
    550       if( punk != NULL) 
     549      punk = *(IUnknown**)((char *) psa->pvData+(ulDataIter*(psa->cbElements)));
     550
     551      if( punk != NULL)
    551552        IUnknown_Release(punk);
    552553    }
     
    557558      bstr = *(BSTR*)((char *) psa->pvData+(ulDataIter*(psa->cbElements)));
    558559
    559       if( bstr != NULL) 
     560      if( bstr != NULL)
    560561        SysFreeString( bstr );
    561562    }
    562563  }
    563      
    564   /* check if this array is a Vector, in which case do not free the data 
     564
     565  /* check if this array is a Vector, in which case do not free the data
    565566     block since it has been allocated by AllocDescriptor and therefore
    566567     deserve to be freed by DestroyDescriptor */
     
    573574    psa->pvData = NULL;
    574575  }
    575  
     576
    576577  return S_OK;
    577578}
    578579
    579 /************************************************************************ 
    580  *              SafeArrayCopyData
     580/************************************************************************
     581 *      SafeArrayCopyData
    581582 * Copy the psaSource's data block into psaTarget if dimension and size
    582583 * permits it.
     
    585586  SAFEARRAY *psaSource,
    586587  SAFEARRAY **psaTarget)
    587 { 
     588{
    588589  USHORT   cDimCount;        /* looper */
    589590  LONG     lDelta;           /* looper */
    590   IUnknown *punk;   
     591  IUnknown *punk;
    591592  ULONG    ulWholeArraySize; /* Number of item in SA */
    592593  BSTR   bstr;
    593594
    594   if(! (validArg(psaSource) && validArg(*psaTarget)) ) 
     595  if(! (validArg(psaSource) && validArg(*psaTarget)) )
    595596    return E_INVALIDARG;
    596597
     
    598599    return E_INVALIDARG;
    599600
    600   ulWholeArraySize = getArraySize(psaSource); 
     601  ulWholeArraySize = getArraySize(psaSource);
    601602
    602603  /* The two arrays boundaries must be of same lenght */
    603604  for(cDimCount=0;cDimCount < psaSource->cDims; cDimCount++)
    604     if( psaSource->rgsabound[cDimCount].cElements != 
     605    if( psaSource->rgsabound[cDimCount].cElements !=
    605606      (*psaTarget)->rgsabound[cDimCount].cElements)
    606607      return E_INVALIDARG;
    607608
    608   if( isPointer((*psaTarget)->fFeatures) ) {         /* the target contains ptr 
     609  if( isPointer((*psaTarget)->fFeatures) ) {         /* the target contains ptr
    609610                                                        that must be released */
    610611    for(lDelta=0;lDelta < ulWholeArraySize; lDelta++) {
     
    612613        ((char *) (*psaTarget)->pvData + (lDelta * (*psaTarget)->cbElements));
    613614
    614       if( punk != NULL) 
     615      if( punk != NULL)
    615616        IUnknown_Release(punk);
    616617    }
    617618
    618619  } else if( (*psaTarget)->fFeatures & FADF_BSTR) {  /* the target contain BSTR
    619                                                         that must be freed */ 
     620                                                        that must be freed */
    620621    for(lDelta=0;lDelta < ulWholeArraySize; lDelta++) {
    621       bstr = 
     622      bstr =
    622623        *(BSTR*)((char *) (*psaTarget)->pvData + (lDelta * (*psaTarget)->cbElements));
    623624
    624       if( bstr != NULL) 
     625      if( bstr != NULL)
    625626        SysFreeString( bstr );
    626627    }
     
    630631}
    631632
    632 /************************************************************************ 
    633  *              SafeArrayDestroy
     633/************************************************************************
     634 *      SafeArrayDestroy
    634635 * Deallocates all memory reserved for the SafeArray
    635636 */
    636637HRESULT WINAPI SafeArrayDestroy(
    637638  SAFEARRAY * psa)
    638 { 
     639{
    639640  HRESULT hRes;
    640641
    641   if(! validArg(psa)) 
    642     return E_INVALIDARG;
    643 
    644   if(psa->cLocks > 0) 
     642  if(! validArg(psa))
     643    return E_INVALIDARG;
     644
     645  if(psa->cLocks > 0)
    645646    return DISP_E_ARRAYISLOCKED;
    646647
     
    652653}
    653654
    654 /************************************************************************ 
    655  *              SafeArrayCopy
     655/************************************************************************
     656 *      SafeArrayCopy
    656657 * Make a dupplicate of a SafeArray
    657658 */
    658659HRESULT WINAPI SafeArrayCopy(
    659   SAFEARRAY *psa, 
     660  SAFEARRAY *psa,
    660661  SAFEARRAY **ppsaOut)
    661 { 
     662{
    662663  HRESULT hRes;
    663664  DWORD   dAllocSize;
    664665  ULONG   ulWholeArraySize; /* size of the thing */
    665666
    666   if(! validArg(psa)) 
     667  if(! validArg(psa))
    667668    return E_INVALIDARG;
    668669
     
    670671
    671672    /* Duplicate the SAFEARRAY struc */
    672     memcpy(*ppsaOut, psa, 
     673    memcpy(*ppsaOut, psa,
    673674            sizeof(*psa)+(sizeof(*(psa->rgsabound))*(psa->cDims-1)));
    674675
     
    677678    /* make sure the new safe array doesn't have the FADF_CREATEVECTOR flag,
    678679       because the data has not been allocated with the descriptor. */
    679     (*ppsaOut)->fFeatures &= ~FADF_CREATEVECTOR; 
    680  
    681     /* Get the allocated memory size for source and allocate it for target */ 
     680    (*ppsaOut)->fFeatures &= ~FADF_CREATEVECTOR;
     681
     682    /* Get the allocated memory size for source and allocate it for target */
    682683    ulWholeArraySize = getArraySize(psa); /* Number of item in SA */
    683684    dAllocSize = ulWholeArraySize*psa->cbElements;
    684685
    685     (*ppsaOut)->pvData = 
     686    (*ppsaOut)->pvData =
    686687      HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dAllocSize);
    687688    if( (*ppsaOut)->pvData != NULL) {   /* HeapAlloc succeed */
     
    693694        return hRes;
    694695      }
    695        
     696
    696697    } else { /* failed to allocate or dupplicate... */
    697698      SafeArrayDestroyDescriptor(*ppsaOut);
     
    705706}
    706707
    707 /************************************************************************ 
    708  *              SafeArrayCreateVector
    709  * Creates a one dimension safearray where the data is next to the 
     708/************************************************************************
     709 *      SafeArrayCreateVector
     710 * Creates a one dimension safearray where the data is next to the
    710711 * SAFEARRAY structure.
    711712 */
    712713SAFEARRAY* WINAPI SafeArrayCreateVector(
    713   VARTYPE vt, 
    714   LONG    lLbound, 
    715   ULONG   cElements) 
    716 { 
     714  VARTYPE vt,
     715  LONG    lLbound,
     716  ULONG   cElements)
     717{
    717718  SAFEARRAY *psa;
    718719
     
    723724
    724725  /* Allocate memory for the array descriptor and data contiguously  */
    725   if( FAILED( psa = HeapAlloc( GetProcessHeap(), 
    726                       HEAP_ZERO_MEMORY, 
     726  if( FAILED( psa = HeapAlloc( GetProcessHeap(),
     727                      HEAP_ZERO_MEMORY,
    727728                      (sizeof(*psa) + (VARTYPE_SIZE[vt] * cElements))))) {
    728729    return NULL;
    729730  }
    730                                                                                
    731   /* setup data members... */ 
     731
     732  /* setup data members... */
    732733  psa->cDims      = 1; /* always and forever */
    733734  psa->fFeatures  = getFeatures(vt) | FADF_CREATEVECTOR;  /* undocumented flag used by Microsoft */
     
    739740  psa->rgsabound[0].lLbound   = lLbound;
    740741
    741   return(psa);                           
    742 } 
    743 
    744 /************************************************************************ 
    745  *              SafeArrayRedim
     742  return(psa);
     743}
     744
     745/************************************************************************
     746 *      SafeArrayRedim
    746747 * Changes the caracteristics of the last dimension of the SafeArray
    747748 */
    748749HRESULT WINAPI SafeArrayRedim(
    749   SAFEARRAY      *psa, 
     750  SAFEARRAY      *psa,
    750751  SAFEARRAYBOUND *psaboundNew)
    751 { 
     752{
    752753  LONG   lDelta;  /* hold difference in size */
    753754  USHORT cDims=1; /* dims counter */
    754755
    755   if( !validArg(psa) )                   
    756     return E_INVALIDARG;
    757 
    758   if( psa->cLocks > 0 )                   
     756  if( !validArg(psa) )
     757    return E_INVALIDARG;
     758
     759  if( psa->cLocks > 0 )
    759760    return DISP_E_ARRAYISLOCKED;
    760761
    761   if( psa->fFeatures & FADF_FIXEDSIZE )   
    762     return E_INVALIDARG;
    763 
    764   if( SafeArrayLock(psa)==E_UNEXPECTED ) 
     762  if( psa->fFeatures & FADF_FIXEDSIZE )
     763    return E_INVALIDARG;
     764
     765  if( SafeArrayLock(psa)==E_UNEXPECTED )
    765766    return E_UNEXPECTED;/* UNDOC error condition */
    766767
     
    774775
    775776  } else /* need to enlarge (lDelta +) reduce (lDelta -) */
    776     if(! resizeSafeArray(psa, lDelta)) 
     777    if(! resizeSafeArray(psa, lDelta))
    777778      return E_UNEXPECTED; /* UNDOC error condition */
    778779
    779   /* the only modifyable dimension sits in [0] as the dimensions were reversed 
     780  /* the only modifyable dimension sits in [0] as the dimensions were reversed
    780781     at array creation time... */
    781782  psa->rgsabound[0].cElements = psaboundNew->cElements;
     
    789790 ************************************************************************/
    790791
    791 /************************************************************************ 
     792/************************************************************************
    792793 * Used to validate the SAFEARRAY type of arg
    793794 */
    794795static BOOL validArg(
    795   SAFEARRAY *psa) 
     796  SAFEARRAY *psa)
    796797{
    797798  SAFEARRAYBOUND *sab;
     
    822823}
    823824
    824 /************************************************************************ 
     825/************************************************************************
    825826 * Used to reallocate memory
    826827 */
    827828static BOOL resizeSafeArray(
    828   SAFEARRAY *psa, 
     829  SAFEARRAY *psa,
    829830  LONG lDelta)
    830831{
    831832  ULONG    ulWholeArraySize;  /* use as multiplicator */
    832   PVOID    pvNewBlock = NULL; 
     833  PVOID    pvNewBlock = NULL;
    833834  IUnknown *punk;
    834835  BSTR   bstr;
     
    838839  if(lDelta < 0) {                    /* array needs to be shorthen  */
    839840    if( isPointer(psa->fFeatures))    /* ptr that need to be released */
    840             for(;lDelta < 0; lDelta++) {
    841               punk = *(IUnknown**)
     841        for(;lDelta < 0; lDelta++) {
     842          punk = *(IUnknown**)
    842843          ((char *) psa->pvData+((ulWholeArraySize+lDelta)*psa->cbElements));
    843        
     844
    844845        if( punk != NULL )
    845846          IUnknown_Release(punk);
    846             }
     847        }
    847848
    848849    else if(psa->fFeatures & FADF_BSTR)  /* BSTR that need to be freed */
    849             for(;lDelta < 0; lDelta++) {
     850        for(;lDelta < 0; lDelta++) {
    850851        bstr = *(BSTR*)
    851852          ((char *) psa->pvData+((ulWholeArraySize+lDelta)*psa->cbElements));
     
    858859  if (!(psa->fFeatures & FADF_CREATEVECTOR))
    859860  {
    860     /* Ok now, if we are enlarging the array, we *MUST* move the whole block 
     861    /* Ok now, if we are enlarging the array, we *MUST* move the whole block
    861862       pointed to by pvData.   If we are shorthening the array, this move is
    862        optional but we do it anyway becuase the benefit is that we are 
     863       optional but we do it anyway becuase the benefit is that we are
    863864       releasing to the system the unused memory */
    864865
    865     if((pvNewBlock = HeapReAlloc(GetProcessHeap(), 0, psa->pvData, 
    866        (ulWholeArraySize + lDelta) * psa->cbElements)) == NULL) 
     866    if((pvNewBlock = HeapReAlloc(GetProcessHeap(), 0, psa->pvData,
     867       (ulWholeArraySize + lDelta) * psa->cbElements)) == NULL)
    867868        return FALSE; /* TODO If we get here it means:
    868869                         SHRINK situation :  we've deleted the undesired
     
    873874  else
    874875  {
    875     /* Allocate a new block, because the previous data has been allocated with 
     876    /* Allocate a new block, because the previous data has been allocated with
    876877       the descriptor in SafeArrayCreateVector function. */
    877878
    878879    if((pvNewBlock = HeapAlloc(GetProcessHeap(), 0,
    879        ulWholeArraySize * psa->cbElements)) == NULL) 
     880       ulWholeArraySize * psa->cbElements)) == NULL)
    880881        return FALSE;
    881882
     
    887888}
    888889
    889 /************************************************************************ 
    890  * Used to set the fFeatures data member of the SAFEARRAY structure. 
     890/************************************************************************
     891 * Used to set the fFeatures data member of the SAFEARRAY structure.
    891892 */
    892893static INT getFeatures(
    893   VARTYPE vt) 
     894  VARTYPE vt)
    894895{
    895896  switch(vt) {
     
    901902}
    902903
    903 /************************************************************************ 
    904  * Used to figure out if the fFeatures data member of the SAFEARRAY 
    905  * structure contain any information about the type of data stored... 
     904/************************************************************************
     905 * Used to figure out if the fFeatures data member of the SAFEARRAY
     906 * structure contain any information about the type of data stored...
    906907 */
    907908static BOOL isPointer(
    908   USHORT feature) 
     909  USHORT feature)
    909910{
    910911  switch(feature) {
     
    915916}
    916917
    917 /************************************************************************ 
    918  * Used to calculate the displacement when accessing or modifying 
     918/************************************************************************
     919 * Used to calculate the displacement when accessing or modifying
    919920 * safearray data set.
    920921 *
     
    926927 */
    927928static ULONG calcDisplacement(
    928   LONG           *coor, 
    929   SAFEARRAYBOUND *mat, 
    930   LONG           dim) 
     929  LONG           *coor,
     930  SAFEARRAYBOUND *mat,
     931  LONG           dim)
    931932{
    932933  ULONG res = 0;
    933934  LONG  iterDim;
    934935
    935   for(iterDim=0; iterDim<dim; iterDim++) 
     936  for(iterDim=0; iterDim<dim; iterDim++)
    936937    /* the -mat[dim] bring coor[dim] relative to 0 for calculation */
    937     res += ((coor[iterDim]-mat[iterDim].lLbound) * 
     938    res += ((coor[iterDim]-mat[iterDim].lLbound) *
    938939            endOfDim(coor, mat, iterDim+1, dim));
    939940
     
    942943}
    943944
    944 /************************************************************************ 
    945  * Recursivity agent for calcDisplacement method.  Used within Put and 
     945/************************************************************************
     946 * Recursivity agent for calcDisplacement method.  Used within Put and
    946947 * Get methods.
    947948 */
    948949static INT endOfDim(
    949   LONG           *coor, 
    950   SAFEARRAYBOUND *mat, 
    951   LONG           dim, 
    952   LONG           realDim) 
    953 {
    954   if(dim==realDim) 
     950  LONG           *coor,
     951  SAFEARRAYBOUND *mat,
     952  LONG           dim,
     953  LONG           realDim)
     954{
     955  if(dim==realDim)
    955956    return 1;
    956   else 
     957  else
    957958    return (endOfDim(coor, mat, dim+1, realDim) * mat[dim].cElements);
    958959}
    959960
    960961
    961 /************************************************************************ 
    962  * Method used to validate the coordinate received in Put and Get 
     962/************************************************************************
     963 * Method used to validate the coordinate received in Put and Get
    963964 * methods.
    964965 */
    965966static BOOL validCoordinate(
    966   LONG      *coor, 
    967   SAFEARRAY *psa) 
     967  LONG      *coor,
     968  SAFEARRAY *psa)
    968969{
    969970  INT   iter=0;
     
    977978    if((hRes = SafeArrayGetUBound(psa, iter, &lUBound)) != S_OK)
    978979      return FALSE;
    979  
    980     if(lLBound == lUBound) 
    981       return FALSE; 
    982    
     980
     981    if(lLBound == lUBound)
     982      return FALSE;
     983
    983984    if((coor[iter] >= lLBound) && (coor[iter] <= lUBound))
    984985      return TRUE;
     
    987988  }
    988989  return FALSE;
    989 } 
    990 
    991 /************************************************************************ 
     990}
     991
     992/************************************************************************
    992993 * Method used to calculate the number of cells of the SA
    993994 */
    994995static ULONG getArraySize(
    995   SAFEARRAY *psa) 
    996 {
    997   USHORT cCount; 
     996  SAFEARRAY *psa)
     997{
     998  USHORT cCount;
    998999  ULONG  ulWholeArraySize = 1;
    9991000
     
    10011002    ulWholeArraySize *= psa->rgsabound[cCount].cElements;
    10021003
    1003   return ulWholeArraySize; 
    1004 }
    1005 
    1006 
    1007 /************************************************************************ 
     1004  return ulWholeArraySize;
     1005}
     1006
     1007
     1008/************************************************************************
    10081009 * Method used to handle data space dupplication for Copy32 and CopyData32
    10091010 */
    10101011static HRESULT duplicateData(
    1011   SAFEARRAY *psa, 
    1012   SAFEARRAY **ppsaOut) 
     1012  SAFEARRAY *psa,
     1013  SAFEARRAY **ppsaOut)
    10131014{
    10141015  ULONG    ulWholeArraySize; /* size of the thing */
     
    10181019
    10191020  ulWholeArraySize = getArraySize(psa); /* Number of item in SA */
    1020  
     1021
    10211022  SafeArrayLock(*ppsaOut);
    10221023
    1023   if( isPointer(psa->fFeatures) ) {  /* If datatype is object increment 
     1024  if( isPointer(psa->fFeatures) ) {  /* If datatype is object increment
    10241025                                        object's reference count */
    10251026
     
    10321033
    10331034    /* Copy the source array data into target array */
    1034     memcpy((*ppsaOut)->pvData, psa->pvData, 
     1035    memcpy((*ppsaOut)->pvData, psa->pvData,
    10351036      ulWholeArraySize*psa->cbElements);
    10361037
    1037   } else if( psa->fFeatures & FADF_BSTR ) { /* if datatype is BSTR allocate 
     1038  } else if( psa->fFeatures & FADF_BSTR ) { /* if datatype is BSTR allocate
    10381039                                               the BSTR in the new array */
    10391040
     
    10461047      }
    10471048
    1048       *((BSTR*)((char *) (*ppsaOut)->pvData+(lDelta * psa->cbElements))) = 
     1049      *((BSTR*)((char *) (*ppsaOut)->pvData+(lDelta * psa->cbElements))) =
    10491050        pbstrReAllocStr;
    10501051    }
     
    10521053  } else { /* Simply copy the source array data into target array */
    10531054
    1054     memcpy((*ppsaOut)->pvData, psa->pvData, 
     1055    memcpy((*ppsaOut)->pvData, psa->pvData,
    10551056      ulWholeArraySize*psa->cbElements);
    10561057  }
     
    10621063
    10631064
    1064 /************************************************************************ 
    1065  *              SafeArrayGetVarType
     1065/************************************************************************
     1066 *      SafeArrayGetVarType
    10661067 * Returns the VARTYPE stored in the given safearray
    10671068 */
     
    10991100    hr = S_OK;
    11001101  }
    1101  
     1102
    11021103  TRACE("HRESULT = %08lx", hr);
    11031104  return hr;
  • trunk/src/oleaut32/typelib.c

    r6575 r6648  
     1/* $Id: typelib.c,v 1.6 2001-09-05 13:19:01 bird Exp $ */
    12/*
    2  *      TYPELIB
    3  *
    4  *      Copyright 1997  Marcus Meissner
    5  *                    1999  Rein Klazes
    6  *                    2000  Francois Jacques
     3 *  TYPELIB
     4 *
     5 *  Copyright 1997  Marcus Meissner
     6 *            1999  Rein Klazes
     7 *            2000  Francois Jacques
    78 * --------------------------------------------------------------------------------------
    89 * Known problems (2000, Francois Jacques)
    910 *
    1011 * - Tested using OLEVIEW (Platform SDK tool) only.
    11  *   
    12  * - dual interface dispinterfaces. vtable-interface ITypeInfo instances are 
    13  *   creating by doing a straight copy of the dispinterface instance and just changing 
     12 *
     13 * - dual interface dispinterfaces. vtable-interface ITypeInfo instances are
     14 *   creating by doing a straight copy of the dispinterface instance and just changing
    1415 *   its typekind. Pointed structures aren't copied - only the address of the pointers.
    1516 *   So when you release the dispinterface, you delete the vtable-interface structures
    1617 *   as well... fortunately, clean up of structures is not implemented.
    17  * 
     18 *
    1819 * - locale stuff is partially implemented but hasn't been tested.
    1920 *
     
    3940 * -. some methods just return pointers to internal data structures, this is
    4041 *      partly laziness, partly I want to check how windows does it.
    41  * 
     42 *
    4243 */
    4344#ifdef __WIN32OS2__
     
    8485#ifndef __WIN32OS2__
    8586/****************************************************************************
    86  *              QueryPathOfRegTypeLib   [TYPELIB.14]
     87 *      QueryPathOfRegTypeLib   [TYPELIB.14]
    8788 *
    8889 * the path is "Classes\Typelib\<guid>\<major>.<minor>\<lcid>\win16\"
    8990 * RETURNS
    90  *      path of typelib
     91 *  path of typelib
    9192 */
    9293HRESULT WINAPI
    93 QueryPathOfRegTypeLib16(       
    94         REFGUID guid,   /* [in] referenced guid */
    95         WORD wMaj,      /* [in] major version */
    96         WORD wMin,      /* [in] minor version */
    97         LCID lcid,      /* [in] locale id */
    98         LPBSTR16 path   /* [out] path of typelib */
     94QueryPathOfRegTypeLib16(
     95    REFGUID guid,   /* [in] referenced guid */
     96    WORD wMaj,  /* [in] major version */
     97    WORD wMin,  /* [in] minor version */
     98    LCID lcid,  /* [in] locale id */
     99    LPBSTR16 path   /* [out] path of typelib */
    99100) {
    100         char    xguid[80];
    101         char    typelibkey[100],pathname[260];
    102         DWORD   plen;
    103 
    104         TRACE("\n");
    105 
    106         if (HIWORD(guid)) {
     101    char    xguid[80];
     102    char    typelibkey[100],pathname[260];
     103    DWORD   plen;
     104
     105        TRACE("\n");
     106
     107    if (HIWORD(guid)) {
    107108            sprintf( typelibkey, "SOFTWARE\\Classes\\Typelib\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\%d.%d\\%lx\\win16",
    108109                     guid->Data1, guid->Data2, guid->Data3,
     
    110111                     guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7],
    111112                     wMaj,wMin,lcid);
    112         } else {
    113                 sprintf(xguid,"<guid 0x%08lx>",(DWORD)guid);
    114                 FIXME("(%s,%d,%d,0x%04lx,%p),can't handle non-string guids.\n",xguid,wMaj,wMin,(DWORD)lcid,path);
    115                 return E_FAIL;
    116         }
    117         plen = sizeof(pathname);
    118         if (RegQueryValueA(HKEY_LOCAL_MACHINE,typelibkey,pathname,&plen)) {
    119                 /* try again without lang specific id */
    120                 if (SUBLANGID(lcid))
    121                         return QueryPathOfRegTypeLib16(guid,wMaj,wMin,PRIMARYLANGID(lcid),path);
    122                 FIXME("key %s not found\n",typelibkey);
    123                 return E_FAIL;
    124         }
    125         *path = SysAllocString16(pathname);
    126         return S_OK;
     113    } else {
     114        sprintf(xguid,"<guid 0x%08lx>",(DWORD)guid);
     115        FIXME("(%s,%d,%d,0x%04lx,%p),can't handle non-string guids.\n",xguid,wMaj,wMin,(DWORD)lcid,path);
     116        return E_FAIL;
     117    }
     118    plen = sizeof(pathname);
     119    if (RegQueryValueA(HKEY_LOCAL_MACHINE,typelibkey,pathname,&plen)) {
     120        /* try again without lang specific id */
     121        if (SUBLANGID(lcid))
     122            return QueryPathOfRegTypeLib16(guid,wMaj,wMin,PRIMARYLANGID(lcid),path);
     123        FIXME("key %s not found\n",typelibkey);
     124        return E_FAIL;
     125    }
     126    *path = SysAllocString16(pathname);
     127    return S_OK;
    127128}
    128129#endif
    129  
     130
    130131/****************************************************************************
    131  *              QueryPathOfRegTypeLib   [OLEAUT32.164]
     132 *      QueryPathOfRegTypeLib   [OLEAUT32.164]
    132133 * RETURNS
    133  *      path of typelib
     134 *  path of typelib
    134135 */
    135136HRESULT WINAPI
    136 QueryPathOfRegTypeLib( 
    137         REFGUID guid,   /* [in] referenced guid */
    138         WORD wMaj,      /* [in] major version */
    139         WORD wMin,      /* [in] minor version */
    140         LCID lcid,      /* [in] locale id */
    141         LPBSTR path )   /* [out] path of typelib */
     137QueryPathOfRegTypeLib(
     138    REFGUID guid,   /* [in] referenced guid */
     139    WORD wMaj,  /* [in] major version */
     140    WORD wMin,  /* [in] minor version */
     141    LCID lcid,  /* [in] locale id */
     142    LPBSTR path )   /* [out] path of typelib */
    142143{
    143144    /* don't need to ZeroMemory those arrays since sprintf and RegQueryValue add
     
    171172            "SOFTWARE\\Classes\\Typelib\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\%d.%d\\%lx\\win32",
    172173            guid->Data1,    guid->Data2,    guid->Data3,
    173             guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], 
     174            guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
    174175            guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7],
    175176            wMaj,
     
    211212        }
    212213    }
    213        
     214
    214215    if (hr != S_OK)
    215                 TRACE_(typelib)("%s not found\n", szTypeLibKey);
    216        
     216        TRACE_(typelib)("%s not found\n", szTypeLibKey);
     217
    217218    return hr;
    218219}
     
    226227 */
    227228HRESULT WINAPI CreateTypeLib(
    228         SYSKIND syskind, LPCOLESTR szFile, ICreateTypeLib** ppctlib
     229    SYSKIND syskind, LPCOLESTR szFile, ICreateTypeLib** ppctlib
    229230) {
    230231    FIXME("(%d,%s,%p), stub!\n",syskind,debugstr_w(szFile),ppctlib);
     
    256257
    257258/******************************************************************************
    258  *              LoadTypeLib     [OLEAUT32.161]
     259 *      LoadTypeLib [OLEAUT32.161]
    259260 * Loads and registers a type library
    260261 * NOTES
     
    277278
    278279/******************************************************************************
    279  *              LoadTypeLibEx   [OLEAUT32.183]
     280 *      LoadTypeLibEx   [OLEAUT32.183]
    280281 * Loads and optionally registers a type library
    281282 *
     
    292293    HRESULT res;
    293294    TRACE("(%s,%d,%p)\n",debugstr_w(szFile), regkind, pptLib);
    294    
     295
    295296    p=HEAP_strdupWtoA(GetProcessHeap(),0,szFile);
    296    
     297
    297298    res= TLB_ReadTypeLib(p, (ITypeLib2**)pptLib);
    298299
     
    323324
    324325/******************************************************************************
    325  *              LoadRegTypeLib  [OLEAUT32.162]
    326  */
    327 HRESULT WINAPI LoadRegTypeLib( 
    328         REFGUID rguid,          /* [in] referenced guid */
    329         WORD wVerMajor,         /* [in] major version */
    330         WORD wVerMinor,         /* [in] minor version */
    331         LCID lcid,              /* [in] locale id */
    332         ITypeLib **ppTLib)      /* [out] path of typelib */
     326 *      LoadRegTypeLib  [OLEAUT32.162]
     327 */
     328HRESULT WINAPI LoadRegTypeLib(
     329    REFGUID rguid,      /* [in] referenced guid */
     330    WORD wVerMajor,     /* [in] major version */
     331    WORD wVerMinor,     /* [in] minor version */
     332    LCID lcid,      /* [in] locale id */
     333    ITypeLib **ppTLib)  /* [out] path of typelib */
    333334{
    334335    BSTR bstr=NULL;
     
    344345
    345346    return res;
    346 }       
     347}
    347348
    348349
    349350/******************************************************************************
    350  *              RegisterTypeLib [OLEAUT32.163]
    351  * Adds information about a type library to the System Registry           
     351 *      RegisterTypeLib [OLEAUT32.163]
     352 * Adds information about a type library to the System Registry
    352353 * NOTES
    353354 *    Docs: ITypeLib FAR * ptlib
     
    363364     OLECHAR * szFullPath, /* [in] full Path of the library*/
    364365     OLECHAR * szHelpDir)  /* [in] dir to the helpfile for the library,
    365                                                         may be NULL*/
     366                            may be NULL*/
    366367{
    367368    HRESULT res;
     
    444445
    445446/******************************************************************************
    446  *      UnRegisterTypeLib       [OLEAUT32.186]
    447  * Removes information about a type library from the System Registry           
     447 *  UnRegisterTypeLib   [OLEAUT32.186]
     448 * Removes information about a type library from the System Registry
    448449 * NOTES
    449450 *
     
    453454 */
    454455HRESULT WINAPI UnRegisterTypeLib(
    455     REFGUID libid,      /* [in] Guid of the library */
    456         WORD wVerMajor, /* [in] major version */
    457         WORD wVerMinor, /* [in] minor version */
    458         LCID lcid,      /* [in] locale id */
    459         SYSKIND syskind)
    460 {   
     456    REFGUID libid,  /* [in] Guid of the library */
     457    WORD wVerMajor, /* [in] major version */
     458    WORD wVerMinor, /* [in] minor version */
     459    LCID lcid,  /* [in] locale id */
     460    SYSKIND syskind)
     461{
    461462    TRACE("(IID: %s): stub\n",debugstr_guid(libid));
    462     return S_OK;        /* FIXME: pretend everything is OK */
     463    return S_OK;    /* FIXME: pretend everything is OK */
    463464}
    464465
    465466#ifndef __WIN32OS2__
    466467/****************************************************************************
    467  *      OaBuildVersion                          (TYPELIB.15)
     468 *  OaBuildVersion              (TYPELIB.15)
    468469 *
    469470 * known TYPELIB.DLL versions:
    470471 *
    471  * OLE 2.01 no OaBuildVersion() avail   1993    --      ---
    472  * OLE 2.02                             1993-94 02     3002
    473  * OLE 2.03                                     23      730
    474  * OLE 2.03                                     03     3025
    475  * OLE 2.03 W98 SE orig. file !!        1993-95 10     3024
    476  * OLE 2.1   NT                         1993-95 ??      ???
    477  * OLE 2.3.1 W95                                23      700
    478  * OLE2 4.0  NT4SP6                     1993-98 40     4277
     472 * OLE 2.01 no OaBuildVersion() avail   1993    --  ---
     473 * OLE 2.02             1993-94 02     3002
     474 * OLE 2.03                 23  730
     475 * OLE 2.03                 03     3025
     476 * OLE 2.03 W98 SE orig. file !!    1993-95 10     3024
     477 * OLE 2.1   NT             1993-95 ??  ???
     478 * OLE 2.3.1 W95                23  700
     479 * OLE2 4.0  NT4SP6         1993-98 40     4277
    479480 */
    480481DWORD WINAPI OaBuildVersion16(void)
     
    488489    {
    489490    case 0x80000a03:  /* WIN31 */
    490                 return MAKELONG(3027, 3); /* WfW 3.11 */
     491        return MAKELONG(3027, 3); /* WfW 3.11 */
    491492    case 0x80000004:  /* WIN95 */
    492                 return MAKELONG(700, 23); /* Win95A */
     493        return MAKELONG(700, 23); /* Win95A */
    493494    case 0x80000a04:  /* WIN98 */
    494                 return MAKELONG(3024, 10); /* W98 SE */
     495        return MAKELONG(3024, 10); /* W98 SE */
    495496    case 0x00000004:  /* NT4 */
    496                 return MAKELONG(4277, 40); /* NT4 SP6 */
     497        return MAKELONG(4277, 40); /* NT4 SP6 */
    497498    default:
    498         FIXME("Version value not known yet. Please investigate it!\n");
    499                 return 0;
     499    FIXME("Version value not known yet. Please investigate it!\n");
     500        return 0;
    500501    }
    501502}
     
    507508/*======================= ITypeLib implementation =======================*/
    508509
    509 typedef struct tagTLBCustData 
     510typedef struct tagTLBCustData
    510511{
    511512    GUID guid;
     
    521522    BSTR name;                  /* name; */
    522523
    523         LCID lcid;                                      /* lcid of imported typelib */
    524 
    525         WORD wVersionMajor;         /* major version number */
     524    LCID lcid;                  /* lcid of imported typelib */
     525
     526    WORD wVersionMajor;         /* major version number */
    526527    WORD wVersionMinor;         /* minor version number */
    527528
     
    536537    UINT ref;
    537538    TLIBATTR LibAttr;            /* guid,lcid,syskind,version,flags */
    538    
     539
    539540    /* strings can be stored in tlb as multibyte strings BUT they are *always*
    540         * exported to the application as a UNICODE string.
    541         */
    542         BSTR Name;
     541    * exported to the application as a UNICODE string.
     542    */
     543    BSTR Name;
    543544    BSTR DocString;
    544545    BSTR HelpFile;
     
    579580    int ctCustData;
    580581    TLBCustData * pCustData;        /* linked list to cust data; */
    581         TLBRefType * pRefType;                  /* linked list to referenced types */
     582    TLBRefType * pRefType;          /* linked list to referenced types */
    582583} TLBParDesc;
    583584
     
    594595    int ctCustData;
    595596    TLBCustData * pCustData;        /* linked list to cust data; */
    596     struct tagTLBFuncDesc * next; 
     597    struct tagTLBFuncDesc * next;
    597598} TLBFuncDesc;
    598599
     
    607608    int ctCustData;
    608609    TLBCustData * pCustData;/* linked list to cust data; */
    609     struct tagTLBVarDesc * next; 
     610    struct tagTLBVarDesc * next;
    610611} TLBVarDesc;
    611612
     
    618619    ITypeLibImpl * pTypeLib;        /* back pointer to typelib */
    619620    int index;                  /* index in this typelib; */
    620     /* type libs seem to store the doc strings in ascii 
     621    /* type libs seem to store the doc strings in ascii
    621622     * so why should we do it in unicode?
    622623     */
     
    633634
    634635    /* Implemented Interfaces  */
    635     TLBRefType * impltypelist;     
     636    TLBRefType * impltypelist;
    636637    int ctCustData;
    637638    TLBCustData * pCustData;        /* linked list to cust data; */
     
    645646typedef struct tagTLBContext
    646647{
    647         unsigned int oStart;  /* start of TLB in file */
    648         unsigned int pos;     /* current pos */
    649         unsigned int length;  /* total length */
    650         void *mapping;        /* memory mapping */
    651         TLBSegDir * pTblDir;
    652         ITypeLibImpl* pLibInfo;
     648    unsigned int oStart;  /* start of TLB in file */
     649    unsigned int pos;     /* current pos */
     650    unsigned int length;  /* total length */
     651    void *mapping;        /* memory mapping */
     652    TLBSegDir * pTblDir;
     653    ITypeLibImpl* pLibInfo;
    653654} TLBContext;
    654655
     
    744745static void dump_TLBFuncDesc(TLBFuncDesc * pfd)
    745746{
    746         while (pfd)
    747         {
    748           dump_TLBFuncDescOne(pfd);
    749           pfd = pfd->next;
    750         };
     747    while (pfd)
     748    {
     749      dump_TLBFuncDescOne(pfd);
     750      pfd = pfd->next;
     751    };
    751752}
    752753static void dump_TLBVarDesc(TLBVarDesc * pvd)
    753754{
    754         while (pvd)
    755         {
    756           TRACE_(typelib)("%s\n", debugstr_w(pvd->Name));
    757           pvd = pvd->next;
    758         };
     755    while (pvd)
     756    {
     757      TRACE_(typelib)("%s\n", debugstr_w(pvd->Name));
     758      pvd = pvd->next;
     759    };
    759760}
    760761static void dump_TLBRefType(TLBRefType * prt)
    761762{
    762         while (prt)
    763         {
    764           TRACE_(typelib)("%s\n", debugstr_guid(&(prt->guid)));
    765           TRACE_(typelib)("  href:0x%08lx\n", prt->reference);
    766           prt = prt->next;
    767         };
     763    while (prt)
     764    {
     765      TRACE_(typelib)("%s\n", debugstr_guid(&(prt->guid)));
     766      TRACE_(typelib)("  href:0x%08lx\n", prt->reference);
     767      prt = prt->next;
     768    };
    768769}
    769770
     
    771772{
    772773    char szVarType[15];
    773    
     774
    774775    TRACE("(%p)\n", pvar);
    775  
     776
    776777    if (!pvar)  return;
    777  
     778
    778779    ZeroMemory(szVarType, sizeof(szVarType));
    779                
     780
    780781    /* FIXME : we could have better trace here, depending on the VARTYPE
    781782     * of the variant
     
    784785
    785786    TRACE("VARTYPE: %s\n", szVarType);
    786    
     787
    787788    switch (V_VT(pvar))
    788789    {
     
    790791            TRACE("%3.3e\n", V_UNION(pvar, fltVal));
    791792            break;
    792            
     793
    793794        case VT_R8:
    794795            TRACE("%3.3e\n", V_UNION(pvar, dblVal));
    795796            break;
    796            
     797
    797798        default:
    798799            TRACE("%ld\n", V_UNION(pvar, lVal));
    799800            break;
    800     }       
     801    }
    801802
    802803    if (V_VT(pvar) & VT_BYREF)
     
    807808{
    808809    int index = 0;
    809    
     810
    810811    TRACE("args=%u named args=%u\n", pdp->cArgs, pdp->cNamedArgs);
    811812
     
    819820static char * typekind_desc[] =
    820821{
    821         "TKIND_ENUM",
    822         "TKIND_RECORD",
    823         "TKIND_MODULE",
    824         "TKIND_INTERFACE",
    825         "TKIND_DISPATCH",
    826         "TKIND_COCLASS",
    827         "TKIND_ALIAS",
    828         "TKIND_UNION",
    829         "TKIND_MAX"
     822    "TKIND_ENUM",
     823    "TKIND_RECORD",
     824    "TKIND_MODULE",
     825    "TKIND_INTERFACE",
     826    "TKIND_DISPATCH",
     827    "TKIND_COCLASS",
     828    "TKIND_ALIAS",
     829    "TKIND_UNION",
     830    "TKIND_MAX"
    830831};
    831832
     
    846847static char * typekind_desc[] =
    847848{
    848         "TKIND_ENUM",
    849         "TKIND_RECORD",
    850         "TKIND_MODULE",
    851         "TKIND_INTERFACE",
    852         "TKIND_DISPATCH",
    853         "TKIND_COCLASS",
    854         "TKIND_ALIAS",
    855         "TKIND_UNION",
    856         "TKIND_MAX"
     849    "TKIND_ENUM",
     850    "TKIND_RECORD",
     851    "TKIND_MODULE",
     852    "TKIND_INTERFACE",
     853    "TKIND_DISPATCH",
     854    "TKIND_COCLASS",
     855    "TKIND_ALIAS",
     856    "TKIND_UNION",
     857    "TKIND_MAX"
    857858};
    858859#define  dump_TypeInfo(a)
     
    936937
    937938    TLB_Read(&niName, sizeof(niName), pcx,
    938                                 pcx->pTblDir->pNametab.offset+offset);
     939                pcx->pTblDir->pNametab.offset+offset);
    939940    niName.namelen &= 0xFF; /* FIXME: correct ? */
    940941    name=TLB_Alloc((niName.namelen & 0xff) +1);
     
    996997}
    997998/*
    998  * read a value and fill a VARIANT structure 
     999 * read a value and fill a VARIANT structure
    9991000 */
    10001001static void TLB_ReadValue( VARIANT * pVar, int offset, TLBContext *pcx )
     
    10091010        return;
    10101011    }
    1011     TLB_Read(&(V_VT(pVar)), sizeof(VARTYPE), pcx, 
     1012    TLB_Read(&(V_VT(pVar)), sizeof(VARTYPE), pcx,
    10121013        pcx->pTblDir->pCustData.offset + offset );
    10131014    TRACE_(typelib)("Vartype = %x\n", V_VT(pVar));
     
    10181019        case VT_I4  :
    10191020        case VT_R4  :
    1020         case VT_ERROR   : 
    1021         case VT_BOOL    : 
    1022         case VT_I1  : 
    1023         case VT_UI1 : 
    1024         case VT_UI2 : 
    1025         case VT_UI4 : 
    1026         case VT_INT : 
    1027         case VT_UINT    : 
     1021        case VT_ERROR   :
     1022        case VT_BOOL    :
     1023        case VT_I1  :
     1024        case VT_UI1 :
     1025        case VT_UI2 :
     1026        case VT_UI4 :
     1027        case VT_INT :
     1028        case VT_UINT    :
    10281029        case VT_VOID    : /* FIXME: is this right? */
    1029         case VT_HRESULT : 
     1030        case VT_HRESULT :
    10301031            size=4; break;
    10311032        case VT_R8  :
    10321033        case VT_CY  :
    1033         case VT_DATE    : 
    1034         case VT_I8  : 
    1035         case VT_UI8 : 
     1034        case VT_DATE    :
     1035        case VT_I8  :
     1036        case VT_UI8 :
    10361037        case VT_DECIMAL :  /* FIXME: is this right? */
    10371038        case VT_FILETIME :
     
    10411042            char * ptr;
    10421043            TLB_Read(&size, sizeof(INT), pcx, DO_NOT_SEEK );
    1043             if(size <= 0) {
    1044                 FIXME("BSTR length = %d?\n", size);
    1045             } else {
     1044        if(size <= 0) {
     1045            FIXME("BSTR length = %d?\n", size);
     1046        } else {
    10461047                ptr=TLB_Alloc(size);/* allocate temp buffer */
    1047                 TLB_Read(ptr, size, pcx, DO_NOT_SEEK); /* read string (ANSI) */
    1048                 V_UNION(pVar, bstrVal)=SysAllocStringLen(NULL,size);
    1049                 /* FIXME: do we need a AtoW conversion here? */
    1050                 V_UNION(pVar, bstrVal[size])=L'\0';
    1051                 while(size--) V_UNION(pVar, bstrVal[size])=ptr[size];
    1052                 TLB_Free(ptr);
    1053             }
    1054         }
    1055         size=-4; break;
     1048        TLB_Read(ptr, size, pcx, DO_NOT_SEEK); /* read string (ANSI) */
     1049        V_UNION(pVar, bstrVal)=SysAllocStringLen(NULL,size);
     1050        /* FIXME: do we need a AtoW conversion here? */
     1051        V_UNION(pVar, bstrVal[size])=L'\0';
     1052        while(size--) V_UNION(pVar, bstrVal[size])=ptr[size];
     1053        TLB_Free(ptr);
     1054        }
     1055    }
     1056    size=-4; break;
    10561057    /* FIXME: this will not work AT ALL when the variant contains a pointer */
    10571058        case VT_DISPATCH :
    1058         case VT_VARIANT : 
    1059         case VT_UNKNOWN : 
    1060         case VT_PTR : 
     1059        case VT_VARIANT :
     1060        case VT_UNKNOWN :
     1061        case VT_PTR :
    10611062        case VT_SAFEARRAY :
    1062         case VT_CARRAY  : 
    1063         case VT_USERDEFINED : 
    1064         case VT_LPSTR   : 
    1065         case VT_LPWSTR  : 
    1066         case VT_BLOB    : 
    1067         case VT_STREAM  : 
    1068         case VT_STORAGE : 
    1069         case VT_STREAMED_OBJECT : 
    1070         case VT_STORED_OBJECT   : 
    1071         case VT_BLOB_OBJECT : 
    1072         case VT_CF  : 
    1073         case VT_CLSID   : 
    1074         default: 
    1075             size=0; 
     1063        case VT_CARRAY  :
     1064        case VT_USERDEFINED :
     1065        case VT_LPSTR   :
     1066        case VT_LPWSTR  :
     1067        case VT_BLOB    :
     1068        case VT_STREAM  :
     1069        case VT_STORAGE :
     1070        case VT_STREAMED_OBJECT :
     1071        case VT_STORED_OBJECT   :
     1072        case VT_BLOB_OBJECT :
     1073        case VT_CF  :
     1074        case VT_CLSID   :
     1075        default:
     1076            size=0;
    10761077            FIXME("VARTYPE %d is not supported, setting pointer to NULL\n",
    10771078                V_VT(pVar));
     
    10961097        count++;
    10971098        pNew=TLB_Alloc(sizeof(TLBCustData));
    1098         TLB_Read(&entry, sizeof(entry), pcx, 
     1099        TLB_Read(&entry, sizeof(entry), pcx,
    10991100            pcx->pTblDir->pCDGuids.offset+offset);
    11001101        TLB_ReadGuid(&(pNew->guid), entry.GuidOffset , pcx);
     
    11181119}
    11191120
    1120 static void 
    1121 TLB_DoFuncs(TLBContext*     pcx, 
    1122             int             cFuncs, 
     1121static void
     1122TLB_DoFuncs(TLBContext*     pcx,
     1123            int             cFuncs,
    11231124            int             cVars,
    1124             int             offset, 
     1125            int             offset,
    11251126            TLBFuncDesc**   pptfd)
    11261127{
    1127     /* 
     1128    /*
    11281129     * member information is stored in a data structure at offset
    11291130     * indicated by the memoffset field of the typeinfo structure
    11301131     * There are several distinctive parts.
    1131      * the first part starts with a field that holds the total length 
     1132     * the first part starts with a field that holds the total length
    11321133     * of this (first) part excluding this field. Then follow the records,
    11331134     * for each member there is one record.
    11341135     *
    11351136     * First entry is always the length of the record (excluding this
    1136      * length word). 
    1137      * Rest of the record depends on the type of the member. If there is 
     1137     * length word).
     1138     * Rest of the record depends on the type of the member. If there is
    11381139     * a field indicating the member type (function variable intereface etc)
    11391140     * I have not found it yet. At this time we depend on the information
     
    11421143     * Second follows an array sized nrMEM*sizeof(INT) with a memeber id
    11431144     * for each member;
    1144      * 
    1145      * Third is a equal sized array with file offsets to the name entry 
     1145     *
     1146     * Third is a equal sized array with file offsets to the name entry
    11461147     * of each member.
    1147      * 
     1148     *
    11481149     * Forth and last (?) part is an array with offsets to the records in the
    11491150     * first part of this file segment.
     
    11651166
    11661167        /* name, eventually add to a hash table */
    1167         TLB_Read(&nameoffset, 
    1168                  sizeof(INT), 
    1169                  pcx, 
     1168        TLB_Read(&nameoffset,
     1169                 sizeof(INT),
     1170                 pcx,
    11701171                 offset + infolen + (cFuncs + cVars + i + 1) * sizeof(INT));
    11711172
     
    11741175        /* read the function information record */
    11751176        TLB_Read(&reclength, sizeof(INT), pcx, recoffset);
    1176        
     1177
    11771178        reclength &= 0x1ff;
    11781179
    1179         TLB_Read(pFuncRec, reclength - sizeof(INT), pcx, DO_NOT_SEEK) ; 
     1180        TLB_Read(pFuncRec, reclength - sizeof(INT), pcx, DO_NOT_SEEK) ;
    11801181
    11811182        /* do the attributes */
     
    11861187        {
    11871188            (*pptfd)->helpcontext = pFuncRec->OptAttr[0] ;
    1188            
     1189
    11891190            if ( nrattributes > 1 )
    11901191            {
     
    12091210                        if ( nrattributes > 6 && pFuncRec->FKCCIC & 0x80 )
    12101211                        {
    1211                             TLB_CustData(pcx, 
     1212                            TLB_CustData(pcx,
    12121213                                         pFuncRec->OptAttr[6],
    12131214                                         &(*pptfd)->pCustData);
     
    12191220
    12201221        /* fill the FuncDesc Structure */
    1221         TLB_Read( & (*pptfd)->funcdesc.memid, 
    1222                   sizeof(INT), pcx, 
     1222        TLB_Read( & (*pptfd)->funcdesc.memid,
     1223                  sizeof(INT), pcx,
    12231224                  offset + infolen + ( i + 1) * sizeof(INT));
    12241225
     
    12311232        (*pptfd)->funcdesc.wFuncFlags =   LOWORD(pFuncRec->Flags) ;
    12321233
    1233         TLB_GetTdesc(pcx, 
    1234                      pFuncRec->DataType,   
     1234        TLB_GetTdesc(pcx,
     1235                     pFuncRec->DataType,
    12351236                     &(*pptfd)->funcdesc.elemdescFunc.tdesc) ;
    12361237
     
    12411242            TLBParameterInfo paraminfo;
    12421243
    1243             (*pptfd)->funcdesc.lprgelemdescParam = 
     1244            (*pptfd)->funcdesc.lprgelemdescParam =
    12441245                TLB_Alloc(pFuncRec->nrargs * sizeof(ELEMDESC));
    12451246
    1246             (*pptfd)->pParamDesc = 
     1247            (*pptfd)->pParamDesc =
    12471248                TLB_Alloc(pFuncRec->nrargs * sizeof(TLBParDesc));
    12481249
    12491250            TLB_Read(&paraminfo,
    1250                      sizeof(paraminfo), 
    1251                      pcx, 
     1251                     sizeof(paraminfo),
     1252                     pcx,
    12521253                     recoffset + reclength -
    12531254                        pFuncRec->nrargs * sizeof(TLBParameterInfo));
     
    12571258                TYPEDESC* lpArgTypeDesc = 0;
    12581259
    1259                 TLB_GetTdesc(pcx, 
    1260                              paraminfo.DataType,   
     1260                TLB_GetTdesc(pcx,
     1261                             paraminfo.DataType,
    12611262                             &(*pptfd)->funcdesc.lprgelemdescParam[j].tdesc) ;
    12621263
     
    12651266                (*pptfd)->pParamDesc[j].Name = (void *) paraminfo.oName;
    12661267
    1267                 /* SEEK value = jump to offset, 
     1268                /* SEEK value = jump to offset,
    12681269                 * from there jump to the end of record,
    12691270                 * go back by (j-1) arguments
     
    12711272                TLB_Read( &paraminfo ,
    12721273                          sizeof(TLBParameterInfo), pcx,
    1273                           recoffset + reclength - ((pFuncRec->nrargs - j - 1) 
     1274                          recoffset + reclength - ((pFuncRec->nrargs - j - 1)
    12741275                                                   * sizeof(TLBParameterInfo)));
    1275                 lpArgTypeDesc = 
     1276                lpArgTypeDesc =
    12761277                    & ((*pptfd)->funcdesc.lprgelemdescParam[j].tdesc);
    12771278
     
    12891290
    12901291                    case VT_USERDEFINED:
    1291                         (*pptfd)->pParamDesc[j].pRefType = 
     1292                        (*pptfd)->pParamDesc[j].pRefType =
    12921293                        TLB_Alloc(sizeof(TLBRefType));
    12931294
    1294                         TLB_DoRefType(pcx, 
    1295                                       lpArgTypeDesc->u.hreftype, 
     1295                        TLB_DoRefType(pcx,
     1296                                      lpArgTypeDesc->u.hreftype,
    12961297                                      & ( (*pptfd)->pParamDesc[j].pRefType ));
    12971298
     
    13111312                TYPEDESC* lpArgTypeDesc;
    13121313
    1313                 (*pptfd)->funcdesc.elemdescFunc = 
     1314                (*pptfd)->funcdesc.elemdescFunc =
    13141315                (*pptfd)->funcdesc.lprgelemdescParam[j];
    13151316
     
    13241325                        break;
    13251326                    case VT_CARRAY:
    1326                         lpArgTypeDesc = 
     1327                        lpArgTypeDesc =
    13271328                        & (lpArgTypeDesc->u.lpadesc->tdescElem);
    13281329
     
    13301331
    13311332                    case VT_USERDEFINED:
    1332                         (*pptfd)->pParamDesc[j].pRefType 
     1333                        (*pptfd)->pParamDesc[j].pRefType
    13331334                        = TLB_Alloc(sizeof(TLBRefType));
    13341335
    1335                         TLB_DoRefType(pcx, 
    1336                                       lpArgTypeDesc->u.hreftype, 
     1336                        TLB_DoRefType(pcx,
     1337                                      lpArgTypeDesc->u.hreftype,
    13371338                                      &((*pptfd)->pParamDesc[j].pRefType));
    13381339
     
    13541355
    13551356                /* default value */
    1356                 if ( (PARAMFLAG_FHASDEFAULT & 
     1357                if ( (PARAMFLAG_FHASDEFAULT &
    13571358                      (*pptfd)->funcdesc.lprgelemdescParam[j].u.paramdesc.wParamFlags) &&
    13581359                     ((pFuncRec->FKCCIC) & 0x1000) )
    13591360                {
    1360                     INT* pInt = (INT *)((char *)pFuncRec + 
    1361                                    reclength - 
     1361                    INT* pInt = (INT *)((char *)pFuncRec +
     1362                                   reclength -
    13621363                                   (pFuncRec->nrargs * 4 + 1) * sizeof(INT) );
    13631364
     
    13671368                    pParamDesc->pparamdescex->cBytes = sizeof(PARAMDESCEX);
    13681369
    1369                     TLB_ReadValue(&(pParamDesc->pparamdescex->varDefaultValue), 
     1370                    TLB_ReadValue(&(pParamDesc->pparamdescex->varDefaultValue),
    13701371                        pInt[j], pcx);
    13711372                }
     
    13731374                if ( nrattributes > 7 + j && pFuncRec->FKCCIC & 0x80 )
    13741375                {
    1375                     TLB_CustData(pcx, 
     1376                    TLB_CustData(pcx,
    13761377                                 pFuncRec->OptAttr[7+j],
    13771378                                 &(*pptfd)->pParamDesc[j].pCustData);
     
    14001401
    14011402    TLB_Read(&infolen,sizeof(INT), pcx, offset);
    1402     TLB_Read(&recoffset,sizeof(INT), pcx, offset + infolen + 
     1403    TLB_Read(&recoffset,sizeof(INT), pcx, offset + infolen +
    14031404        ((cFuncs+cVars)*2+cFuncs + 1)*sizeof(INT));
    14041405    recoffset += offset+sizeof(INT);
     
    14061407        *pptvd=TLB_Alloc(sizeof(TLBVarDesc));
    14071408    /* name, eventually add to a hash table */
    1408         TLB_Read(&nameoffset, sizeof(INT), pcx, 
     1409        TLB_Read(&nameoffset, sizeof(INT), pcx,
    14091410            offset + infolen + (cFuncs + cVars + i + 1) * sizeof(INT));
    14101411        (*pptvd)->Name=TLB_ReadName(pcx, nameoffset);
     
    14121413        TLB_Read(&reclength, sizeof(INT), pcx, recoffset);
    14131414        reclength &=0xff;
    1414         TLB_Read(pVarRec, reclength - sizeof(INT), pcx, DO_NOT_SEEK) ; 
     1415        TLB_Read(pVarRec, reclength - sizeof(INT), pcx, DO_NOT_SEEK) ;
    14151416    /* Optional data */
    14161417        if(reclength >(6*sizeof(INT)) )
     
    14221423            (*pptvd)->HelpStringContext=pVarRec->HelpStringContext;
    14231424    /* fill the VarDesc Structure */
    1424         TLB_Read(&(*pptvd)->vardesc.memid, sizeof(INT), pcx, 
     1425        TLB_Read(&(*pptvd)->vardesc.memid, sizeof(INT), pcx,
    14251426            offset + infolen + ( i + 1) * sizeof(INT));
    14261427        (*pptvd)->vardesc.varkind = pVarRec->VarKind;
    14271428        (*pptvd)->vardesc.wVarFlags = pVarRec->Flags;
    1428         TLB_GetTdesc(pcx, pVarRec->DataType,   
     1429        TLB_GetTdesc(pcx, pVarRec->DataType,
    14291430            &(*pptvd)->vardesc.elemdescVar.tdesc) ;
    14301431/*   (*pptvd)->vardesc.lpstrSchema; is reserved (SDK) fixme?? */
     
    14431444 * If comes from import, its an offset+1 in the ImpInfo table
    14441445 * */
    1445 static void TLB_DoRefType(TLBContext *pcx, 
     1446static void TLB_DoRefType(TLBContext *pcx,
    14461447                          int offset, TLBRefType ** pprtd)
    14471448{
     
    14571458        TRACE_(typelib)("offset %x, masked offset %x\n", offset, offset + (offset & 0xfffffffc));
    14581459
    1459         TLB_Read(&impinfo, sizeof(impinfo), pcx, 
     1460        TLB_Read(&impinfo, sizeof(impinfo), pcx,
    14601461            pcx->pTblDir->pImpInfo.offset + (offset & 0xfffffffc));
    14611462        for(j=0;pImpLib;j++){   /* search the known offsets of all import libraries */
     
    15381539    ptiRet->TypeAttr.cbSizeVft=tiBase.cbSizeVft; /* FIXME: this is only the non inherited part */
    15391540    if(ptiRet->TypeAttr.typekind == TKIND_ALIAS)
    1540         TLB_GetTdesc(pcx, tiBase.datatype1, 
     1541        TLB_GetTdesc(pcx, tiBase.datatype1,
    15411542            &ptiRet->TypeAttr.tdescAlias) ;
    15421543
     
    15561557    /* functions */
    15571558    if(ptiRet->TypeAttr.cFuncs >0 )
    1558         TLB_DoFuncs(pcx, ptiRet->TypeAttr.cFuncs ,ptiRet->TypeAttr.cVars, 
     1559        TLB_DoFuncs(pcx, ptiRet->TypeAttr.cFuncs ,ptiRet->TypeAttr.cVars,
    15591560        tiBase.memoffset, & ptiRet->funclist);
    15601561    /* variables */
    15611562    if(ptiRet->TypeAttr.cVars >0 )
    1562         TLB_DoVars(pcx, ptiRet->TypeAttr.cFuncs ,ptiRet->TypeAttr.cVars, 
     1563        TLB_DoVars(pcx, ptiRet->TypeAttr.cFuncs ,ptiRet->TypeAttr.cVars,
    15631564        tiBase.memoffset, & ptiRet->varlist);
    15641565    if(ptiRet->TypeAttr.cImplTypes >0 ){
     
    15661567        {
    15671568        case TKIND_COCLASS:
    1568             TLB_DoImplTypes(pcx, ptiRet->TypeAttr.cImplTypes , 
     1569            TLB_DoImplTypes(pcx, ptiRet->TypeAttr.cImplTypes ,
    15691570                tiBase.datatype1, & ptiRet->impltypelist);
    15701571            break;
    15711572        case TKIND_DISPATCH:
    15721573            ptiRet->impltypelist=TLB_Alloc(sizeof(TLBRefType));
    1573            
     1574
    15741575            if (tiBase.datatype1 != -1)
    15751576            {
     
    15801581              char* szStdOle     = "stdole2.tlb\0";
    15811582              int   nStdOleLen = strlen(szStdOle);
    1582                            
     1583
    15831584              ptiRet->impltypelist->guid             = IID_IDispatch;
    15841585              ptiRet->impltypelist->reference        = -1;
    15851586              ptiRet->impltypelist->pImpTLInfo       = TLB_Alloc(sizeof(TLBImpLib));
    1586               ptiRet->impltypelist->pImpTLInfo->guid = IID_StdOle;             
     1587              ptiRet->impltypelist->pImpTLInfo->guid = IID_StdOle;
    15871588              ptiRet->impltypelist->pImpTLInfo->name = SysAllocStringLen(NULL, nStdOleLen  + 1);
    1588              
     1589
    15891590              MultiByteToWideChar(CP_ACP,
    15901591                                  MB_PRECOMPOSED,
     
    15931594                                  ptiRet->impltypelist->pImpTLInfo->name,
    15941595                                  SysStringLen(ptiRet->impltypelist->pImpTLInfo->name));
    1595                                  
     1596
    15961597              ptiRet->impltypelist->pImpTLInfo->lcid          = 0;
    15971598              ptiRet->impltypelist->pImpTLInfo->wVersionMajor = 2;
     
    16171618
    16181619/****************************************************************************
    1619  *      TLB_ReadTypeLib
     1620 *  TLB_ReadTypeLib
    16201621 *
    16211622 * find the type of the typelib file and map the typelib resource into
     
    16391640
    16401641    /* is it a DLL? */
    1641         for (i=0 ; i < nStrLen ; ++i)
    1642         {
    1643             pszFileName[i] = tolower(pszFileName[i]);
    1644         }
     1642    for (i=0 ; i < nStrLen ; ++i)
     1643    {
     1644        pszFileName[i] = tolower(pszFileName[i]);
     1645    }
    16451646    pszTypeLibIndex = strstr(pszFileName, ".dll");
    16461647
     
    16561657      /* yes -> it's a index! store DLL name, without the trailing back-slash */
    16571658      size_t nMemToAlloc = pszTypeLibIndex - pszFileName;
    1658      
     1659
    16591660      pszDllName = HeapAlloc(GetProcessHeap(),
    1660                           HEAP_ZERO_MEMORY, 
     1661                          HEAP_ZERO_MEMORY,
    16611662                          nMemToAlloc + 1);
    1662                          
     1663
    16631664      strncpy(pszDllName, pszFileName, nMemToAlloc);
    1664      
     1665
    16651666      /* move index string pointer pass the backslash */
    16661667      while (*pszTypeLibIndex == '\\')
     
    16711672      /* No index, reset variable to 1 */
    16721673      pszDllName = HeapAlloc(GetProcessHeap(),
    1673                           HEAP_ZERO_MEMORY, 
     1674                          HEAP_ZERO_MEMORY,
    16741675                          nStrLen + 1);
    1675                          
     1676
    16761677      strncpy(pszDllName, pszFileName, nStrLen);
    1677      
     1678
    16781679      pszTypeLibIndex = "1\0";
    16791680    }
     
    16991700                /* retrieve file size */
    17001701                DWORD dwTLBLength = GetFileSize(hFile, NULL);
    1701    
     1702
    17021703            *ppTypeLib = ITypeLib2_Constructor(pBase, dwTLBLength);
    17031704            ITypeLib2_AddRef(*ppTypeLib);
     
    17251726            LPVOID pBase = LockResource(hGlobal);
    17261727            DWORD  dwTLBLength = SizeofResource(hinstDLL, hrsrc);
    1727            
     1728
    17281729            if (pBase)
    17291730            {
     
    17601761
    17611762/****************************************************************************
    1762  *      ITypeLib2_Constructor
     1763 *  ITypeLib2_Constructor
    17631764 *
    17641765 * loading a typelib from a in-memory image
     
    17861787    cx.pLibInfo = pTypeLibImpl;
    17871788    cx.length = dwTLBLength;
    1788    
     1789
    17891790    /* read header */
    17901791    TLB_Read((void*)&tlbHeader, sizeof(tlbHeader), &cx, 0);
     
    17921793    TRACE("\tmagic1=0x%08x ,magic2=0x%08x\n",tlbHeader.magic1,tlbHeader.magic2 );
    17931794    if (memcmp(&tlbHeader.magic1,TLBMAGIC2,4)) {
    1794         FIXME("Header type magic 0x%08x not supported.\n",tlbHeader.magic1);
    1795         return NULL;
     1795    FIXME("Header type magic 0x%08x not supported.\n",tlbHeader.magic1);
     1796    return NULL;
    17961797    }
    17971798    /* there is a small number of information here until the next important
     
    18021803    /* now read the segment directory */
    18031804    TRACE("read segment directory (at %ld)\n",lPSegDir);
    1804     TLB_Read((void*)&tlbSegDir, sizeof(tlbSegDir), &cx, lPSegDir); 
     1805    TLB_Read((void*)&tlbSegDir, sizeof(tlbSegDir), &cx, lPSegDir);
    18051806    cx.pTblDir = &tlbSegDir;
    18061807
     
    18091810    {
    18101811        ERR("cannot find the table directory, ptr=0x%lx\n",lPSegDir);
    1811         HeapFree(GetProcessHeap(),0,pTypeLibImpl);
    1812         return NULL;
     1812    HeapFree(GetProcessHeap(),0,pTypeLibImpl);
     1813    return NULL;
    18131814    }
    18141815
     
    18521853        TLB_Read(td, sizeof(td), &cx, tlbSegDir.pTypdescTab.offset);
    18531854        for(i=0; i<cTD; )
    1854         {
     1855    {
    18551856            /* FIXME: add several sanity checks here */
    18561857            pTypeLibImpl->pTypeDesc[i].vt = td[0] & VT_TYPEMASK;
    18571858            if(td[0] == VT_PTR || td[0] == VT_SAFEARRAY)
    1858             {
    1859                 /* FIXME: check safearray */
     1859        {
     1860            /* FIXME: check safearray */
    18601861                if(td[3] < 0)
    18611862                    pTypeLibImpl->pTypeDesc[i].u.lptdesc= & stndTypeDesc[td[2]];
     
    18631864                    pTypeLibImpl->pTypeDesc[i].u.lptdesc= & pTypeLibImpl->pTypeDesc[td[2]/8];
    18641865            }
    1865             else if(td[0] == VT_CARRAY)
     1866        else if(td[0] == VT_CARRAY)
    18661867            {
    1867                 /* array descr table here */
    1868                 pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)((int) td[2]);  /* temp store offset in*/
     1868            /* array descr table here */
     1869            pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)((int) td[2]);  /* temp store offset in*/
    18691870            }
    18701871            else if(td[0] == VT_USERDEFINED)
    1871             {
     1872        {
    18721873                pTypeLibImpl->pTypeDesc[i].u.hreftype = MAKELONG(td[2],td[3]);
    18731874            }
    1874             if(++i<cTD) TLB_Read(td, sizeof(td), &cx, DO_NOT_SEEK);
     1875        if(++i<cTD) TLB_Read(td, sizeof(td), &cx, DO_NOT_SEEK);
    18751876        }
    18761877
    18771878        /* second time around to fill the array subscript info */
    18781879        for(i=0;i<cTD;i++)
    1879         {
     1880    {
    18801881            if(pTypeLibImpl->pTypeDesc[i].vt != VT_CARRAY) continue;
    18811882            if(tlbSegDir.pArrayDescriptions.offset>0)
    1882             {
     1883        {
    18831884                TLB_Read(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (int) pTypeLibImpl->pTypeDesc[i].u.lpadesc);
    18841885                pTypeLibImpl->pTypeDesc[i].u.lpadesc = TLB_Alloc(sizeof(ARRAYDESC)+sizeof(SAFEARRAYBOUND)*(td[3]-1));
     
    18921893
    18931894                for(j = 0; j<td[2]; j++)
    1894                 {
    1895                     TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].cElements, 
     1895        {
     1896                    TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].cElements,
    18961897                        sizeof(INT), &cx, DO_NOT_SEEK);
    1897                     TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].lLbound, 
     1898                    TLB_Read(& pTypeLibImpl->pTypeDesc[i].u.lpadesc->rgbounds[j].lLbound,
    18981899                        sizeof(INT), &cx, DO_NOT_SEEK);
    18991900                }
    19001901            }
    1901             else
    1902             {
     1902        else
     1903        {
    19031904                pTypeLibImpl->pTypeDesc[i].u.lpadesc = NULL;
    19041905                ERR("didn't find array description data\n");
     
    19151916
    19161917        while(offset < tlbSegDir.pImpFiles.offset +tlbSegDir.pImpFiles.length)
    1917         {
     1918    {
    19181919            *ppImpLib = TLB_Alloc(sizeof(TLBImpLib));
    19191920            (*ppImpLib)->offset = offset - tlbSegDir.pImpFiles.offset;
    19201921            TLB_Read(&oGuid, sizeof(INT), &cx, offset);
    19211922
    1922                         TLB_Read(&(*ppImpLib)->lcid,          sizeof(LCID),   &cx, DO_NOT_SEEK);
     1923            TLB_Read(&(*ppImpLib)->lcid,          sizeof(LCID),   &cx, DO_NOT_SEEK);
    19231924            TLB_Read(&(*ppImpLib)->wVersionMajor, sizeof(WORD),   &cx, DO_NOT_SEEK);
    19241925            TLB_Read(&(*ppImpLib)->wVersionMinor, sizeof(WORD),   &cx, DO_NOT_SEEK);
     
    19591960 */
    19601961static HRESULT WINAPI ITypeLib2_fnQueryInterface(
    1961         ITypeLib2 * iface,
    1962         REFIID riid,
    1963         VOID **ppvObject)
     1962    ITypeLib2 * iface,
     1963    REFIID riid,
     1964    VOID **ppvObject)
    19641965{
    19651966    ICOM_THIS( ITypeLibImpl, iface);
     
    19681969
    19691970    *ppvObject=NULL;
    1970     if(IsEqualIID(riid, &IID_IUnknown) || 
     1971    if(IsEqualIID(riid, &IID_IUnknown) ||
    19711972       IsEqualIID(riid,&IID_ITypeLib)||
    19721973       IsEqualIID(riid,&IID_ITypeLib2))
     
    20032004
    20042005    --(This->ref);
    2005    
     2006
    20062007    TRACE("(%p)->(%u)\n",This, This->ref);
    20072008
     
    20352036          This->HelpStringDll = NULL;
    20362037      }
    2037    
     2038
    20382039      ITypeInfo_Release((ITypeInfo*) This->pTypeInfo);
    20392040      HeapFree(GetProcessHeap(),0,This);
     
    20452046
    20462047/* ITypeLib::GetTypeInfoCount
    2047  * 
     2048 *
    20482049 * Returns the number of type descriptions in the type library
    20492050 */
     
    20612062static HRESULT WINAPI ITypeLib2_fnGetTypeInfo(
    20622063    ITypeLib2 *iface,
    2063     UINT index, 
     2064    UINT index,
    20642065    ITypeInfo **ppTInfo)
    20652066{
    20662067    int i;
    2067    
     2068
    20682069    ICOM_THIS( ITypeLibImpl, iface);
    20692070    ITypeInfoImpl *pTypeInfo = This->pTypeInfo;
     
    20722073
    20732074    if (!ppTInfo) return E_INVALIDARG;
    2074    
     2075
    20752076    /* search element n in list */
    20762077    for(i=0; i < index; i++)
     
    20822083        return TYPE_E_ELEMENTNOTFOUND;
    20832084      }
    2084     }   
     2085    }
    20852086
    20862087    *ppTInfo = (ITypeInfo *) pTypeInfo;
    2087    
     2088
    20882089    ITypeInfo_AddRef(*ppTInfo);
    20892090    TRACE("-- found (%p)\n",*ppTInfo);
     
    21082109
    21092110    if(!pTKind) return E_INVALIDARG;
    2110    
     2111
    21112112    /* search element n in list */
    21122113    for(i=0; i < index; i++)
     
    21552156    }
    21562157
    2157     TRACE("-- found (%p, %s)\n", 
    2158           pTypeInfo, 
     2158    TRACE("-- found (%p, %s)\n",
     2159          pTypeInfo,
    21592160          debugstr_w(pTypeInfo->Name));
    21602161
     
    21702171 */
    21712172static HRESULT WINAPI ITypeLib2_fnGetLibAttr(
    2172         ITypeLib2 *iface,
    2173         LPTLIBATTR *ppTLibAttr)
     2173    ITypeLib2 *iface,
     2174    LPTLIBATTR *ppTLibAttr)
    21742175{
    21752176    ICOM_THIS( ITypeLibImpl, iface);
     
    21872188 */
    21882189static HRESULT WINAPI ITypeLib2_fnGetTypeComp(
    2189         ITypeLib2 *iface,
    2190         ITypeComp **ppTComp)
     2190    ITypeLib2 *iface,
     2191    ITypeComp **ppTComp)
    21912192{
    21922193    ICOM_THIS( ITypeLibImpl, iface);
     
    22072208    BSTR *pBstrName,
    22082209    BSTR *pBstrDocString,
    2209     DWORD *pdwHelpContext, 
     2210    DWORD *pdwHelpContext,
    22102211    BSTR *pBstrHelpFile)
    22112212{
    22122213    ICOM_THIS( ITypeLibImpl, iface);
    2213    
     2214
    22142215    HRESULT result = E_INVALIDARG;
    2215    
     2216
    22162217    ITypeInfo *pTInfo;
    22172218
    2218    
     2219
    22192220    TRACE("(%p) index %d Name(%p) DocString(%p) HelpContext(%p) HelpFile(%p)\n",
    22202221        This, index,
    2221         pBstrName, pBstrDocString, 
     2222        pBstrName, pBstrDocString,
    22222223        pdwHelpContext, pBstrHelpFile);
    2223    
     2224
    22242225    if(index<0)
    2225     { 
     2226    {
    22262227       /* documentation for the typelib */
    22272228       if(pBstrName && This->Name)
     
    22372238           if (!(*pBstrDocString)) return STG_E_INSUFFICIENTMEMORY;
    22382239       }
    2239    
     2240
    22402241       if(pdwHelpContext)
    22412242       {
     
    22512252       result = S_OK;
    22522253    }
    2253     else 
     2254    else
    22542255    {
    22552256        /* for a typeinfo */
     
    22582259        if(SUCCEEDED(result))
    22592260        {
    2260             result = ITypeInfo_GetDocumentation(pTInfo, 
    2261                                           MEMBERID_NIL, 
     2261            result = ITypeInfo_GetDocumentation(pTInfo,
     2262                                          MEMBERID_NIL,
    22622263                                          pBstrName,
    2263                                           pBstrDocString, 
     2264                                          pBstrDocString,
    22642265                                          pdwHelpContext, pBstrHelpFile);
    2265            
     2266
    22662267            ITypeInfo_Release(pTInfo);
    22672268        }
     
    22772278 */
    22782279static HRESULT WINAPI ITypeLib2_fnIsName(
    2279         ITypeLib2 *iface,
    2280         LPOLESTR szNameBuf,
    2281         ULONG lHashVal,
    2282         BOOL *pfName)
     2280    ITypeLib2 *iface,
     2281    LPOLESTR szNameBuf,
     2282    ULONG lHashVal,
     2283    BOOL *pfName)
    22832284{
    22842285    ICOM_THIS( ITypeLibImpl, iface);
     
    22902291
    22912292    TRACE("(%p)->(%s,%08lx,%p)\n", This, debugstr_w(szNameBuf), lHashVal,
    2292           pfName);
     2293      pfName);
    22932294
    22942295    *pfName=TRUE;
     
    23032304        for(pVInfo=pTInfo->varlist;pVInfo;pVInfo=pVInfo->next)
    23042305            if(!memcmp(szNameBuf,pVInfo->Name, nNameBufLen)) goto ITypeLib2_fnIsName_exit;
    2305        
     2306
    23062307    }
    23072308    *pfName=FALSE;
     
    23102311    TRACE("(%p)slow! search for %s: %s found!\n", This,
    23112312          debugstr_w(szNameBuf), *pfName?"NOT":"");
    2312    
     2313
    23132314    return S_OK;
    23142315}
     
    23212322 */
    23222323static HRESULT WINAPI ITypeLib2_fnFindName(
    2323         ITypeLib2 *iface,
    2324         LPOLESTR szNameBuf,
    2325         ULONG lHashVal,
    2326         ITypeInfo **ppTInfo,
    2327         MEMBERID *rgMemId,
    2328         UINT16 *pcFound)
     2324    ITypeLib2 *iface,
     2325    LPOLESTR szNameBuf,
     2326    ULONG lHashVal,
     2327    ITypeInfo **ppTInfo,
     2328    MEMBERID *rgMemId,
     2329    UINT16 *pcFound)
    23292330{
    23302331    ICOM_THIS( ITypeLibImpl, iface);
     
    23332334    TLBVarDesc *pVInfo;
    23342335    int i,j = 0;
    2335    
     2336
    23362337    UINT nNameBufLen = SysStringLen(szNameBuf);
    23372338
     
    23562357
    23572358    *pcFound=j;
    2358    
     2359
    23592360    return S_OK;
    23602361}
     
    23662367 */
    23672368static VOID WINAPI ITypeLib2_fnReleaseTLibAttr(
    2368         ITypeLib2 *iface,
    2369         TLIBATTR *pTLibAttr)
     2369    ITypeLib2 *iface,
     2370    TLIBATTR *pTLibAttr)
    23702371{
    23712372    ICOM_THIS( ITypeLibImpl, iface);
     
    23792380 */
    23802381static HRESULT WINAPI ITypeLib2_fnGetCustData(
    2381         ITypeLib2 * iface,
    2382         REFGUID guid,
     2382    ITypeLib2 * iface,
     2383    REFGUID guid,
    23832384        VARIANT *pVarVal)
    23842385{
     
    23902391      if( IsEqualIID(guid, &pCData->guid)) break;
    23912392    }
    2392    
     2393
    23932394    TRACE("(%p) guid %s %s found!x)\n", This, debugstr_guid(guid), pCData? "" : "NOT");
    23942395
     
    24092410 */
    24102411static HRESULT WINAPI ITypeLib2_fnGetLibStatistics(
    2411         ITypeLib2 * iface,
     2412    ITypeLib2 * iface,
    24122413        ULONG *pcUniqueNames,
    2413         ULONG *pcchUniqueNames)
     2414    ULONG *pcchUniqueNames)
    24142415{
    24152416    ICOM_THIS( ITypeLibImpl, iface);
     
    24302431 */
    24312432static HRESULT WINAPI ITypeLib2_fnGetDocumentation2(
    2432         ITypeLib2 * iface,
     2433    ITypeLib2 * iface,
    24332434        INT index,
    2434         LCID lcid,
    2435         BSTR *pbstrHelpString,
     2435    LCID lcid,
     2436    BSTR *pbstrHelpString,
    24362437        DWORD *pdwHelpStringContext,
    2437         BSTR *pbstrHelpStringDll)
     2438    BSTR *pbstrHelpStringDll)
    24382439{
    24392440    ICOM_THIS( ITypeLibImpl, iface);
     
    24632464      /* for a typeinfo */
    24642465      result=ITypeLib2_GetTypeInfo(iface, index, &pTInfo);
    2465      
     2466
    24662467      if(SUCCEEDED(result))
    2467       { 
     2468      {
    24682469        ITypeInfo2 * pTInfo2;
    2469         result = ITypeInfo_QueryInterface(pTInfo, 
    2470                                           &IID_ITypeInfo2, 
     2470        result = ITypeInfo_QueryInterface(pTInfo,
     2471                                          &IID_ITypeInfo2,
    24712472                                          (LPVOID*) &pTInfo2);
    24722473
    24732474        if(SUCCEEDED(result))
    24742475        {
    2475           result = ITypeInfo2_GetDocumentation2(pTInfo2, 
    2476                                            MEMBERID_NIL, 
     2476          result = ITypeInfo2_GetDocumentation2(pTInfo2,
     2477                                           MEMBERID_NIL,
    24772478                                           lcid,
    2478                                            pbstrHelpString, 
    2479                                            pdwHelpStringContext, 
     2479                                           pbstrHelpString,
     2480                                           pdwHelpStringContext,
    24802481                                           pbstrHelpStringDll);
    2481  
     2482
    24822483          ITypeInfo2_Release(pTInfo2);
    24832484        }
    2484            
     2485
    24852486        ITypeInfo_Release(pTInfo);
    24862487      }
     
    24912492/* ITypeLib2::GetAllCustData
    24922493 *
    2493  * Gets all custom data items for the library. 
     2494 * Gets all custom data items for the library.
    24942495 *
    24952496 */
    24962497static HRESULT WINAPI ITypeLib2_fnGetAllCustData(
    2497         ITypeLib2 * iface,
     2498    ITypeLib2 * iface,
    24982499        CUSTDATA *pCustData)
    24992500{
     
    25012502    TLBCustData *pCData;
    25022503    int i;
    2503     TRACE("(%p) returning %d items\n", This, This->ctCustData); 
     2504    TRACE("(%p) returning %d items\n", This, This->ctCustData);
    25042505    pCustData->prgCustData = TLB_Alloc(This->ctCustData * sizeof(CUSTDATAITEM));
    25052506    if(pCustData->prgCustData ){
     
    25562557 */
    25572558static HRESULT WINAPI ITypeInfo_fnQueryInterface(
    2558         ITypeInfo2 *iface,
    2559         REFIID riid,
    2560         VOID **ppvObject)
     2559    ITypeInfo2 *iface,
     2560    REFIID riid,
     2561    VOID **ppvObject)
    25612562{
    25622563    ICOM_THIS( ITypeLibImpl, iface);
     
    25652566
    25662567    *ppvObject=NULL;
    2567     if(IsEqualIID(riid, &IID_IUnknown) || 
     2568    if(IsEqualIID(riid, &IID_IUnknown) ||
    25682569            IsEqualIID(riid,&IID_ITypeInfo)||
    25692570            IsEqualIID(riid,&IID_ITypeInfo2))
     
    25982599
    25992600    --(This->ref);
    2600    
     2601
    26012602    TRACE("(%p)->(%u)\n",This, This->ref);
    26022603
     
    26052606      FIXME("destroy child objects\n");
    26062607
    2607       TRACE("destroying ITypeInfo(%p)\n",This); 
     2608      TRACE("destroying ITypeInfo(%p)\n",This);
    26082609      if (This->Name)
    26092610      {
     
    26112612          This->Name = 0;
    26122613      }
    2613      
     2614
    26142615      if (This->DocString)
    26152616      {
     
    26702671    ICOM_THIS( ITypeInfoImpl, iface);
    26712672    int i;
    2672     TLBFuncDesc * pFDesc; 
     2673    TLBFuncDesc * pFDesc;
    26732674    TRACE("(%p) index %d\n", This, index);
    26742675    for(i=0, pFDesc=This->funclist; i!=index && pFDesc; i++, pFDesc=pFDesc->next)
     
    26842685/* ITypeInfo::GetVarDesc
    26852686 *
    2686  * Retrieves a VARDESC structure that describes the specified variable. 
     2687 * Retrieves a VARDESC structure that describes the specified variable.
    26872688 *
    26882689 */
     
    26922693    ICOM_THIS( ITypeInfoImpl, iface);
    26932694    int i;
    2694     TLBVarDesc * pVDesc; 
     2695    TLBVarDesc * pVDesc;
    26952696    TRACE("(%p) index %d\n", This, index);
    26962697    for(i=0, pVDesc=This->varlist; i!=index && pVDesc; i++, pVDesc=pVDesc->next)
     
    27142715{
    27152716    ICOM_THIS( ITypeInfoImpl, iface);
    2716     TLBFuncDesc * pFDesc; 
    2717     TLBVarDesc * pVDesc; 
     2717    TLBFuncDesc * pFDesc;
     2718    TLBVarDesc * pVDesc;
    27182719    int i;
    27192720    TRACE("(%p) memid=0x%08lx Maxname=%d\n", This, memid, cMaxNames);
     
    27252726      {
    27262727        if(!i)
    2727                   *rgBstrNames=SysAllocString(pFDesc->Name);
     2728          *rgBstrNames=SysAllocString(pFDesc->Name);
    27282729        else
    27292730          rgBstrNames[i]=SysAllocString(pFDesc->pParamDesc[i-1].Name);
     
    27482749          result=ITypeInfo_GetRefTypeInfo(iface, This->impltypelist->reference, &pTInfo);
    27492750          if(SUCCEEDED(result))
    2750           {
     2751      {
    27512752            result=ITypeInfo_GetNames(pTInfo, memid, rgBstrNames, cMaxNames, pcNames);
    27522753            ITypeInfo_Release(pTInfo);
     
    27562757        }
    27572758        else
    2758         {
     2759    {
    27592760          WARN("no names found\n");
    2760         }
     2761    }
    27612762        *pcNames=0;
    27622763        return TYPE_E_ELEMENTNOTFOUND;
     
    27762777 */
    27772778static HRESULT WINAPI ITypeInfo_fnGetRefTypeOfImplType(
    2778         ITypeInfo2 *iface,
     2779    ITypeInfo2 *iface,
    27792780        UINT index,
    2780         HREFTYPE  *pRefType)
     2781    HREFTYPE  *pRefType)
    27812782{
    27822783    ICOM_THIS( ITypeInfoImpl, iface);
     
    27932794      */
    27942795      if( This->TypeAttr.typekind != TKIND_DISPATCH) return E_INVALIDARG;
    2795      
     2796
    27962797      if (This->TypeAttr.wTypeFlags & TYPEFLAG_FDISPATCHABLE &&
    27972798          This->TypeAttr.wTypeFlags & TYPEFLAG_FDUAL )
     
    28122813        pIref = pIref->next;
    28132814      }
    2814      
     2815
    28152816      if (!pIref) return TYPE_E_ELEMENTNOTFOUND;
    2816      
     2817
    28172818      *pRefType = pIref->reference;
    2818      
     2819
    28192820      TRACE("-- 0x%08lx %s\n",pIref->reference, debugstr_guid(&pIref->guid) );
    28202821    }
    2821    
     2822
    28222823    return S_OK;
    2823    
     2824
    28242825}
    28252826
    28262827/* ITypeInfo::GetImplTypeFlags
    2827  * 
    2828  * Retrieves the IMPLTYPEFLAGS enumeration for one implemented interface 
     2828 *
     2829 * Retrieves the IMPLTYPEFLAGS enumeration for one implemented interface
    28292830 * or base interface in a type description.
    28302831 */
     
    28542855{
    28552856    ICOM_THIS( ITypeInfoImpl, iface);
    2856     TLBFuncDesc * pFDesc; 
    2857     TLBVarDesc * pVDesc; 
     2857    TLBFuncDesc * pFDesc;
     2858    TLBVarDesc * pVDesc;
    28582859    HRESULT ret=S_OK;
    2859         UINT nNameLen = SysStringLen(*rgszNames);
    2860        
     2860    UINT nNameLen = SysStringLen(*rgszNames);
     2861
    28612862    TRACE("(%p) Name %s cNames %d\n", This, debugstr_w(*rgszNames),
    28622863            cNames);
     
    28662867            if(cNames) *pMemId=pFDesc->funcdesc.memid;
    28672868            for(i=1; i < cNames; i++){
    2868                                 UINT nParamLen = SysStringLen(rgszNames[i]);
     2869                UINT nParamLen = SysStringLen(rgszNames[i]);
    28692870                for(j=0; j<pFDesc->funcdesc.cParams; j++)
    28702871                    if(memcmp(rgszNames[i],pFDesc->pParamDesc[j].Name, nParamLen))
     
    28772878            return ret;
    28782879        }
    2879     }   
     2880    }
    28802881    for(pVDesc=This->varlist; pVDesc; pVDesc=pVDesc->next) {
    28812882        if( !memcmp(*rgszNames, pVDesc->Name, nNameLen)) {
     
    28842885        }
    28852886    }
    2886     /* not found, see if this is and interface with an inheritance */       
    2887     if(This->TypeAttr.typekind==TKIND_INTERFACE && 
     2887    /* not found, see if this is and interface with an inheritance */
     2888    if(This->TypeAttr.typekind==TKIND_INTERFACE &&
    28882889            This->TypeAttr.cImplTypes ){
    28892890        /* recursive search */
    28902891        ITypeInfo *pTInfo;
    2891         ret=ITypeInfo_GetRefTypeInfo(iface, 
     2892        ret=ITypeInfo_GetRefTypeInfo(iface,
    28922893                This->impltypelist->reference, &pTInfo);
    28932894        if(SUCCEEDED(ret)){
     
    29032904
    29042905/* ITypeInfo::Invoke
    2905  * 
     2906 *
    29062907 * Invokes a method, or accesses a property of an object, that implements the
    29072908 * interface described by the type description.
     
    29112912
    29122913    if (TRACE_ON(ole)) {
    2913         int i;
    2914         MESSAGE("Calling %p(",func);
    2915         for (i=0;i<nrargs;i++) MESSAGE("%08lx,",args[i]);
    2916         MESSAGE(")\n");
     2914    int i;
     2915    MESSAGE("Calling %p(",func);
     2916    for (i=0;i<nrargs;i++) MESSAGE("%08lx,",args[i]);
     2917    MESSAGE(")\n");
    29172918    }
    29182919
     
    29202921    case CC_STDCALL:
    29212922
    2922         switch (nrargs) {
    2923         case 0: {
     2923    switch (nrargs) {
     2924    case 0: {
    29242925#ifdef __WIN32OS2__
    2925                 DWORD (* WINAPI xfunc)() = func;
     2926        DWORD (* WINAPI xfunc)() = func;
    29262927#else
    2927                 DWORD (WINAPI *xfunc)() = func;
     2928        DWORD (WINAPI *xfunc)() = func;
    29282929#endif
    2929                 res = xfunc();
    2930                 break;
    2931         }
    2932         case 1: {
     2930        res = xfunc();
     2931        break;
     2932    }
     2933    case 1: {
    29332934#ifdef __WIN32OS2__
    2934                 DWORD (* WINAPI xfunc)(DWORD) = func;
     2935        DWORD (* WINAPI xfunc)(DWORD) = func;
    29352936#else
    2936                 DWORD (WINAPI *xfunc)(DWORD) = func;
     2937        DWORD (WINAPI *xfunc)(DWORD) = func;
    29372938#endif
    2938                 res = xfunc(args[0]);
    2939                 break;
    2940         }
    2941         case 2: {
     2939        res = xfunc(args[0]);
     2940        break;
     2941    }
     2942    case 2: {
    29422943#ifdef __WIN32OS2__
    2943                 DWORD (* WINAPI xfunc)(DWORD,DWORD) = func;
     2944        DWORD (* WINAPI xfunc)(DWORD,DWORD) = func;
    29442945#else
    2945                 DWORD (WINAPI *xfunc)(DWORD,DWORD) = func;
     2946        DWORD (WINAPI *xfunc)(DWORD,DWORD) = func;
    29462947#endif
    2947                 res = xfunc(args[0],args[1]);
    2948                 break;
    2949         }
    2950         case 3: {
     2948        res = xfunc(args[0],args[1]);
     2949        break;
     2950    }
     2951    case 3: {
    29512952#ifdef __WIN32OS2__
    2952                 DWORD (* WINAPI xfunc)(DWORD,DWORD,DWORD) = func;
     2953        DWORD (* WINAPI xfunc)(DWORD,DWORD,DWORD) = func;
    29532954#else
    2954                 DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD) = func;
     2955        DWORD (WINAPI *xfunc)(DWORD,DWORD,DWORD) = func;
    29552956#endif
    2956                 res = xfunc(args[0],args[1],args[2]);
    2957                 break;
    2958         }
    2959         default:
    2960                 FIXME("unsupported number of arguments %d in stdcall\n",nrargs);
    2961                 res = -1;
    2962                 break;
    2963         }
    2964         break;
     2957        res = xfunc(args[0],args[1],args[2]);
     2958        break;
     2959    }
    29652960    default:
    2966         FIXME("unsupported calling convention %d\n",callconv);
    2967         res = -1;
    2968         break;
     2961        FIXME("unsupported number of arguments %d in stdcall\n",nrargs);
     2962        res = -1;
     2963        break;
     2964    }
     2965    break;
     2966    default:
     2967    FIXME("unsupported calling convention %d\n",callconv);
     2968    res = -1;
     2969    break;
    29692970    }
    29702971    TRACE("returns %08lx\n",res);
     
    29832984{
    29842985    ICOM_THIS( ITypeInfoImpl, iface);
    2985     TLBFuncDesc * pFDesc; 
    2986     TLBVarDesc * pVDesc; 
     2986    TLBFuncDesc * pFDesc;
     2987    TLBVarDesc * pVDesc;
    29872988    int i;
    29882989
     
    29932994
    29942995    for(pFDesc=This->funclist; pFDesc; pFDesc=pFDesc->next)
    2995         if (pFDesc->funcdesc.memid == memid) {
    2996             if (pFDesc->funcdesc.invkind & (dwFlags & ~DISPATCH_METHOD))
    2997                 break;
    2998         }
     2996    if (pFDesc->funcdesc.memid == memid) {
     2997        if (pFDesc->funcdesc.invkind & (dwFlags & ~DISPATCH_METHOD))
     2998        break;
     2999    }
    29993000    if (pFDesc) {
    3000         dump_TLBFuncDescOne(pFDesc);
    3001         switch (pFDesc->funcdesc.funckind) {
    3002         case FUNC_PUREVIRTUAL:
    3003         case FUNC_VIRTUAL: {
    3004             DWORD res;
    3005             DWORD *args = (DWORD*)HeapAlloc(GetProcessHeap(),0,sizeof(DWORD)*(pFDesc->funcdesc.cParams+1));
    3006             DWORD *args2 = (DWORD*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DWORD)*(pFDesc->funcdesc.cParams));
    3007             args[0] = (DWORD)pIUnk;
    3008 
    3009             for (i=0;i<pFDesc->funcdesc.cParams;i++) {
    3010                 if (i<pDispParams->cArgs) {
    3011                     TRACE("set %d to disparg type %d vs %d\n",i,
    3012                             V_VT(pDispParams->rgvarg+i),
    3013                             pFDesc->funcdesc.lprgelemdescParam[i].tdesc.vt
    3014                     );
    3015                     args[i+1] = V_UNION(pDispParams->rgvarg+i,lVal);
    3016                 } else {
    3017                     TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc);
    3018                     TRACE("set %d to pointer for get (type is %d)\n",i,tdesc->vt);
    3019                     /*FIXME: give pointers for the rest, so propertyget works*/
    3020                     args[i+1] = (DWORD)&args2[i];
    3021 
    3022                     /* If pointer to variant, pass reference to variant
    3023                      * in result variant array.
    3024                      */
    3025                     if ((tdesc->vt == VT_PTR) &&
    3026                         (tdesc->u.lptdesc->vt == VT_VARIANT) &&
    3027                         pVarResult
    3028                     )
    3029                         args[i+1] = (DWORD)(pVarResult+(i-pDispParams->cArgs));
    3030                 }
    3031             }
    3032             if (pFDesc->funcdesc.cParamsOpt)
    3033                 FIXME("Does not support optional parameters (%d)\n",
    3034                         pFDesc->funcdesc.cParamsOpt
    3035                 );
    3036 
    3037             res = _invoke((*(DWORD***)pIUnk)[pFDesc->funcdesc.oVft/4],
    3038                     pFDesc->funcdesc.callconv,
    3039                     pFDesc->funcdesc.cParams+1,
    3040                     args
    3041             );
    3042             if (pVarResult && (dwFlags & (DISPATCH_PROPERTYGET))) {
    3043                 for (i=0;i<pFDesc->funcdesc.cParams-pDispParams->cArgs;i++) {
    3044                     TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc);
    3045                     /* If we are a pointer to a variant, we are done already */
    3046                     if ((tdesc->vt==VT_PTR)&&(tdesc->u.lptdesc->vt==VT_VARIANT))
    3047                         continue;
    3048 
    3049                     VariantInit(&pVarResult[i]);
    3050                     V_UNION(pVarResult+i,intVal) = args2[i];
    3051 
    3052                     if (tdesc->vt == VT_PTR)
    3053                         tdesc = tdesc->u.lptdesc;
    3054                     V_VT(pVarResult+i) = tdesc->vt;
    3055 
    3056                     /* HACK: VB5 likes this.
    3057                      * I do not know why. There is 1 example in MSDN which uses
    3058                      * this which appears broken (mixes int vals and
    3059                      * IDispatch*.).
    3060                      */
    3061                     if ((tdesc->vt == VT_PTR) && (dwFlags & DISPATCH_METHOD))
    3062                         V_VT(pVarResult+i) = VT_DISPATCH;
    3063                     TRACE("storing into variant: [%d] type %d, val %08x\n",
    3064                             i,V_VT(pVarResult+i),V_UNION(pVarResult+i,intVal)
    3065                     );
    3066                 }
    3067             }
    3068             HeapFree(GetProcessHeap(),0,args2);
    3069             HeapFree(GetProcessHeap(),0,args);
    3070             return S_OK;
    3071         }
    3072         case FUNC_DISPATCH:  {
    3073            IDispatch *disp;
    3074            HRESULT hr;
    3075 
    3076            hr = IUnknown_QueryInterface((LPUNKNOWN)pIUnk,&IID_IDispatch,(LPVOID*)&disp);
    3077            if (hr) {
    3078                FIXME("FUNC_DISPATCH used on object without IDispatch iface?\n");
    3079                return hr;
    3080            }
    3081            FIXME("Calling Invoke in IDispatch iface. untested!\n");
    3082            hr = IDispatch_Invoke(
    3083                disp,memid,&IID_NULL,LOCALE_USER_DEFAULT,dwFlags,pDispParams,
    3084                pVarResult,pExcepInfo,pArgErr
    3085            );
    3086            if (hr)
    3087                FIXME("IDispatch::Invoke failed with %08lx. (Could be not a real error?)\n",hr);
    3088            IDispatch_Release(disp);
    3089            return hr;
    3090         }
    3091         default:
    3092            FIXME("Unknown function invocation type %d\n",pFDesc->funcdesc.funckind);
    3093            return E_FAIL;
    3094         }
     3001    dump_TLBFuncDescOne(pFDesc);
     3002    switch (pFDesc->funcdesc.funckind) {
     3003    case FUNC_PUREVIRTUAL:
     3004    case FUNC_VIRTUAL: {
     3005        DWORD res;
     3006        DWORD *args = (DWORD*)HeapAlloc(GetProcessHeap(),0,sizeof(DWORD)*(pFDesc->funcdesc.cParams+1));
     3007        DWORD *args2 = (DWORD*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DWORD)*(pFDesc->funcdesc.cParams));
     3008        args[0] = (DWORD)pIUnk;
     3009
     3010        for (i=0;i<pFDesc->funcdesc.cParams;i++) {
     3011        if (i<pDispParams->cArgs) {
     3012            TRACE("set %d to disparg type %d vs %d\n",i,
     3013                V_VT(pDispParams->rgvarg+i),
     3014                pFDesc->funcdesc.lprgelemdescParam[i].tdesc.vt
     3015            );
     3016            args[i+1] = V_UNION(pDispParams->rgvarg+i,lVal);
     3017        } else {
     3018            TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc);
     3019            TRACE("set %d to pointer for get (type is %d)\n",i,tdesc->vt);
     3020            /*FIXME: give pointers for the rest, so propertyget works*/
     3021            args[i+1] = (DWORD)&args2[i];
     3022
     3023            /* If pointer to variant, pass reference to variant
     3024             * in result variant array.
     3025             */
     3026            if ((tdesc->vt == VT_PTR) &&
     3027            (tdesc->u.lptdesc->vt == VT_VARIANT) &&
     3028            pVarResult
     3029            )
     3030            args[i+1] = (DWORD)(pVarResult+(i-pDispParams->cArgs));
     3031        }
     3032        }
     3033        if (pFDesc->funcdesc.cParamsOpt)
     3034        FIXME("Does not support optional parameters (%d)\n",
     3035            pFDesc->funcdesc.cParamsOpt
     3036        );
     3037
     3038        res = _invoke((*(DWORD***)pIUnk)[pFDesc->funcdesc.oVft/4],
     3039            pFDesc->funcdesc.callconv,
     3040            pFDesc->funcdesc.cParams+1,
     3041            args
     3042        );
     3043        if (pVarResult && (dwFlags & (DISPATCH_PROPERTYGET))) {
     3044        for (i=0;i<pFDesc->funcdesc.cParams-pDispParams->cArgs;i++) {
     3045            TYPEDESC *tdesc = &(pFDesc->funcdesc.lprgelemdescParam[i].tdesc);
     3046            /* If we are a pointer to a variant, we are done already */
     3047            if ((tdesc->vt==VT_PTR)&&(tdesc->u.lptdesc->vt==VT_VARIANT))
     3048            continue;
     3049
     3050            VariantInit(&pVarResult[i]);
     3051            V_UNION(pVarResult+i,intVal) = args2[i];
     3052
     3053            if (tdesc->vt == VT_PTR)
     3054            tdesc = tdesc->u.lptdesc;
     3055            V_VT(pVarResult+i) = tdesc->vt;
     3056
     3057            /* HACK: VB5 likes this.
     3058             * I do not know why. There is 1 example in MSDN which uses
     3059             * this which appears broken (mixes int vals and
     3060             * IDispatch*.).
     3061             */
     3062            if ((tdesc->vt == VT_PTR) && (dwFlags & DISPATCH_METHOD))
     3063            V_VT(pVarResult+i) = VT_DISPATCH;
     3064            TRACE("storing into variant: [%d] type %d, val %08x\n",
     3065                i,V_VT(pVarResult+i),V_UNION(pVarResult+i,intVal)
     3066            );
     3067        }
     3068        }
     3069        HeapFree(GetProcessHeap(),0,args2);
     3070        HeapFree(GetProcessHeap(),0,args);
     3071        return S_OK;
     3072    }
     3073    case FUNC_DISPATCH:  {
     3074       IDispatch *disp;
     3075       HRESULT hr;
     3076
     3077       hr = IUnknown_QueryInterface((LPUNKNOWN)pIUnk,&IID_IDispatch,(LPVOID*)&disp);
     3078       if (hr) {
     3079           FIXME("FUNC_DISPATCH used on object without IDispatch iface?\n");
     3080           return hr;
     3081       }
     3082       FIXME("Calling Invoke in IDispatch iface. untested!\n");
     3083       hr = IDispatch_Invoke(
     3084           disp,memid,&IID_NULL,LOCALE_USER_DEFAULT,dwFlags,pDispParams,
     3085           pVarResult,pExcepInfo,pArgErr
     3086       );
     3087       if (hr)
     3088           FIXME("IDispatch::Invoke failed with %08lx. (Could be not a real error?)\n",hr);
     3089       IDispatch_Release(disp);
     3090       return hr;
     3091    }
     3092    default:
     3093       FIXME("Unknown function invocation type %d\n",pFDesc->funcdesc.funckind);
     3094       return E_FAIL;
     3095    }
    30953096    } else {
    3096         FIXME("variable based invoking not supported yet.\n");
    3097         for(pVDesc=This->varlist; pVDesc; pVDesc=pVDesc->next) {
    3098             if (pVDesc->vardesc.memid == memid) {
    3099                 FIXME("varseek: Found memid name %s\n",debugstr_w(((LPWSTR)pVDesc->Name)));
    3100                 dump_TLBVarDesc(pVDesc);
    3101                 break;
    3102             }
    3103         }
     3097    FIXME("variable based invoking not supported yet.\n");
     3098    for(pVDesc=This->varlist; pVDesc; pVDesc=pVDesc->next) {
     3099        if (pVDesc->vardesc.memid == memid) {
     3100        FIXME("varseek: Found memid name %s\n",debugstr_w(((LPWSTR)pVDesc->Name)));
     3101        dump_TLBVarDesc(pVDesc);
     3102        break;
     3103        }
     3104    }
    31043105    }
    31053106    FIXME("Did not find member id %d!\n",(int)memid);
     
    31083109
    31093110/* ITypeInfo::GetDocumentation
    3110  * 
     3111 *
    31113112 * Retrieves the documentation string, the complete Help file name and path,
    31123113 * and the context ID for the Help topic for a specified type description.
     
    31173118{
    31183119    ICOM_THIS( ITypeInfoImpl, iface);
    3119     TLBFuncDesc * pFDesc; 
    3120     TLBVarDesc * pVDesc; 
     3120    TLBFuncDesc * pFDesc;
     3121    TLBVarDesc * pVDesc;
    31213122    TRACE("(%p) memid %ld Name(%p) DocString(%p)"
    31223123          " HelpContext(%p) HelpFile(%p)\n",
     
    31463147
    31473148/*  ITypeInfo::GetDllEntry
    3148  * 
     3149 *
    31493150 * Retrieves a description or specification of an entry point for a function
    31503151 * in a DLL.
     
    31603161
    31613162/* ITypeInfo::GetRefTypeInfo
    3162  * 
     3163 *
    31633164 * If a type description references other type descriptions, it retrieves
    31643165 * the referenced type descriptions.
    31653166 */
    31663167static HRESULT WINAPI ITypeInfo_fnGetRefTypeInfo(
    3167         ITypeInfo2 *iface,
     3168    ITypeInfo2 *iface,
    31683169        HREFTYPE hRefType,
    3169         ITypeInfo  **ppTInfo)
     3170    ITypeInfo  **ppTInfo)
    31703171{
    31713172    ICOM_THIS( ITypeInfoImpl, iface);
     
    31833184      }
    31843185    }
    3185         else if (hRefType == -1 &&
     3186    else if (hRefType == -1 &&
    31863187             (((ITypeInfoImpl*) This)->TypeAttr.typekind   == TKIND_DISPATCH) &&
    31873188             (((ITypeInfoImpl*) This)->TypeAttr.wTypeFlags &  TYPEFLAG_FDUAL))
    31883189    {
    3189           /* when we meet a DUAL dispinterface, we must create the interface
    3190           * version of it.
    3191           */
    3192           ITypeInfoImpl* pTypeInfoImpl = (ITypeInfoImpl*) ITypeInfo_Constructor();
    3193 
    3194                
    3195           /* the interface version contains the same information as the dispinterface
    3196            * copy the contents of the structs.
    3197            */
    3198           *pTypeInfoImpl = *This;
    3199           pTypeInfoImpl->ref = 1;
    3200                
    3201           /* change the type to interface */
    3202           pTypeInfoImpl->TypeAttr.typekind = TKIND_INTERFACE;
    3203                
     3190      /* when we meet a DUAL dispinterface, we must create the interface
     3191      * version of it.
     3192      */
     3193      ITypeInfoImpl* pTypeInfoImpl = (ITypeInfoImpl*) ITypeInfo_Constructor();
     3194
     3195
     3196      /* the interface version contains the same information as the dispinterface
     3197       * copy the contents of the structs.
     3198       */
     3199      *pTypeInfoImpl = *This;
     3200      pTypeInfoImpl->ref = 1;
     3201
     3202      /* change the type to interface */
     3203      pTypeInfoImpl->TypeAttr.typekind = TKIND_INTERFACE;
     3204
    32043205      *ppTInfo = (ITypeInfo*) pTypeInfoImpl;
    32053206
    3206           ITypeInfo_AddRef((ITypeInfo*) pTypeInfoImpl);
     3207      ITypeInfo_AddRef((ITypeInfo*) pTypeInfoImpl);
    32073208
    32083209      result = S_OK;
    3209         }
     3210    }
    32103211    else
    32113212    {
    32123213      /* imported type lib */
    32133214      TLBRefType   *pRefType     = NULL;
    3214      
     3215
    32153216      /* search in implemented types */
    3216       for( pRefType = This->impltypelist; 
     3217      for( pRefType = This->impltypelist;
    32173218           pRefType && (pRefType->reference != hRefType);
    32183219           pRefType = pRefType->next);
    3219      
     3220
    32203221      if(!pRefType)
    3221       {                       
     3222      {
    32223223        TYPEATTR*       pMyTypeAttr  = &This->TypeAttr;
    32233224        unsigned short  cFuncs       = pMyTypeAttr->cFuncs;
    32243225        unsigned short  cVars        = pMyTypeAttr->cVars;
    3225        
    3226         /* search in arguments */     
     3226
     3227        /* search in arguments */
    32273228        if (cFuncs > 0)
    32283229        {
    32293230          unsigned short  cFuncIndex   = 0;
    3230  
     3231
    32313232          TLBFuncDesc*    pCurrFunc    = This->funclist;
    3232          
     3233
    32333234          for (cFuncIndex = 0; !pRefType && cFuncIndex < cFuncs ; ++cFuncIndex)
    32343235          {
    32353236            FUNCDESC*  pCurrFuncDesc = &pCurrFunc->funcdesc;
    3236            
     3237
    32373238            short      cParams       = pCurrFuncDesc->cParams;
    32383239            short      cParamIndex   = 0;
    3239              
    3240             for (cParamIndex = 0 ; 
    3241                  !pRefType && cParamIndex < cParams ; 
     3240
     3241            for (cParamIndex = 0 ;
     3242                 !pRefType && cParamIndex < cParams ;
    32423243                 ++cParamIndex)
    32433244            {
    32443245              TLBParDesc* pCurrParamDesc = &(pCurrFunc->pParamDesc[cParamIndex]);
    3245              
     3246
    32463247              if ( pCurrParamDesc->pRefType && pCurrParamDesc->pRefType->reference == hRefType)
    32473248              {
     
    32503251              }
    32513252            }
    3252            
     3253
    32533254            pCurrFunc = pCurrFunc->next;
    32543255          }
     
    32613262        }
    32623263      }
    3263      
     3264
    32643265      /* href-referenced typeinfo found! */
    32653266      if (pRefType || hRefType == -1)
    32663267      {
    32673268        ITypeLibImpl *pTypeLib = pRefType->pImpTLInfo->pImpTypeLib;
    3268        
    3269         if(pTypeLib) 
     3269
     3270        if(pTypeLib)
    32703271        {
    32713272          TRACE("typeinfo in imported typelib that is already loaded\n");
    3272                  
    3273           result = ITypeLib2_GetTypeInfoOfGuid((LPTYPELIB)pTypeLib, 
    3274                                            &pRefType->guid, 
     3273
     3274          result = ITypeLib2_GetTypeInfoOfGuid((LPTYPELIB)pTypeLib,
     3275                                           &pRefType->guid,
    32753276                                           ppTInfo);
    32763277        }
     
    32823283                      pRefType->pImpTLInfo->lcid,
    32833284                      (LPTYPELIB *)&pTypeLib);
    3284          
     3285
    32853286          if(!SUCCEEDED(result))
    3286                   {
     3287          {
    32873288            BSTR libnam=SysAllocString(pRefType->pImpTLInfo->name);
    32883289            TRACE("typeinfo in imported typelib that isn't already loaded\n");
    32893290            result=LoadTypeLib(libnam, (LPTYPELIB *)&pTypeLib);
    32903291            SysFreeString(libnam);
    3291           } 
     3292          }
    32923293          if(SUCCEEDED(result))
    32933294          {
    32943295            result=ITypeLib2_GetTypeInfoOfGuid((LPTYPELIB)pTypeLib, &pRefType->guid, ppTInfo);
    32953296            pRefType->pImpTLInfo->pImpTypeLib = pTypeLib;
    3296                         ITypeLib2_AddRef((ITypeLib*) pTypeLib);
    3297           }       
     3297            ITypeLib2_AddRef((ITypeLib*) pTypeLib);
     3298          }
    32983299        }
    32993300      }
     
    33063307
    33073308/* ITypeInfo::AddressOfMember
    3308  * 
     3309 *
    33093310 * Retrieves the addresses of static functions or variables, such as those
    33103311 * defined in a DLL.
     
    33193320
    33203321/* ITypeInfo::CreateInstance
    3321  * 
    3322  * Creates a new instance of a type that describes a component object class 
     3322 *
     3323 * Creates a new instance of a type that describes a component object class
    33233324 * (coclass).
    33243325 */
    3325 static HRESULT WINAPI ITypeInfo_fnCreateInstance( ITypeInfo2 *iface, 
    3326         IUnknown *pUnk, REFIID riid, VOID  **ppvObj) 
     3326static HRESULT WINAPI ITypeInfo_fnCreateInstance( ITypeInfo2 *iface,
     3327        IUnknown *pUnk, REFIID riid, VOID  **ppvObj)
    33273328{
    33283329    ICOM_THIS( ITypeInfoImpl, iface);
     
    33363337 */
    33373338static HRESULT WINAPI ITypeInfo_fnGetMops( ITypeInfo2 *iface, MEMBERID memid,
    3338                                 BSTR  *pBstrMops)
     3339                BSTR  *pBstrMops)
    33393340{
    33403341    ICOM_THIS( ITypeInfoImpl, iface);
     
    33443345
    33453346/* ITypeInfo::GetContainingTypeLib
    3346  * 
     3347 *
    33473348 * Retrieves the containing type library and the index of the type description
    33483349 * within that type library.
     
    33793380 */
    33803381static HRESULT WINAPI ITypeInfo_fnReleaseFuncDesc(
    3381         ITypeInfo2 *iface,
     3382    ITypeInfo2 *iface,
    33823383        FUNCDESC *pFuncDesc)
    33833384{
     
    34173418 * Returns the type flags without any allocations. This returns a DWORD type
    34183419 * flag, which expands the type flags without growing the TYPEATTR (type
    3419  * attribute). 
     3420 * attribute).
    34203421 *
    34213422 */
     
    34423443    HRESULT result;
    34433444    /* FIXME: should check for invKind??? */
    3444     for(i=0, pFuncInfo=This->funclist;pFuncInfo && 
     3445    for(i=0, pFuncInfo=This->funclist;pFuncInfo &&
    34453446            memid != pFuncInfo->funcdesc.memid; i++, pFuncInfo=pFuncInfo->next);
    34463447    if(pFuncInfo){
     
    34593460 *
    34603461 * Binds to a specific member based on a known DISPID, where the member name
    3461  * is not known (for example, when binding to a default member). 
     3462 * is not known (for example, when binding to a default member).
    34623463 *
    34633464 */
     
    34693470    int i;
    34703471    HRESULT result;
    3471     for(i=0, pVarInfo=This->varlist; pVarInfo && 
     3472    for(i=0, pVarInfo=This->varlist; pVarInfo &&
    34723473            memid != pVarInfo->vardesc.memid; i++, pVarInfo=pVarInfo->next)
    34733474        ;
     
    34893490 */
    34903491static HRESULT WINAPI ITypeInfo2_fnGetCustData(
    3491         ITypeInfo2 * iface,
    3492         REFGUID guid,
    3493         VARIANT *pVarVal)
     3492    ITypeInfo2 * iface,
     3493    REFGUID guid,
     3494    VARIANT *pVarVal)
    34943495{
    34953496    ICOM_THIS( ITypeInfoImpl, iface);
     
    35153516 */
    35163517static HRESULT WINAPI ITypeInfo2_fnGetFuncCustData(
    3517         ITypeInfo2 * iface,
    3518         UINT index,
    3519         REFGUID guid,
    3520         VARIANT *pVarVal)
     3518    ITypeInfo2 * iface,
     3519    UINT index,
     3520    REFGUID guid,
     3521    VARIANT *pVarVal)
    35213522{
    35223523    ICOM_THIS( ITypeInfoImpl, iface);
    35233524    TLBCustData *pCData=NULL;
    3524     TLBFuncDesc * pFDesc; 
     3525    TLBFuncDesc * pFDesc;
    35253526    int i;
    35263527    for(i=0, pFDesc=This->funclist; i!=index && pFDesc; i++,
     
    35463547 */
    35473548static HRESULT WINAPI ITypeInfo2_fnGetParamCustData(
    3548         ITypeInfo2 * iface,
    3549         UINT indexFunc,
    3550         UINT indexParam,
    3551         REFGUID guid,
    3552         VARIANT *pVarVal)
    3553 {   
     3549    ITypeInfo2 * iface,
     3550    UINT indexFunc,
     3551    UINT indexParam,
     3552    REFGUID guid,
     3553    VARIANT *pVarVal)
     3554{
    35543555    ICOM_THIS( ITypeInfoImpl, iface);
    35553556    TLBCustData *pCData=NULL;
    3556     TLBFuncDesc * pFDesc; 
     3557    TLBFuncDesc * pFDesc;
    35573558    int i;
    35583559
     
    35603561
    35613562    if(pFDesc && indexParam >=0 && indexParam<pFDesc->funcdesc.cParams)
    3562         for(pCData=pFDesc->pParamDesc[indexParam].pCustData; pCData; 
     3563        for(pCData=pFDesc->pParamDesc[indexParam].pCustData; pCData;
    35633564                pCData = pCData->next)
    35643565            if( IsEqualIID(guid, &pCData->guid)) break;
     
    35803581 */
    35813582static HRESULT WINAPI ITypeInfo2_fnGetVarCustData(
    3582         ITypeInfo2 * iface,
    3583         UINT index,
    3584         REFGUID guid,
    3585         VARIANT *pVarVal)
    3586 {   
     3583    ITypeInfo2 * iface,
     3584    UINT index,
     3585    REFGUID guid,
     3586    VARIANT *pVarVal)
     3587{
    35873588    ICOM_THIS( ITypeInfoImpl, iface);
    35883589    TLBCustData *pCData=NULL;
    3589     TLBVarDesc * pVDesc; 
     3590    TLBVarDesc * pVDesc;
    35903591    int i;
    35913592
     
    36163617 */
    36173618static HRESULT WINAPI ITypeInfo2_fnGetImplTypeCustData(
    3618         ITypeInfo2 * iface,
    3619         UINT index,
    3620         REFGUID guid,
    3621         VARIANT *pVarVal)
    3622 {   
     3619    ITypeInfo2 * iface,
     3620    UINT index,
     3621    REFGUID guid,
     3622    VARIANT *pVarVal)
     3623{
    36233624    ICOM_THIS( ITypeInfoImpl, iface);
    36243625    TLBCustData *pCData=NULL;
    3625     TLBRefType * pRDesc; 
     3626    TLBRefType * pRDesc;
    36263627    int i;
    36273628
     
    36353636      }
    36363637    }
    3637    
     3638
    36383639    TRACE("(%p) guid %s %s found!x)\n", This, debugstr_guid(guid), pCData? "" : "NOT");
    36393640
     
    36483649
    36493650/* ITypeInfo2::GetDocumentation2
    3650  * 
     3651 *
    36513652 * Retrieves the documentation string, the complete Help file name and path,
    36523653 * the localization context to use, and the context ID for the library Help
     
    36553656 */
    36563657static HRESULT WINAPI ITypeInfo2_fnGetDocumentation2(
    3657         ITypeInfo2 * iface,
    3658         MEMBERID memid,
    3659         LCID lcid,
    3660         BSTR *pbstrHelpString,
    3661         DWORD *pdwHelpStringContext,
    3662         BSTR *pbstrHelpStringDll)
     3658    ITypeInfo2 * iface,
     3659    MEMBERID memid,
     3660    LCID lcid,
     3661    BSTR *pbstrHelpString,
     3662    DWORD *pdwHelpStringContext,
     3663    BSTR *pbstrHelpStringDll)
    36633664{
    36643665    ICOM_THIS( ITypeInfoImpl, iface);
    3665     TLBFuncDesc * pFDesc; 
    3666     TLBVarDesc * pVDesc; 
     3666    TLBFuncDesc * pFDesc;
     3667    TLBVarDesc * pVDesc;
    36673668    TRACE("(%p) memid %ld lcid(0x%lx)  HelpString(%p) "
    36683669          "HelpStringContext(%p) HelpStringDll(%p)\n",
     
    37113712/* ITypeInfo2::GetAllCustData
    37123713 *
    3713  * Gets all custom data items for the Type info. 
     3714 * Gets all custom data items for the Type info.
    37143715 *
    37153716 */
    37163717static HRESULT WINAPI ITypeInfo2_fnGetAllCustData(
    3717         ITypeInfo2 * iface,
    3718         CUSTDATA *pCustData)
     3718    ITypeInfo2 * iface,
     3719    CUSTDATA *pCustData)
    37193720{
    37203721    ICOM_THIS( ITypeInfoImpl, iface);
     
    37223723    int i;
    37233724
    3724     TRACE("(%p) returning %d items\n", This, This->ctCustData); 
     3725    TRACE("(%p) returning %d items\n", This, This->ctCustData);
    37253726
    37263727    pCustData->prgCustData = TLB_Alloc(This->ctCustData * sizeof(CUSTDATAITEM));
     
    37443745 */
    37453746static HRESULT WINAPI ITypeInfo2_fnGetAllFuncCustData(
    3746         ITypeInfo2 * iface,
    3747         UINT index,
    3748         CUSTDATA *pCustData)
     3747    ITypeInfo2 * iface,
     3748    UINT index,
     3749    CUSTDATA *pCustData)
    37493750{
    37503751    ICOM_THIS( ITypeInfoImpl, iface);
    37513752    TLBCustData *pCData;
    3752     TLBFuncDesc * pFDesc; 
     3753    TLBFuncDesc * pFDesc;
    37533754    int i;
    3754     TRACE("(%p) index %d\n", This, index); 
     3755    TRACE("(%p) index %d\n", This, index);
    37553756    for(i=0, pFDesc=This->funclist; i!=index && pFDesc; i++,
    37563757            pFDesc=pFDesc->next)
     
    37863787    ICOM_THIS( ITypeInfoImpl, iface);
    37873788    TLBCustData *pCData=NULL;
    3788     TLBFuncDesc * pFDesc; 
     3789    TLBFuncDesc * pFDesc;
    37893790    int i;
    3790     TRACE("(%p) index %d\n", This, indexFunc); 
     3791    TRACE("(%p) index %d\n", This, indexFunc);
    37913792    for(i=0, pFDesc=This->funclist; i!=indexFunc && pFDesc; i++,
    37923793            pFDesc=pFDesc->next)
    37933794        ;
    37943795    if(pFDesc && indexParam >=0 && indexParam<pFDesc->funcdesc.cParams){
    3795         pCustData->prgCustData = 
     3796        pCustData->prgCustData =
    37963797            TLB_Alloc(pFDesc->pParamDesc[indexParam].ctCustData *
    37973798                    sizeof(CUSTDATAITEM));
     
    38233824    ICOM_THIS( ITypeInfoImpl, iface);
    38243825    TLBCustData *pCData;
    3825     TLBVarDesc * pVDesc; 
     3826    TLBVarDesc * pVDesc;
    38263827    int i;
    3827     TRACE("(%p) index %d\n", This, index); 
     3828    TRACE("(%p) index %d\n", This, index);
    38283829    for(i=0, pVDesc=This->varlist; i!=index && pVDesc; i++,
    38293830            pVDesc=pVDesc->next)
     
    38553856 */
    38563857static HRESULT WINAPI ITypeInfo2_fnGetAllImplTypeCustData(
    3857         ITypeInfo2 * iface,
    3858         UINT index,
    3859         CUSTDATA *pCustData)
     3858    ITypeInfo2 * iface,
     3859    UINT index,
     3860    CUSTDATA *pCustData)
    38603861{
    38613862    ICOM_THIS( ITypeInfoImpl, iface);
    38623863    TLBCustData *pCData;
    3863     TLBRefType * pRDesc; 
     3864    TLBRefType * pRDesc;
    38643865    int i;
    3865     TRACE("(%p) index %d\n", This, index); 
     3866    TRACE("(%p) index %d\n", This, index);
    38663867    for(i=0, pRDesc=This->impltypelist; i!=index && pRDesc; i++,
    38673868            pRDesc=pRDesc->next)
     
    38873888}
    38883889
    3889 static ICOM_VTABLE(ITypeInfo2) tinfvt = 
     3890static ICOM_VTABLE(ITypeInfo2) tinfvt =
    38903891{
    38913892    ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
  • trunk/src/oleaut32/variant.c

    r6575 r6648  
     1/* $Id: variant.c,v 1.5 2001-09-05 13:19:02 bird Exp $ */
    12/*
    23 * VARIANT
     
    2829
    2930#include "config.h"
    30  
     31
    3132#include <string.h>
    3233#include <stdlib.h>
     
    106107
    107108/******************************************************************************
    108  *         DateTimeStringToTm   [INTERNAL]
     109 *     DateTimeStringToTm   [INTERNAL]
    109110 *
    110111 * Converts a string representation of a date and/or time to a tm structure.
     
    122123static BOOL DateTimeStringToTm( OLECHAR* strIn, DWORD dwFlags, struct tm* pTm )
    123124{
    124         BOOL res = FALSE;
    125         double          fsec;
    126         int             tzp;
    127         int             dtype;
    128         int             nf;
    129         char       *field[MAXDATEFIELDS];
    130         int             ftype[MAXDATEFIELDS];
    131         char            lowstr[MAXDATELEN + 1];
    132         char* strDateTime = NULL;
    133 
    134         /* Convert the string to ASCII since this is the only format
    135         * postgesql can handle.
    136         */
    137         strDateTime = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    138 
    139         if( strDateTime != NULL )
    140         {
    141                 /* Make sure we don't go over the maximum length
    142                 * accepted by postgesql.
    143                 */
    144                 if( strlen( strDateTime ) <= MAXDATELEN )
    145                 {
    146                         if( ParseDateTime( strDateTime, lowstr, field, ftype, MAXDATEFIELDS, &nf) == 0 )
    147                         {
    148                                 if( dwFlags & VAR_DATEVALUEONLY )
    149                                 {
    150                                         /* Get the date information.
    151                                         * It returns 0 if date information was
    152                                         * present and 1 if only time information was present.
    153                                         * -1 if an error occures.
    154                                         */
    155                                         if( DecodeDateTime(field, ftype, nf, &dtype, pTm, &fsec, &tzp) == 0 )
    156                                         {
    157                                                 /* Eliminate the time information since we
    158                                                 * were asked to get date information only.
    159                                                 */
    160                                                 pTm->tm_sec = 0;
    161                                                 pTm->tm_min = 0;
    162                                                 pTm->tm_hour = 0;
    163                                                 res = TRUE;
    164                                         }
    165                                 }
    166                                 if( dwFlags & VAR_TIMEVALUEONLY )
    167                                 {
    168                                         /* Get time information only.
    169                                         */
    170                                         if( DecodeTimeOnly(field, ftype, nf, &dtype, pTm, &fsec) == 0 )
    171                                         {
    172                                                 res = TRUE;
    173                                         }
    174                                 }
    175                                 else
    176                                 {
    177                                         /* Get both date and time information.
    178                                         * It returns 0 if date information was
    179                                         * present and 1 if only time information was present.
    180                                         * -1 if an error occures.
    181                                         */
    182                                         if( DecodeDateTime(field, ftype, nf, &dtype, pTm, &fsec, &tzp) != -1 )
    183                                         {
    184                                                 res = TRUE;
    185                                         }
    186                                 }
    187                         }
    188                 }
    189                 HeapFree( GetProcessHeap(), 0, strDateTime );
    190         }
    191 
    192         return res;
    193 }
    194 
    195 
    196 
    197 
    198 
    199 
    200 /******************************************************************************
    201  *         TmToDATE     [INTERNAL]
     125    BOOL res = FALSE;
     126    double      fsec;
     127    int         tzp;
     128    int         dtype;
     129    int         nf;
     130    char       *field[MAXDATEFIELDS];
     131    int         ftype[MAXDATEFIELDS];
     132    char        lowstr[MAXDATELEN + 1];
     133    char* strDateTime = NULL;
     134
     135    /* Convert the string to ASCII since this is the only format
     136    * postgesql can handle.
     137    */
     138    strDateTime = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
     139
     140    if( strDateTime != NULL )
     141    {
     142        /* Make sure we don't go over the maximum length
     143        * accepted by postgesql.
     144        */
     145        if( strlen( strDateTime ) <= MAXDATELEN )
     146        {
     147            if( ParseDateTime( strDateTime, lowstr, field, ftype, MAXDATEFIELDS, &nf) == 0 )
     148            {
     149                if( dwFlags & VAR_DATEVALUEONLY )
     150                {
     151                    /* Get the date information.
     152                    * It returns 0 if date information was
     153                    * present and 1 if only time information was present.
     154                    * -1 if an error occures.
     155                    */
     156                    if( DecodeDateTime(field, ftype, nf, &dtype, pTm, &fsec, &tzp) == 0 )
     157                    {
     158                        /* Eliminate the time information since we
     159                        * were asked to get date information only.
     160                        */
     161                        pTm->tm_sec = 0;
     162                        pTm->tm_min = 0;
     163                        pTm->tm_hour = 0;
     164                        res = TRUE;
     165                    }
     166                }
     167                if( dwFlags & VAR_TIMEVALUEONLY )
     168                {
     169                    /* Get time information only.
     170                    */
     171                    if( DecodeTimeOnly(field, ftype, nf, &dtype, pTm, &fsec) == 0 )
     172                    {
     173                        res = TRUE;
     174                    }
     175                }
     176                else
     177                {
     178                    /* Get both date and time information.
     179                    * It returns 0 if date information was
     180                    * present and 1 if only time information was present.
     181                    * -1 if an error occures.
     182                    */
     183                    if( DecodeDateTime(field, ftype, nf, &dtype, pTm, &fsec, &tzp) != -1 )
     184                    {
     185                        res = TRUE;
     186                    }
     187                }
     188            }
     189        }
     190        HeapFree( GetProcessHeap(), 0, strDateTime );
     191    }
     192
     193    return res;
     194}
     195
     196
     197
     198
     199
     200
     201/******************************************************************************
     202 *     TmToDATE     [INTERNAL]
    202203 *
    203204 * The date is implemented using an 8 byte floating-point number.
     
    216217 * The tm structure is as follows:
    217218 * struct tm {
    218  *                int tm_sec;      seconds after the minute - [0,59]
    219  *                int tm_min;      minutes after the hour - [0,59]
    220  *                int tm_hour;     hours since midnight - [0,23]
    221  *                int tm_mday;     day of the month - [1,31]
    222  *                int tm_mon;      months since January - [0,11]
    223  *                int tm_year;     years
    224  *                int tm_wday;     days since Sunday - [0,6]
    225  *                int tm_yday;     days since January 1 - [0,365]
    226  *                int tm_isdst;    daylight savings time flag
    227  *                };
     219 *        int tm_sec;      seconds after the minute - [0,59]
     220 *        int tm_min;      minutes after the hour - [0,59]
     221 *        int tm_hour;     hours since midnight - [0,23]
     222 *        int tm_mday;     day of the month - [1,31]
     223 *        int tm_mon;      months since January - [0,11]
     224 *        int tm_year;     years
     225 *        int tm_wday;     days since Sunday - [0,6]
     226 *        int tm_yday;     days since January 1 - [0,365]
     227 *        int tm_isdst;    daylight savings time flag
     228 *        };
    228229 *
    229230 * Note: This function does not use the tm_wday, tm_yday, tm_wday,
     
    235236static BOOL TmToDATE( struct tm* pTm, DATE *pDateOut )
    236237{
    237         if( (pTm->tm_year - 1900) >= 0 )
    238         {
    239                 int leapYear = 0;
    240                
    241                 /* Start at 1. This is the way DATE is defined.
    242                 * January 1, 1900 at Midnight is 1.00.
    243                 * January 1, 1900 at 6AM is 1.25.
    244                 * and so on.
    245                 */
    246                 *pDateOut = 1;
    247 
    248                 /* Add the number of days corresponding to
    249                 * tm_year.
    250                 */
    251                 *pDateOut += (pTm->tm_year - 1900) * 365;
    252 
    253                 /* Add the leap days in the previous years between now and 1900.
    254                 * Note a leap year is one that is a multiple of 4
    255                 * but not of a 100.  Except if it is a multiple of
    256                 * 400 then it is a leap year.
    257                 */
    258                 *pDateOut += ( (pTm->tm_year - 1) / 4 ) - ( 1900 / 4 );
    259                 *pDateOut -= ( (pTm->tm_year - 1) / 100 ) - ( 1900 / 100 );
    260                 *pDateOut += ( (pTm->tm_year - 1) / 400 ) - ( 1900 / 400 );
    261 
    262                 /* Set the leap year flag if the
    263                 * current year specified by tm_year is a
    264                 * leap year. This will be used to add a day
    265                 * to the day count.
    266                 */
    267                 if( isleap( pTm->tm_year ) )
    268                         leapYear = 1;
    269                
    270                 /* Add the number of days corresponding to
    271                 * the month.
    272                 */
    273                 switch( pTm->tm_mon )
    274                 {
    275                 case 2:
    276                         *pDateOut += 31;
    277                         break;
    278                 case 3:
    279                         *pDateOut += ( 59 + leapYear );
    280                         break;
    281                 case 4:
    282                         *pDateOut += ( 90 + leapYear );
    283                         break;
    284                 case 5:
    285                         *pDateOut += ( 120 + leapYear );
    286                         break;
    287                 case 6:
    288                         *pDateOut += ( 151 + leapYear );
    289                         break;
    290                 case 7:
    291                         *pDateOut += ( 181 + leapYear );
    292                         break;
    293                 case 8:
    294                         *pDateOut += ( 212 + leapYear );
    295                         break;
    296                 case 9:
    297                         *pDateOut += ( 243 + leapYear );
    298                         break;
    299                 case 10:
    300                         *pDateOut += ( 273 + leapYear );
    301                         break;
    302                 case 11:
    303                         *pDateOut += ( 304 + leapYear );
    304                         break;
    305                 case 12:
    306                         *pDateOut += ( 334 + leapYear );
    307                         break;
    308                 }
    309                 /* Add the number of days in this month.
    310                 */
    311                 *pDateOut += pTm->tm_mday;
    312        
    313                 /* Add the number of seconds, minutes, and hours
    314                 * to the DATE. Note these are the fracionnal part
    315                 * of the DATE so seconds / number of seconds in a day.
    316                 */
    317                 *pDateOut += pTm->tm_hour / 24.0;
    318                 *pDateOut += pTm->tm_min / 1440.0;
    319                 *pDateOut += pTm->tm_sec / 86400.0;
    320                 return TRUE;
    321         }
    322         return FALSE;
    323 }
    324 
    325 /******************************************************************************
    326  *         DateToTm     [INTERNAL]
     238    if( (pTm->tm_year - 1900) >= 0 )
     239    {
     240        int leapYear = 0;
     241
     242        /* Start at 1. This is the way DATE is defined.
     243        * January 1, 1900 at Midnight is 1.00.
     244        * January 1, 1900 at 6AM is 1.25.
     245        * and so on.
     246        */
     247        *pDateOut = 1;
     248
     249        /* Add the number of days corresponding to
     250        * tm_year.
     251        */
     252        *pDateOut += (pTm->tm_year - 1900) * 365;
     253
     254        /* Add the leap days in the previous years between now and 1900.
     255        * Note a leap year is one that is a multiple of 4
     256        * but not of a 100.  Except if it is a multiple of
     257        * 400 then it is a leap year.
     258        */
     259        *pDateOut += ( (pTm->tm_year - 1) / 4 ) - ( 1900 / 4 );
     260        *pDateOut -= ( (pTm->tm_year - 1) / 100 ) - ( 1900 / 100 );
     261        *pDateOut += ( (pTm->tm_year - 1) / 400 ) - ( 1900 / 400 );
     262
     263        /* Set the leap year flag if the
     264        * current year specified by tm_year is a
     265        * leap year. This will be used to add a day
     266        * to the day count.
     267        */
     268        if( isleap( pTm->tm_year ) )
     269            leapYear = 1;
     270
     271        /* Add the number of days corresponding to
     272        * the month.
     273        */
     274        switch( pTm->tm_mon )
     275        {
     276        case 2:
     277            *pDateOut += 31;
     278            break;
     279        case 3:
     280            *pDateOut += ( 59 + leapYear );
     281            break;
     282        case 4:
     283            *pDateOut += ( 90 + leapYear );
     284            break;
     285        case 5:
     286            *pDateOut += ( 120 + leapYear );
     287            break;
     288        case 6:
     289            *pDateOut += ( 151 + leapYear );
     290            break;
     291        case 7:
     292            *pDateOut += ( 181 + leapYear );
     293            break;
     294        case 8:
     295            *pDateOut += ( 212 + leapYear );
     296            break;
     297        case 9:
     298            *pDateOut += ( 243 + leapYear );
     299            break;
     300        case 10:
     301            *pDateOut += ( 273 + leapYear );
     302            break;
     303        case 11:
     304            *pDateOut += ( 304 + leapYear );
     305            break;
     306        case 12:
     307            *pDateOut += ( 334 + leapYear );
     308            break;
     309        }
     310        /* Add the number of days in this month.
     311        */
     312        *pDateOut += pTm->tm_mday;
     313
     314        /* Add the number of seconds, minutes, and hours
     315        * to the DATE. Note these are the fracionnal part
     316        * of the DATE so seconds / number of seconds in a day.
     317        */
     318        *pDateOut += pTm->tm_hour / 24.0;
     319        *pDateOut += pTm->tm_min / 1440.0;
     320        *pDateOut += pTm->tm_sec / 86400.0;
     321        return TRUE;
     322    }
     323    return FALSE;
     324}
     325
     326/******************************************************************************
     327 *     DateToTm     [INTERNAL]
    327328 *
    328329 * This function converts a windows DATE to a tm structure.
     
    339340static BOOL DateToTm( DATE dateIn, DWORD dwFlags, struct tm* pTm )
    340341{
    341         /* Do not process dates smaller than January 1, 1900.
    342         * Which corresponds to 2.0 in the windows DATE format.
    343         */
    344         if( dateIn >= 2.0 )
    345         {
    346                 double decimalPart = 0.0;
    347                 double wholePart = 0.0;
    348 
    349                 memset(pTm,0,sizeof(*pTm));
    350        
    351                 /* Because of the nature of DATE format which
    352                 * associates 2.0 to January 1, 1900. We will
    353                 * remove 1.0 from the whole part of the DATE
    354                 * so that in the following code 1.0
    355                 * will correspond to January 1, 1900.
    356                 * This simplifies the processing of the DATE value.
    357                 */
    358                 dateIn -= 1.0;
    359 
    360                 wholePart = (double) floor( dateIn );
    361                 decimalPart = fmod( dateIn, wholePart );
    362 
    363                 if( !(dwFlags & VAR_TIMEVALUEONLY) )
    364                 {
    365                         int nDay = 0;
    366                         int leapYear = 0;
    367                         double yearsSince1900 = 0;
    368                         /* Start at 1900, this is where the DATE time 0.0 starts.
    369                         */
    370                         pTm->tm_year = 1900;
    371                         /* find in what year the day in the "wholePart" falls into.
    372                         * add the value to the year field.
    373                         */
    374                         yearsSince1900 = floor( (wholePart / DAYS_IN_ONE_YEAR) + 0.001 );
    375                         pTm->tm_year += yearsSince1900;
    376                         /* determine if this is a leap year.
    377                         */
    378                         if( isleap( pTm->tm_year ) )
    379                         {
    380                                 leapYear = 1;
    381                                 wholePart++;
    382                         }
    383 
    384                         /* find what day of that year the "wholePart" corresponds to.
    385                         * Note: nDay is in [1-366] format
    386                         */
    387                         nDay = (int) ( wholePart - floor( yearsSince1900 * DAYS_IN_ONE_YEAR ) );
    388                         /* Set the tm_yday value.
    389                         * Note: The day must be converted from [1-366] to [0-365]
    390                         */
    391                         /*pTm->tm_yday = nDay - 1;*/
    392                         /* find which month this day corresponds to.
    393                         */
    394                         if( nDay <= 31 )
    395                         {
    396                                 pTm->tm_mday = nDay;
    397                                 pTm->tm_mon = 0;
    398                         }
    399                         else if( nDay <= ( 59 + leapYear ) )
    400                         {
    401                                 pTm->tm_mday = nDay - 31;
    402                                 pTm->tm_mon = 1;
    403                         }
    404                         else if( nDay <= ( 90 + leapYear ) )
    405                         {
    406                                 pTm->tm_mday = nDay - ( 59 + leapYear );
    407                                 pTm->tm_mon = 2;
    408                         }
    409                         else if( nDay <= ( 120 + leapYear ) )
    410                         {
    411                                 pTm->tm_mday = nDay - ( 90 + leapYear );
    412                                 pTm->tm_mon = 3;
    413                         }
    414                         else if( nDay <= ( 151 + leapYear ) )
    415                         {
    416                                 pTm->tm_mday = nDay - ( 120 + leapYear );
    417                                 pTm->tm_mon = 4;
    418                         }
    419                         else if( nDay <= ( 181 + leapYear ) )
    420                         {
    421                                 pTm->tm_mday = nDay - ( 151 + leapYear );
    422                                 pTm->tm_mon = 5;
    423                         }
    424                         else if( nDay <= ( 212 + leapYear ) )
    425                         {
    426                                 pTm->tm_mday = nDay - ( 181 + leapYear );
    427                                 pTm->tm_mon = 6;
    428                         }
    429                         else if( nDay <= ( 243 + leapYear ) )
    430                         {
    431                                 pTm->tm_mday = nDay - ( 212 + leapYear );
    432                                 pTm->tm_mon = 7;
    433                         }
    434                         else if( nDay <= ( 273 + leapYear ) )
    435                         {
    436                                 pTm->tm_mday = nDay - ( 243 + leapYear );
    437                                 pTm->tm_mon = 8;
    438                         }
    439                         else if( nDay <= ( 304 + leapYear ) )
    440                         {
    441                                 pTm->tm_mday = nDay - ( 273 + leapYear );
    442                                 pTm->tm_mon = 9;
    443                         }
    444                         else if( nDay <= ( 334 + leapYear ) )
    445                         {
    446                                 pTm->tm_mday = nDay - ( 304 + leapYear );
    447                                 pTm->tm_mon = 10;
    448                         }
    449                         else if( nDay <= ( 365 + leapYear ) )
    450                         {
    451                                 pTm->tm_mday = nDay - ( 334 + leapYear );
    452                                 pTm->tm_mon = 11;
    453                         }
    454                 }
    455                 if( !(dwFlags & VAR_DATEVALUEONLY) )
    456                 {
    457                         /* find the number of seconds in this day.
    458                         * fractional part times, hours, minutes, seconds.
    459                         */
    460                         pTm->tm_hour = (int) ( decimalPart * 24 );
    461                         pTm->tm_min = (int) ( ( ( decimalPart * 24 ) - pTm->tm_hour ) * 60 );
    462                         pTm->tm_sec = (int) ( ( ( decimalPart * 24 * 60 ) - ( pTm->tm_hour * 60 ) - pTm->tm_min ) * 60 );
    463                 }
    464                 return TRUE;
    465         }
    466         return FALSE;
    467 }
    468 
    469 
    470 
    471 /******************************************************************************
    472  *         SizeOfVariantData    [INTERNAL]
     342    /* Do not process dates smaller than January 1, 1900.
     343    * Which corresponds to 2.0 in the windows DATE format.
     344    */
     345    if( dateIn >= 2.0 )
     346    {
     347        double decimalPart = 0.0;
     348        double wholePart = 0.0;
     349
     350        memset(pTm,0,sizeof(*pTm));
     351
     352        /* Because of the nature of DATE format which
     353        * associates 2.0 to January 1, 1900. We will
     354        * remove 1.0 from the whole part of the DATE
     355        * so that in the following code 1.0
     356        * will correspond to January 1, 1900.
     357        * This simplifies the processing of the DATE value.
     358        */
     359        dateIn -= 1.0;
     360
     361        wholePart = (double) floor( dateIn );
     362        decimalPart = fmod( dateIn, wholePart );
     363
     364        if( !(dwFlags & VAR_TIMEVALUEONLY) )
     365        {
     366            int nDay = 0;
     367            int leapYear = 0;
     368            double yearsSince1900 = 0;
     369            /* Start at 1900, this is where the DATE time 0.0 starts.
     370            */
     371            pTm->tm_year = 1900;
     372            /* find in what year the day in the "wholePart" falls into.
     373            * add the value to the year field.
     374            */
     375            yearsSince1900 = floor( (wholePart / DAYS_IN_ONE_YEAR) + 0.001 );
     376            pTm->tm_year += yearsSince1900;
     377            /* determine if this is a leap year.
     378            */
     379            if( isleap( pTm->tm_year ) )
     380            {
     381                leapYear = 1;
     382                wholePart++;
     383            }
     384
     385            /* find what day of that year the "wholePart" corresponds to.
     386            * Note: nDay is in [1-366] format
     387            */
     388            nDay = (int) ( wholePart - floor( yearsSince1900 * DAYS_IN_ONE_YEAR ) );
     389            /* Set the tm_yday value.
     390            * Note: The day must be converted from [1-366] to [0-365]
     391            */
     392            /*pTm->tm_yday = nDay - 1;*/
     393            /* find which month this day corresponds to.
     394            */
     395            if( nDay <= 31 )
     396            {
     397                pTm->tm_mday = nDay;
     398                pTm->tm_mon = 0;
     399            }
     400            else if( nDay <= ( 59 + leapYear ) )
     401            {
     402                pTm->tm_mday = nDay - 31;
     403                pTm->tm_mon = 1;
     404            }
     405            else if( nDay <= ( 90 + leapYear ) )
     406            {
     407                pTm->tm_mday = nDay - ( 59 + leapYear );
     408                pTm->tm_mon = 2;
     409            }
     410            else if( nDay <= ( 120 + leapYear ) )
     411            {
     412                pTm->tm_mday = nDay - ( 90 + leapYear );
     413                pTm->tm_mon = 3;
     414            }
     415            else if( nDay <= ( 151 + leapYear ) )
     416            {
     417                pTm->tm_mday = nDay - ( 120 + leapYear );
     418                pTm->tm_mon = 4;
     419            }
     420            else if( nDay <= ( 181 + leapYear ) )
     421            {
     422                pTm->tm_mday = nDay - ( 151 + leapYear );
     423                pTm->tm_mon = 5;
     424            }
     425            else if( nDay <= ( 212 + leapYear ) )
     426            {
     427                pTm->tm_mday = nDay - ( 181 + leapYear );
     428                pTm->tm_mon = 6;
     429            }
     430            else if( nDay <= ( 243 + leapYear ) )
     431            {
     432                pTm->tm_mday = nDay - ( 212 + leapYear );
     433                pTm->tm_mon = 7;
     434            }
     435            else if( nDay <= ( 273 + leapYear ) )
     436            {
     437                pTm->tm_mday = nDay - ( 243 + leapYear );
     438                pTm->tm_mon = 8;
     439            }
     440            else if( nDay <= ( 304 + leapYear ) )
     441            {
     442                pTm->tm_mday = nDay - ( 273 + leapYear );
     443                pTm->tm_mon = 9;
     444            }
     445            else if( nDay <= ( 334 + leapYear ) )
     446            {
     447                pTm->tm_mday = nDay - ( 304 + leapYear );
     448                pTm->tm_mon = 10;
     449            }
     450            else if( nDay <= ( 365 + leapYear ) )
     451            {
     452                pTm->tm_mday = nDay - ( 334 + leapYear );
     453                pTm->tm_mon = 11;
     454            }
     455        }
     456        if( !(dwFlags & VAR_DATEVALUEONLY) )
     457        {
     458            /* find the number of seconds in this day.
     459            * fractional part times, hours, minutes, seconds.
     460            */
     461            pTm->tm_hour = (int) ( decimalPart * 24 );
     462            pTm->tm_min = (int) ( ( ( decimalPart * 24 ) - pTm->tm_hour ) * 60 );
     463            pTm->tm_sec = (int) ( ( ( decimalPart * 24 * 60 ) - ( pTm->tm_hour * 60 ) - pTm->tm_min ) * 60 );
     464        }
     465        return TRUE;
     466    }
     467    return FALSE;
     468}
     469
     470
     471
     472/******************************************************************************
     473 *     SizeOfVariantData    [INTERNAL]
    473474 *
    474475 * This function finds the size of the data referenced by a Variant based
     
    528529}
    529530/******************************************************************************
    530  *         StringDupAtoBstr             [INTERNAL]
    531  * 
     531 *     StringDupAtoBstr     [INTERNAL]
     532 *
    532533 */
    533534static BSTR StringDupAtoBstr( char* strIn )
    534535{
    535         BSTR bstr = NULL;
    536         OLECHAR* pNewString = NULL;
    537         pNewString = HEAP_strdupAtoW( GetProcessHeap(), 0, strIn );
    538         bstr = SysAllocString( pNewString );
    539         HeapFree( GetProcessHeap(), 0, pNewString );
    540         return bstr;
    541 }
    542 
    543 /******************************************************************************
    544  *              round           [INTERNAL]
     536    BSTR bstr = NULL;
     537    OLECHAR* pNewString = NULL;
     538    pNewString = HEAP_strdupAtoW( GetProcessHeap(), 0, strIn );
     539    bstr = SysAllocString( pNewString );
     540    HeapFree( GetProcessHeap(), 0, pNewString );
     541    return bstr;
     542}
     543
     544/******************************************************************************
     545 *      round       [INTERNAL]
    545546 *
    546547 * Round the double value to the nearest integer value.
     
    556557   nSign = (d >= 0.0) ? 1 : -1;
    557558    d = fabs( d );
    558    
    559         /* Remove the decimals.
    560         */
     559
     560    /* Remove the decimals.
     561    */
    561562   integerValue = floor( d );
    562563
     
    573574    decimals = d - integerValue;
    574575
    575         /* Note: Ceil returns the smallest integer that is greater that x.
    576         * and floor returns the largest integer that is less than or equal to x.
    577         */
     576    /* Note: Ceil returns the smallest integer that is greater that x.
     577    * and floor returns the largest integer that is less than or equal to x.
     578    */
    578579    if( decimals > 0.5 )
    579580    {
     
    603604    }
    604605
    605         return roundedValue * nSign;
    606 }
    607 
    608 /******************************************************************************
    609  *              RemoveCharacterFromString               [INTERNAL]
     606    return roundedValue * nSign;
     607}
     608
     609/******************************************************************************
     610 *      RemoveCharacterFromString       [INTERNAL]
    610611 *
    611612 * Removes any of the characters in "strOfCharToRemove" from the "str" argument.
     
    613614static void RemoveCharacterFromString( LPSTR str, LPSTR strOfCharToRemove )
    614615{
    615         LPSTR pNewString = NULL;
    616         LPSTR strToken = NULL;
    617 
    618 
    619         /* Check if we have a valid argument
    620         */
    621         if( str != NULL )
    622         {
    623                 pNewString = strdup( str );
    624                 str[0] = '\0';
    625                 strToken = strtok( pNewString, strOfCharToRemove );
    626                 while( strToken != NULL ) {
    627                         strcat( str, strToken );
    628                         strToken = strtok( NULL, strOfCharToRemove );
    629                 }
    630                 free( pNewString );
    631         }
    632         return;
    633 }
    634 
    635 /******************************************************************************
    636  *              GetValidRealString              [INTERNAL]
     616    LPSTR pNewString = NULL;
     617    LPSTR strToken = NULL;
     618
     619
     620    /* Check if we have a valid argument
     621    */
     622    if( str != NULL )
     623    {
     624        pNewString = strdup( str );
     625        str[0] = '\0';
     626        strToken = strtok( pNewString, strOfCharToRemove );
     627        while( strToken != NULL ) {
     628            strcat( str, strToken );
     629            strToken = strtok( NULL, strOfCharToRemove );
     630        }
     631        free( pNewString );
     632    }
     633    return;
     634}
     635
     636/******************************************************************************
     637 *      GetValidRealString      [INTERNAL]
    637638 *
    638639 * Checks if the string is of proper format to be converted to a real value.
     
    640641static BOOL IsValidRealString( LPSTR strRealString )
    641642{
    642         /* Real values that have a decimal point are required to either have
    643         * digits before or after the decimal point.  We will assume that
    644         * we do not have any digits at either position. If we do encounter
    645         * some we will disable this flag.
    646         */
    647         BOOL bDigitsRequired = TRUE;
    648         /* Processed fields in the string representation of the real number.
    649         */
    650         BOOL bWhiteSpaceProcessed = FALSE;
    651         BOOL bFirstSignProcessed = FALSE;
    652         BOOL bFirstDigitsProcessed = FALSE;
    653         BOOL bDecimalPointProcessed = FALSE;
    654         BOOL bSecondDigitsProcessed = FALSE;
    655         BOOL bExponentProcessed = FALSE;
    656         BOOL bSecondSignProcessed = FALSE;
    657         BOOL bThirdDigitsProcessed = FALSE;
    658         /* Assume string parameter "strRealString" is valid and try to disprove it.
    659         */
    660         BOOL bValidRealString = TRUE;
    661 
    662         /* Used to count the number of tokens in the "strRealString".
    663         */
    664         LPSTR strToken = NULL;
    665         int nTokens = 0;
    666         LPSTR pChar = NULL;
    667        
    668         /* Check if we have a valid argument
    669         */
    670         if( strRealString == NULL )
    671         {
    672                 bValidRealString = FALSE;
    673         }
    674 
    675         if( bValidRealString == TRUE )
    676         {
    677                 /* Make sure we only have ONE token in the string.
    678                 */
    679                 strToken = strtok( strRealString, " " );
    680                 while( strToken != NULL ) {
    681                         nTokens++;             
    682                         strToken = strtok( NULL, " " );
    683                 }
    684 
    685                 if( nTokens != 1 )
    686                 {
    687                         bValidRealString = FALSE;
    688                 }
    689         }
    690 
    691 
    692         /* Make sure this token contains only valid characters.
    693         * The string argument to atof has the following form:
    694         * [whitespace] [sign] [digits] [.digits] [ {d | D | e | E }[sign]digits]
    695         * Whitespace consists of space and|or <TAB> characters, which are ignored.
     643    /* Real values that have a decimal point are required to either have
     644    * digits before or after the decimal point.  We will assume that
     645    * we do not have any digits at either position. If we do encounter
     646    * some we will disable this flag.
     647    */
     648    BOOL bDigitsRequired = TRUE;
     649    /* Processed fields in the string representation of the real number.
     650    */
     651    BOOL bWhiteSpaceProcessed = FALSE;
     652    BOOL bFirstSignProcessed = FALSE;
     653    BOOL bFirstDigitsProcessed = FALSE;
     654    BOOL bDecimalPointProcessed = FALSE;
     655    BOOL bSecondDigitsProcessed = FALSE;
     656    BOOL bExponentProcessed = FALSE;
     657    BOOL bSecondSignProcessed = FALSE;
     658    BOOL bThirdDigitsProcessed = FALSE;
     659    /* Assume string parameter "strRealString" is valid and try to disprove it.
     660    */
     661    BOOL bValidRealString = TRUE;
     662
     663    /* Used to count the number of tokens in the "strRealString".
     664    */
     665    LPSTR strToken = NULL;
     666    int nTokens = 0;
     667    LPSTR pChar = NULL;
     668
     669    /* Check if we have a valid argument
     670    */
     671    if( strRealString == NULL )
     672    {
     673        bValidRealString = FALSE;
     674    }
     675
     676    if( bValidRealString == TRUE )
     677    {
     678        /* Make sure we only have ONE token in the string.
     679        */
     680        strToken = strtok( strRealString, " " );
     681        while( strToken != NULL ) {
     682            nTokens++;
     683            strToken = strtok( NULL, " " );
     684        }
     685
     686        if( nTokens != 1 )
     687        {
     688            bValidRealString = FALSE;
     689        }
     690    }
     691
     692
     693    /* Make sure this token contains only valid characters.
     694    * The string argument to atof has the following form:
     695    * [whitespace] [sign] [digits] [.digits] [ {d | D | e | E }[sign]digits]
     696    * Whitespace consists of space and|or <TAB> characters, which are ignored.
    696697     * Sign is either plus '+' or minus '-'.
    697698     * Digits are one or more decimal digits.
     
    700701     * The decimal digits may be followed by an exponent.
    701702     * An Exponent consists of an introductory letter ( D, d, E, or e) and
    702         * an optionally signed decimal integer.
    703         */
    704         pChar = strRealString;
    705         while( bValidRealString == TRUE && *pChar != '\0' )
    706         {
    707                 switch( *pChar )
    708                 {
    709                 /* If whitespace...
    710                 */
    711                 case ' ':
    712                 case '\t':
    713                         if( bWhiteSpaceProcessed ||
    714                                 bFirstSignProcessed ||
    715                                 bFirstDigitsProcessed ||
    716                                 bDecimalPointProcessed ||
    717                                 bSecondDigitsProcessed ||
    718                                 bExponentProcessed ||
    719                                 bSecondSignProcessed ||
    720                                 bThirdDigitsProcessed )
    721                         {
    722                                 bValidRealString = FALSE;
    723                         }
    724                         break;
    725                 /* If sign...
    726                 */
    727                 case '+':
    728                 case '-':
    729                         if( bFirstSignProcessed == FALSE )
    730                         {
    731                                 if( bFirstDigitsProcessed ||
    732                                         bDecimalPointProcessed ||
    733                                         bSecondDigitsProcessed ||
    734                                         bExponentProcessed ||
    735                                         bSecondSignProcessed ||
    736                                         bThirdDigitsProcessed )
    737                                 {
    738                                         bValidRealString = FALSE;
    739                                 }
    740                                 bWhiteSpaceProcessed = TRUE;
    741                                 bFirstSignProcessed = TRUE;
    742                         }
    743                         else if( bSecondSignProcessed == FALSE )
    744                         {
     703    * an optionally signed decimal integer.
     704    */
     705    pChar = strRealString;
     706    while( bValidRealString == TRUE && *pChar != '\0' )
     707    {
     708        switch( *pChar )
     709        {
     710        /* If whitespace...
     711        */
     712        case ' ':
     713        case '\t':
     714            if( bWhiteSpaceProcessed ||
     715                bFirstSignProcessed ||
     716                bFirstDigitsProcessed ||
     717                bDecimalPointProcessed ||
     718                bSecondDigitsProcessed ||
     719                bExponentProcessed ||
     720                bSecondSignProcessed ||
     721                bThirdDigitsProcessed )
     722            {
     723                bValidRealString = FALSE;
     724            }
     725            break;
     726        /* If sign...
     727        */
     728        case '+':
     729        case '-':
     730            if( bFirstSignProcessed == FALSE )
     731            {
     732                if( bFirstDigitsProcessed ||
     733                    bDecimalPointProcessed ||
     734                    bSecondDigitsProcessed ||
     735                    bExponentProcessed ||
     736                    bSecondSignProcessed ||
     737                    bThirdDigitsProcessed )
     738                {
     739                    bValidRealString = FALSE;
     740                }
     741                bWhiteSpaceProcessed = TRUE;
     742                bFirstSignProcessed = TRUE;
     743            }
     744            else if( bSecondSignProcessed == FALSE )
     745            {
    745746                /* Note: The exponent must be present in
    746                                 * order to accept the second sign...
    747                                 */
    748                                 if( bExponentProcessed == FALSE ||
    749                                         bThirdDigitsProcessed ||
    750                                         bDigitsRequired )
    751                                 {
    752                                         bValidRealString = FALSE;
    753                                 }
    754                                 bFirstSignProcessed = TRUE;
    755                                 bWhiteSpaceProcessed = TRUE;
    756                                 bFirstDigitsProcessed = TRUE;
    757                                 bDecimalPointProcessed = TRUE;
    758                                 bSecondDigitsProcessed = TRUE;
    759                                 bSecondSignProcessed = TRUE;
    760                         }
    761                         break;
    762 
    763                 /* If decimals...
    764                 */
    765                 case '0':
    766                 case '1':
    767                 case '2':
    768                 case '3':
    769                 case '4':
    770                 case '5':
    771                 case '6':
    772                 case '7':
    773                 case '8':
    774                 case '9':
    775                         if( bFirstDigitsProcessed == FALSE )
    776                         {
    777                                 if( bDecimalPointProcessed ||
    778                                         bSecondDigitsProcessed ||
    779                                         bExponentProcessed ||
    780                                         bSecondSignProcessed ||
    781                                         bThirdDigitsProcessed )
    782                                 {
    783                                         bValidRealString = FALSE;
    784                                 }
    785                                 bFirstSignProcessed = TRUE;
    786                                 bWhiteSpaceProcessed = TRUE;
    787                                 /* We have found some digits before the decimal point
    788                                 * so disable the "Digits required" flag.
    789                                 */
    790                                 bDigitsRequired = FALSE;
    791                         }
    792                         else if( bSecondDigitsProcessed == FALSE )
    793                         {
    794                                 if( bExponentProcessed ||
    795                                         bSecondSignProcessed ||
    796                                         bThirdDigitsProcessed )
    797                                 {
    798                                         bValidRealString = FALSE;
    799                                 }
    800                                 bFirstSignProcessed = TRUE;
    801                                 bWhiteSpaceProcessed = TRUE;
    802                                 bFirstDigitsProcessed = TRUE;
    803                                 bDecimalPointProcessed = TRUE;
    804                                 /* We have found some digits after the decimal point
    805                                 * so disable the "Digits required" flag.
    806                                 */
    807                                 bDigitsRequired = FALSE;
    808                         }
    809                         else if( bThirdDigitsProcessed == FALSE )
    810                         {
    811                                 /* Getting here means everything else should be processed.
     747                * order to accept the second sign...
     748                */
     749                if( bExponentProcessed == FALSE ||
     750                    bThirdDigitsProcessed ||
     751                    bDigitsRequired )
     752                {
     753                    bValidRealString = FALSE;
     754                }
     755                bFirstSignProcessed = TRUE;
     756                bWhiteSpaceProcessed = TRUE;
     757                bFirstDigitsProcessed = TRUE;
     758                bDecimalPointProcessed = TRUE;
     759                bSecondDigitsProcessed = TRUE;
     760                bSecondSignProcessed = TRUE;
     761            }
     762            break;
     763
     764        /* If decimals...
     765        */
     766        case '0':
     767        case '1':
     768        case '2':
     769        case '3':
     770        case '4':
     771        case '5':
     772        case '6':
     773        case '7':
     774        case '8':
     775        case '9':
     776            if( bFirstDigitsProcessed == FALSE )
     777            {
     778                if( bDecimalPointProcessed ||
     779                    bSecondDigitsProcessed ||
     780                    bExponentProcessed ||
     781                    bSecondSignProcessed ||
     782                    bThirdDigitsProcessed )
     783                {
     784                    bValidRealString = FALSE;
     785                }
     786                bFirstSignProcessed = TRUE;
     787                bWhiteSpaceProcessed = TRUE;
     788                /* We have found some digits before the decimal point
     789                * so disable the "Digits required" flag.
     790                */
     791                bDigitsRequired = FALSE;
     792            }
     793            else if( bSecondDigitsProcessed == FALSE )
     794            {
     795                if( bExponentProcessed ||
     796                    bSecondSignProcessed ||
     797                    bThirdDigitsProcessed )
     798                {
     799                    bValidRealString = FALSE;
     800                }
     801                bFirstSignProcessed = TRUE;
     802                bWhiteSpaceProcessed = TRUE;
     803                bFirstDigitsProcessed = TRUE;
     804                bDecimalPointProcessed = TRUE;
     805                /* We have found some digits after the decimal point
     806                * so disable the "Digits required" flag.
     807                */
     808                bDigitsRequired = FALSE;
     809            }
     810            else if( bThirdDigitsProcessed == FALSE )
     811            {
     812                /* Getting here means everything else should be processed.
    812813                 * If we get anything else than a decimal following this
    813814                 * digit it will be flagged by the other cases, so
    814                                 * we do not really need to do anything in here.
    815                                 */
    816                         }
    817                         break;
    818                 /* If DecimalPoint...
    819                 */
    820                 case '.':
    821                         if( bDecimalPointProcessed ||
    822                                 bSecondDigitsProcessed ||
    823                                 bExponentProcessed ||
    824                                 bSecondSignProcessed ||
    825                                 bThirdDigitsProcessed )
    826                         {
    827                                 bValidRealString = FALSE;
    828                         }
    829                         bFirstSignProcessed = TRUE;
    830                         bWhiteSpaceProcessed = TRUE;
    831                         bFirstDigitsProcessed = TRUE;
    832                         bDecimalPointProcessed = TRUE;
    833                         break;
    834                 /* If Exponent...
    835                 */
    836                 case 'e':
    837                 case 'E':
    838                 case 'd':
    839                 case 'D':
    840                         if( bExponentProcessed ||
    841                                 bSecondSignProcessed ||
    842                                 bThirdDigitsProcessed ||
    843                                 bDigitsRequired )
    844                         {
    845                                 bValidRealString = FALSE;
    846                         }
    847                         bFirstSignProcessed = TRUE;
    848                         bWhiteSpaceProcessed = TRUE;
    849                         bFirstDigitsProcessed = TRUE;
    850                         bDecimalPointProcessed = TRUE;
    851                         bSecondDigitsProcessed = TRUE;
    852                         bExponentProcessed = TRUE;
    853                         break;
    854                 default:
    855                         bValidRealString = FALSE;
    856                         break;
    857                 }
    858                 /* Process next character.
    859                 */
    860                 pChar++;
    861         }
    862 
    863         /* If the required digits were not present we have an invalid
    864         * string representation of a real number.
    865         */
    866         if( bDigitsRequired == TRUE )
    867         {
    868                 bValidRealString = FALSE;
    869         }
    870 
    871         return bValidRealString;
    872 }
    873 
    874 
    875 /******************************************************************************
    876  *              Coerce  [INTERNAL]
     815                * we do not really need to do anything in here.
     816                */
     817            }
     818            break;
     819        /* If DecimalPoint...
     820        */
     821        case '.':
     822            if( bDecimalPointProcessed ||
     823                bSecondDigitsProcessed ||
     824                bExponentProcessed ||
     825                bSecondSignProcessed ||
     826                bThirdDigitsProcessed )
     827            {
     828                bValidRealString = FALSE;
     829            }
     830            bFirstSignProcessed = TRUE;
     831            bWhiteSpaceProcessed = TRUE;
     832            bFirstDigitsProcessed = TRUE;
     833            bDecimalPointProcessed = TRUE;
     834            break;
     835        /* If Exponent...
     836        */
     837        case 'e':
     838        case 'E':
     839        case 'd':
     840        case 'D':
     841            if( bExponentProcessed ||
     842                bSecondSignProcessed ||
     843                bThirdDigitsProcessed ||
     844                bDigitsRequired )
     845            {
     846                bValidRealString = FALSE;
     847            }
     848            bFirstSignProcessed = TRUE;
     849            bWhiteSpaceProcessed = TRUE;
     850            bFirstDigitsProcessed = TRUE;
     851            bDecimalPointProcessed = TRUE;
     852            bSecondDigitsProcessed = TRUE;
     853            bExponentProcessed = TRUE;
     854            break;
     855        default:
     856            bValidRealString = FALSE;
     857            break;
     858        }
     859        /* Process next character.
     860        */
     861        pChar++;
     862    }
     863
     864    /* If the required digits were not present we have an invalid
     865    * string representation of a real number.
     866    */
     867    if( bDigitsRequired == TRUE )
     868    {
     869        bValidRealString = FALSE;
     870    }
     871
     872    return bValidRealString;
     873}
     874
     875
     876/******************************************************************************
     877 *      Coerce  [INTERNAL]
    877878 *
    878879 * This function dispatches execution to the proper conversion API
     
    880881 *
    881882 * FIXME: Passing down dwFlags to the conversion functions is wrong, this
    882  *        is a different flagmask. Check MSDN.
     883 *    is a different flagmask. Check MSDN.
    883884 */
    884885static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps, VARTYPE vt )
    885886{
    886         HRESULT res = S_OK;
    887         unsigned short vtFrom = 0;
    888         vtFrom = V_VT(ps) & VT_TYPEMASK;
    889 
    890        
    891         /* Note: Since "long" and "int" values both have 4 bytes and are
    892         * both signed integers "int" will be treated as "long" in the
    893         * following code.
    894         * The same goes for their unsigned versions.
    895         */
    896 
    897         /* Trivial Case: If the coercion is from two types that are
    898         * identical then we can blindly copy from one argument to another.*/
    899         if ((vt==vtFrom))
    900         {
    901            return VariantCopy(pd,ps);
    902         }
    903 
    904         /* Cases requiring thought*/
    905         switch( vt )
    906         {
     887    HRESULT res = S_OK;
     888    unsigned short vtFrom = 0;
     889    vtFrom = V_VT(ps) & VT_TYPEMASK;
     890
     891
     892    /* Note: Since "long" and "int" values both have 4 bytes and are
     893    * both signed integers "int" will be treated as "long" in the
     894    * following code.
     895    * The same goes for their unsigned versions.
     896    */
     897
     898    /* Trivial Case: If the coercion is from two types that are
     899    * identical then we can blindly copy from one argument to another.*/
     900    if ((vt==vtFrom))
     901    {
     902       return VariantCopy(pd,ps);
     903    }
     904
     905    /* Cases requiring thought*/
     906    switch( vt )
     907    {
    907908
    908909    case( VT_EMPTY ):
     
    916917        }
    917918        break;
    918         case( VT_I1 ):
    919                 switch( vtFrom )
     919    case( VT_I1 ):
     920        switch( vtFrom )
    920921        {
    921922        case( VT_I1 ):
    922923            res = VariantCopy( pd, ps );
    923924            break;
    924                 case( VT_I2 ):
    925                         res = VarI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,cVal) );
    926                         break;
    927                 case( VT_INT ):
    928                 case( VT_I4 ):
    929                         res = VarI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,cVal) );
    930                         break;
    931                 case( VT_UI1 ):
    932                         res = VarI1FromUI1( V_UNION(ps,bVal), &V_UNION(pd,cVal) );
    933                         break;
    934                 case( VT_UI2 ):
    935                         res = VarI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cVal) );
    936                         break;
    937                 case( VT_UINT ):
    938                 case( VT_UI4 ):
    939                         res = VarI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cVal) );
    940                         break;
    941                 case( VT_R4 ):
    942                         res = VarI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,cVal) );
    943                         break;
    944                 case( VT_R8 ):
    945                         res = VarI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,cVal) );
    946                         break;
    947                 case( VT_DATE ):
    948                         res = VarI1FromDate( V_UNION(ps,date), &V_UNION(pd,cVal) );
    949                         break;
    950                 case( VT_BOOL ):
    951                         res = VarI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,cVal) );
    952                         break;
    953                 case( VT_BSTR ):
    954                         res = VarI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cVal) );
    955                         break;
    956                 case( VT_CY ):
    957                         res = VarI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,cVal) );
    958                         break;
    959                 case( VT_DISPATCH ):
    960                         /*res = VarI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cVal) );*/
    961                 case( VT_DECIMAL ):
    962                         /*res = VarI1FromDec( V_UNION(ps,decVal), &V_UNION(pd,cVal) );*/
    963                 case( VT_UNKNOWN ):
    964                 default:
    965                         res = DISP_E_TYPEMISMATCH;
    966                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    967                         break;
    968                 }
    969                 break;
    970 
    971         case( VT_I2 ):
    972                 switch( vtFrom )
    973                 {
    974                 case( VT_I1 ):
    975                         res = VarI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,iVal) );
    976                         break;
     925        case( VT_I2 ):
     926            res = VarI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,cVal) );
     927            break;
     928        case( VT_INT ):
     929        case( VT_I4 ):
     930            res = VarI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,cVal) );
     931            break;
     932        case( VT_UI1 ):
     933            res = VarI1FromUI1( V_UNION(ps,bVal), &V_UNION(pd,cVal) );
     934            break;
     935        case( VT_UI2 ):
     936            res = VarI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cVal) );
     937            break;
     938        case( VT_UINT ):
     939        case( VT_UI4 ):
     940            res = VarI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cVal) );
     941            break;
     942        case( VT_R4 ):
     943            res = VarI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,cVal) );
     944            break;
     945        case( VT_R8 ):
     946            res = VarI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,cVal) );
     947            break;
     948        case( VT_DATE ):
     949            res = VarI1FromDate( V_UNION(ps,date), &V_UNION(pd,cVal) );
     950            break;
     951        case( VT_BOOL ):
     952            res = VarI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,cVal) );
     953            break;
     954        case( VT_BSTR ):
     955            res = VarI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cVal) );
     956            break;
     957        case( VT_CY ):
     958            res = VarI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,cVal) );
     959            break;
     960        case( VT_DISPATCH ):
     961            /*res = VarI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cVal) );*/
     962        case( VT_DECIMAL ):
     963            /*res = VarI1FromDec( V_UNION(ps,decVal), &V_UNION(pd,cVal) );*/
     964        case( VT_UNKNOWN ):
     965        default:
     966            res = DISP_E_TYPEMISMATCH;
     967            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     968            break;
     969        }
     970        break;
     971
     972    case( VT_I2 ):
     973        switch( vtFrom )
     974        {
     975        case( VT_I1 ):
     976            res = VarI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,iVal) );
     977            break;
    977978        case( VT_I2 ):
    978979            res = VariantCopy( pd, ps );
    979980            break;
    980                 case( VT_INT ):
    981                 case( VT_I4 ):
    982                         res = VarI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,iVal) );
    983                         break;
    984                 case( VT_UI1 ):
    985                         res = VarI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,iVal) );
    986                         break;
    987                 case( VT_UI2 ):
    988                         res = VarI2FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,iVal) );
    989                         break;
    990                 case( VT_UINT ):
    991                 case( VT_UI4 ):
    992                         res = VarI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,iVal) );
    993                         break;
    994                 case( VT_R4 ):
    995                         res = VarI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,iVal) );
    996                         break;
    997                 case( VT_R8 ):
    998                         res = VarI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,iVal) );
    999                         break;
    1000                 case( VT_DATE ):
    1001                         res = VarI2FromDate( V_UNION(ps,date), &V_UNION(pd,iVal) );
    1002                         break;
    1003                 case( VT_BOOL ):
    1004                         res = VarI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,iVal) );
    1005                         break;
    1006                 case( VT_BSTR ):
    1007                         res = VarI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,iVal) );
    1008                         break;
    1009                 case( VT_CY ):
    1010                         res = VarI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,iVal) );
    1011                         break;
    1012                 case( VT_DISPATCH ):
    1013                         /*res = VarI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,iVal) );*/
    1014                 case( VT_DECIMAL ):
    1015                         /*res = VarI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,iVal) );*/
    1016                 case( VT_UNKNOWN ):
    1017                 default:
    1018                         res = DISP_E_TYPEMISMATCH;
    1019                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1020                         break;
    1021                 }
    1022                 break;
    1023 
    1024         case( VT_INT ):
    1025         case( VT_I4 ):
    1026                 switch( vtFrom )
    1027                 {
    1028                 case( VT_I1 ):
    1029                         res = VarI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,lVal) );
    1030                         break;
    1031                 case( VT_I2 ):
    1032                         res = VarI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,lVal) );
     981        case( VT_INT ):
     982        case( VT_I4 ):
     983            res = VarI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,iVal) );
     984            break;
     985        case( VT_UI1 ):
     986            res = VarI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,iVal) );
     987            break;
     988        case( VT_UI2 ):
     989            res = VarI2FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,iVal) );
     990            break;
     991        case( VT_UINT ):
     992        case( VT_UI4 ):
     993            res = VarI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,iVal) );
     994            break;
     995        case( VT_R4 ):
     996            res = VarI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,iVal) );
     997            break;
     998        case( VT_R8 ):
     999            res = VarI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,iVal) );
     1000            break;
     1001        case( VT_DATE ):
     1002            res = VarI2FromDate( V_UNION(ps,date), &V_UNION(pd,iVal) );
     1003            break;
     1004        case( VT_BOOL ):
     1005            res = VarI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,iVal) );
     1006            break;
     1007        case( VT_BSTR ):
     1008            res = VarI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,iVal) );
     1009            break;
     1010        case( VT_CY ):
     1011            res = VarI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,iVal) );
     1012            break;
     1013        case( VT_DISPATCH ):
     1014            /*res = VarI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,iVal) );*/
     1015        case( VT_DECIMAL ):
     1016            /*res = VarI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,iVal) );*/
     1017        case( VT_UNKNOWN ):
     1018        default:
     1019            res = DISP_E_TYPEMISMATCH;
     1020            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1021            break;
     1022        }
     1023        break;
     1024
     1025    case( VT_INT ):
     1026    case( VT_I4 ):
     1027        switch( vtFrom )
     1028        {
     1029        case( VT_I1 ):
     1030            res = VarI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,lVal) );
     1031            break;
     1032        case( VT_I2 ):
     1033            res = VarI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,lVal) );
    10331034            break;
    10341035        case( VT_INT ):
     
    10391040            res = VariantCopy( pd, ps );
    10401041            break;
    1041                 case( VT_UI1 ):
    1042                         res = VarI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,lVal) );
    1043                         break;
    1044                 case( VT_UI2 ):
    1045                         res = VarI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,lVal) );
    1046                         break;
    1047                 case( VT_UINT ):
    1048                 case( VT_UI4 ):
    1049                         res = VarI4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,lVal) );
    1050                         break;
    1051                 case( VT_R4 ):
    1052                         res = VarI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,lVal) );
    1053                         break;
    1054                 case( VT_R8 ):
    1055                         res = VarI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,lVal) );
    1056                         break;
    1057                 case( VT_DATE ):
    1058                         res = VarI4FromDate( V_UNION(ps,date), &V_UNION(pd,lVal) );
    1059                         break;
    1060                 case( VT_BOOL ):
    1061                         res = VarI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,lVal) );
    1062                         break;
    1063                 case( VT_BSTR ):
    1064                         res = VarI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,lVal) );
    1065                         break;
    1066                 case( VT_CY ):
    1067                         res = VarI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,lVal) );
    1068                         break;
    1069                 case( VT_DISPATCH ):
    1070                         /*res = VarI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,lVal) );*/
    1071                 case( VT_DECIMAL ):
    1072                         /*res = VarI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,lVal) );*/
    1073                 case( VT_UNKNOWN ):
    1074                 default:
    1075                         res = DISP_E_TYPEMISMATCH;
    1076                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1077                         break;
    1078                 }
    1079                 break;
    1080 
    1081         case( VT_UI1 ):
    1082                 switch( vtFrom )
    1083                 {
    1084                 case( VT_I1 ):
    1085                         res = VarUI1FromI1( V_UNION(ps,cVal), &V_UNION(pd,bVal) );
    1086                         break;
    1087                 case( VT_I2 ):
    1088                         res = VarUI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,bVal) );
    1089                         break;
    1090                 case( VT_INT ):
    1091                 case( VT_I4 ):
    1092                         res = VarUI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,bVal) );
    1093                         break;
     1042        case( VT_UI1 ):
     1043            res = VarI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,lVal) );
     1044            break;
     1045        case( VT_UI2 ):
     1046            res = VarI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,lVal) );
     1047            break;
     1048        case( VT_UINT ):
     1049        case( VT_UI4 ):
     1050            res = VarI4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,lVal) );
     1051            break;
     1052        case( VT_R4 ):
     1053            res = VarI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,lVal) );
     1054            break;
     1055        case( VT_R8 ):
     1056            res = VarI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,lVal) );
     1057            break;
     1058        case( VT_DATE ):
     1059            res = VarI4FromDate( V_UNION(ps,date), &V_UNION(pd,lVal) );
     1060            break;
     1061        case( VT_BOOL ):
     1062            res = VarI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,lVal) );
     1063            break;
     1064        case( VT_BSTR ):
     1065            res = VarI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,lVal) );
     1066            break;
     1067        case( VT_CY ):
     1068            res = VarI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,lVal) );
     1069            break;
     1070        case( VT_DISPATCH ):
     1071            /*res = VarI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,lVal) );*/
     1072        case( VT_DECIMAL ):
     1073            /*res = VarI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,lVal) );*/
     1074        case( VT_UNKNOWN ):
     1075        default:
     1076            res = DISP_E_TYPEMISMATCH;
     1077            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1078            break;
     1079        }
     1080        break;
     1081
     1082    case( VT_UI1 ):
     1083        switch( vtFrom )
     1084        {
     1085        case( VT_I1 ):
     1086            res = VarUI1FromI1( V_UNION(ps,cVal), &V_UNION(pd,bVal) );
     1087            break;
     1088        case( VT_I2 ):
     1089            res = VarUI1FromI2( V_UNION(ps,iVal), &V_UNION(pd,bVal) );
     1090            break;
     1091        case( VT_INT ):
     1092        case( VT_I4 ):
     1093            res = VarUI1FromI4( V_UNION(ps,lVal), &V_UNION(pd,bVal) );
     1094            break;
    10941095        case( VT_UI1 ):
    10951096            res = VariantCopy( pd, ps );
    10961097            break;
    1097                 case( VT_UI2 ):
    1098                         res = VarUI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,bVal) );
    1099                         break;
    1100                 case( VT_UINT ):
    1101                 case( VT_UI4 ):
    1102                         res = VarUI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,bVal) );
    1103                         break;
    1104                 case( VT_R4 ):
    1105                         res = VarUI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,bVal) );
    1106                         break;
    1107                 case( VT_R8 ):
    1108                         res = VarUI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,bVal) );
    1109                         break;
    1110                 case( VT_DATE ):
    1111                         res = VarUI1FromDate( V_UNION(ps,date), &V_UNION(pd,bVal) );
    1112                         break;
    1113                 case( VT_BOOL ):
    1114                         res = VarUI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,bVal) );
    1115                         break;
    1116                 case( VT_BSTR ):
    1117                         res = VarUI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,bVal) );
    1118                         break;
    1119                 case( VT_CY ):
    1120                         res = VarUI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,bVal) );
    1121                         break;
    1122                 case( VT_DISPATCH ):
    1123                         /*res = VarUI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,bVal) );*/
    1124                 case( VT_DECIMAL ):
    1125                         /*res = VarUI1FromDec( V_UNION(ps,deiVal), &V_UNION(pd,bVal) );*/
    1126                 case( VT_UNKNOWN ):
    1127                 default:
    1128                         res = DISP_E_TYPEMISMATCH;
    1129                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1130                         break;
    1131                 }
    1132                 break;
    1133 
    1134         case( VT_UI2 ):
    1135                 switch( vtFrom )
    1136                 {
    1137                 case( VT_I1 ):
    1138                         res = VarUI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,uiVal) );
    1139                         break;
    1140                 case( VT_I2 ):
    1141                         res = VarUI2FromI2( V_UNION(ps,iVal), &V_UNION(pd,uiVal) );
    1142                         break;
    1143                 case( VT_INT ):
    1144                 case( VT_I4 ):
    1145                         res = VarUI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,uiVal) );
    1146                         break;
    1147                 case( VT_UI1 ):
    1148                         res = VarUI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,uiVal) );
    1149                         break;
     1098        case( VT_UI2 ):
     1099            res = VarUI1FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,bVal) );
     1100            break;
     1101        case( VT_UINT ):
     1102        case( VT_UI4 ):
     1103            res = VarUI1FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,bVal) );
     1104            break;
     1105        case( VT_R4 ):
     1106            res = VarUI1FromR4( V_UNION(ps,fltVal), &V_UNION(pd,bVal) );
     1107            break;
     1108        case( VT_R8 ):
     1109            res = VarUI1FromR8( V_UNION(ps,dblVal), &V_UNION(pd,bVal) );
     1110            break;
     1111        case( VT_DATE ):
     1112            res = VarUI1FromDate( V_UNION(ps,date), &V_UNION(pd,bVal) );
     1113            break;
     1114        case( VT_BOOL ):
     1115            res = VarUI1FromBool( V_UNION(ps,boolVal), &V_UNION(pd,bVal) );
     1116            break;
     1117        case( VT_BSTR ):
     1118            res = VarUI1FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,bVal) );
     1119            break;
     1120        case( VT_CY ):
     1121            res = VarUI1FromCy( V_UNION(ps,cyVal), &V_UNION(pd,bVal) );
     1122            break;
     1123        case( VT_DISPATCH ):
     1124            /*res = VarUI1FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,bVal) );*/
     1125        case( VT_DECIMAL ):
     1126            /*res = VarUI1FromDec( V_UNION(ps,deiVal), &V_UNION(pd,bVal) );*/
     1127        case( VT_UNKNOWN ):
     1128        default:
     1129            res = DISP_E_TYPEMISMATCH;
     1130            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1131            break;
     1132        }
     1133        break;
     1134
     1135    case( VT_UI2 ):
     1136        switch( vtFrom )
     1137        {
     1138        case( VT_I1 ):
     1139            res = VarUI2FromI1( V_UNION(ps,cVal), &V_UNION(pd,uiVal) );
     1140            break;
     1141        case( VT_I2 ):
     1142            res = VarUI2FromI2( V_UNION(ps,iVal), &V_UNION(pd,uiVal) );
     1143            break;
     1144        case( VT_INT ):
     1145        case( VT_I4 ):
     1146            res = VarUI2FromI4( V_UNION(ps,lVal), &V_UNION(pd,uiVal) );
     1147            break;
     1148        case( VT_UI1 ):
     1149            res = VarUI2FromUI1( V_UNION(ps,bVal), &V_UNION(pd,uiVal) );
     1150            break;
    11501151        case( VT_UI2 ):
    11511152            res = VariantCopy( pd, ps );
    11521153            break;
    1153                 case( VT_UINT ):
    1154                 case( VT_UI4 ):
    1155                         res = VarUI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,uiVal) );
    1156                         break;
    1157                 case( VT_R4 ):
    1158                         res = VarUI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,uiVal) );
    1159                         break;
    1160                 case( VT_R8 ):
    1161                         res = VarUI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,uiVal) );
    1162                         break;
    1163                 case( VT_DATE ):
    1164                         res = VarUI2FromDate( V_UNION(ps,date), &V_UNION(pd,uiVal) );
    1165                         break;
    1166                 case( VT_BOOL ):
    1167                         res = VarUI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,uiVal) );
    1168                         break;
    1169                 case( VT_BSTR ):
    1170                         res = VarUI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,uiVal) );
    1171                         break;
    1172                 case( VT_CY ):
    1173                         res = VarUI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,uiVal) );
    1174                         break;
    1175                 case( VT_DISPATCH ):
    1176                         /*res = VarUI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,uiVal) );*/
    1177                 case( VT_DECIMAL ):
    1178                         /*res = VarUI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,uiVal) );*/
    1179                 case( VT_UNKNOWN ):
    1180                 default:
    1181                         res = DISP_E_TYPEMISMATCH;
    1182                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1183                         break;
    1184                 }
    1185                 break;
    1186 
    1187         case( VT_UINT ):
    1188         case( VT_UI4 ):
    1189                 switch( vtFrom )
    1190                 {
    1191                 case( VT_I1 ):
    1192                         res = VarUI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,ulVal) );
    1193                         break;
    1194                 case( VT_I2 ):
    1195                         res = VarUI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,ulVal) );
    1196                         break;
    1197                 case( VT_INT ):
    1198                 case( VT_I4 ):
    1199                         res = VarUI4FromI4( V_UNION(ps,lVal), &V_UNION(pd,ulVal) );
    1200                         break;
    1201                 case( VT_UI1 ):
    1202                         res = VarUI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,ulVal) );
    1203                         break;
    1204                 case( VT_UI2 ):
    1205                         res = VarUI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,ulVal) );
    1206                         break;
     1154        case( VT_UINT ):
     1155        case( VT_UI4 ):
     1156            res = VarUI2FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,uiVal) );
     1157            break;
     1158        case( VT_R4 ):
     1159            res = VarUI2FromR4( V_UNION(ps,fltVal), &V_UNION(pd,uiVal) );
     1160            break;
     1161        case( VT_R8 ):
     1162            res = VarUI2FromR8( V_UNION(ps,dblVal), &V_UNION(pd,uiVal) );
     1163            break;
     1164        case( VT_DATE ):
     1165            res = VarUI2FromDate( V_UNION(ps,date), &V_UNION(pd,uiVal) );
     1166            break;
     1167        case( VT_BOOL ):
     1168            res = VarUI2FromBool( V_UNION(ps,boolVal), &V_UNION(pd,uiVal) );
     1169            break;
     1170        case( VT_BSTR ):
     1171            res = VarUI2FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,uiVal) );
     1172            break;
     1173        case( VT_CY ):
     1174            res = VarUI2FromCy( V_UNION(ps,cyVal), &V_UNION(pd,uiVal) );
     1175            break;
     1176        case( VT_DISPATCH ):
     1177            /*res = VarUI2FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,uiVal) );*/
     1178        case( VT_DECIMAL ):
     1179            /*res = VarUI2FromDec( V_UNION(ps,deiVal), &V_UNION(pd,uiVal) );*/
     1180        case( VT_UNKNOWN ):
     1181        default:
     1182            res = DISP_E_TYPEMISMATCH;
     1183            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1184            break;
     1185        }
     1186        break;
     1187
     1188    case( VT_UINT ):
     1189    case( VT_UI4 ):
     1190        switch( vtFrom )
     1191        {
     1192        case( VT_I1 ):
     1193            res = VarUI4FromI1( V_UNION(ps,cVal), &V_UNION(pd,ulVal) );
     1194            break;
     1195        case( VT_I2 ):
     1196            res = VarUI4FromI2( V_UNION(ps,iVal), &V_UNION(pd,ulVal) );
     1197            break;
     1198        case( VT_INT ):
     1199        case( VT_I4 ):
     1200            res = VarUI4FromI4( V_UNION(ps,lVal), &V_UNION(pd,ulVal) );
     1201            break;
     1202        case( VT_UI1 ):
     1203            res = VarUI4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,ulVal) );
     1204            break;
     1205        case( VT_UI2 ):
     1206            res = VarUI4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,ulVal) );
     1207            break;
    12071208        case( VT_UI4 ):
    12081209            res = VariantCopy( pd, ps );
    12091210            break;
    1210                 case( VT_R4 ):
    1211                         res = VarUI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,ulVal) );
    1212                         break;
    1213                 case( VT_R8 ):
    1214                         res = VarUI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,ulVal) );
    1215                         break;
    1216                 case( VT_DATE ):
    1217                         res = VarUI4FromDate( V_UNION(ps,date), &V_UNION(pd,ulVal) );
    1218                         break;
    1219                 case( VT_BOOL ):
    1220                         res = VarUI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,ulVal) );
    1221                         break;
    1222                 case( VT_BSTR ):
    1223                         res = VarUI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,ulVal) );
    1224                         break;
    1225                 case( VT_CY ):
    1226                         res = VarUI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,ulVal) );
    1227                         break;
    1228                 case( VT_DISPATCH ):
    1229                         /*res = VarUI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,ulVal) );*/
    1230                 case( VT_DECIMAL ):
    1231                         /*res = VarUI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,ulVal) );*/
    1232                 case( VT_UNKNOWN ):
    1233                 default:
    1234                         res = DISP_E_TYPEMISMATCH;
    1235                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1236                         break;
    1237                 }
    1238                 break;
    1239                
    1240         case( VT_R4 ):
    1241                 switch( vtFrom )
    1242                 {
    1243                 case( VT_I1 ):
    1244                         res = VarR4FromI1( V_UNION(ps,cVal), &V_UNION(pd,fltVal) );
    1245                         break;
    1246                 case( VT_I2 ):
    1247                         res = VarR4FromI2( V_UNION(ps,iVal), &V_UNION(pd,fltVal) );
    1248                         break;
    1249                 case( VT_INT ):
    1250                 case( VT_I4 ):
    1251                         res = VarR4FromI4( V_UNION(ps,lVal), &V_UNION(pd,fltVal) );
    1252                         break;
    1253                 case( VT_UI1 ):
    1254                         res = VarR4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,fltVal) );
    1255                         break;
    1256                 case( VT_UI2 ):
    1257                         res = VarR4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,fltVal) );
    1258                         break;
    1259                 case( VT_UINT ):
    1260                 case( VT_UI4 ):
    1261                         res = VarR4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,fltVal) );
    1262                         break;
     1211        case( VT_R4 ):
     1212            res = VarUI4FromR4( V_UNION(ps,fltVal), &V_UNION(pd,ulVal) );
     1213            break;
     1214        case( VT_R8 ):
     1215            res = VarUI4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,ulVal) );
     1216            break;
     1217        case( VT_DATE ):
     1218            res = VarUI4FromDate( V_UNION(ps,date), &V_UNION(pd,ulVal) );
     1219            break;
     1220        case( VT_BOOL ):
     1221            res = VarUI4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,ulVal) );
     1222            break;
     1223        case( VT_BSTR ):
     1224            res = VarUI4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,ulVal) );
     1225            break;
     1226        case( VT_CY ):
     1227            res = VarUI4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,ulVal) );
     1228            break;
     1229        case( VT_DISPATCH ):
     1230            /*res = VarUI4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,ulVal) );*/
     1231        case( VT_DECIMAL ):
     1232            /*res = VarUI4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,ulVal) );*/
     1233        case( VT_UNKNOWN ):
     1234        default:
     1235            res = DISP_E_TYPEMISMATCH;
     1236            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1237            break;
     1238        }
     1239        break;
     1240
     1241    case( VT_R4 ):
     1242        switch( vtFrom )
     1243        {
     1244        case( VT_I1 ):
     1245            res = VarR4FromI1( V_UNION(ps,cVal), &V_UNION(pd,fltVal) );
     1246            break;
     1247        case( VT_I2 ):
     1248            res = VarR4FromI2( V_UNION(ps,iVal), &V_UNION(pd,fltVal) );
     1249            break;
     1250        case( VT_INT ):
     1251        case( VT_I4 ):
     1252            res = VarR4FromI4( V_UNION(ps,lVal), &V_UNION(pd,fltVal) );
     1253            break;
     1254        case( VT_UI1 ):
     1255            res = VarR4FromUI1( V_UNION(ps,bVal), &V_UNION(pd,fltVal) );
     1256            break;
     1257        case( VT_UI2 ):
     1258            res = VarR4FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,fltVal) );
     1259            break;
     1260        case( VT_UINT ):
     1261        case( VT_UI4 ):
     1262            res = VarR4FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,fltVal) );
     1263            break;
    12631264        case( VT_R4 ):
    12641265            res = VariantCopy( pd, ps );
    12651266            break;
    1266                 case( VT_R8 ):
    1267                         res = VarR4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,fltVal) );
    1268                         break;
    1269                 case( VT_DATE ):
    1270                         res = VarR4FromDate( V_UNION(ps,date), &V_UNION(pd,fltVal) );
    1271                         break;
    1272                 case( VT_BOOL ):
    1273                         res = VarR4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,fltVal) );
    1274                         break;
    1275                 case( VT_BSTR ):
    1276                         res = VarR4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,fltVal) );
    1277                         break;
    1278                 case( VT_CY ):
    1279                         res = VarR4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,fltVal) );
    1280                         break;
    1281                 case( VT_DISPATCH ):
    1282                         /*res = VarR4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,fltVal) );*/
    1283                 case( VT_DECIMAL ):
    1284                         /*res = VarR4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,fltVal) );*/
    1285                 case( VT_UNKNOWN ):
    1286                 default:
    1287                         res = DISP_E_TYPEMISMATCH;
    1288                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1289                         break;
    1290                 }
    1291                 break;
    1292 
    1293         case( VT_R8 ):
    1294                 switch( vtFrom )
    1295                 {
    1296                 case( VT_I1 ):
    1297                         res = VarR8FromI1( V_UNION(ps,cVal), &V_UNION(pd,dblVal) );
    1298                         break;
    1299                 case( VT_I2 ):
    1300                         res = VarR8FromI2( V_UNION(ps,iVal), &V_UNION(pd,dblVal) );
    1301                         break;
    1302                 case( VT_INT ):
    1303                 case( VT_I4 ):
    1304                         res = VarR8FromI4( V_UNION(ps,lVal), &V_UNION(pd,dblVal) );
    1305                         break;
    1306                 case( VT_UI1 ):
    1307                         res = VarR8FromUI1( V_UNION(ps,bVal), &V_UNION(pd,dblVal) );
    1308                         break;
    1309                 case( VT_UI2 ):
    1310                         res = VarR8FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,dblVal) );
    1311                         break;
    1312                 case( VT_UINT ):
    1313                 case( VT_UI4 ):
    1314                         res = VarR8FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,dblVal) );
    1315                         break;
    1316                 case( VT_R4 ):
    1317                         res = VarR8FromR4( V_UNION(ps,fltVal), &V_UNION(pd,dblVal) );
    1318                         break;
     1267        case( VT_R8 ):
     1268            res = VarR4FromR8( V_UNION(ps,dblVal), &V_UNION(pd,fltVal) );
     1269            break;
     1270        case( VT_DATE ):
     1271            res = VarR4FromDate( V_UNION(ps,date), &V_UNION(pd,fltVal) );
     1272            break;
     1273        case( VT_BOOL ):
     1274            res = VarR4FromBool( V_UNION(ps,boolVal), &V_UNION(pd,fltVal) );
     1275            break;
     1276        case( VT_BSTR ):
     1277            res = VarR4FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,fltVal) );
     1278            break;
     1279        case( VT_CY ):
     1280            res = VarR4FromCy( V_UNION(ps,cyVal), &V_UNION(pd,fltVal) );
     1281            break;
     1282        case( VT_DISPATCH ):
     1283            /*res = VarR4FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,fltVal) );*/
     1284        case( VT_DECIMAL ):
     1285            /*res = VarR4FromDec( V_UNION(ps,deiVal), &V_UNION(pd,fltVal) );*/
     1286        case( VT_UNKNOWN ):
     1287        default:
     1288            res = DISP_E_TYPEMISMATCH;
     1289            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1290            break;
     1291        }
     1292        break;
     1293
     1294    case( VT_R8 ):
     1295        switch( vtFrom )
     1296        {
     1297        case( VT_I1 ):
     1298            res = VarR8FromI1( V_UNION(ps,cVal), &V_UNION(pd,dblVal) );
     1299            break;
     1300        case( VT_I2 ):
     1301            res = VarR8FromI2( V_UNION(ps,iVal), &V_UNION(pd,dblVal) );
     1302            break;
     1303        case( VT_INT ):
     1304        case( VT_I4 ):
     1305            res = VarR8FromI4( V_UNION(ps,lVal), &V_UNION(pd,dblVal) );
     1306            break;
     1307        case( VT_UI1 ):
     1308            res = VarR8FromUI1( V_UNION(ps,bVal), &V_UNION(pd,dblVal) );
     1309            break;
     1310        case( VT_UI2 ):
     1311            res = VarR8FromUI2( V_UNION(ps,uiVal), &V_UNION(pd,dblVal) );
     1312            break;
     1313        case( VT_UINT ):
     1314        case( VT_UI4 ):
     1315            res = VarR8FromUI4( V_UNION(ps,ulVal), &V_UNION(pd,dblVal) );
     1316            break;
     1317        case( VT_R4 ):
     1318            res = VarR8FromR4( V_UNION(ps,fltVal), &V_UNION(pd,dblVal) );
     1319            break;
    13191320        case( VT_R8 ):
    13201321            res = VariantCopy( pd, ps );
    13211322            break;
    1322                 case( VT_DATE ):
    1323                         res = VarR8FromDate( V_UNION(ps,date), &V_UNION(pd,dblVal) );
    1324                         break;
    1325                 case( VT_BOOL ):
    1326                         res = VarR8FromBool( V_UNION(ps,boolVal), &V_UNION(pd,dblVal) );
    1327                         break;
    1328                 case( VT_BSTR ):
    1329                         res = VarR8FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,dblVal) );
    1330                         break;
    1331                 case( VT_CY ):
    1332                         res = VarR8FromCy( V_UNION(ps,cyVal), &V_UNION(pd,dblVal) );
    1333                         break;
    1334                 case( VT_DISPATCH ):
    1335                         /*res = VarR8FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,dblVal) );*/
    1336                 case( VT_DECIMAL ):
    1337                         /*res = VarR8FromDec( V_UNION(ps,deiVal), &V_UNION(pd,dblVal) );*/
    1338                 case( VT_UNKNOWN ):
    1339                 default:
    1340                         res = DISP_E_TYPEMISMATCH;
    1341                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1342                         break;
    1343                 }
    1344                 break;
    1345 
    1346         case( VT_DATE ):
    1347                 switch( vtFrom )
    1348                 {
    1349                 case( VT_I1 ):
    1350                         res = VarDateFromI1( V_UNION(ps,cVal), &V_UNION(pd,date) );
    1351                         break;
    1352                 case( VT_I2 ):
    1353                         res = VarDateFromI2( V_UNION(ps,iVal), &V_UNION(pd,date) );
    1354                         break;
    1355                 case( VT_INT ):
    1356                         res = VarDateFromInt( V_UNION(ps,intVal), &V_UNION(pd,date) );
    1357                         break;
    1358                 case( VT_I4 ):
    1359                         res = VarDateFromI4( V_UNION(ps,lVal), &V_UNION(pd,date) );
    1360                         break;
    1361                 case( VT_UI1 ):
    1362                         res = VarDateFromUI1( V_UNION(ps,bVal), &V_UNION(pd,date) );
    1363                         break;
    1364                 case( VT_UI2 ):
    1365                         res = VarDateFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,date) );
    1366                         break;
    1367                 case( VT_UINT ):
    1368                         res = VarDateFromUint( V_UNION(ps,uintVal), &V_UNION(pd,date) );
    1369                         break;
    1370                 case( VT_UI4 ):
    1371                         res = VarDateFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,date) );
    1372                         break;
    1373                 case( VT_R4 ):
    1374                         res = VarDateFromR4( V_UNION(ps,fltVal), &V_UNION(pd,date) );
    1375                         break;
    1376                 case( VT_R8 ):
    1377                         res = VarDateFromR8( V_UNION(ps,dblVal), &V_UNION(pd,date) );
    1378                         break;
     1323        case( VT_DATE ):
     1324            res = VarR8FromDate( V_UNION(ps,date), &V_UNION(pd,dblVal) );
     1325            break;
     1326        case( VT_BOOL ):
     1327            res = VarR8FromBool( V_UNION(ps,boolVal), &V_UNION(pd,dblVal) );
     1328            break;
     1329        case( VT_BSTR ):
     1330            res = VarR8FromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,dblVal) );
     1331            break;
     1332        case( VT_CY ):
     1333            res = VarR8FromCy( V_UNION(ps,cyVal), &V_UNION(pd,dblVal) );
     1334            break;
     1335        case( VT_DISPATCH ):
     1336            /*res = VarR8FromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,dblVal) );*/
     1337        case( VT_DECIMAL ):
     1338            /*res = VarR8FromDec( V_UNION(ps,deiVal), &V_UNION(pd,dblVal) );*/
     1339        case( VT_UNKNOWN ):
     1340        default:
     1341            res = DISP_E_TYPEMISMATCH;
     1342            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1343            break;
     1344        }
     1345        break;
     1346
     1347    case( VT_DATE ):
     1348        switch( vtFrom )
     1349        {
     1350        case( VT_I1 ):
     1351            res = VarDateFromI1( V_UNION(ps,cVal), &V_UNION(pd,date) );
     1352            break;
     1353        case( VT_I2 ):
     1354            res = VarDateFromI2( V_UNION(ps,iVal), &V_UNION(pd,date) );
     1355            break;
     1356        case( VT_INT ):
     1357            res = VarDateFromInt( V_UNION(ps,intVal), &V_UNION(pd,date) );
     1358            break;
     1359        case( VT_I4 ):
     1360            res = VarDateFromI4( V_UNION(ps,lVal), &V_UNION(pd,date) );
     1361            break;
     1362        case( VT_UI1 ):
     1363            res = VarDateFromUI1( V_UNION(ps,bVal), &V_UNION(pd,date) );
     1364            break;
     1365        case( VT_UI2 ):
     1366            res = VarDateFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,date) );
     1367            break;
     1368        case( VT_UINT ):
     1369            res = VarDateFromUint( V_UNION(ps,uintVal), &V_UNION(pd,date) );
     1370            break;
     1371        case( VT_UI4 ):
     1372            res = VarDateFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,date) );
     1373            break;
     1374        case( VT_R4 ):
     1375            res = VarDateFromR4( V_UNION(ps,fltVal), &V_UNION(pd,date) );
     1376            break;
     1377        case( VT_R8 ):
     1378            res = VarDateFromR8( V_UNION(ps,dblVal), &V_UNION(pd,date) );
     1379            break;
    13791380        case( VT_DATE ):
    13801381            res = VariantCopy( pd, ps );
    13811382            break;
    1382                 case( VT_BOOL ):
    1383                         res = VarDateFromBool( V_UNION(ps,boolVal), &V_UNION(pd,date) );
    1384                         break;
    1385                 case( VT_BSTR ):
    1386                         res = VarDateFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,date) );
    1387                         break;
    1388                 case( VT_CY ):
    1389                         res = VarDateFromCy( V_UNION(ps,cyVal), &V_UNION(pd,date) );
    1390                         break;
    1391                 case( VT_DISPATCH ):
    1392                         /*res = VarDateFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,date) );*/
    1393                 case( VT_DECIMAL ):
    1394                         /*res = VarDateFromDec( V_UNION(ps,deiVal), &V_UNION(pd,date) );*/
    1395                 case( VT_UNKNOWN ):
    1396                 default:
    1397                         res = DISP_E_TYPEMISMATCH;
    1398                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1399                         break;
    1400                 }
    1401                 break;
    1402 
    1403         case( VT_BOOL ):
    1404                 switch( vtFrom )
    1405                 {
    1406                 case( VT_I1 ):
    1407                         res = VarBoolFromI1( V_UNION(ps,cVal), &V_UNION(pd,boolVal) );
    1408                         break;
    1409                 case( VT_I2 ):
    1410                         res = VarBoolFromI2( V_UNION(ps,iVal), &V_UNION(pd,boolVal) );
    1411                         break;
    1412                 case( VT_INT ):
    1413                         res = VarBoolFromInt( V_UNION(ps,intVal), &V_UNION(pd,boolVal) );
    1414                         break;
    1415                 case( VT_I4 ):
    1416                         res = VarBoolFromI4( V_UNION(ps,lVal), &V_UNION(pd,boolVal) );
    1417                         break;
    1418                 case( VT_UI1 ):
    1419                         res = VarBoolFromUI1( V_UNION(ps,bVal), &V_UNION(pd,boolVal) );
    1420                         break;
    1421                 case( VT_UI2 ):
    1422                         res = VarBoolFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,boolVal) );
    1423                         break;
    1424                 case( VT_UINT ):
    1425                         res = VarBoolFromUint( V_UNION(ps,uintVal), &V_UNION(pd,boolVal) );
    1426                         break;
    1427                 case( VT_UI4 ):
    1428                         res = VarBoolFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,boolVal) );
    1429                         break;
    1430                 case( VT_R4 ):
    1431                         res = VarBoolFromR4( V_UNION(ps,fltVal), &V_UNION(pd,boolVal) );
    1432                         break;
    1433                 case( VT_R8 ):
    1434                         res = VarBoolFromR8( V_UNION(ps,dblVal), &V_UNION(pd,boolVal) );
    1435                         break;
    1436                 case( VT_DATE ):
    1437                         res = VarBoolFromDate( V_UNION(ps,date), &V_UNION(pd,boolVal) );
    1438                         break;
     1383        case( VT_BOOL ):
     1384            res = VarDateFromBool( V_UNION(ps,boolVal), &V_UNION(pd,date) );
     1385            break;
     1386        case( VT_BSTR ):
     1387            res = VarDateFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,date) );
     1388            break;
     1389        case( VT_CY ):
     1390            res = VarDateFromCy( V_UNION(ps,cyVal), &V_UNION(pd,date) );
     1391            break;
     1392        case( VT_DISPATCH ):
     1393            /*res = VarDateFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,date) );*/
     1394        case( VT_DECIMAL ):
     1395            /*res = VarDateFromDec( V_UNION(ps,deiVal), &V_UNION(pd,date) );*/
     1396        case( VT_UNKNOWN ):
     1397        default:
     1398            res = DISP_E_TYPEMISMATCH;
     1399            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1400            break;
     1401        }
     1402        break;
     1403
     1404    case( VT_BOOL ):
     1405        switch( vtFrom )
     1406        {
     1407        case( VT_I1 ):
     1408            res = VarBoolFromI1( V_UNION(ps,cVal), &V_UNION(pd,boolVal) );
     1409            break;
     1410        case( VT_I2 ):
     1411            res = VarBoolFromI2( V_UNION(ps,iVal), &V_UNION(pd,boolVal) );
     1412            break;
     1413        case( VT_INT ):
     1414            res = VarBoolFromInt( V_UNION(ps,intVal), &V_UNION(pd,boolVal) );
     1415            break;
     1416        case( VT_I4 ):
     1417            res = VarBoolFromI4( V_UNION(ps,lVal), &V_UNION(pd,boolVal) );
     1418            break;
     1419        case( VT_UI1 ):
     1420            res = VarBoolFromUI1( V_UNION(ps,bVal), &V_UNION(pd,boolVal) );
     1421            break;
     1422        case( VT_UI2 ):
     1423            res = VarBoolFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,boolVal) );
     1424            break;
     1425        case( VT_UINT ):
     1426            res = VarBoolFromUint( V_UNION(ps,uintVal), &V_UNION(pd,boolVal) );
     1427            break;
     1428        case( VT_UI4 ):
     1429            res = VarBoolFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,boolVal) );
     1430            break;
     1431        case( VT_R4 ):
     1432            res = VarBoolFromR4( V_UNION(ps,fltVal), &V_UNION(pd,boolVal) );
     1433            break;
     1434        case( VT_R8 ):
     1435            res = VarBoolFromR8( V_UNION(ps,dblVal), &V_UNION(pd,boolVal) );
     1436            break;
     1437        case( VT_DATE ):
     1438            res = VarBoolFromDate( V_UNION(ps,date), &V_UNION(pd,boolVal) );
     1439            break;
    14391440        case( VT_BOOL ):
    14401441            res = VariantCopy( pd, ps );
    14411442            break;
    1442                 case( VT_BSTR ):
    1443                         res = VarBoolFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,boolVal) );
    1444                         break;
    1445                 case( VT_CY ):
    1446                         res = VarBoolFromCy( V_UNION(ps,cyVal), &V_UNION(pd,boolVal) );
    1447                         break;
    1448                 case( VT_DISPATCH ):
    1449                         /*res = VarBoolFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,boolVal) );*/
    1450                 case( VT_DECIMAL ):
    1451                         /*res = VarBoolFromDec( V_UNION(ps,deiVal), &V_UNION(pd,boolVal) );*/
    1452                 case( VT_UNKNOWN ):
    1453                 default:
    1454                         res = DISP_E_TYPEMISMATCH;
    1455                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1456                         break;
    1457                 }
    1458                 break;
    1459 
    1460         case( VT_BSTR ):
    1461                 switch( vtFrom )
    1462                 {
    1463                 case( VT_EMPTY ):
    1464                         if ((V_UNION(pd,bstrVal) = SysAllocStringLen(NULL, 0)))
    1465                                 res = S_OK;
    1466                         else
    1467                                 res = E_OUTOFMEMORY;
    1468                         break;
    1469                 case( VT_I1 ):
    1470                         res = VarBstrFromI1( V_UNION(ps,cVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1471                         break;
    1472                 case( VT_I2 ):
    1473                         res = VarBstrFromI2( V_UNION(ps,iVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1474                         break;
    1475                 case( VT_INT ):
    1476                         res = VarBstrFromInt( V_UNION(ps,intVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1477                         break;
    1478                 case( VT_I4 ):
    1479                         res = VarBstrFromI4( V_UNION(ps,lVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1480                         break;
    1481                 case( VT_UI1 ):
    1482                         res = VarBstrFromUI1( V_UNION(ps,bVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1483                         break;
    1484                 case( VT_UI2 ):
    1485                         res = VarBstrFromUI2( V_UNION(ps,uiVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1486                         break;
    1487                 case( VT_UINT ):
    1488                         res = VarBstrFromUint( V_UNION(ps,uintVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1489                         break;
    1490                 case( VT_UI4 ):
    1491                         res = VarBstrFromUI4( V_UNION(ps,ulVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1492                         break;
    1493                 case( VT_R4 ):
    1494                         res = VarBstrFromR4( V_UNION(ps,fltVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1495                         break;
    1496                 case( VT_R8 ):
    1497                         res = VarBstrFromR8( V_UNION(ps,dblVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1498                         break;
    1499                 case( VT_DATE ):
    1500                         res = VarBstrFromDate( V_UNION(ps,date), lcid, 0, &V_UNION(pd,bstrVal) );
    1501                         break;
    1502                 case( VT_BOOL ):
    1503                         res = VarBstrFromBool( V_UNION(ps,boolVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1504                         break;
    1505                 case( VT_BSTR ):
    1506                         res = VariantCopy( pd, ps );
    1507                         break;
    1508                 case( VT_CY ):
    1509                         res = VarBstrFromCy( V_UNION(ps,cyVal), lcid, 0, &V_UNION(pd,bstrVal) );
    1510                         break;
    1511                 case( VT_DISPATCH ):
    1512                         /*res = VarBstrFromDisp( V_UNION(ps,pdispVal), lcid, 0, &(pd,bstrVal) );*/
    1513                 case( VT_DECIMAL ):
    1514                         /*res = VarBstrFromDec( V_UNION(ps,deiVal), lcid, 0, &(pd,bstrVal) );*/
    1515                 case( VT_UNKNOWN ):
    1516                 default:
    1517                         res = DISP_E_TYPEMISMATCH;
    1518                         FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1519                         break;
    1520                 }
    1521                 break;
     1443        case( VT_BSTR ):
     1444            res = VarBoolFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,boolVal) );
     1445            break;
     1446        case( VT_CY ):
     1447            res = VarBoolFromCy( V_UNION(ps,cyVal), &V_UNION(pd,boolVal) );
     1448            break;
     1449        case( VT_DISPATCH ):
     1450            /*res = VarBoolFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,boolVal) );*/
     1451        case( VT_DECIMAL ):
     1452            /*res = VarBoolFromDec( V_UNION(ps,deiVal), &V_UNION(pd,boolVal) );*/
     1453        case( VT_UNKNOWN ):
     1454        default:
     1455            res = DISP_E_TYPEMISMATCH;
     1456            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1457            break;
     1458        }
     1459        break;
     1460
     1461    case( VT_BSTR ):
     1462        switch( vtFrom )
     1463        {
     1464        case( VT_EMPTY ):
     1465            if ((V_UNION(pd,bstrVal) = SysAllocStringLen(NULL, 0)))
     1466                res = S_OK;
     1467            else
     1468                res = E_OUTOFMEMORY;
     1469            break;
     1470        case( VT_I1 ):
     1471            res = VarBstrFromI1( V_UNION(ps,cVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1472            break;
     1473        case( VT_I2 ):
     1474            res = VarBstrFromI2( V_UNION(ps,iVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1475            break;
     1476        case( VT_INT ):
     1477            res = VarBstrFromInt( V_UNION(ps,intVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1478            break;
     1479        case( VT_I4 ):
     1480            res = VarBstrFromI4( V_UNION(ps,lVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1481            break;
     1482        case( VT_UI1 ):
     1483            res = VarBstrFromUI1( V_UNION(ps,bVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1484            break;
     1485        case( VT_UI2 ):
     1486            res = VarBstrFromUI2( V_UNION(ps,uiVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1487            break;
     1488        case( VT_UINT ):
     1489            res = VarBstrFromUint( V_UNION(ps,uintVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1490            break;
     1491        case( VT_UI4 ):
     1492            res = VarBstrFromUI4( V_UNION(ps,ulVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1493            break;
     1494        case( VT_R4 ):
     1495            res = VarBstrFromR4( V_UNION(ps,fltVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1496            break;
     1497        case( VT_R8 ):
     1498            res = VarBstrFromR8( V_UNION(ps,dblVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1499            break;
     1500        case( VT_DATE ):
     1501            res = VarBstrFromDate( V_UNION(ps,date), lcid, 0, &V_UNION(pd,bstrVal) );
     1502            break;
     1503        case( VT_BOOL ):
     1504            res = VarBstrFromBool( V_UNION(ps,boolVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1505            break;
     1506        case( VT_BSTR ):
     1507            res = VariantCopy( pd, ps );
     1508            break;
     1509        case( VT_CY ):
     1510            res = VarBstrFromCy( V_UNION(ps,cyVal), lcid, 0, &V_UNION(pd,bstrVal) );
     1511            break;
     1512        case( VT_DISPATCH ):
     1513            /*res = VarBstrFromDisp( V_UNION(ps,pdispVal), lcid, 0, &(pd,bstrVal) );*/
     1514        case( VT_DECIMAL ):
     1515            /*res = VarBstrFromDec( V_UNION(ps,deiVal), lcid, 0, &(pd,bstrVal) );*/
     1516        case( VT_UNKNOWN ):
     1517        default:
     1518            res = DISP_E_TYPEMISMATCH;
     1519            FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1520            break;
     1521        }
     1522        break;
    15221523
    15231524     case( VT_CY ):
    1524         switch( vtFrom )
    1525           {
    1526           case( VT_I1 ):
    1527              res = VarCyFromI1( V_UNION(ps,cVal), &V_UNION(pd,cyVal) );
    1528              break;
    1529           case( VT_I2 ):
    1530              res = VarCyFromI2( V_UNION(ps,iVal), &V_UNION(pd,cyVal) );
    1531              break;
    1532           case( VT_INT ):
    1533              res = VarCyFromInt( V_UNION(ps,intVal), &V_UNION(pd,cyVal) );
    1534              break;
    1535           case( VT_I4 ):
    1536              res = VarCyFromI4( V_UNION(ps,lVal), &V_UNION(pd,cyVal) );
    1537              break;
    1538           case( VT_UI1 ):
    1539              res = VarCyFromUI1( V_UNION(ps,bVal), &V_UNION(pd,cyVal) );
    1540              break;
    1541           case( VT_UI2 ):
    1542              res = VarCyFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cyVal) );
    1543              break;
    1544           case( VT_UINT ):
    1545              res = VarCyFromUint( V_UNION(ps,uintVal), &V_UNION(pd,cyVal) );
    1546              break;
    1547           case( VT_UI4 ):
    1548              res = VarCyFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cyVal) );
    1549              break;
    1550           case( VT_R4 ):
    1551              res = VarCyFromR4( V_UNION(ps,fltVal), &V_UNION(pd,cyVal) );
    1552              break;
    1553           case( VT_R8 ):
    1554              res = VarCyFromR8( V_UNION(ps,dblVal), &V_UNION(pd,cyVal) );
    1555              break;
    1556           case( VT_DATE ):
    1557              res = VarCyFromDate( V_UNION(ps,date), &V_UNION(pd,cyVal) );
    1558              break;
    1559           case( VT_BOOL ):
    1560              res = VarCyFromBool( V_UNION(ps,date), &V_UNION(pd,cyVal) );
    1561              break;
    1562           case( VT_CY ):
    1563              res = VariantCopy( pd, ps );
    1564              break;
    1565           case( VT_BSTR ):
    1566              res = VarCyFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cyVal) );
    1567              break;
    1568           case( VT_DISPATCH ):
    1569              /*res = VarCyFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cyVal) );*/
    1570           case( VT_DECIMAL ):
    1571              /*res = VarCyFromDec( V_UNION(ps,deiVal), &V_UNION(pd,cyVal) );*/
    1572              break;
    1573           case( VT_UNKNOWN ):
    1574           default:
    1575              res = DISP_E_TYPEMISMATCH;
    1576              FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1577              break;
    1578           }
    1579         break;
    1580 
    1581         default:
    1582                 res = DISP_E_TYPEMISMATCH;
    1583                 FIXME("Coercion from %d to %d\n", vtFrom, vt );
    1584                 break;
    1585         }
    1586        
    1587         return res;
    1588 }
    1589 
    1590 /******************************************************************************
    1591  *              ValidateVtRange [INTERNAL]
     1525    switch( vtFrom )
     1526      {
     1527      case( VT_I1 ):
     1528         res = VarCyFromI1( V_UNION(ps,cVal), &V_UNION(pd,cyVal) );
     1529         break;
     1530      case( VT_I2 ):
     1531         res = VarCyFromI2( V_UNION(ps,iVal), &V_UNION(pd,cyVal) );
     1532         break;
     1533      case( VT_INT ):
     1534         res = VarCyFromInt( V_UNION(ps,intVal), &V_UNION(pd,cyVal) );
     1535         break;
     1536      case( VT_I4 ):
     1537         res = VarCyFromI4( V_UNION(ps,lVal), &V_UNION(pd,cyVal) );
     1538         break;
     1539      case( VT_UI1 ):
     1540         res = VarCyFromUI1( V_UNION(ps,bVal), &V_UNION(pd,cyVal) );
     1541         break;
     1542      case( VT_UI2 ):
     1543         res = VarCyFromUI2( V_UNION(ps,uiVal), &V_UNION(pd,cyVal) );
     1544         break;
     1545      case( VT_UINT ):
     1546         res = VarCyFromUint( V_UNION(ps,uintVal), &V_UNION(pd,cyVal) );
     1547         break;
     1548      case( VT_UI4 ):
     1549         res = VarCyFromUI4( V_UNION(ps,ulVal), &V_UNION(pd,cyVal) );
     1550         break;
     1551      case( VT_R4 ):
     1552         res = VarCyFromR4( V_UNION(ps,fltVal), &V_UNION(pd,cyVal) );
     1553         break;
     1554      case( VT_R8 ):
     1555         res = VarCyFromR8( V_UNION(ps,dblVal), &V_UNION(pd,cyVal) );
     1556         break;
     1557      case( VT_DATE ):
     1558         res = VarCyFromDate( V_UNION(ps,date), &V_UNION(pd,cyVal) );
     1559         break;
     1560      case( VT_BOOL ):
     1561         res = VarCyFromBool( V_UNION(ps,date), &V_UNION(pd,cyVal) );
     1562         break;
     1563      case( VT_CY ):
     1564         res = VariantCopy( pd, ps );
     1565         break;
     1566      case( VT_BSTR ):
     1567         res = VarCyFromStr( V_UNION(ps,bstrVal), lcid, 0, &V_UNION(pd,cyVal) );
     1568         break;
     1569      case( VT_DISPATCH ):
     1570         /*res = VarCyFromDisp( V_UNION(ps,pdispVal), lcid, &V_UNION(pd,cyVal) );*/
     1571      case( VT_DECIMAL ):
     1572         /*res = VarCyFromDec( V_UNION(ps,deiVal), &V_UNION(pd,cyVal) );*/
     1573         break;
     1574      case( VT_UNKNOWN ):
     1575      default:
     1576         res = DISP_E_TYPEMISMATCH;
     1577         FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1578         break;
     1579      }
     1580    break;
     1581
     1582    default:
     1583        res = DISP_E_TYPEMISMATCH;
     1584        FIXME("Coercion from %d to %d\n", vtFrom, vt );
     1585        break;
     1586    }
     1587
     1588    return res;
     1589}
     1590
     1591/******************************************************************************
     1592 *      ValidateVtRange [INTERNAL]
    15921593 *
    15931594 * Used internally by the hi-level Variant API to determine
     
    16081609
    16091610/******************************************************************************
    1610  *              ValidateVartype [INTERNAL]
     1611 *      ValidateVartype [INTERNAL]
    16111612 *
    16121613 * Used internally by the hi-level Variant API to determine
     
    16151616static HRESULT WINAPI ValidateVariantType( VARTYPE vt )
    16161617{
    1617         HRESULT res = S_OK;
    1618 
    1619         /* check if we have a valid argument.
    1620         */
    1621         if( vt & VT_BYREF )
     1618    HRESULT res = S_OK;
     1619
     1620    /* check if we have a valid argument.
     1621    */
     1622    if( vt & VT_BYREF )
    16221623    {
    16231624        /* if by reference check that the type is in
     
    16261627        if( ( vt & VT_TYPEMASK ) == VT_EMPTY ||
    16271628            ( vt & VT_TYPEMASK ) == VT_NULL ||
    1628                         ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )
    1629                 {
    1630                         res = E_INVALIDARG;
    1631                 }
    1632                        
     1629            ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )
     1630        {
     1631            res = E_INVALIDARG;
     1632        }
     1633
    16331634    }
    16341635    else
     
    16361637        res = ValidateVtRange( vt );
    16371638    }
    1638                
    1639         return res;
    1640 }
    1641 
    1642 /******************************************************************************
    1643  *              ValidateVt      [INTERNAL]
     1639
     1640    return res;
     1641}
     1642
     1643/******************************************************************************
     1644 *      ValidateVt  [INTERNAL]
    16441645 *
    16451646 * Used internally by the hi-level Variant API to determine
     
    16481649static HRESULT WINAPI ValidateVt( VARTYPE vt )
    16491650{
    1650         HRESULT res = S_OK;
    1651 
    1652         /* check if we have a valid argument.
    1653         */
    1654         if( vt & VT_BYREF )
     1651    HRESULT res = S_OK;
     1652
     1653    /* check if we have a valid argument.
     1654    */
     1655    if( vt & VT_BYREF )
    16551656    {
    16561657        /* if by reference check that the type is in
     
    16591660        if( ( vt & VT_TYPEMASK ) == VT_EMPTY ||
    16601661            ( vt & VT_TYPEMASK ) == VT_NULL ||
    1661                         ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )
    1662                 {
    1663                         res = DISP_E_BADVARTYPE;
    1664                 }
    1665                        
     1662            ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )
     1663        {
     1664            res = DISP_E_BADVARTYPE;
     1665        }
     1666
    16661667    }
    16671668    else
     
    16691670        res = ValidateVtRange( vt );
    16701671    }
    1671                
    1672         return res;
    1673 }
    1674 
    1675 
    1676 
    1677 
    1678 
    1679 /******************************************************************************
    1680  *              VariantInit     [OLEAUT32.8]
     1672
     1673    return res;
     1674}
     1675
     1676
     1677
     1678
     1679
     1680/******************************************************************************
     1681 *      VariantInit [OLEAUT32.8]
    16811682 *
    16821683 * Initializes the Variant.  Unlike VariantClear it does not interpret the current
     
    16941695
    16951696/******************************************************************************
    1696  *              VariantClear    [OLEAUT32.9]
     1697 *      VariantClear    [OLEAUT32.9]
    16971698 *
    16981699 * This function clears the VARIANT by setting the vt field to VT_EMPTY. It also
    1699  * sets the wReservedX field to 0.      The current contents of the VARIANT are
     1700 * sets the wReservedX field to 0.  The current contents of the VARIANT are
    17001701 * freed.  If the vt is VT_BSTR the string is freed. If VT_DISPATCH the object is
    17011702 * released. If VT_ARRAY the array is freed.
     
    17161717      if ( (V_VT(pvarg) & VT_ARRAY) != 0)
    17171718      {
    1718         SafeArrayDestroy(V_UNION(pvarg,parray));
     1719    SafeArrayDestroy(V_UNION(pvarg,parray));
    17191720      }
    17201721      else
    17211722      {
    1722         switch( V_VT(pvarg) & VT_TYPEMASK )
    1723         {
    1724           case( VT_BSTR ):
    1725             SysFreeString( V_UNION(pvarg,bstrVal) );
    1726             break;
    1727           case( VT_DISPATCH ):
    1728             if(V_UNION(pvarg,pdispVal)!=NULL)
    1729               ICOM_CALL(Release,V_UNION(pvarg,pdispVal));
    1730             break;
    1731           case( VT_VARIANT ):
    1732             VariantClear(V_UNION(pvarg,pvarVal));
    1733             break;
    1734           case( VT_UNKNOWN ):
    1735             if(V_UNION(pvarg,punkVal)!=NULL)
    1736               ICOM_CALL(Release,V_UNION(pvarg,punkVal));
    1737             break;
    1738           case( VT_SAFEARRAY ):
    1739             SafeArrayDestroy(V_UNION(pvarg,parray));
    1740             break;
    1741           default:
    1742             break;
    1743         }
     1723    switch( V_VT(pvarg) & VT_TYPEMASK )
     1724    {
     1725      case( VT_BSTR ):
     1726        SysFreeString( V_UNION(pvarg,bstrVal) );
     1727        break;
     1728      case( VT_DISPATCH ):
     1729        if(V_UNION(pvarg,pdispVal)!=NULL)
     1730          ICOM_CALL(Release,V_UNION(pvarg,pdispVal));
     1731        break;
     1732      case( VT_VARIANT ):
     1733        VariantClear(V_UNION(pvarg,pvarVal));
     1734        break;
     1735      case( VT_UNKNOWN ):
     1736        if(V_UNION(pvarg,punkVal)!=NULL)
     1737          ICOM_CALL(Release,V_UNION(pvarg,punkVal));
     1738        break;
     1739      case( VT_SAFEARRAY ):
     1740        SafeArrayDestroy(V_UNION(pvarg,parray));
     1741        break;
     1742      default:
     1743        break;
     1744    }
    17441745      }
    17451746    }
    1746        
     1747
    17471748    /*
    17481749     * Empty all the fields and mark the type as empty.
     
    17561757
    17571758/******************************************************************************
    1758  *              VariantCopy     [OLEAUT32.10]
     1759 *      VariantCopy [OLEAUT32.10]
    17591760 *
    17601761 * Frees up the designation variant and makes a copy of the source.
     
    17741775  {
    17751776    res = VariantClear( pvargDest );
    1776                
     1777
    17771778    if( res == S_OK )
    17781779    {
    17791780      if( V_VT(pvargSrc) & VT_BYREF )
    17801781      {
    1781         /* In the case of byreference we only need
    1782         * to copy the pointer.
    1783         */
    1784         pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3;
    1785         V_VT(pvargDest) = V_VT(pvargSrc);
     1782    /* In the case of byreference we only need
     1783    * to copy the pointer.
     1784    */
     1785    pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3;
     1786    V_VT(pvargDest) = V_VT(pvargSrc);
    17861787      }
    17871788      else
    17881789      {
    1789         /*
    1790         * The VT_ARRAY flag is another way to designate a safe array.
    1791         */
    1792         if (V_VT(pvargSrc) & VT_ARRAY)
    1793         {
    1794           SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray));
    1795         }
    1796         else
    1797         {
    1798           /* In the case of by value we need to
    1799            * copy the actuall value. In the case of
    1800            * VT_BSTR a copy of the string is made,
    1801            * if VT_DISPATCH or VT_IUNKNOWN AddReff is
    1802            * called to increment the object's reference count.
    1803            */
    1804           switch( V_VT(pvargSrc) & VT_TYPEMASK )
    1805           {
    1806             case( VT_BSTR ):
    1807               V_UNION(pvargDest,bstrVal) = SysAllocString( V_UNION(pvargSrc,bstrVal) );
    1808               break;
    1809             case( VT_DISPATCH ):
    1810               V_UNION(pvargDest,pdispVal) = V_UNION(pvargSrc,pdispVal);
    1811               if (V_UNION(pvargDest,pdispVal)!=NULL)
    1812                 ICOM_CALL(AddRef,V_UNION(pvargDest,pdispVal));
    1813               break;
    1814             case( VT_VARIANT ):
    1815               VariantCopy(V_UNION(pvargDest,pvarVal),V_UNION(pvargSrc,pvarVal));
    1816               break;
    1817             case( VT_UNKNOWN ):
    1818               V_UNION(pvargDest,punkVal) = V_UNION(pvargSrc,punkVal);
    1819               if (V_UNION(pvargDest,pdispVal)!=NULL)
    1820                 ICOM_CALL(AddRef,V_UNION(pvargDest,punkVal));
    1821               break;
    1822             case( VT_SAFEARRAY ):
    1823               SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray));
    1824               break;
    1825             default:
    1826               pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3;
    1827               break;
    1828           }
    1829         }
    1830        
    1831         V_VT(pvargDest) = V_VT(pvargSrc);
    1832       }     
     1790    /*
     1791    * The VT_ARRAY flag is another way to designate a safe array.
     1792    */
     1793    if (V_VT(pvargSrc) & VT_ARRAY)
     1794    {
     1795      SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray));
     1796    }
     1797    else
     1798    {
     1799      /* In the case of by value we need to
     1800       * copy the actuall value. In the case of
     1801       * VT_BSTR a copy of the string is made,
     1802       * if VT_DISPATCH or VT_IUNKNOWN AddReff is
     1803       * called to increment the object's reference count.
     1804       */
     1805      switch( V_VT(pvargSrc) & VT_TYPEMASK )
     1806      {
     1807        case( VT_BSTR ):
     1808          V_UNION(pvargDest,bstrVal) = SysAllocString( V_UNION(pvargSrc,bstrVal) );
     1809          break;
     1810        case( VT_DISPATCH ):
     1811          V_UNION(pvargDest,pdispVal) = V_UNION(pvargSrc,pdispVal);
     1812          if (V_UNION(pvargDest,pdispVal)!=NULL)
     1813        ICOM_CALL(AddRef,V_UNION(pvargDest,pdispVal));
     1814          break;
     1815        case( VT_VARIANT ):
     1816          VariantCopy(V_UNION(pvargDest,pvarVal),V_UNION(pvargSrc,pvarVal));
     1817          break;
     1818        case( VT_UNKNOWN ):
     1819          V_UNION(pvargDest,punkVal) = V_UNION(pvargSrc,punkVal);
     1820          if (V_UNION(pvargDest,pdispVal)!=NULL)
     1821        ICOM_CALL(AddRef,V_UNION(pvargDest,punkVal));
     1822          break;
     1823        case( VT_SAFEARRAY ):
     1824          SafeArrayCopy(V_UNION(pvargSrc,parray), &V_UNION(pvargDest,parray));
     1825          break;
     1826        default:
     1827          pvargDest->n1.n2.n3 = pvargSrc->n1.n2.n3;
     1828          break;
     1829      }
     1830    }
     1831
     1832    V_VT(pvargDest) = V_VT(pvargSrc);
     1833      }
    18331834    }
    18341835  }
     
    18391840
    18401841/******************************************************************************
    1841  *              VariantCopyInd  [OLEAUT32.11]
     1842 *      VariantCopyInd  [OLEAUT32.11]
    18421843 *
    18431844 * Frees up the destination variant and makes a copy of the source.  If
     
    18541855  if( res != S_OK )
    18551856    return res;
    1856  
     1857
    18571858  if( V_VT(pvargSrc) & VT_BYREF )
    18581859  {
     
    18761877      if( res == S_OK )
    18771878      {
    1878         /*
    1879         * The VT_ARRAY flag is another way to designate a safearray variant.
    1880         */
    1881         if ( V_VT(pvargSrc) & VT_ARRAY)
    1882         {
    1883           SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray));
    1884         }
    1885         else
    1886         {
    1887           /* In the case of by reference we need
    1888            * to copy the date pointed to by the variant.
    1889            */
    1890 
    1891           /* Get the variant type.
    1892            */
    1893           switch( V_VT(pvargSrc) & VT_TYPEMASK )
    1894           {
    1895             case( VT_BSTR ):
    1896               V_UNION(pvargDest,bstrVal) = SysAllocString( *(V_UNION(pvargSrc,pbstrVal)) );
    1897               break;
    1898             case( VT_DISPATCH ):
    1899               break;
    1900             case( VT_VARIANT ):
    1901               {
    1902                 /* Prevent from cycling.  According to tests on
    1903                 * VariantCopyInd in Windows and the documentation
    1904                 * this API dereferences the inner Variants to only one depth.
    1905                 * If the inner Variant itself contains an
    1906                 * other inner variant the E_INVALIDARG error is
    1907                  * returned.
    1908                 */
    1909                 if( pvargSrc->n1.n2.wReserved1 & PROCESSING_INNER_VARIANT )
    1910                 {
    1911                   /* If we get here we are attempting to deference
    1912                    * an inner variant that that is itself contained
    1913                    * in an inner variant so report E_INVALIDARG error.
    1914                    */
    1915                   res = E_INVALIDARG;
    1916                 }
    1917                 else
    1918                 {
    1919                   /* Set the processing inner variant flag.
    1920                    * We will set this flag in the inner variant
    1921                    * that will be passed to the VariantCopyInd function.
    1922                    */
    1923                   (V_UNION(pvargSrc,pvarVal))->n1.n2.wReserved1 |= PROCESSING_INNER_VARIANT;
    1924                  
    1925                   /* Dereference the inner variant.
    1926                    */
    1927                   res = VariantCopyInd( pvargDest, V_UNION(pvargSrc,pvarVal) );
    1928                   /* We must also copy its type, I think.
    1929                    */
    1930                   V_VT(pvargSrc) = V_VT(V_UNION(pvargSrc,pvarVal));
    1931                 }
    1932               }
    1933               break;
    1934             case( VT_UNKNOWN ):
    1935               break;
    1936             case( VT_SAFEARRAY ):
    1937               SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray));
    1938               break;
    1939             default:
    1940               /* This is a by reference Variant which means that the union
    1941                * part of the Variant contains a pointer to some data of
    1942                * type "V_VT(pvargSrc) & VT_TYPEMASK".
    1943                * We will deference this data in a generic fashion using
    1944                * the void pointer "Variant.u.byref".
    1945                * We will copy this data into the union of the destination
    1946                * Variant.
    1947                */
    1948               memcpy( &pvargDest->n1.n2, V_UNION(pvargSrc,byref), SizeOfVariantData( pvargSrc ) );
    1949               break;
    1950           }
    1951         }
    1952        
    1953         V_VT(pvargDest) = V_VT(pvargSrc) & VT_TYPEMASK;
     1879    /*
     1880    * The VT_ARRAY flag is another way to designate a safearray variant.
     1881    */
     1882    if ( V_VT(pvargSrc) & VT_ARRAY)
     1883    {
     1884      SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray));
     1885    }
     1886    else
     1887    {
     1888      /* In the case of by reference we need
     1889       * to copy the date pointed to by the variant.
     1890       */
     1891
     1892      /* Get the variant type.
     1893       */
     1894      switch( V_VT(pvargSrc) & VT_TYPEMASK )
     1895      {
     1896        case( VT_BSTR ):
     1897          V_UNION(pvargDest,bstrVal) = SysAllocString( *(V_UNION(pvargSrc,pbstrVal)) );
     1898          break;
     1899        case( VT_DISPATCH ):
     1900          break;
     1901        case( VT_VARIANT ):
     1902          {
     1903        /* Prevent from cycling.  According to tests on
     1904        * VariantCopyInd in Windows and the documentation
     1905        * this API dereferences the inner Variants to only one depth.
     1906        * If the inner Variant itself contains an
     1907        * other inner variant the E_INVALIDARG error is
     1908         * returned.
     1909        */
     1910        if( pvargSrc->n1.n2.wReserved1 & PROCESSING_INNER_VARIANT )
     1911        {
     1912          /* If we get here we are attempting to deference
     1913           * an inner variant that that is itself contained
     1914           * in an inner variant so report E_INVALIDARG error.
     1915           */
     1916          res = E_INVALIDARG;
     1917        }
     1918        else
     1919        {
     1920          /* Set the processing inner variant flag.
     1921           * We will set this flag in the inner variant
     1922           * that will be passed to the VariantCopyInd function.
     1923           */
     1924          (V_UNION(pvargSrc,pvarVal))->n1.n2.wReserved1 |= PROCESSING_INNER_VARIANT;
     1925
     1926          /* Dereference the inner variant.
     1927           */
     1928          res = VariantCopyInd( pvargDest, V_UNION(pvargSrc,pvarVal) );
     1929          /* We must also copy its type, I think.
     1930           */
     1931          V_VT(pvargSrc) = V_VT(V_UNION(pvargSrc,pvarVal));
     1932        }
     1933          }
     1934          break;
     1935        case( VT_UNKNOWN ):
     1936          break;
     1937        case( VT_SAFEARRAY ):
     1938          SafeArrayCopy(*V_UNION(pvargSrc,pparray), &V_UNION(pvargDest,parray));
     1939          break;
     1940        default:
     1941          /* This is a by reference Variant which means that the union
     1942           * part of the Variant contains a pointer to some data of
     1943           * type "V_VT(pvargSrc) & VT_TYPEMASK".
     1944           * We will deference this data in a generic fashion using
     1945           * the void pointer "Variant.u.byref".
     1946           * We will copy this data into the union of the destination
     1947           * Variant.
     1948           */
     1949          memcpy( &pvargDest->n1.n2, V_UNION(pvargSrc,byref), SizeOfVariantData( pvargSrc ) );
     1950          break;
     1951      }
     1952    }
     1953
     1954    V_VT(pvargDest) = V_VT(pvargSrc) & VT_TYPEMASK;
    19541955      }
    19551956    }
     
    19681969
    19691970/******************************************************************************
    1970  *              VariantChangeType       [OLEAUT32.12]
     1971 *      VariantChangeType   [OLEAUT32.12]
    19711972 */
    19721973HRESULT WINAPI VariantChangeType(VARIANTARG* pvargDest, VARIANTARG* pvargSrc,
    1973                                                         USHORT wFlags, VARTYPE vt)
    1974 {
    1975         return VariantChangeTypeEx( pvargDest, pvargSrc, 0, wFlags, vt );
    1976 }
    1977 
    1978 /******************************************************************************
    1979  *              VariantChangeTypeEx     [OLEAUT32.147]
     1974                            USHORT wFlags, VARTYPE vt)
     1975{
     1976    return VariantChangeTypeEx( pvargDest, pvargSrc, 0, wFlags, vt );
     1977}
     1978
     1979/******************************************************************************
     1980 *      VariantChangeTypeEx [OLEAUT32.147]
    19801981 */
    19811982HRESULT WINAPI VariantChangeTypeEx(VARIANTARG* pvargDest, VARIANTARG* pvargSrc,
    1982                                                           LCID lcid, USHORT wFlags, VARTYPE vt)
    1983 {
    1984         HRESULT res = S_OK;
    1985         VARIANTARG varg;
    1986         VariantInit( &varg );
    1987        
    1988         TRACE("(%p, %p, %ld, %u, %u),stub\n", pvargDest, pvargSrc, lcid, wFlags, vt);
    1989 
    1990         /* validate our source argument.
    1991         */
    1992         res = ValidateVariantType( V_VT(pvargSrc) );
    1993 
    1994         /* validate the vartype.
    1995         */
    1996         if( res == S_OK )
    1997         {
    1998                 res = ValidateVt( vt );
    1999         }
    2000 
    2001         /* if we are doing an in-place conversion make a copy of the source.
    2002         */
    2003         if( res == S_OK && pvargDest == pvargSrc )
    2004         {
    2005                 res = VariantCopy( &varg, pvargSrc );
    2006                 pvargSrc = &varg;
    2007         }
    2008 
    2009         if( res == S_OK )
    2010         {
    2011                 /* free up the destination variant.
    2012                 */
    2013                 res = VariantClear( pvargDest );
    2014         }
    2015 
    2016         if( res == S_OK )
    2017         {
    2018                 if( V_VT(pvargSrc) & VT_BYREF )
    2019                 {
    2020                         /* Convert the source variant to a "byvalue" variant.
    2021                         */
    2022                         VARIANTARG Variant;
    2023                         VariantInit( &Variant );
    2024                         res = VariantCopyInd( &Variant, pvargSrc );
    2025                         if( res == S_OK )
    2026                         {
    2027                                 res = Coerce( pvargDest, lcid, wFlags, &Variant, vt );
    2028                                 /* this should not fail.
    2029                                 */
    2030                                 VariantClear( &Variant );
    2031                         }
    2032        
    2033                 }
    2034                 else
    2035                 {
    2036                         /* Use the current "byvalue" source variant.
    2037                         */
    2038                         res = Coerce( pvargDest, lcid, wFlags, pvargSrc, vt );
    2039                 }
    2040         }
    2041         /* this should not fail.
    2042         */
    2043         VariantClear( &varg );
    2044        
    2045         /* set the type of the destination
    2046         */
    2047         if ( res == S_OK )
    2048                 V_VT(pvargDest) = vt;
    2049 
    2050         return res;
    2051 }
    2052 
    2053 
    2054 
    2055 
    2056 /******************************************************************************
    2057  *              VarUI1FromI2            [OLEAUT32.130]
     1983                              LCID lcid, USHORT wFlags, VARTYPE vt)
     1984{
     1985    HRESULT res = S_OK;
     1986    VARIANTARG varg;
     1987    VariantInit( &varg );
     1988
     1989    TRACE("(%p, %p, %ld, %u, %u),stub\n", pvargDest, pvargSrc, lcid, wFlags, vt);
     1990
     1991    /* validate our source argument.
     1992    */
     1993    res = ValidateVariantType( V_VT(pvargSrc) );
     1994
     1995    /* validate the vartype.
     1996    */
     1997    if( res == S_OK )
     1998    {
     1999        res = ValidateVt( vt );
     2000    }
     2001
     2002    /* if we are doing an in-place conversion make a copy of the source.
     2003    */
     2004    if( res == S_OK && pvargDest == pvargSrc )
     2005    {
     2006        res = VariantCopy( &varg, pvargSrc );
     2007        pvargSrc = &varg;
     2008    }
     2009
     2010    if( res == S_OK )
     2011    {
     2012        /* free up the destination variant.
     2013        */
     2014        res = VariantClear( pvargDest );
     2015    }
     2016
     2017    if( res == S_OK )
     2018    {
     2019        if( V_VT(pvargSrc) & VT_BYREF )
     2020        {
     2021            /* Convert the source variant to a "byvalue" variant.
     2022            */
     2023            VARIANTARG Variant;
     2024            VariantInit( &Variant );
     2025            res = VariantCopyInd( &Variant, pvargSrc );
     2026            if( res == S_OK )
     2027            {
     2028                res = Coerce( pvargDest, lcid, wFlags, &Variant, vt );
     2029                /* this should not fail.
     2030                */
     2031                VariantClear( &Variant );
     2032            }
     2033
     2034        }
     2035        else
     2036        {
     2037            /* Use the current "byvalue" source variant.
     2038            */
     2039            res = Coerce( pvargDest, lcid, wFlags, pvargSrc, vt );
     2040        }
     2041    }
     2042    /* this should not fail.
     2043    */
     2044    VariantClear( &varg );
     2045
     2046    /* set the type of the destination
     2047    */
     2048    if ( res == S_OK )
     2049        V_VT(pvargDest) = vt;
     2050
     2051    return res;
     2052}
     2053
     2054
     2055
     2056
     2057/******************************************************************************
     2058 *      VarUI1FromI2        [OLEAUT32.130]
    20582059 */
    20592060HRESULT WINAPI VarUI1FromI2(short sIn, BYTE* pbOut)
    20602061{
    2061         TRACE("( %d, %p ), stub\n", sIn, pbOut );
    2062 
    2063         /* Check range of value.
    2064         */
    2065         if( sIn < UI1_MIN || sIn > UI1_MAX )
    2066         {
    2067                 return DISP_E_OVERFLOW;
    2068         }
    2069 
    2070         *pbOut = (BYTE) sIn;
    2071        
    2072         return S_OK;
    2073 }
    2074 
    2075 /******************************************************************************
    2076  *              VarUI1FromI4            [OLEAUT32.131]
     2062    TRACE("( %d, %p ), stub\n", sIn, pbOut );
     2063
     2064    /* Check range of value.
     2065    */
     2066    if( sIn < UI1_MIN || sIn > UI1_MAX )
     2067    {
     2068        return DISP_E_OVERFLOW;
     2069    }
     2070
     2071    *pbOut = (BYTE) sIn;
     2072
     2073    return S_OK;
     2074}
     2075
     2076/******************************************************************************
     2077 *      VarUI1FromI4        [OLEAUT32.131]
    20772078 */
    20782079HRESULT WINAPI VarUI1FromI4(LONG lIn, BYTE* pbOut)
    20792080{
    2080         TRACE("( %ld, %p ), stub\n", lIn, pbOut );
    2081 
    2082         /* Check range of value.
    2083         */
    2084         if( lIn < UI1_MIN || lIn > UI1_MAX )
    2085         {
    2086                 return DISP_E_OVERFLOW;
    2087         }
    2088 
    2089         *pbOut = (BYTE) lIn;
    2090        
    2091         return S_OK;
    2092 }
    2093 
    2094 
    2095 /******************************************************************************
    2096  *              VarUI1FromR4            [OLEAUT32.132]
     2081    TRACE("( %ld, %p ), stub\n", lIn, pbOut );
     2082
     2083    /* Check range of value.
     2084    */
     2085    if( lIn < UI1_MIN || lIn > UI1_MAX )
     2086    {
     2087        return DISP_E_OVERFLOW;
     2088    }
     2089
     2090    *pbOut = (BYTE) lIn;
     2091
     2092    return S_OK;
     2093}
     2094
     2095
     2096/******************************************************************************
     2097 *      VarUI1FromR4        [OLEAUT32.132]
    20972098 */
    20982099HRESULT WINAPI VarUI1FromR4(FLOAT fltIn, BYTE* pbOut)
    20992100{
    2100         TRACE("( %f, %p ), stub\n", fltIn, pbOut );
    2101 
    2102         /* Check range of value.
     2101    TRACE("( %f, %p ), stub\n", fltIn, pbOut );
     2102
     2103    /* Check range of value.
    21032104     */
    21042105    fltIn = round( fltIn );
    2105         if( fltIn < UI1_MIN || fltIn > UI1_MAX )
    2106         {
    2107                 return DISP_E_OVERFLOW;
    2108         }
    2109 
    2110         *pbOut = (BYTE) fltIn;
    2111        
    2112         return S_OK;
    2113 }
    2114 
    2115 /******************************************************************************
    2116  *              VarUI1FromR8            [OLEAUT32.133]
     2106    if( fltIn < UI1_MIN || fltIn > UI1_MAX )
     2107    {
     2108        return DISP_E_OVERFLOW;
     2109    }
     2110
     2111    *pbOut = (BYTE) fltIn;
     2112
     2113    return S_OK;
     2114}
     2115
     2116/******************************************************************************
     2117 *      VarUI1FromR8        [OLEAUT32.133]
    21172118 */
    21182119HRESULT WINAPI VarUI1FromR8(double dblIn, BYTE* pbOut)
    21192120{
    2120         TRACE("( %f, %p ), stub\n", dblIn, pbOut );
    2121 
    2122         /* Check range of value.
     2121    TRACE("( %f, %p ), stub\n", dblIn, pbOut );
     2122
     2123    /* Check range of value.
    21232124     */
    21242125    dblIn = round( dblIn );
    2125         if( dblIn < UI1_MIN || dblIn > UI1_MAX )
    2126         {
    2127                 return DISP_E_OVERFLOW;
    2128         }
    2129 
    2130         *pbOut = (BYTE) dblIn;
    2131 
    2132         return S_OK;
    2133 }
    2134 
    2135 /******************************************************************************
    2136  *              VarUI1FromDate          [OLEAUT32.135]
     2126    if( dblIn < UI1_MIN || dblIn > UI1_MAX )
     2127    {
     2128        return DISP_E_OVERFLOW;
     2129    }
     2130
     2131    *pbOut = (BYTE) dblIn;
     2132
     2133    return S_OK;
     2134}
     2135
     2136/******************************************************************************
     2137 *      VarUI1FromDate      [OLEAUT32.135]
    21372138 */
    21382139HRESULT WINAPI VarUI1FromDate(DATE dateIn, BYTE* pbOut)
    21392140{
    2140         TRACE("( %f, %p ), stub\n", dateIn, pbOut );
    2141 
    2142         /* Check range of value.
     2141    TRACE("( %f, %p ), stub\n", dateIn, pbOut );
     2142
     2143    /* Check range of value.
    21432144     */
    21442145    dateIn = round( dateIn );
    2145         if( dateIn < UI1_MIN || dateIn > UI1_MAX )
    2146         {
    2147                 return DISP_E_OVERFLOW;
    2148         }
    2149 
    2150         *pbOut = (BYTE) dateIn;
    2151 
    2152         return S_OK;
    2153 }
    2154 
    2155 /******************************************************************************
    2156  *              VarUI1FromBool          [OLEAUT32.138]
     2146    if( dateIn < UI1_MIN || dateIn > UI1_MAX )
     2147    {
     2148        return DISP_E_OVERFLOW;
     2149    }
     2150
     2151    *pbOut = (BYTE) dateIn;
     2152
     2153    return S_OK;
     2154}
     2155
     2156/******************************************************************************
     2157 *      VarUI1FromBool      [OLEAUT32.138]
    21572158 */
    21582159HRESULT WINAPI VarUI1FromBool(VARIANT_BOOL boolIn, BYTE* pbOut)
    21592160{
    2160         TRACE("( %d, %p ), stub\n", boolIn, pbOut );
    2161 
    2162         *pbOut = (BYTE) boolIn;
    2163 
    2164         return S_OK;
    2165 }
    2166 
    2167 /******************************************************************************
    2168  *              VarUI1FromI1            [OLEAUT32.237]
     2161    TRACE("( %d, %p ), stub\n", boolIn, pbOut );
     2162
     2163    *pbOut = (BYTE) boolIn;
     2164
     2165    return S_OK;
     2166}
     2167
     2168/******************************************************************************
     2169 *      VarUI1FromI1        [OLEAUT32.237]
    21692170 */
    21702171HRESULT WINAPI VarUI1FromI1(CHAR cIn, BYTE* pbOut)
    21712172{
    2172         TRACE("( %c, %p ), stub\n", cIn, pbOut );
    2173 
    2174         *pbOut = cIn;
    2175 
    2176         return S_OK;
    2177 }
    2178 
    2179 /******************************************************************************
    2180  *              VarUI1FromUI2           [OLEAUT32.238]
     2173    TRACE("( %c, %p ), stub\n", cIn, pbOut );
     2174
     2175    *pbOut = cIn;
     2176
     2177    return S_OK;
     2178}
     2179
     2180/******************************************************************************
     2181 *      VarUI1FromUI2       [OLEAUT32.238]
    21812182 */
    21822183HRESULT WINAPI VarUI1FromUI2(USHORT uiIn, BYTE* pbOut)
    21832184{
    2184         TRACE("( %d, %p ), stub\n", uiIn, pbOut );
    2185 
    2186         /* Check range of value.
    2187         */
    2188         if( uiIn > UI1_MAX )
    2189         {
    2190                 return DISP_E_OVERFLOW;
    2191         }
    2192 
    2193         *pbOut = (BYTE) uiIn;
    2194 
    2195         return S_OK;
    2196 }
    2197 
    2198 /******************************************************************************
    2199  *              VarUI1FromUI4           [OLEAUT32.239]
     2185    TRACE("( %d, %p ), stub\n", uiIn, pbOut );
     2186
     2187    /* Check range of value.
     2188    */
     2189    if( uiIn > UI1_MAX )
     2190    {
     2191        return DISP_E_OVERFLOW;
     2192    }
     2193
     2194    *pbOut = (BYTE) uiIn;
     2195
     2196    return S_OK;
     2197}
     2198
     2199/******************************************************************************
     2200 *      VarUI1FromUI4       [OLEAUT32.239]
    22002201 */
    22012202HRESULT WINAPI VarUI1FromUI4(ULONG ulIn, BYTE* pbOut)
    22022203{
    2203         TRACE("( %ld, %p ), stub\n", ulIn, pbOut );
    2204 
    2205         /* Check range of value.
    2206         */
    2207         if( ulIn > UI1_MAX )
    2208         {
    2209                 return DISP_E_OVERFLOW;
    2210         }
    2211 
    2212         *pbOut = (BYTE) ulIn;
    2213 
    2214         return S_OK;
    2215 }
    2216 
    2217 
    2218 /******************************************************************************
    2219  *              VarUI1FromStr           [OLEAUT32.136]
     2204    TRACE("( %ld, %p ), stub\n", ulIn, pbOut );
     2205
     2206    /* Check range of value.
     2207    */
     2208    if( ulIn > UI1_MAX )
     2209    {
     2210        return DISP_E_OVERFLOW;
     2211    }
     2212
     2213    *pbOut = (BYTE) ulIn;
     2214
     2215    return S_OK;
     2216}
     2217
     2218
     2219/******************************************************************************
     2220 *      VarUI1FromStr       [OLEAUT32.136]
    22202221 */
    22212222HRESULT WINAPI VarUI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, BYTE* pbOut)
    22222223{
    2223         double dValue = 0.0;
    2224         LPSTR pNewString = NULL;
    2225 
    2226         TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, pbOut );
    2227 
    2228         /* Check if we have a valid argument
    2229         */
    2230         pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    2231         RemoveCharacterFromString( pNewString, "," );
    2232         if( IsValidRealString( pNewString ) == FALSE )
    2233         {
    2234                 return DISP_E_TYPEMISMATCH;
    2235         }
    2236 
    2237         /* Convert the valid string to a floating point number.
    2238         */
    2239         dValue = atof( pNewString );
    2240        
    2241         /* We don't need the string anymore so free it.
    2242         */
    2243         HeapFree( GetProcessHeap(), 0 , pNewString );
    2244 
    2245         /* Check range of value.
     2224    double dValue = 0.0;
     2225    LPSTR pNewString = NULL;
     2226
     2227    TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, pbOut );
     2228
     2229    /* Check if we have a valid argument
     2230    */
     2231    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
     2232    RemoveCharacterFromString( pNewString, "," );
     2233    if( IsValidRealString( pNewString ) == FALSE )
     2234    {
     2235        return DISP_E_TYPEMISMATCH;
     2236    }
     2237
     2238    /* Convert the valid string to a floating point number.
     2239    */
     2240    dValue = atof( pNewString );
     2241
     2242    /* We don't need the string anymore so free it.
     2243    */
     2244    HeapFree( GetProcessHeap(), 0 , pNewString );
     2245
     2246    /* Check range of value.
    22462247     */
    22472248    dValue = round( dValue );
    2248         if( dValue < UI1_MIN || dValue > UI1_MAX )
    2249         {
    2250                 return DISP_E_OVERFLOW;
    2251         }
    2252 
    2253         *pbOut = (BYTE) dValue;
    2254 
    2255         return S_OK;
     2249    if( dValue < UI1_MIN || dValue > UI1_MAX )
     2250    {
     2251        return DISP_E_OVERFLOW;
     2252    }
     2253
     2254    *pbOut = (BYTE) dValue;
     2255
     2256    return S_OK;
    22562257}
    22572258
     
    22622263HRESULT WINAPI VarUI1FromCy(CY cyIn, BYTE* pbOut) {
    22632264   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2264    
     2265
    22652266   if (t > UI1_MAX || t < UI1_MIN) return DISP_E_OVERFLOW;
    2266    
     2267
    22672268   *pbOut = (BYTE)t;
    22682269   return S_OK;
     
    22702271
    22712272/******************************************************************************
    2272  *              VarI2FromUI1            [OLEAUT32.48]
     2273 *      VarI2FromUI1        [OLEAUT32.48]
    22732274 */
    22742275HRESULT WINAPI VarI2FromUI1(BYTE bIn, short* psOut)
    22752276{
    2276         TRACE("( 0x%08x, %p ), stub\n", bIn, psOut );
    2277 
    2278         *psOut = (short) bIn;
    2279        
    2280         return S_OK;
    2281 }
    2282 
    2283 /******************************************************************************
    2284  *              VarI2FromI4             [OLEAUT32.49]
     2277    TRACE("( 0x%08x, %p ), stub\n", bIn, psOut );
     2278
     2279    *psOut = (short) bIn;
     2280
     2281    return S_OK;
     2282}
     2283
     2284/******************************************************************************
     2285 *      VarI2FromI4     [OLEAUT32.49]
    22852286 */
    22862287HRESULT WINAPI VarI2FromI4(LONG lIn, short* psOut)
    22872288{
    2288         TRACE("( %lx, %p ), stub\n", lIn, psOut );
    2289 
    2290         /* Check range of value.
    2291         */
    2292         if( lIn < I2_MIN || lIn > I2_MAX )
    2293         {
    2294                 return DISP_E_OVERFLOW;
    2295         }
    2296 
    2297         *psOut = (short) lIn;
    2298        
    2299         return S_OK;
    2300 }
    2301 
    2302 /******************************************************************************
    2303  *              VarI2FromR4             [OLEAUT32.50]
     2289    TRACE("( %lx, %p ), stub\n", lIn, psOut );
     2290
     2291    /* Check range of value.
     2292    */
     2293    if( lIn < I2_MIN || lIn > I2_MAX )
     2294    {
     2295        return DISP_E_OVERFLOW;
     2296    }
     2297
     2298    *psOut = (short) lIn;
     2299
     2300    return S_OK;
     2301}
     2302
     2303/******************************************************************************
     2304 *      VarI2FromR4     [OLEAUT32.50]
    23042305 */
    23052306HRESULT WINAPI VarI2FromR4(FLOAT fltIn, short* psOut)
    23062307{
    2307         TRACE("( %f, %p ), stub\n", fltIn, psOut );
    2308 
    2309         /* Check range of value.
     2308    TRACE("( %f, %p ), stub\n", fltIn, psOut );
     2309
     2310    /* Check range of value.
    23102311     */
    23112312    fltIn = round( fltIn );
    2312         if( fltIn < I2_MIN || fltIn > I2_MAX )
    2313         {
    2314                 return DISP_E_OVERFLOW;
    2315         }
    2316 
    2317         *psOut = (short) fltIn;
    2318 
    2319         return S_OK;
    2320 }
    2321 
    2322 /******************************************************************************
    2323  *              VarI2FromR8             [OLEAUT32.51]
     2313    if( fltIn < I2_MIN || fltIn > I2_MAX )
     2314    {
     2315        return DISP_E_OVERFLOW;
     2316    }
     2317
     2318    *psOut = (short) fltIn;
     2319
     2320    return S_OK;
     2321}
     2322
     2323/******************************************************************************
     2324 *      VarI2FromR8     [OLEAUT32.51]
    23242325 */
    23252326HRESULT WINAPI VarI2FromR8(double dblIn, short* psOut)
    23262327{
    2327         TRACE("( %f, %p ), stub\n", dblIn, psOut );
    2328 
    2329         /* Check range of value.
     2328    TRACE("( %f, %p ), stub\n", dblIn, psOut );
     2329
     2330    /* Check range of value.
    23302331     */
    23312332    dblIn = round( dblIn );
    2332         if( dblIn < I2_MIN || dblIn > I2_MAX )
    2333         {
    2334                 return DISP_E_OVERFLOW;
    2335         }
    2336 
    2337         *psOut = (short) dblIn;
    2338 
    2339         return S_OK;
    2340 }
    2341 
    2342 /******************************************************************************
    2343  *              VarI2FromDate           [OLEAUT32.53]
     2333    if( dblIn < I2_MIN || dblIn > I2_MAX )
     2334    {
     2335        return DISP_E_OVERFLOW;
     2336    }
     2337
     2338    *psOut = (short) dblIn;
     2339
     2340    return S_OK;
     2341}
     2342
     2343/******************************************************************************
     2344 *      VarI2FromDate       [OLEAUT32.53]
    23442345 */
    23452346HRESULT WINAPI VarI2FromDate(DATE dateIn, short* psOut)
    23462347{
    2347         TRACE("( %f, %p ), stub\n", dateIn, psOut );
    2348 
    2349         /* Check range of value.
     2348    TRACE("( %f, %p ), stub\n", dateIn, psOut );
     2349
     2350    /* Check range of value.
    23502351     */
    23512352    dateIn = round( dateIn );
    2352         if( dateIn < I2_MIN || dateIn > I2_MAX )
    2353         {
    2354                 return DISP_E_OVERFLOW;
    2355         }
    2356 
    2357         *psOut = (short) dateIn;
    2358 
    2359         return S_OK;
    2360 }
    2361 
    2362 /******************************************************************************
    2363  *              VarI2FromBool           [OLEAUT32.56]
     2353    if( dateIn < I2_MIN || dateIn > I2_MAX )
     2354    {
     2355        return DISP_E_OVERFLOW;
     2356    }
     2357
     2358    *psOut = (short) dateIn;
     2359
     2360    return S_OK;
     2361}
     2362
     2363/******************************************************************************
     2364 *      VarI2FromBool       [OLEAUT32.56]
    23642365 */
    23652366HRESULT WINAPI VarI2FromBool(VARIANT_BOOL boolIn, short* psOut)
    23662367{
    2367         TRACE("( %d, %p ), stub\n", boolIn, psOut );
    2368 
    2369         *psOut = (short) boolIn;
    2370 
    2371         return S_OK;
    2372 }
    2373 
    2374 /******************************************************************************
    2375  *              VarI2FromI1             [OLEAUT32.205]
     2368    TRACE("( %d, %p ), stub\n", boolIn, psOut );
     2369
     2370    *psOut = (short) boolIn;
     2371
     2372    return S_OK;
     2373}
     2374
     2375/******************************************************************************
     2376 *      VarI2FromI1     [OLEAUT32.205]
    23762377 */
    23772378HRESULT WINAPI VarI2FromI1(CHAR cIn, short* psOut)
    23782379{
    2379         TRACE("( %c, %p ), stub\n", cIn, psOut );
    2380 
    2381         *psOut = (short) cIn;
    2382 
    2383         return S_OK;
    2384 }
    2385 
    2386 /******************************************************************************
    2387  *              VarI2FromUI2            [OLEAUT32.206]
     2380    TRACE("( %c, %p ), stub\n", cIn, psOut );
     2381
     2382    *psOut = (short) cIn;
     2383
     2384    return S_OK;
     2385}
     2386
     2387/******************************************************************************
     2388 *      VarI2FromUI2        [OLEAUT32.206]
    23882389 */
    23892390HRESULT WINAPI VarI2FromUI2(USHORT uiIn, short* psOut)
    23902391{
    2391         TRACE("( %d, %p ), stub\n", uiIn, psOut );
    2392 
    2393         /* Check range of value.
    2394         */
    2395         if( uiIn > I2_MAX )
    2396         {
    2397                 return DISP_E_OVERFLOW;
    2398         }
    2399 
    2400         *psOut = (short) uiIn;
    2401 
    2402         return S_OK;
    2403 }
    2404 
    2405 /******************************************************************************
    2406  *              VarI2FromUI4            [OLEAUT32.207]
     2392    TRACE("( %d, %p ), stub\n", uiIn, psOut );
     2393
     2394    /* Check range of value.
     2395    */
     2396    if( uiIn > I2_MAX )
     2397    {
     2398        return DISP_E_OVERFLOW;
     2399    }
     2400
     2401    *psOut = (short) uiIn;
     2402
     2403    return S_OK;
     2404}
     2405
     2406/******************************************************************************
     2407 *      VarI2FromUI4        [OLEAUT32.207]
    24072408 */
    24082409HRESULT WINAPI VarI2FromUI4(ULONG ulIn, short* psOut)
    24092410{
    2410         TRACE("( %lx, %p ), stub\n", ulIn, psOut );
    2411 
    2412         /* Check range of value.
    2413         */
    2414         if( ulIn < I2_MIN || ulIn > I2_MAX )
    2415         {
    2416                 return DISP_E_OVERFLOW;
    2417         }
    2418 
    2419         *psOut = (short) ulIn;
    2420 
    2421         return S_OK;
    2422 }
    2423 
    2424 /******************************************************************************
    2425  *              VarI2FromStr            [OLEAUT32.54]
     2411    TRACE("( %lx, %p ), stub\n", ulIn, psOut );
     2412
     2413    /* Check range of value.
     2414    */
     2415    if( ulIn < I2_MIN || ulIn > I2_MAX )
     2416    {
     2417        return DISP_E_OVERFLOW;
     2418    }
     2419
     2420    *psOut = (short) ulIn;
     2421
     2422    return S_OK;
     2423}
     2424
     2425/******************************************************************************
     2426 *      VarI2FromStr        [OLEAUT32.54]
    24262427 */
    24272428HRESULT WINAPI VarI2FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, short* psOut)
    24282429{
    2429         double dValue = 0.0;
    2430         LPSTR pNewString = NULL;
    2431 
    2432         TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, psOut );
    2433 
    2434         /* Check if we have a valid argument
    2435         */
    2436         pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    2437         RemoveCharacterFromString( pNewString, "," );
    2438         if( IsValidRealString( pNewString ) == FALSE )
    2439         {
    2440                 return DISP_E_TYPEMISMATCH;
    2441         }
    2442 
    2443         /* Convert the valid string to a floating point number.
    2444         */
    2445         dValue = atof( pNewString );
    2446        
    2447         /* We don't need the string anymore so free it.
    2448         */
    2449         HeapFree( GetProcessHeap(), 0, pNewString );
    2450 
    2451         /* Check range of value.
     2430    double dValue = 0.0;
     2431    LPSTR pNewString = NULL;
     2432
     2433    TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, psOut );
     2434
     2435    /* Check if we have a valid argument
     2436    */
     2437    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
     2438    RemoveCharacterFromString( pNewString, "," );
     2439    if( IsValidRealString( pNewString ) == FALSE )
     2440    {
     2441        return DISP_E_TYPEMISMATCH;
     2442    }
     2443
     2444    /* Convert the valid string to a floating point number.
     2445    */
     2446    dValue = atof( pNewString );
     2447
     2448    /* We don't need the string anymore so free it.
     2449    */
     2450    HeapFree( GetProcessHeap(), 0, pNewString );
     2451
     2452    /* Check range of value.
    24522453     */
    24532454    dValue = round( dValue );
    2454         if( dValue < I2_MIN || dValue > I2_MAX )
    2455         {
    2456                 return DISP_E_OVERFLOW;
    2457         }
    2458 
    2459         *psOut = (short)  dValue;
    2460 
    2461         return S_OK;
     2455    if( dValue < I2_MIN || dValue > I2_MAX )
     2456    {
     2457        return DISP_E_OVERFLOW;
     2458    }
     2459
     2460    *psOut = (short)  dValue;
     2461
     2462    return S_OK;
    24622463}
    24632464
     
    24682469HRESULT WINAPI VarI2FromCy(CY cyIn, short* psOut) {
    24692470   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2470    
     2471
    24712472   if (t > I2_MAX || t < I2_MIN) return DISP_E_OVERFLOW;
    2472    
     2473
    24732474   *psOut = (SHORT)t;
    24742475   return S_OK;
     
    24762477
    24772478/******************************************************************************
    2478  *              VarI4FromUI1            [OLEAUT32.58]
     2479 *      VarI4FromUI1        [OLEAUT32.58]
    24792480 */
    24802481HRESULT WINAPI VarI4FromUI1(BYTE bIn, LONG* plOut)
    24812482{
    2482         TRACE("( %X, %p ), stub\n", bIn, plOut );
    2483 
    2484         *plOut = (LONG) bIn;
    2485 
    2486         return S_OK;
    2487 }
    2488 
    2489 
    2490 /******************************************************************************
    2491  *              VarI4FromR4             [OLEAUT32.60]
     2483    TRACE("( %X, %p ), stub\n", bIn, plOut );
     2484
     2485    *plOut = (LONG) bIn;
     2486
     2487    return S_OK;
     2488}
     2489
     2490
     2491/******************************************************************************
     2492 *      VarI4FromR4     [OLEAUT32.60]
    24922493 */
    24932494HRESULT WINAPI VarI4FromR4(FLOAT fltIn, LONG* plOut)
    24942495{
    2495         TRACE("( %f, %p ), stub\n", fltIn, plOut );
    2496 
    2497         /* Check range of value.
     2496    TRACE("( %f, %p ), stub\n", fltIn, plOut );
     2497
     2498    /* Check range of value.
    24982499     */
    24992500    fltIn = round( fltIn );
    2500         if( fltIn < I4_MIN || fltIn > I4_MAX )
    2501         {
    2502                 return DISP_E_OVERFLOW;
    2503         }
    2504 
    2505         *plOut = (LONG) fltIn;
    2506 
    2507         return S_OK;
    2508 }
    2509 
    2510 /******************************************************************************
    2511  *              VarI4FromR8             [OLEAUT32.61]
     2501    if( fltIn < I4_MIN || fltIn > I4_MAX )
     2502    {
     2503        return DISP_E_OVERFLOW;
     2504    }
     2505
     2506    *plOut = (LONG) fltIn;
     2507
     2508    return S_OK;
     2509}
     2510
     2511/******************************************************************************
     2512 *      VarI4FromR8     [OLEAUT32.61]
    25122513 */
    25132514HRESULT WINAPI VarI4FromR8(double dblIn, LONG* plOut)
    25142515{
    2515         TRACE("( %f, %p ), stub\n", dblIn, plOut );
    2516 
    2517         /* Check range of value.
     2516    TRACE("( %f, %p ), stub\n", dblIn, plOut );
     2517
     2518    /* Check range of value.
    25182519     */
    25192520    dblIn = round( dblIn );
    2520         if( dblIn < I4_MIN || dblIn > I4_MAX )
    2521         {
    2522                 return DISP_E_OVERFLOW;
    2523         }
    2524 
    2525         *plOut = (LONG) dblIn;
    2526 
    2527         return S_OK;
    2528 }
    2529 
    2530 /******************************************************************************
    2531  *              VarI4FromDate           [OLEAUT32.63]
     2521    if( dblIn < I4_MIN || dblIn > I4_MAX )
     2522    {
     2523        return DISP_E_OVERFLOW;
     2524    }
     2525
     2526    *plOut = (LONG) dblIn;
     2527
     2528    return S_OK;
     2529}
     2530
     2531/******************************************************************************
     2532 *      VarI4FromDate       [OLEAUT32.63]
    25322533 */
    25332534HRESULT WINAPI VarI4FromDate(DATE dateIn, LONG* plOut)
    25342535{
    2535         TRACE("( %f, %p ), stub\n", dateIn, plOut );
    2536 
    2537         /* Check range of value.
     2536    TRACE("( %f, %p ), stub\n", dateIn, plOut );
     2537
     2538    /* Check range of value.
    25382539     */
    25392540    dateIn = round( dateIn );
    2540         if( dateIn < I4_MIN || dateIn > I4_MAX )
    2541         {
    2542                 return DISP_E_OVERFLOW;
    2543         }
    2544 
    2545         *plOut = (LONG) dateIn;
    2546 
    2547         return S_OK;
    2548 }
    2549 
    2550 /******************************************************************************
    2551  *              VarI4FromBool           [OLEAUT32.66]
     2541    if( dateIn < I4_MIN || dateIn > I4_MAX )
     2542    {
     2543        return DISP_E_OVERFLOW;
     2544    }
     2545
     2546    *plOut = (LONG) dateIn;
     2547
     2548    return S_OK;
     2549}
     2550
     2551/******************************************************************************
     2552 *      VarI4FromBool       [OLEAUT32.66]
    25522553 */
    25532554HRESULT WINAPI VarI4FromBool(VARIANT_BOOL boolIn, LONG* plOut)
    25542555{
    2555         TRACE("( %d, %p ), stub\n", boolIn, plOut );
    2556 
    2557         *plOut = (LONG) boolIn;
    2558 
    2559         return S_OK;
    2560 }
    2561 
    2562 /******************************************************************************
    2563  *              VarI4FromI1             [OLEAUT32.209]
     2556    TRACE("( %d, %p ), stub\n", boolIn, plOut );
     2557
     2558    *plOut = (LONG) boolIn;
     2559
     2560    return S_OK;
     2561}
     2562
     2563/******************************************************************************
     2564 *      VarI4FromI1     [OLEAUT32.209]
    25642565 */
    25652566HRESULT WINAPI VarI4FromI1(CHAR cIn, LONG* plOut)
    25662567{
    2567         TRACE("( %c, %p ), stub\n", cIn, plOut );
    2568 
    2569         *plOut = (LONG) cIn;
    2570 
    2571         return S_OK;
    2572 }
    2573 
    2574 /******************************************************************************
    2575  *              VarI4FromUI2            [OLEAUT32.210]
     2568    TRACE("( %c, %p ), stub\n", cIn, plOut );
     2569
     2570    *plOut = (LONG) cIn;
     2571
     2572    return S_OK;
     2573}
     2574
     2575/******************************************************************************
     2576 *      VarI4FromUI2        [OLEAUT32.210]
    25762577 */
    25772578HRESULT WINAPI VarI4FromUI2(USHORT uiIn, LONG* plOut)
    25782579{
    2579         TRACE("( %d, %p ), stub\n", uiIn, plOut );
    2580 
    2581         *plOut = (LONG) uiIn;
    2582 
    2583         return S_OK;
    2584 }
    2585 
    2586 /******************************************************************************
    2587  *              VarI4FromUI4            [OLEAUT32.211]
     2580    TRACE("( %d, %p ), stub\n", uiIn, plOut );
     2581
     2582    *plOut = (LONG) uiIn;
     2583
     2584    return S_OK;
     2585}
     2586
     2587/******************************************************************************
     2588 *      VarI4FromUI4        [OLEAUT32.211]
    25882589 */
    25892590HRESULT WINAPI VarI4FromUI4(ULONG ulIn, LONG* plOut)
    25902591{
    2591         TRACE("( %lx, %p ), stub\n", ulIn, plOut );
    2592 
    2593         /* Check range of value.
    2594         */
    2595         if( ulIn < I4_MIN || ulIn > I4_MAX )
    2596         {
    2597                 return DISP_E_OVERFLOW;
    2598         }
    2599 
    2600         *plOut = (LONG) ulIn;
    2601 
    2602         return S_OK;
    2603 }
    2604 
    2605 /******************************************************************************
    2606  *              VarI4FromI2             [OLEAUT32.59]
     2592    TRACE("( %lx, %p ), stub\n", ulIn, plOut );
     2593
     2594    /* Check range of value.
     2595    */
     2596    if( ulIn < I4_MIN || ulIn > I4_MAX )
     2597    {
     2598        return DISP_E_OVERFLOW;
     2599    }
     2600
     2601    *plOut = (LONG) ulIn;
     2602
     2603    return S_OK;
     2604}
     2605
     2606/******************************************************************************
     2607 *      VarI4FromI2     [OLEAUT32.59]
    26072608 */
    26082609HRESULT WINAPI VarI4FromI2(short sIn, LONG* plOut)
    26092610{
    2610         TRACE("( %d, %p ), stub\n", sIn, plOut );
    2611 
    2612         *plOut = (LONG) sIn;
    2613 
    2614         return S_OK;
    2615 }
    2616 
    2617 /******************************************************************************
    2618  *              VarI4FromStr            [OLEAUT32.64]
     2611    TRACE("( %d, %p ), stub\n", sIn, plOut );
     2612
     2613    *plOut = (LONG) sIn;
     2614
     2615    return S_OK;
     2616}
     2617
     2618/******************************************************************************
     2619 *      VarI4FromStr        [OLEAUT32.64]
    26192620 */
    26202621HRESULT WINAPI VarI4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, LONG* plOut)
    26212622{
    2622         double dValue = 0.0;
    2623         LPSTR pNewString = NULL;
    2624 
    2625         TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, plOut );
    2626 
    2627         /* Check if we have a valid argument
    2628         */
    2629         pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    2630         RemoveCharacterFromString( pNewString, "," );
    2631         if( IsValidRealString( pNewString ) == FALSE )
    2632         {
    2633                 return DISP_E_TYPEMISMATCH;
    2634         }
    2635 
    2636         /* Convert the valid string to a floating point number.
    2637         */
    2638         dValue = atof( pNewString );
    2639        
    2640         /* We don't need the string anymore so free it.
    2641         */
    2642         HeapFree( GetProcessHeap(), 0, pNewString );
    2643 
    2644         /* Check range of value.
     2623    double dValue = 0.0;
     2624    LPSTR pNewString = NULL;
     2625
     2626    TRACE("( %p, 0x%08lx, 0x%08lx, %p ), stub\n", strIn, lcid, dwFlags, plOut );
     2627
     2628    /* Check if we have a valid argument
     2629    */
     2630    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
     2631    RemoveCharacterFromString( pNewString, "," );
     2632    if( IsValidRealString( pNewString ) == FALSE )
     2633    {
     2634        return DISP_E_TYPEMISMATCH;
     2635    }
     2636
     2637    /* Convert the valid string to a floating point number.
     2638    */
     2639    dValue = atof( pNewString );
     2640
     2641    /* We don't need the string anymore so free it.
     2642    */
     2643    HeapFree( GetProcessHeap(), 0, pNewString );
     2644
     2645    /* Check range of value.
    26452646     */
    26462647    dValue = round( dValue );
    2647         if( dValue < I4_MIN || dValue > I4_MAX )
    2648         {
    2649                 return DISP_E_OVERFLOW;
    2650         }
    2651 
    2652         *plOut = (LONG) dValue;
    2653 
    2654         return S_OK;
     2648    if( dValue < I4_MIN || dValue > I4_MAX )
     2649    {
     2650        return DISP_E_OVERFLOW;
     2651    }
     2652
     2653    *plOut = (LONG) dValue;
     2654
     2655    return S_OK;
    26552656}
    26562657
     
    26612662HRESULT WINAPI VarI4FromCy(CY cyIn, LONG* plOut) {
    26622663   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2663    
     2664
    26642665   if (t > I4_MAX || t < I4_MIN) return DISP_E_OVERFLOW;
    2665    
     2666
    26662667   *plOut = (LONG)t;
    26672668   return S_OK;
     
    26692670
    26702671/******************************************************************************
    2671  *              VarR4FromUI1            [OLEAUT32.68]
     2672 *      VarR4FromUI1        [OLEAUT32.68]
    26722673 */
    26732674HRESULT WINAPI VarR4FromUI1(BYTE bIn, FLOAT* pfltOut)
    26742675{
    2675         TRACE("( %X, %p ), stub\n", bIn, pfltOut );
    2676 
    2677         *pfltOut = (FLOAT) bIn;
    2678 
    2679         return S_OK;
    2680 }
    2681 
    2682 /******************************************************************************
    2683  *              VarR4FromI2             [OLEAUT32.69]
     2676    TRACE("( %X, %p ), stub\n", bIn, pfltOut );
     2677
     2678    *pfltOut = (FLOAT) bIn;
     2679
     2680    return S_OK;
     2681}
     2682
     2683/******************************************************************************
     2684 *      VarR4FromI2     [OLEAUT32.69]
    26842685 */
    26852686HRESULT WINAPI VarR4FromI2(short sIn, FLOAT* pfltOut)
    26862687{
    2687         TRACE("( %d, %p ), stub\n", sIn, pfltOut );
    2688 
    2689         *pfltOut = (FLOAT) sIn;
    2690 
    2691         return S_OK;
    2692 }
    2693 
    2694 /******************************************************************************
    2695  *              VarR4FromI4             [OLEAUT32.70]
     2688    TRACE("( %d, %p ), stub\n", sIn, pfltOut );
     2689
     2690    *pfltOut = (FLOAT) sIn;
     2691
     2692    return S_OK;
     2693}
     2694
     2695/******************************************************************************
     2696 *      VarR4FromI4     [OLEAUT32.70]
    26962697 */
    26972698HRESULT WINAPI VarR4FromI4(LONG lIn, FLOAT* pfltOut)
    26982699{
    2699         TRACE("( %lx, %p ), stub\n", lIn, pfltOut );
    2700 
    2701         *pfltOut = (FLOAT) lIn;
    2702 
    2703         return S_OK;
    2704 }
    2705 
    2706 /******************************************************************************
    2707  *              VarR4FromR8             [OLEAUT32.71]
     2700    TRACE("( %lx, %p ), stub\n", lIn, pfltOut );
     2701
     2702    *pfltOut = (FLOAT) lIn;
     2703
     2704    return S_OK;
     2705}
     2706
     2707/******************************************************************************
     2708 *      VarR4FromR8     [OLEAUT32.71]
    27082709 */
    27092710HRESULT WINAPI VarR4FromR8(double dblIn, FLOAT* pfltOut)
    27102711{
    2711         TRACE("( %f, %p ), stub\n", dblIn, pfltOut );
    2712 
    2713         /* Check range of value.
    2714         */
    2715         if( dblIn < -(FLT_MAX) || dblIn > FLT_MAX )
    2716         {
    2717                 return DISP_E_OVERFLOW;
    2718         }
    2719 
    2720         *pfltOut = (FLOAT) dblIn;
    2721 
    2722         return S_OK;
    2723 }
    2724 
    2725 /******************************************************************************
    2726  *              VarR4FromDate           [OLEAUT32.73]
     2712    TRACE("( %f, %p ), stub\n", dblIn, pfltOut );
     2713
     2714    /* Check range of value.
     2715    */
     2716    if( dblIn < -(FLT_MAX) || dblIn > FLT_MAX )
     2717    {
     2718        return DISP_E_OVERFLOW;
     2719    }
     2720
     2721    *pfltOut = (FLOAT) dblIn;
     2722
     2723    return S_OK;
     2724}
     2725
     2726/******************************************************************************
     2727 *      VarR4FromDate       [OLEAUT32.73]
    27272728 */
    27282729HRESULT WINAPI VarR4FromDate(DATE dateIn, FLOAT* pfltOut)
    27292730{
    2730         TRACE("( %f, %p ), stub\n", dateIn, pfltOut );
    2731 
    2732         /* Check range of value.
    2733         */
    2734         if( dateIn < -(FLT_MAX) || dateIn > FLT_MAX )
    2735         {
    2736                 return DISP_E_OVERFLOW;
    2737         }
    2738 
    2739         *pfltOut = (FLOAT) dateIn;
    2740 
    2741         return S_OK;
    2742 }
    2743 
    2744 /******************************************************************************
    2745  *              VarR4FromBool           [OLEAUT32.76]
     2731    TRACE("( %f, %p ), stub\n", dateIn, pfltOut );
     2732
     2733    /* Check range of value.
     2734    */
     2735    if( dateIn < -(FLT_MAX) || dateIn > FLT_MAX )
     2736    {
     2737        return DISP_E_OVERFLOW;
     2738    }
     2739
     2740    *pfltOut = (FLOAT) dateIn;
     2741
     2742    return S_OK;
     2743}
     2744
     2745/******************************************************************************
     2746 *      VarR4FromBool       [OLEAUT32.76]
    27462747 */
    27472748HRESULT WINAPI VarR4FromBool(VARIANT_BOOL boolIn, FLOAT* pfltOut)
    27482749{
    2749         TRACE("( %d, %p ), stub\n", boolIn, pfltOut );
    2750 
    2751         *pfltOut = (FLOAT) boolIn;
    2752 
    2753         return S_OK;
    2754 }
    2755 
    2756 /******************************************************************************
    2757  *              VarR4FromI1             [OLEAUT32.213]
     2750    TRACE("( %d, %p ), stub\n", boolIn, pfltOut );
     2751
     2752    *pfltOut = (FLOAT) boolIn;
     2753
     2754    return S_OK;
     2755}
     2756
     2757/******************************************************************************
     2758 *      VarR4FromI1     [OLEAUT32.213]
    27582759 */
    27592760HRESULT WINAPI VarR4FromI1(CHAR cIn, FLOAT* pfltOut)
    27602761{
    2761         TRACE("( %c, %p ), stub\n", cIn, pfltOut );
    2762 
    2763         *pfltOut = (FLOAT) cIn;
    2764 
    2765         return S_OK;
    2766 }
    2767 
    2768 /******************************************************************************
    2769  *              VarR4FromUI2            [OLEAUT32.214]
     2762    TRACE("( %c, %p ), stub\n", cIn, pfltOut );
     2763
     2764    *pfltOut = (FLOAT) cIn;
     2765
     2766    return S_OK;
     2767}
     2768
     2769/******************************************************************************
     2770 *      VarR4FromUI2        [OLEAUT32.214]
    27702771 */
    27712772HRESULT WINAPI VarR4FromUI2(USHORT uiIn, FLOAT* pfltOut)
    27722773{
    2773         TRACE("( %d, %p ), stub\n", uiIn, pfltOut );
    2774 
    2775         *pfltOut = (FLOAT) uiIn;
    2776 
    2777         return S_OK;
    2778 }
    2779 
    2780 /******************************************************************************
    2781  *              VarR4FromUI4            [OLEAUT32.215]
     2774    TRACE("( %d, %p ), stub\n", uiIn, pfltOut );
     2775
     2776    *pfltOut = (FLOAT) uiIn;
     2777
     2778    return S_OK;
     2779}
     2780
     2781/******************************************************************************
     2782 *      VarR4FromUI4        [OLEAUT32.215]
    27822783 */
    27832784HRESULT WINAPI VarR4FromUI4(ULONG ulIn, FLOAT* pfltOut)
    27842785{
    2785         TRACE("( %ld, %p ), stub\n", ulIn, pfltOut );
    2786 
    2787         *pfltOut = (FLOAT) ulIn;
    2788 
    2789         return S_OK;
    2790 }
    2791 
    2792 /******************************************************************************
    2793  *              VarR4FromStr            [OLEAUT32.74]
     2786    TRACE("( %ld, %p ), stub\n", ulIn, pfltOut );
     2787
     2788    *pfltOut = (FLOAT) ulIn;
     2789
     2790    return S_OK;
     2791}
     2792
     2793/******************************************************************************
     2794 *      VarR4FromStr        [OLEAUT32.74]
    27942795 */
    27952796HRESULT WINAPI VarR4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, FLOAT* pfltOut)
    27962797{
    2797         double dValue = 0.0;
    2798         LPSTR pNewString = NULL;
    2799 
    2800         TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pfltOut );
    2801 
    2802         /* Check if we have a valid argument
    2803         */
    2804         pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    2805         RemoveCharacterFromString( pNewString, "," );
    2806         if( IsValidRealString( pNewString ) == FALSE )
    2807         {
    2808                 return DISP_E_TYPEMISMATCH;
    2809         }
    2810 
    2811         /* Convert the valid string to a floating point number.
    2812         */
    2813         dValue = atof( pNewString );
    2814        
    2815         /* We don't need the string anymore so free it.
    2816         */
    2817         HeapFree( GetProcessHeap(), 0, pNewString );
    2818 
    2819         /* Check range of value.
    2820         */
    2821         if( dValue < -(FLT_MAX) || dValue > FLT_MAX )
    2822         {
    2823                 return DISP_E_OVERFLOW;
    2824         }
    2825 
    2826         *pfltOut = (FLOAT) dValue;
    2827 
    2828         return S_OK;
     2798    double dValue = 0.0;
     2799    LPSTR pNewString = NULL;
     2800
     2801    TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pfltOut );
     2802
     2803    /* Check if we have a valid argument
     2804    */
     2805    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
     2806    RemoveCharacterFromString( pNewString, "," );
     2807    if( IsValidRealString( pNewString ) == FALSE )
     2808    {
     2809        return DISP_E_TYPEMISMATCH;
     2810    }
     2811
     2812    /* Convert the valid string to a floating point number.
     2813    */
     2814    dValue = atof( pNewString );
     2815
     2816    /* We don't need the string anymore so free it.
     2817    */
     2818    HeapFree( GetProcessHeap(), 0, pNewString );
     2819
     2820    /* Check range of value.
     2821    */
     2822    if( dValue < -(FLT_MAX) || dValue > FLT_MAX )
     2823    {
     2824        return DISP_E_OVERFLOW;
     2825    }
     2826
     2827    *pfltOut = (FLOAT) dValue;
     2828
     2829    return S_OK;
    28292830}
    28302831
     
    28352836HRESULT WINAPI VarR4FromCy(CY cyIn, FLOAT* pfltOut) {
    28362837   *pfltOut = (FLOAT)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2837    
     2838
    28382839   return S_OK;
    28392840}
    28402841
    28412842/******************************************************************************
    2842  *              VarR8FromUI1            [OLEAUT32.78]
     2843 *      VarR8FromUI1        [OLEAUT32.78]
    28432844 */
    28442845HRESULT WINAPI VarR8FromUI1(BYTE bIn, double* pdblOut)
    28452846{
    2846         TRACE("( %d, %p ), stub\n", bIn, pdblOut );
    2847 
    2848         *pdblOut = (double) bIn;
    2849 
    2850         return S_OK;
    2851 }
    2852 
    2853 /******************************************************************************
    2854  *              VarR8FromI2             [OLEAUT32.79]
     2847    TRACE("( %d, %p ), stub\n", bIn, pdblOut );
     2848
     2849    *pdblOut = (double) bIn;
     2850
     2851    return S_OK;
     2852}
     2853
     2854/******************************************************************************
     2855 *      VarR8FromI2     [OLEAUT32.79]
    28552856 */
    28562857HRESULT WINAPI VarR8FromI2(short sIn, double* pdblOut)
    28572858{
    2858         TRACE("( %d, %p ), stub\n", sIn, pdblOut );
    2859 
    2860         *pdblOut = (double) sIn;
    2861 
    2862         return S_OK;
    2863 }
    2864 
    2865 /******************************************************************************
    2866  *              VarR8FromI4             [OLEAUT32.80]
     2859    TRACE("( %d, %p ), stub\n", sIn, pdblOut );
     2860
     2861    *pdblOut = (double) sIn;
     2862
     2863    return S_OK;
     2864}
     2865
     2866/******************************************************************************
     2867 *      VarR8FromI4     [OLEAUT32.80]
    28672868 */
    28682869HRESULT WINAPI VarR8FromI4(LONG lIn, double* pdblOut)
    28692870{
    2870         TRACE("( %ld, %p ), stub\n", lIn, pdblOut );
    2871 
    2872         *pdblOut = (double) lIn;
    2873 
    2874         return S_OK;
    2875 }
    2876 
    2877 /******************************************************************************
    2878  *              VarR8FromR4             [OLEAUT32.81]
     2871    TRACE("( %ld, %p ), stub\n", lIn, pdblOut );
     2872
     2873    *pdblOut = (double) lIn;
     2874
     2875    return S_OK;
     2876}
     2877
     2878/******************************************************************************
     2879 *      VarR8FromR4     [OLEAUT32.81]
    28792880 */
    28802881HRESULT WINAPI VarR8FromR4(FLOAT fltIn, double* pdblOut)
    28812882{
    2882         TRACE("( %f, %p ), stub\n", fltIn, pdblOut );
    2883 
    2884         *pdblOut = (double) fltIn;
    2885 
    2886         return S_OK;
    2887 }
    2888 
    2889 /******************************************************************************
    2890  *              VarR8FromDate           [OLEAUT32.83]
     2883    TRACE("( %f, %p ), stub\n", fltIn, pdblOut );
     2884
     2885    *pdblOut = (double) fltIn;
     2886
     2887    return S_OK;
     2888}
     2889
     2890/******************************************************************************
     2891 *      VarR8FromDate       [OLEAUT32.83]
    28912892 */
    28922893HRESULT WINAPI VarR8FromDate(DATE dateIn, double* pdblOut)
    28932894{
    2894         TRACE("( %f, %p ), stub\n", dateIn, pdblOut );
    2895 
    2896         *pdblOut = (double) dateIn;
    2897 
    2898         return S_OK;
    2899 }
    2900 
    2901 /******************************************************************************
    2902  *              VarR8FromBool           [OLEAUT32.86]
     2895    TRACE("( %f, %p ), stub\n", dateIn, pdblOut );
     2896
     2897    *pdblOut = (double) dateIn;
     2898
     2899    return S_OK;
     2900}
     2901
     2902/******************************************************************************
     2903 *      VarR8FromBool       [OLEAUT32.86]
    29032904 */
    29042905HRESULT WINAPI VarR8FromBool(VARIANT_BOOL boolIn, double* pdblOut)
    29052906{
    2906         TRACE("( %d, %p ), stub\n", boolIn, pdblOut );
    2907 
    2908         *pdblOut = (double) boolIn;
    2909 
    2910         return S_OK;
    2911 }
    2912 
    2913 /******************************************************************************
    2914  *              VarR8FromI1             [OLEAUT32.217]
     2907    TRACE("( %d, %p ), stub\n", boolIn, pdblOut );
     2908
     2909    *pdblOut = (double) boolIn;
     2910
     2911    return S_OK;
     2912}
     2913
     2914/******************************************************************************
     2915 *      VarR8FromI1     [OLEAUT32.217]
    29152916 */
    29162917HRESULT WINAPI VarR8FromI1(CHAR cIn, double* pdblOut)
    29172918{
    2918         TRACE("( %c, %p ), stub\n", cIn, pdblOut );
    2919 
    2920         *pdblOut = (double) cIn;
    2921 
    2922         return S_OK;
    2923 }
    2924 
    2925 /******************************************************************************
    2926  *              VarR8FromUI2            [OLEAUT32.218]
     2919    TRACE("( %c, %p ), stub\n", cIn, pdblOut );
     2920
     2921    *pdblOut = (double) cIn;
     2922
     2923    return S_OK;
     2924}
     2925
     2926/******************************************************************************
     2927 *      VarR8FromUI2        [OLEAUT32.218]
    29272928 */
    29282929HRESULT WINAPI VarR8FromUI2(USHORT uiIn, double* pdblOut)
    29292930{
    2930         TRACE("( %d, %p ), stub\n", uiIn, pdblOut );
    2931 
    2932         *pdblOut = (double) uiIn;
    2933 
    2934         return S_OK;
    2935 }
    2936 
    2937 /******************************************************************************
    2938  *              VarR8FromUI4            [OLEAUT32.219]
     2931    TRACE("( %d, %p ), stub\n", uiIn, pdblOut );
     2932
     2933    *pdblOut = (double) uiIn;
     2934
     2935    return S_OK;
     2936}
     2937
     2938/******************************************************************************
     2939 *      VarR8FromUI4        [OLEAUT32.219]
    29392940 */
    29402941HRESULT WINAPI VarR8FromUI4(ULONG ulIn, double* pdblOut)
    29412942{
    2942         TRACE("( %ld, %p ), stub\n", ulIn, pdblOut );
    2943 
    2944         *pdblOut = (double) ulIn;
    2945 
    2946         return S_OK;
    2947 }
    2948 
    2949 /******************************************************************************
    2950  *              VarR8FromStr            [OLEAUT32.84]
     2943    TRACE("( %ld, %p ), stub\n", ulIn, pdblOut );
     2944
     2945    *pdblOut = (double) ulIn;
     2946
     2947    return S_OK;
     2948}
     2949
     2950/******************************************************************************
     2951 *      VarR8FromStr        [OLEAUT32.84]
    29512952 */
    29522953HRESULT WINAPI VarR8FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, double* pdblOut)
    29532954{
    2954         double dValue = 0.0;
    2955         LPSTR pNewString = NULL;
    2956 
    2957         TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pdblOut );
    2958 
    2959         /* Check if we have a valid argument
    2960         */
    2961         pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    2962         RemoveCharacterFromString( pNewString, "," );
    2963         if( IsValidRealString( pNewString ) == FALSE )
    2964         {
    2965                 return DISP_E_TYPEMISMATCH;
    2966         }
    2967 
    2968         /* Convert the valid string to a floating point number.
    2969         */
    2970         dValue = atof( pNewString );
    2971        
    2972         /* We don't need the string anymore so free it.
    2973         */
    2974         HeapFree( GetProcessHeap(), 0, pNewString );
    2975 
    2976         *pdblOut = dValue;
    2977 
    2978         return S_OK;
     2955    double dValue = 0.0;
     2956    LPSTR pNewString = NULL;
     2957
     2958    TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pdblOut );
     2959
     2960    /* Check if we have a valid argument
     2961    */
     2962    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
     2963    RemoveCharacterFromString( pNewString, "," );
     2964    if( IsValidRealString( pNewString ) == FALSE )
     2965    {
     2966        return DISP_E_TYPEMISMATCH;
     2967    }
     2968
     2969    /* Convert the valid string to a floating point number.
     2970    */
     2971    dValue = atof( pNewString );
     2972
     2973    /* We don't need the string anymore so free it.
     2974    */
     2975    HeapFree( GetProcessHeap(), 0, pNewString );
     2976
     2977    *pdblOut = dValue;
     2978
     2979    return S_OK;
    29792980}
    29802981
     
    29852986HRESULT WINAPI VarR8FromCy(CY cyIn, double* pdblOut) {
    29862987   *pdblOut = (double)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2987    
     2988
    29882989   return S_OK;
    29892990}
    29902991
    29912992/******************************************************************************
    2992  *              VarDateFromUI1          [OLEAUT32.88]
     2993 *      VarDateFromUI1      [OLEAUT32.88]
    29932994 */
    29942995HRESULT WINAPI VarDateFromUI1(BYTE bIn, DATE* pdateOut)
    29952996{
    2996         TRACE("( %d, %p ), stub\n", bIn, pdateOut );
    2997 
    2998         *pdateOut = (DATE) bIn;
    2999 
    3000         return S_OK;
    3001 }
    3002 
    3003 /******************************************************************************
    3004  *              VarDateFromI2           [OLEAUT32.89]
     2997    TRACE("( %d, %p ), stub\n", bIn, pdateOut );
     2998
     2999    *pdateOut = (DATE) bIn;
     3000
     3001    return S_OK;
     3002}
     3003
     3004/******************************************************************************
     3005 *      VarDateFromI2       [OLEAUT32.89]
    30053006 */
    30063007HRESULT WINAPI VarDateFromI2(short sIn, DATE* pdateOut)
    30073008{
    3008         TRACE("( %d, %p ), stub\n", sIn, pdateOut );
    3009 
    3010         *pdateOut = (DATE) sIn;
    3011 
    3012         return S_OK;
    3013 }
    3014 
    3015 /******************************************************************************
    3016  *              VarDateFromI4           [OLEAUT32.90]
     3009    TRACE("( %d, %p ), stub\n", sIn, pdateOut );
     3010
     3011    *pdateOut = (DATE) sIn;
     3012
     3013    return S_OK;
     3014}
     3015
     3016/******************************************************************************
     3017 *      VarDateFromI4       [OLEAUT32.90]
    30173018 */
    30183019HRESULT WINAPI VarDateFromI4(LONG lIn, DATE* pdateOut)
    30193020{
    3020         TRACE("( %ld, %p ), stub\n", lIn, pdateOut );
    3021 
    3022         if( lIn < DATE_MIN || lIn > DATE_MAX )
    3023         {
    3024                 return DISP_E_OVERFLOW;
    3025         }
    3026 
    3027         *pdateOut = (DATE) lIn;
    3028 
    3029         return S_OK;
    3030 }
    3031 
    3032 /******************************************************************************
    3033  *              VarDateFromR4           [OLEAUT32.91]
     3021    TRACE("( %ld, %p ), stub\n", lIn, pdateOut );
     3022
     3023    if( lIn < DATE_MIN || lIn > DATE_MAX )
     3024    {
     3025        return DISP_E_OVERFLOW;
     3026    }
     3027
     3028    *pdateOut = (DATE) lIn;
     3029
     3030    return S_OK;
     3031}
     3032
     3033/******************************************************************************
     3034 *      VarDateFromR4       [OLEAUT32.91]
    30343035 */
    30353036HRESULT WINAPI VarDateFromR4(FLOAT fltIn, DATE* pdateOut)
     
    30383039
    30393040    if( ceil(fltIn) < DATE_MIN || floor(fltIn) > DATE_MAX )
    3040         {
    3041                 return DISP_E_OVERFLOW;
    3042         }
    3043 
    3044         *pdateOut = (DATE) fltIn;
    3045 
    3046         return S_OK;
    3047 }
    3048 
    3049 /******************************************************************************
    3050  *              VarDateFromR8           [OLEAUT32.92]
     3041    {
     3042        return DISP_E_OVERFLOW;
     3043    }
     3044
     3045    *pdateOut = (DATE) fltIn;
     3046
     3047    return S_OK;
     3048}
     3049
     3050/******************************************************************************
     3051 *      VarDateFromR8       [OLEAUT32.92]
    30513052 */
    30523053HRESULT WINAPI VarDateFromR8(double dblIn, DATE* pdateOut)
     
    30543055    TRACE("( %f, %p ), stub\n", dblIn, pdateOut );
    30553056
    3056         if( ceil(dblIn) < DATE_MIN || floor(dblIn) > DATE_MAX )
    3057         {
    3058                 return DISP_E_OVERFLOW;
    3059         }
    3060 
    3061         *pdateOut = (DATE) dblIn;
    3062 
    3063         return S_OK;
    3064 }
    3065 
    3066 /******************************************************************************
    3067  *              VarDateFromStr          [OLEAUT32.94]
     3057    if( ceil(dblIn) < DATE_MIN || floor(dblIn) > DATE_MAX )
     3058    {
     3059        return DISP_E_OVERFLOW;
     3060    }
     3061
     3062    *pdateOut = (DATE) dblIn;
     3063
     3064    return S_OK;
     3065}
     3066
     3067/******************************************************************************
     3068 *      VarDateFromStr      [OLEAUT32.94]
    30683069 * The string representing the date is composed of two parts, a date and time.
    30693070 *
     
    30743075 *
    30753076 * The formats for the date part are has follows:
    3076  * mm/[dd/][yy]yy 
     3077 * mm/[dd/][yy]yy
    30773078 * [dd/]mm/[yy]yy
    3078  * [yy]yy/mm/dd 
     3079 * [yy]yy/mm/dd
    30793080 * January dd[,] [yy]yy
    30803081 * dd January [yy]yy
     
    30833084 *
    30843085 * The formats for the date and time string are has follows.
    3085  * date[whitespace][time] 
     3086 * date[whitespace][time]
    30863087 * [time][whitespace]date
    30873088 *
     
    31113112
    31123113
    3113         return ret;
    3114 }
    3115 
    3116 /******************************************************************************
    3117  *              VarDateFromI1           [OLEAUT32.221]
     3114    return ret;
     3115}
     3116
     3117/******************************************************************************
     3118 *      VarDateFromI1       [OLEAUT32.221]
    31183119 */
    31193120HRESULT WINAPI VarDateFromI1(CHAR cIn, DATE* pdateOut)
    31203121{
    3121         TRACE("( %c, %p ), stub\n", cIn, pdateOut );
    3122 
    3123         *pdateOut = (DATE) cIn;
    3124 
    3125         return S_OK;
    3126 }
    3127 
    3128 /******************************************************************************
    3129  *              VarDateFromUI2          [OLEAUT32.222]
     3122    TRACE("( %c, %p ), stub\n", cIn, pdateOut );
     3123
     3124    *pdateOut = (DATE) cIn;
     3125
     3126    return S_OK;
     3127}
     3128
     3129/******************************************************************************
     3130 *      VarDateFromUI2      [OLEAUT32.222]
    31303131 */
    31313132HRESULT WINAPI VarDateFromUI2(USHORT uiIn, DATE* pdateOut)
    31323133{
    3133         TRACE("( %d, %p ), stub\n", uiIn, pdateOut );
    3134 
    3135         if( uiIn > DATE_MAX )
    3136         {
    3137                 return DISP_E_OVERFLOW;
    3138         }
    3139 
    3140         *pdateOut = (DATE) uiIn;
    3141 
    3142         return S_OK;
    3143 }
    3144 
    3145 /******************************************************************************
    3146  *              VarDateFromUI4          [OLEAUT32.223]
     3134    TRACE("( %d, %p ), stub\n", uiIn, pdateOut );
     3135
     3136    if( uiIn > DATE_MAX )
     3137    {
     3138        return DISP_E_OVERFLOW;
     3139    }
     3140
     3141    *pdateOut = (DATE) uiIn;
     3142
     3143    return S_OK;
     3144}
     3145
     3146/******************************************************************************
     3147 *      VarDateFromUI4      [OLEAUT32.223]
    31473148 */
    31483149HRESULT WINAPI VarDateFromUI4(ULONG ulIn, DATE* pdateOut)
    31493150{
    3150         TRACE("( %ld, %p ), stub\n", ulIn, pdateOut );
    3151 
    3152         if( ulIn < DATE_MIN || ulIn > DATE_MAX )
    3153         {
    3154                 return DISP_E_OVERFLOW;
    3155         }
    3156 
    3157         *pdateOut = (DATE) ulIn;
    3158 
    3159         return S_OK;
    3160 }
    3161 
    3162 /******************************************************************************
    3163  *              VarDateFromBool         [OLEAUT32.96]
     3151    TRACE("( %ld, %p ), stub\n", ulIn, pdateOut );
     3152
     3153    if( ulIn < DATE_MIN || ulIn > DATE_MAX )
     3154    {
     3155        return DISP_E_OVERFLOW;
     3156    }
     3157
     3158    *pdateOut = (DATE) ulIn;
     3159
     3160    return S_OK;
     3161}
     3162
     3163/******************************************************************************
     3164 *      VarDateFromBool     [OLEAUT32.96]
    31643165 */
    31653166HRESULT WINAPI VarDateFromBool(VARIANT_BOOL boolIn, DATE* pdateOut)
    31663167{
    3167         TRACE("( %d, %p ), stub\n", boolIn, pdateOut );
    3168 
    3169         *pdateOut = (DATE) boolIn;
    3170 
    3171         return S_OK;
     3168    TRACE("( %d, %p ), stub\n", boolIn, pdateOut );
     3169
     3170    *pdateOut = (DATE) boolIn;
     3171
     3172    return S_OK;
    31723173}
    31733174
     
    31843185
    31853186/******************************************************************************
    3186  *              VarBstrFromUI1          [OLEAUT32.108]
     3187 *      VarBstrFromUI1      [OLEAUT32.108]
    31873188 */
    31883189HRESULT WINAPI VarBstrFromUI1(BYTE bVal, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    31893190{
    3190         TRACE("( %d, %ld, %ld, %p ), stub\n", bVal, lcid, dwFlags, pbstrOut );
    3191         sprintf( pBuffer, "%d", bVal );
    3192 
    3193         *pbstrOut =  StringDupAtoBstr( pBuffer );
    3194        
    3195         return S_OK;
    3196 }
    3197 
    3198 /******************************************************************************
    3199  *              VarBstrFromI2           [OLEAUT32.109]
     3191    TRACE("( %d, %ld, %ld, %p ), stub\n", bVal, lcid, dwFlags, pbstrOut );
     3192    sprintf( pBuffer, "%d", bVal );
     3193
     3194    *pbstrOut =  StringDupAtoBstr( pBuffer );
     3195
     3196    return S_OK;
     3197}
     3198
     3199/******************************************************************************
     3200 *      VarBstrFromI2       [OLEAUT32.109]
    32003201 */
    32013202HRESULT WINAPI VarBstrFromI2(short iVal, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    32023203{
    3203         TRACE("( %d, %ld, %ld, %p ), stub\n", iVal, lcid, dwFlags, pbstrOut );
    3204         sprintf( pBuffer, "%d", iVal );
    3205         *pbstrOut = StringDupAtoBstr( pBuffer );
    3206 
    3207         return S_OK;
    3208 }
    3209 
    3210 /******************************************************************************
    3211  *              VarBstrFromI4           [OLEAUT32.110]
     3204    TRACE("( %d, %ld, %ld, %p ), stub\n", iVal, lcid, dwFlags, pbstrOut );
     3205    sprintf( pBuffer, "%d", iVal );
     3206    *pbstrOut = StringDupAtoBstr( pBuffer );
     3207
     3208    return S_OK;
     3209}
     3210
     3211/******************************************************************************
     3212 *      VarBstrFromI4       [OLEAUT32.110]
    32123213 */
    32133214HRESULT WINAPI VarBstrFromI4(LONG lIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    32143215{
    3215         TRACE("( %ld, %ld, %ld, %p ), stub\n", lIn, lcid, dwFlags, pbstrOut );
    3216 
    3217         sprintf( pBuffer, "%ld", lIn );
    3218         *pbstrOut = StringDupAtoBstr( pBuffer );
    3219 
    3220         return S_OK;
    3221 }
    3222 
    3223 /******************************************************************************
    3224  *              VarBstrFromR4           [OLEAUT32.111]
     3216    TRACE("( %ld, %ld, %ld, %p ), stub\n", lIn, lcid, dwFlags, pbstrOut );
     3217
     3218    sprintf( pBuffer, "%ld", lIn );
     3219    *pbstrOut = StringDupAtoBstr( pBuffer );
     3220
     3221    return S_OK;
     3222}
     3223
     3224/******************************************************************************
     3225 *      VarBstrFromR4       [OLEAUT32.111]
    32253226 */
    32263227HRESULT WINAPI VarBstrFromR4(FLOAT fltIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    32273228{
    3228         TRACE("( %f, %ld, %ld, %p ), stub\n", fltIn, lcid, dwFlags, pbstrOut );
    3229 
    3230         sprintf( pBuffer, "%.7g", fltIn );
    3231         *pbstrOut = StringDupAtoBstr( pBuffer );
    3232 
    3233         return S_OK;
    3234 }
    3235 
    3236 /******************************************************************************
    3237  *              VarBstrFromR8           [OLEAUT32.112]
     3229    TRACE("( %f, %ld, %ld, %p ), stub\n", fltIn, lcid, dwFlags, pbstrOut );
     3230
     3231    sprintf( pBuffer, "%.7g", fltIn );
     3232    *pbstrOut = StringDupAtoBstr( pBuffer );
     3233
     3234    return S_OK;
     3235}
     3236
     3237/******************************************************************************
     3238 *      VarBstrFromR8       [OLEAUT32.112]
    32383239 */
    32393240HRESULT WINAPI VarBstrFromR8(double dblIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    32403241{
    3241         TRACE("( %f, %ld, %ld, %p ), stub\n", dblIn, lcid, dwFlags, pbstrOut );
    3242 
    3243         sprintf( pBuffer, "%.15g", dblIn );
    3244         *pbstrOut = StringDupAtoBstr( pBuffer );
    3245 
    3246         return S_OK;
     3242    TRACE("( %f, %ld, %ld, %p ), stub\n", dblIn, lcid, dwFlags, pbstrOut );
     3243
     3244    sprintf( pBuffer, "%.15g", dblIn );
     3245    *pbstrOut = StringDupAtoBstr( pBuffer );
     3246
     3247    return S_OK;
    32473248}
    32483249
     
    32513252 */
    32523253HRESULT WINAPI VarBstrFromCy(CY cyIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut) {
    3253                                 /* FIXME */
    3254         return E_NOTIMPL;
    3255 }
    3256 
    3257  
    3258 /******************************************************************************
    3259  *              VarBstrFromDate         [OLEAUT32.114]
     3254                /* FIXME */
     3255    return E_NOTIMPL;
     3256}
     3257
     3258
     3259/******************************************************************************
     3260 *      VarBstrFromDate     [OLEAUT32.114]
    32603261 *
    32613262 * The date is implemented using an 8 byte floating-point number.
     
    32743275 * The tm structure is as follows:
    32753276 * struct tm {
    3276  *                int tm_sec;      seconds after the minute - [0,59]
    3277  *                int tm_min;      minutes after the hour - [0,59]
    3278  *                int tm_hour;     hours since midnight - [0,23]
    3279  *                int tm_mday;     day of the month - [1,31]
    3280  *                int tm_mon;      months since January - [0,11]
    3281  *                int tm_year;     years
    3282  *                int tm_wday;     days since Sunday - [0,6]
    3283  *                int tm_yday;     days since January 1 - [0,365]
    3284  *                int tm_isdst;    daylight savings time flag
    3285  *                };
     3277 *        int tm_sec;      seconds after the minute - [0,59]
     3278 *        int tm_min;      minutes after the hour - [0,59]
     3279 *        int tm_hour;     hours since midnight - [0,23]
     3280 *        int tm_mday;     day of the month - [1,31]
     3281 *        int tm_mon;      months since January - [0,11]
     3282 *        int tm_year;     years
     3283 *        int tm_wday;     days since Sunday - [0,6]
     3284 *        int tm_yday;     days since January 1 - [0,365]
     3285 *        int tm_isdst;    daylight savings time flag
     3286 *        };
    32863287 */
    32873288HRESULT WINAPI VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
     
    32933294
    32943295    if( DateToTm( dateIn, dwFlags, &TM ) == FALSE )
    3295                         {
     3296            {
    32963297        return E_INVALIDARG;
    3297                 }
     3298        }
    32983299
    32993300    if( dwFlags & VAR_DATEVALUEONLY )
    3300                         strftime( pBuffer, BUFFER_MAX, "%x", &TM );
     3301            strftime( pBuffer, BUFFER_MAX, "%x", &TM );
    33013302    else if( dwFlags & VAR_TIMEVALUEONLY )
    3302                         strftime( pBuffer, BUFFER_MAX, "%X", &TM );
    3303                 else
     3303            strftime( pBuffer, BUFFER_MAX, "%X", &TM );
     3304        else
    33043305        strftime( pBuffer, BUFFER_MAX, "%x %X", &TM );
    33053306
    3306                 *pbstrOut = StringDupAtoBstr( pBuffer );
    3307 
    3308         return S_OK;
    3309 }
    3310 
    3311 /******************************************************************************
    3312  *              VarBstrFromBool         [OLEAUT32.116]
     3307        *pbstrOut = StringDupAtoBstr( pBuffer );
     3308
     3309    return S_OK;
     3310}
     3311
     3312/******************************************************************************
     3313 *      VarBstrFromBool     [OLEAUT32.116]
    33133314 */
    33143315HRESULT WINAPI VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    33153316{
    3316         TRACE("( %d, %ld, %ld, %p ), stub\n", boolIn, lcid, dwFlags, pbstrOut );
    3317 
    3318         if( boolIn == VARIANT_FALSE )
    3319         {
    3320                 sprintf( pBuffer, "False" );
    3321         }
    3322         else
    3323         {
    3324                 sprintf( pBuffer, "True" );
    3325         }
    3326 
    3327         *pbstrOut = StringDupAtoBstr( pBuffer );
    3328 
    3329         return S_OK;
    3330 }
    3331 
    3332 /******************************************************************************
    3333  *              VarBstrFromI1           [OLEAUT32.229]
     3317    TRACE("( %d, %ld, %ld, %p ), stub\n", boolIn, lcid, dwFlags, pbstrOut );
     3318
     3319    if( boolIn == VARIANT_FALSE )
     3320    {
     3321        sprintf( pBuffer, "False" );
     3322    }
     3323    else
     3324    {
     3325        sprintf( pBuffer, "True" );
     3326    }
     3327
     3328    *pbstrOut = StringDupAtoBstr( pBuffer );
     3329
     3330    return S_OK;
     3331}
     3332
     3333/******************************************************************************
     3334 *      VarBstrFromI1       [OLEAUT32.229]
    33343335 */
    33353336HRESULT WINAPI VarBstrFromI1(CHAR cIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    33363337{
    3337         TRACE("( %c, %ld, %ld, %p ), stub\n", cIn, lcid, dwFlags, pbstrOut );
    3338         sprintf( pBuffer, "%d", cIn );
    3339         *pbstrOut = StringDupAtoBstr( pBuffer );
    3340 
    3341         return S_OK;
    3342 }
    3343 
    3344 /******************************************************************************
    3345  *              VarBstrFromUI2          [OLEAUT32.230]
     3338    TRACE("( %c, %ld, %ld, %p ), stub\n", cIn, lcid, dwFlags, pbstrOut );
     3339    sprintf( pBuffer, "%d", cIn );
     3340    *pbstrOut = StringDupAtoBstr( pBuffer );
     3341
     3342    return S_OK;
     3343}
     3344
     3345/******************************************************************************
     3346 *      VarBstrFromUI2      [OLEAUT32.230]
    33463347 */
    33473348HRESULT WINAPI VarBstrFromUI2(USHORT uiIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    33483349{
    3349         TRACE("( %d, %ld, %ld, %p ), stub\n", uiIn, lcid, dwFlags, pbstrOut );
    3350         sprintf( pBuffer, "%d", uiIn );
    3351         *pbstrOut = StringDupAtoBstr( pBuffer );
    3352 
    3353         return S_OK;
    3354 }
    3355 
    3356 /******************************************************************************
    3357  *              VarBstrFromUI4          [OLEAUT32.231]
     3350    TRACE("( %d, %ld, %ld, %p ), stub\n", uiIn, lcid, dwFlags, pbstrOut );
     3351    sprintf( pBuffer, "%d", uiIn );
     3352    *pbstrOut = StringDupAtoBstr( pBuffer );
     3353
     3354    return S_OK;
     3355}
     3356
     3357/******************************************************************************
     3358 *      VarBstrFromUI4      [OLEAUT32.231]
    33583359 */
    33593360HRESULT WINAPI VarBstrFromUI4(ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    33603361{
    3361         TRACE("( %ld, %ld, %ld, %p ), stub\n", ulIn, lcid, dwFlags, pbstrOut );
    3362         sprintf( pBuffer, "%ld", ulIn );
    3363         *pbstrOut = StringDupAtoBstr( pBuffer );
    3364 
    3365         return S_OK;
    3366 }
    3367 
    3368 /******************************************************************************
    3369  *              VarBoolFromUI1          [OLEAUT32.118]
     3362    TRACE("( %ld, %ld, %ld, %p ), stub\n", ulIn, lcid, dwFlags, pbstrOut );
     3363    sprintf( pBuffer, "%ld", ulIn );
     3364    *pbstrOut = StringDupAtoBstr( pBuffer );
     3365
     3366    return S_OK;
     3367}
     3368
     3369/******************************************************************************
     3370 *      VarBoolFromUI1      [OLEAUT32.118]
    33703371 */
    33713372HRESULT WINAPI VarBoolFromUI1(BYTE bIn, VARIANT_BOOL* pboolOut)
    33723373{
    3373         TRACE("( %d, %p ), stub\n", bIn, pboolOut );
    3374 
    3375         if( bIn == 0 )
    3376         {
    3377                 *pboolOut = VARIANT_FALSE;
    3378         }
    3379         else
    3380         {
    3381                 *pboolOut = VARIANT_TRUE;
    3382         }
    3383 
    3384         return S_OK;
    3385 }
    3386 
    3387 /******************************************************************************
    3388  *              VarBoolFromI2           [OLEAUT32.119]
     3374    TRACE("( %d, %p ), stub\n", bIn, pboolOut );
     3375
     3376    if( bIn == 0 )
     3377    {
     3378        *pboolOut = VARIANT_FALSE;
     3379    }
     3380    else
     3381    {
     3382        *pboolOut = VARIANT_TRUE;
     3383    }
     3384
     3385    return S_OK;
     3386}
     3387
     3388/******************************************************************************
     3389 *      VarBoolFromI2       [OLEAUT32.119]
    33893390 */
    33903391HRESULT WINAPI VarBoolFromI2(short sIn, VARIANT_BOOL* pboolOut)
    33913392{
    3392         TRACE("( %d, %p ), stub\n", sIn, pboolOut );
    3393 
    3394         if( sIn == 0 )
    3395         {
    3396                 *pboolOut = VARIANT_FALSE;
    3397         }
    3398         else
    3399         {
    3400                 *pboolOut = VARIANT_TRUE;
    3401         }
    3402 
    3403         return S_OK;
    3404 }
    3405 
    3406 /******************************************************************************
    3407  *              VarBoolFromI4           [OLEAUT32.120]
     3393    TRACE("( %d, %p ), stub\n", sIn, pboolOut );
     3394
     3395    if( sIn == 0 )
     3396    {
     3397        *pboolOut = VARIANT_FALSE;
     3398    }
     3399    else
     3400    {
     3401        *pboolOut = VARIANT_TRUE;
     3402    }
     3403
     3404    return S_OK;
     3405}
     3406
     3407/******************************************************************************
     3408 *      VarBoolFromI4       [OLEAUT32.120]
    34083409 */
    34093410HRESULT WINAPI VarBoolFromI4(LONG lIn, VARIANT_BOOL* pboolOut)
    34103411{
    3411         TRACE("( %ld, %p ), stub\n", lIn, pboolOut );
    3412 
    3413         if( lIn == 0 )
    3414         {
    3415                 *pboolOut = VARIANT_FALSE;
    3416         }
    3417         else
    3418         {
    3419                 *pboolOut = VARIANT_TRUE;
    3420         }
    3421 
    3422         return S_OK;
    3423 }
    3424 
    3425 /******************************************************************************
    3426  *              VarBoolFromR4           [OLEAUT32.121]
     3412    TRACE("( %ld, %p ), stub\n", lIn, pboolOut );
     3413
     3414    if( lIn == 0 )
     3415    {
     3416        *pboolOut = VARIANT_FALSE;
     3417    }
     3418    else
     3419    {
     3420        *pboolOut = VARIANT_TRUE;
     3421    }
     3422
     3423    return S_OK;
     3424}
     3425
     3426/******************************************************************************
     3427 *      VarBoolFromR4       [OLEAUT32.121]
    34273428 */
    34283429HRESULT WINAPI VarBoolFromR4(FLOAT fltIn, VARIANT_BOOL* pboolOut)
    34293430{
    3430         TRACE("( %f, %p ), stub\n", fltIn, pboolOut );
    3431 
    3432         if( fltIn == 0.0 )
    3433         {
    3434                 *pboolOut = VARIANT_FALSE;
    3435         }
    3436         else
    3437         {
    3438                 *pboolOut = VARIANT_TRUE;
    3439         }
    3440 
    3441         return S_OK;
    3442 }
    3443 
    3444 /******************************************************************************
    3445  *              VarBoolFromR8           [OLEAUT32.122]
     3431    TRACE("( %f, %p ), stub\n", fltIn, pboolOut );
     3432
     3433    if( fltIn == 0.0 )
     3434    {
     3435        *pboolOut = VARIANT_FALSE;
     3436    }
     3437    else
     3438    {
     3439        *pboolOut = VARIANT_TRUE;
     3440    }
     3441
     3442    return S_OK;
     3443}
     3444
     3445/******************************************************************************
     3446 *      VarBoolFromR8       [OLEAUT32.122]
    34463447 */
    34473448HRESULT WINAPI VarBoolFromR8(double dblIn, VARIANT_BOOL* pboolOut)
    34483449{
    3449         TRACE("( %f, %p ), stub\n", dblIn, pboolOut );
    3450 
    3451         if( dblIn == 0.0 )
    3452         {
    3453                 *pboolOut = VARIANT_FALSE;
    3454         }
    3455         else
    3456         {
    3457                 *pboolOut = VARIANT_TRUE;
    3458         }
    3459 
    3460         return S_OK;
    3461 }
    3462 
    3463 /******************************************************************************
    3464  *              VarBoolFromDate         [OLEAUT32.123]
     3450    TRACE("( %f, %p ), stub\n", dblIn, pboolOut );
     3451
     3452    if( dblIn == 0.0 )
     3453    {
     3454        *pboolOut = VARIANT_FALSE;
     3455    }
     3456    else
     3457    {
     3458        *pboolOut = VARIANT_TRUE;
     3459    }
     3460
     3461    return S_OK;
     3462}
     3463
     3464/******************************************************************************
     3465 *      VarBoolFromDate     [OLEAUT32.123]
    34653466 */
    34663467HRESULT WINAPI VarBoolFromDate(DATE dateIn, VARIANT_BOOL* pboolOut)
    34673468{
    3468         TRACE("( %f, %p ), stub\n", dateIn, pboolOut );
    3469 
    3470         if( dateIn == 0.0 )
    3471         {
    3472                 *pboolOut = VARIANT_FALSE;
    3473         }
    3474         else
    3475         {
    3476                 *pboolOut = VARIANT_TRUE;
    3477         }
    3478 
    3479         return S_OK;
    3480 }
    3481 
    3482 /******************************************************************************
    3483  *              VarBoolFromStr          [OLEAUT32.125]
     3469    TRACE("( %f, %p ), stub\n", dateIn, pboolOut );
     3470
     3471    if( dateIn == 0.0 )
     3472    {
     3473        *pboolOut = VARIANT_FALSE;
     3474    }
     3475    else
     3476    {
     3477        *pboolOut = VARIANT_TRUE;
     3478    }
     3479
     3480    return S_OK;
     3481}
     3482
     3483/******************************************************************************
     3484 *      VarBoolFromStr      [OLEAUT32.125]
    34843485 */
    34853486HRESULT WINAPI VarBoolFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, VARIANT_BOOL* pboolOut)
    34863487{
    3487         HRESULT ret = S_OK;
    3488         char* pNewString = NULL;
    3489 
    3490         TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pboolOut );
     3488    HRESULT ret = S_OK;
     3489    char* pNewString = NULL;
     3490
     3491    TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pboolOut );
    34913492
    34923493    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    34933494
    3494         if( pNewString == NULL || strlen( pNewString ) == 0 )
    3495         {
    3496                 ret = DISP_E_TYPEMISMATCH;
    3497         }
    3498 
    3499         if( ret == S_OK )
    3500         {
    3501                 if( strncasecmp( pNewString, "True", strlen( pNewString ) ) == 0 )
    3502                 {
    3503                         *pboolOut = VARIANT_TRUE;
    3504                 }
    3505                 else if( strncasecmp( pNewString, "False", strlen( pNewString ) ) == 0 )
    3506                 {
    3507                         *pboolOut = VARIANT_FALSE;
    3508                 }
    3509                 else
    3510                 {
    3511                         /* Try converting the string to a floating point number.
    3512                         */
    3513                         double dValue = 0.0;
    3514                         HRESULT res = VarR8FromStr( strIn, lcid, dwFlags, &dValue );
    3515                         if( res != S_OK )
    3516                         {
    3517                                 ret = DISP_E_TYPEMISMATCH;
    3518                         }
    3519                         else if( dValue == 0.0 )
    3520                         {
    3521                                 *pboolOut = VARIANT_FALSE;
    3522                         }
    3523                         else
    3524                         {
    3525                                 *pboolOut = VARIANT_TRUE;
    3526                         }
    3527                 }
    3528         }
    3529 
    3530         HeapFree( GetProcessHeap(), 0, pNewString );
    3531        
    3532         return ret;
    3533 }
    3534 
    3535 /******************************************************************************
    3536  *              VarBoolFromI1           [OLEAUT32.233]
     3495    if( pNewString == NULL || strlen( pNewString ) == 0 )
     3496    {
     3497        ret = DISP_E_TYPEMISMATCH;
     3498    }
     3499
     3500    if( ret == S_OK )
     3501    {
     3502        if( strncasecmp( pNewString, "True", strlen( pNewString ) ) == 0 )
     3503        {
     3504            *pboolOut = VARIANT_TRUE;
     3505        }
     3506        else if( strncasecmp( pNewString, "False", strlen( pNewString ) ) == 0 )
     3507        {
     3508            *pboolOut = VARIANT_FALSE;
     3509        }
     3510        else
     3511        {
     3512            /* Try converting the string to a floating point number.
     3513            */
     3514            double dValue = 0.0;
     3515            HRESULT res = VarR8FromStr( strIn, lcid, dwFlags, &dValue );
     3516            if( res != S_OK )
     3517            {
     3518                ret = DISP_E_TYPEMISMATCH;
     3519            }
     3520            else if( dValue == 0.0 )
     3521            {
     3522                *pboolOut = VARIANT_FALSE;
     3523            }
     3524            else
     3525            {
     3526                *pboolOut = VARIANT_TRUE;
     3527            }
     3528        }
     3529    }
     3530
     3531    HeapFree( GetProcessHeap(), 0, pNewString );
     3532
     3533    return ret;
     3534}
     3535
     3536/******************************************************************************
     3537 *      VarBoolFromI1       [OLEAUT32.233]
    35373538 */
    35383539HRESULT WINAPI VarBoolFromI1(CHAR cIn, VARIANT_BOOL* pboolOut)
    35393540{
    3540         TRACE("( %c, %p ), stub\n", cIn, pboolOut );
    3541 
    3542         if( cIn == 0 )
    3543         {
    3544                 *pboolOut = VARIANT_FALSE;
    3545         }
    3546         else
    3547         {
    3548                 *pboolOut = VARIANT_TRUE;
    3549         }
    3550 
    3551         return S_OK;
    3552 }
    3553 
    3554 /******************************************************************************
    3555  *              VarBoolFromUI2          [OLEAUT32.234]
     3541    TRACE("( %c, %p ), stub\n", cIn, pboolOut );
     3542
     3543    if( cIn == 0 )
     3544    {
     3545        *pboolOut = VARIANT_FALSE;
     3546    }
     3547    else
     3548    {
     3549        *pboolOut = VARIANT_TRUE;
     3550    }
     3551
     3552    return S_OK;
     3553}
     3554
     3555/******************************************************************************
     3556 *      VarBoolFromUI2      [OLEAUT32.234]
    35563557 */
    35573558HRESULT WINAPI VarBoolFromUI2(USHORT uiIn, VARIANT_BOOL* pboolOut)
    35583559{
    3559         TRACE("( %d, %p ), stub\n", uiIn, pboolOut );
    3560 
    3561         if( uiIn == 0 )
    3562         {
    3563                 *pboolOut = VARIANT_FALSE;
    3564         }
    3565         else
    3566         {
    3567                 *pboolOut = VARIANT_TRUE;
    3568         }
    3569 
    3570         return S_OK;
    3571 }
    3572 
    3573 /******************************************************************************
    3574  *              VarBoolFromUI4          [OLEAUT32.235]
     3560    TRACE("( %d, %p ), stub\n", uiIn, pboolOut );
     3561
     3562    if( uiIn == 0 )
     3563    {
     3564        *pboolOut = VARIANT_FALSE;
     3565    }
     3566    else
     3567    {
     3568        *pboolOut = VARIANT_TRUE;
     3569    }
     3570
     3571    return S_OK;
     3572}
     3573
     3574/******************************************************************************
     3575 *      VarBoolFromUI4      [OLEAUT32.235]
    35753576 */
    35763577HRESULT WINAPI VarBoolFromUI4(ULONG ulIn, VARIANT_BOOL* pboolOut)
    35773578{
    3578         TRACE("( %ld, %p ), stub\n", ulIn, pboolOut );
    3579 
    3580         if( ulIn == 0 )
    3581         {
    3582                 *pboolOut = VARIANT_FALSE;
    3583         }
    3584         else
    3585         {
    3586                 *pboolOut = VARIANT_TRUE;
    3587         }
    3588 
    3589         return S_OK;
     3579    TRACE("( %ld, %p ), stub\n", ulIn, pboolOut );
     3580
     3581    if( ulIn == 0 )
     3582    {
     3583        *pboolOut = VARIANT_FALSE;
     3584    }
     3585    else
     3586    {
     3587        *pboolOut = VARIANT_TRUE;
     3588    }
     3589
     3590    return S_OK;
    35903591}
    35913592
     
    35973598      if (cyIn.s.Hi || cyIn.s.Lo) *pboolOut = -1;
    35983599      else *pboolOut = 0;
    3599      
     3600
    36003601      return S_OK;
    36013602}
    36023603
    36033604/******************************************************************************
    3604  *              VarI1FromUI1            [OLEAUT32.244]
     3605 *      VarI1FromUI1        [OLEAUT32.244]
    36053606 */
    36063607HRESULT WINAPI VarI1FromUI1(BYTE bIn, CHAR* pcOut)
    36073608{
    3608         TRACE("( %d, %p ), stub\n", bIn, pcOut );
    3609 
    3610         /* Check range of value.
    3611         */
    3612         if( bIn > CHAR_MAX )
    3613         {
    3614                 return DISP_E_OVERFLOW;
    3615         }
    3616 
    3617         *pcOut = (CHAR) bIn;
    3618 
    3619         return S_OK;
    3620 }
    3621 
    3622 /******************************************************************************
    3623  *              VarI1FromI2             [OLEAUT32.245]
     3609    TRACE("( %d, %p ), stub\n", bIn, pcOut );
     3610
     3611    /* Check range of value.
     3612    */
     3613    if( bIn > CHAR_MAX )
     3614    {
     3615        return DISP_E_OVERFLOW;
     3616    }
     3617
     3618    *pcOut = (CHAR) bIn;
     3619
     3620    return S_OK;
     3621}
     3622
     3623/******************************************************************************
     3624 *      VarI1FromI2     [OLEAUT32.245]
    36243625 */
    36253626HRESULT WINAPI VarI1FromI2(short uiIn, CHAR* pcOut)
    36263627{
    3627         TRACE("( %d, %p ), stub\n", uiIn, pcOut );
    3628 
    3629         if( uiIn > CHAR_MAX )
    3630         {
    3631                 return DISP_E_OVERFLOW;
    3632         }
    3633 
    3634         *pcOut = (CHAR) uiIn;
    3635 
    3636         return S_OK;
    3637 }
    3638 
    3639 /******************************************************************************
    3640  *              VarI1FromI4             [OLEAUT32.246]
     3628    TRACE("( %d, %p ), stub\n", uiIn, pcOut );
     3629
     3630    if( uiIn > CHAR_MAX )
     3631    {
     3632        return DISP_E_OVERFLOW;
     3633    }
     3634
     3635    *pcOut = (CHAR) uiIn;
     3636
     3637    return S_OK;
     3638}
     3639
     3640/******************************************************************************
     3641 *      VarI1FromI4     [OLEAUT32.246]
    36413642 */
    36423643HRESULT WINAPI VarI1FromI4(LONG lIn, CHAR* pcOut)
    36433644{
    3644         TRACE("( %ld, %p ), stub\n", lIn, pcOut );
    3645 
    3646         if( lIn < CHAR_MIN || lIn > CHAR_MAX )
    3647         {
    3648                 return DISP_E_OVERFLOW;
    3649         }
    3650 
    3651         *pcOut = (CHAR) lIn;
    3652 
    3653         return S_OK;
    3654 }
    3655 
    3656 /******************************************************************************
    3657  *              VarI1FromR4             [OLEAUT32.247]
     3645    TRACE("( %ld, %p ), stub\n", lIn, pcOut );
     3646
     3647    if( lIn < CHAR_MIN || lIn > CHAR_MAX )
     3648    {
     3649        return DISP_E_OVERFLOW;
     3650    }
     3651
     3652    *pcOut = (CHAR) lIn;
     3653
     3654    return S_OK;
     3655}
     3656
     3657/******************************************************************************
     3658 *      VarI1FromR4     [OLEAUT32.247]
    36583659 */
    36593660HRESULT WINAPI VarI1FromR4(FLOAT fltIn, CHAR* pcOut)
    36603661{
    3661         TRACE("( %f, %p ), stub\n", fltIn, pcOut );
     3662    TRACE("( %f, %p ), stub\n", fltIn, pcOut );
    36623663
    36633664    fltIn = round( fltIn );
    3664         if( fltIn < CHAR_MIN || fltIn > CHAR_MAX )
    3665         {
    3666                 return DISP_E_OVERFLOW;
    3667         }
    3668 
    3669         *pcOut = (CHAR) fltIn;
    3670 
    3671         return S_OK;
    3672 }
    3673 
    3674 /******************************************************************************
    3675  *              VarI1FromR8             [OLEAUT32.248]
     3665    if( fltIn < CHAR_MIN || fltIn > CHAR_MAX )
     3666    {
     3667        return DISP_E_OVERFLOW;
     3668    }
     3669
     3670    *pcOut = (CHAR) fltIn;
     3671
     3672    return S_OK;
     3673}
     3674
     3675/******************************************************************************
     3676 *      VarI1FromR8     [OLEAUT32.248]
    36763677 */
    36773678HRESULT WINAPI VarI1FromR8(double dblIn, CHAR* pcOut)
    36783679{
    3679         TRACE("( %f, %p ), stub\n", dblIn, pcOut );
     3680    TRACE("( %f, %p ), stub\n", dblIn, pcOut );
    36803681
    36813682    dblIn = round( dblIn );
    36823683    if( dblIn < CHAR_MIN || dblIn > CHAR_MAX )
    3683         {
    3684                 return DISP_E_OVERFLOW;
    3685         }
    3686 
    3687         *pcOut = (CHAR) dblIn;
    3688 
    3689         return S_OK;
    3690 }
    3691 
    3692 /******************************************************************************
    3693  *              VarI1FromDate           [OLEAUT32.249]
     3684    {
     3685        return DISP_E_OVERFLOW;
     3686    }
     3687
     3688    *pcOut = (CHAR) dblIn;
     3689
     3690    return S_OK;
     3691}
     3692
     3693/******************************************************************************
     3694 *      VarI1FromDate       [OLEAUT32.249]
    36943695 */
    36953696HRESULT WINAPI VarI1FromDate(DATE dateIn, CHAR* pcOut)
    36963697{
    3697         TRACE("( %f, %p ), stub\n", dateIn, pcOut );
     3698    TRACE("( %f, %p ), stub\n", dateIn, pcOut );
    36983699
    36993700    dateIn = round( dateIn );
    3700         if( dateIn < CHAR_MIN || dateIn > CHAR_MAX )
    3701         {
    3702                 return DISP_E_OVERFLOW;
    3703         }
    3704 
    3705         *pcOut = (CHAR) dateIn;
    3706 
    3707         return S_OK;
    3708 }
    3709 
    3710 /******************************************************************************
    3711  *              VarI1FromStr            [OLEAUT32.251]
     3701    if( dateIn < CHAR_MIN || dateIn > CHAR_MAX )
     3702    {
     3703        return DISP_E_OVERFLOW;
     3704    }
     3705
     3706    *pcOut = (CHAR) dateIn;
     3707
     3708    return S_OK;
     3709}
     3710
     3711/******************************************************************************
     3712 *      VarI1FromStr        [OLEAUT32.251]
    37123713 */
    37133714HRESULT WINAPI VarI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, CHAR* pcOut)
    37143715{
    3715         double dValue = 0.0;
    3716         LPSTR pNewString = NULL;
    3717 
    3718         TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pcOut );
    3719 
    3720         /* Check if we have a valid argument
    3721         */
    3722         pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    3723         RemoveCharacterFromString( pNewString, "," );
    3724         if( IsValidRealString( pNewString ) == FALSE )
    3725         {
    3726                 return DISP_E_TYPEMISMATCH;
    3727         }
    3728 
    3729         /* Convert the valid string to a floating point number.
    3730         */
    3731         dValue = atof( pNewString );
    3732  
    3733         /* We don't need the string anymore so free it.
    3734         */
    3735         HeapFree( GetProcessHeap(), 0, pNewString );
    3736 
    3737         /* Check range of value.
     3716    double dValue = 0.0;
     3717    LPSTR pNewString = NULL;
     3718
     3719    TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pcOut );
     3720
     3721    /* Check if we have a valid argument
     3722    */
     3723    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
     3724    RemoveCharacterFromString( pNewString, "," );
     3725    if( IsValidRealString( pNewString ) == FALSE )
     3726    {
     3727        return DISP_E_TYPEMISMATCH;
     3728    }
     3729
     3730    /* Convert the valid string to a floating point number.
     3731    */
     3732    dValue = atof( pNewString );
     3733
     3734    /* We don't need the string anymore so free it.
     3735    */
     3736    HeapFree( GetProcessHeap(), 0, pNewString );
     3737
     3738    /* Check range of value.
    37383739     */
    37393740    dValue = round( dValue );
    3740         if( dValue < CHAR_MIN || dValue > CHAR_MAX )
    3741         {
    3742                 return DISP_E_OVERFLOW;
    3743         }
    3744 
    3745         *pcOut = (CHAR) dValue;
    3746 
    3747         return S_OK;
    3748 }
    3749 
    3750 /******************************************************************************
    3751  *              VarI1FromBool           [OLEAUT32.253]
     3741    if( dValue < CHAR_MIN || dValue > CHAR_MAX )
     3742    {
     3743        return DISP_E_OVERFLOW;
     3744    }
     3745
     3746    *pcOut = (CHAR) dValue;
     3747
     3748    return S_OK;
     3749}
     3750
     3751/******************************************************************************
     3752 *      VarI1FromBool       [OLEAUT32.253]
    37523753 */
    37533754HRESULT WINAPI VarI1FromBool(VARIANT_BOOL boolIn, CHAR* pcOut)
    37543755{
    3755         TRACE("( %d, %p ), stub\n", boolIn, pcOut );
    3756 
    3757         *pcOut = (CHAR) boolIn;
    3758 
    3759         return S_OK;
    3760 }
    3761 
    3762 /******************************************************************************
    3763  *              VarI1FromUI2            [OLEAUT32.254]
     3756    TRACE("( %d, %p ), stub\n", boolIn, pcOut );
     3757
     3758    *pcOut = (CHAR) boolIn;
     3759
     3760    return S_OK;
     3761}
     3762
     3763/******************************************************************************
     3764 *      VarI1FromUI2        [OLEAUT32.254]
    37643765 */
    37653766HRESULT WINAPI VarI1FromUI2(USHORT uiIn, CHAR* pcOut)
    37663767{
    3767         TRACE("( %d, %p ), stub\n", uiIn, pcOut );
    3768 
    3769         if( uiIn > CHAR_MAX )
    3770         {
    3771                 return DISP_E_OVERFLOW;
    3772         }
    3773 
    3774         *pcOut = (CHAR) uiIn;
    3775 
    3776         return S_OK;
    3777 }
    3778 
    3779 /******************************************************************************
    3780  *              VarI1FromUI4            [OLEAUT32.255]
     3768    TRACE("( %d, %p ), stub\n", uiIn, pcOut );
     3769
     3770    if( uiIn > CHAR_MAX )
     3771    {
     3772        return DISP_E_OVERFLOW;
     3773    }
     3774
     3775    *pcOut = (CHAR) uiIn;
     3776
     3777    return S_OK;
     3778}
     3779
     3780/******************************************************************************
     3781 *      VarI1FromUI4        [OLEAUT32.255]
    37813782 */
    37823783HRESULT WINAPI VarI1FromUI4(ULONG ulIn, CHAR* pcOut)
    37833784{
    3784         TRACE("( %ld, %p ), stub\n", ulIn, pcOut );
    3785 
    3786         if( ulIn > CHAR_MAX )
    3787         {
    3788                 return DISP_E_OVERFLOW;
    3789         }
    3790 
    3791         *pcOut = (CHAR) ulIn;
    3792 
    3793         return S_OK;
     3785    TRACE("( %ld, %p ), stub\n", ulIn, pcOut );
     3786
     3787    if( ulIn > CHAR_MAX )
     3788    {
     3789        return DISP_E_OVERFLOW;
     3790    }
     3791
     3792    *pcOut = (CHAR) ulIn;
     3793
     3794    return S_OK;
    37943795}
    37953796
     
    38003801HRESULT WINAPI VarI1FromCy(CY cyIn, CHAR* pcOut) {
    38013802   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    3802    
     3803
    38033804   if (t > CHAR_MAX || t < CHAR_MIN) return DISP_E_OVERFLOW;
    3804    
     3805
    38053806   *pcOut = (CHAR)t;
    38063807   return S_OK;
     
    38083809
    38093810/******************************************************************************
    3810  *              VarUI2FromUI1           [OLEAUT32.257]
     3811 *      VarUI2FromUI1       [OLEAUT32.257]
    38113812 */
    38123813HRESULT WINAPI VarUI2FromUI1(BYTE bIn, USHORT* puiOut)
    38133814{
    3814         TRACE("( %d, %p ), stub\n", bIn, puiOut );
    3815 
    3816         *puiOut = (USHORT) bIn;
    3817 
    3818         return S_OK;
    3819 }
    3820 
    3821 /******************************************************************************
    3822  *              VarUI2FromI2            [OLEAUT32.258]
     3815    TRACE("( %d, %p ), stub\n", bIn, puiOut );
     3816
     3817    *puiOut = (USHORT) bIn;
     3818
     3819    return S_OK;
     3820}
     3821
     3822/******************************************************************************
     3823 *      VarUI2FromI2        [OLEAUT32.258]
    38233824 */
    38243825HRESULT WINAPI VarUI2FromI2(short uiIn, USHORT* puiOut)
    38253826{
    3826         TRACE("( %d, %p ), stub\n", uiIn, puiOut );
    3827 
    3828         if( uiIn < UI2_MIN )
    3829         {
    3830                 return DISP_E_OVERFLOW;
    3831         }
    3832 
    3833         *puiOut = (USHORT) uiIn;
    3834 
    3835         return S_OK;
    3836 }
    3837 
    3838 /******************************************************************************
    3839  *              VarUI2FromI4            [OLEAUT32.259]
     3827    TRACE("( %d, %p ), stub\n", uiIn, puiOut );
     3828
     3829    if( uiIn < UI2_MIN )
     3830    {
     3831        return DISP_E_OVERFLOW;
     3832    }
     3833
     3834    *puiOut = (USHORT) uiIn;
     3835
     3836    return S_OK;
     3837}
     3838
     3839/******************************************************************************
     3840 *      VarUI2FromI4        [OLEAUT32.259]
    38403841 */
    38413842HRESULT WINAPI VarUI2FromI4(LONG lIn, USHORT* puiOut)
    38423843{
    3843         TRACE("( %ld, %p ), stub\n", lIn, puiOut );
    3844 
    3845         if( lIn < UI2_MIN || lIn > UI2_MAX )
    3846         {
    3847                 return DISP_E_OVERFLOW;
    3848         }
    3849 
    3850         *puiOut = (USHORT) lIn;
    3851 
    3852         return S_OK;
    3853 }
    3854 
    3855 /******************************************************************************
    3856  *              VarUI2FromR4            [OLEAUT32.260]
     3844    TRACE("( %ld, %p ), stub\n", lIn, puiOut );
     3845
     3846    if( lIn < UI2_MIN || lIn > UI2_MAX )
     3847    {
     3848        return DISP_E_OVERFLOW;
     3849    }
     3850
     3851    *puiOut = (USHORT) lIn;
     3852
     3853    return S_OK;
     3854}
     3855
     3856/******************************************************************************
     3857 *      VarUI2FromR4        [OLEAUT32.260]
    38573858 */
    38583859HRESULT WINAPI VarUI2FromR4(FLOAT fltIn, USHORT* puiOut)
    38593860{
    3860         TRACE("( %f, %p ), stub\n", fltIn, puiOut );
     3861    TRACE("( %f, %p ), stub\n", fltIn, puiOut );
    38613862
    38623863    fltIn = round( fltIn );
    3863         if( fltIn < UI2_MIN || fltIn > UI2_MAX )
    3864         {
    3865                 return DISP_E_OVERFLOW;
    3866         }
    3867 
    3868         *puiOut = (USHORT) fltIn;
    3869 
    3870         return S_OK;
    3871 }
    3872 
    3873 /******************************************************************************
    3874  *              VarUI2FromR8            [OLEAUT32.261]
     3864    if( fltIn < UI2_MIN || fltIn > UI2_MAX )
     3865    {
     3866        return DISP_E_OVERFLOW;
     3867    }
     3868
     3869    *puiOut = (USHORT) fltIn;
     3870
     3871    return S_OK;
     3872}
     3873
     3874/******************************************************************************
     3875 *      VarUI2FromR8        [OLEAUT32.261]
    38753876 */
    38763877HRESULT WINAPI VarUI2FromR8(double dblIn, USHORT* puiOut)
    38773878{
    3878         TRACE("( %f, %p ), stub\n", dblIn, puiOut );
     3879    TRACE("( %f, %p ), stub\n", dblIn, puiOut );
    38793880
    38803881    dblIn = round( dblIn );
    38813882    if( dblIn < UI2_MIN || dblIn > UI2_MAX )
    3882         {
    3883                 return DISP_E_OVERFLOW;
    3884         }
    3885 
    3886         *puiOut = (USHORT) dblIn;
    3887 
    3888         return S_OK;
    3889 }
    3890 
    3891 /******************************************************************************
    3892  *              VarUI2FromDate          [OLEAUT32.262]
     3883    {
     3884        return DISP_E_OVERFLOW;
     3885    }
     3886
     3887    *puiOut = (USHORT) dblIn;
     3888
     3889    return S_OK;
     3890}
     3891
     3892/******************************************************************************
     3893 *      VarUI2FromDate      [OLEAUT32.262]
    38933894 */
    38943895HRESULT WINAPI VarUI2FromDate(DATE dateIn, USHORT* puiOut)
    38953896{
    3896         TRACE("( %f, %p ), stub\n", dateIn, puiOut );
     3897    TRACE("( %f, %p ), stub\n", dateIn, puiOut );
    38973898
    38983899    dateIn = round( dateIn );
    3899         if( dateIn < UI2_MIN || dateIn > UI2_MAX )
    3900         {
    3901                 return DISP_E_OVERFLOW;
    3902         }
    3903 
    3904         *puiOut = (USHORT) dateIn;
    3905 
    3906         return S_OK;
    3907 }
    3908 
    3909 /******************************************************************************
    3910  *              VarUI2FromStr           [OLEAUT32.264]
     3900    if( dateIn < UI2_MIN || dateIn > UI2_MAX )
     3901    {
     3902        return DISP_E_OVERFLOW;
     3903    }
     3904
     3905    *puiOut = (USHORT) dateIn;
     3906
     3907    return S_OK;
     3908}
     3909
     3910/******************************************************************************
     3911 *      VarUI2FromStr       [OLEAUT32.264]
    39113912 */
    39123913HRESULT WINAPI VarUI2FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, USHORT* puiOut)
    39133914{
    3914         double dValue = 0.0;
    3915         LPSTR pNewString = NULL;
    3916 
    3917         TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, puiOut );
    3918 
    3919         /* Check if we have a valid argument
    3920         */
    3921         pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    3922         RemoveCharacterFromString( pNewString, "," );
    3923         if( IsValidRealString( pNewString ) == FALSE )
    3924         {
    3925                 return DISP_E_TYPEMISMATCH;
    3926         }
    3927 
    3928         /* Convert the valid string to a floating point number.
    3929         */
    3930         dValue = atof( pNewString );
    3931  
    3932         /* We don't need the string anymore so free it.
    3933         */
    3934         HeapFree( GetProcessHeap(), 0, pNewString );
    3935 
    3936         /* Check range of value.
     3915    double dValue = 0.0;
     3916    LPSTR pNewString = NULL;
     3917
     3918    TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, puiOut );
     3919
     3920    /* Check if we have a valid argument
     3921    */
     3922    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
     3923    RemoveCharacterFromString( pNewString, "," );
     3924    if( IsValidRealString( pNewString ) == FALSE )
     3925    {
     3926        return DISP_E_TYPEMISMATCH;
     3927    }
     3928
     3929    /* Convert the valid string to a floating point number.
     3930    */
     3931    dValue = atof( pNewString );
     3932
     3933    /* We don't need the string anymore so free it.
     3934    */
     3935    HeapFree( GetProcessHeap(), 0, pNewString );
     3936
     3937    /* Check range of value.
    39373938     */
    39383939    dValue = round( dValue );
    3939         if( dValue < UI2_MIN || dValue > UI2_MAX )
    3940         {
    3941                 return DISP_E_OVERFLOW;
    3942         }
    3943 
    3944         *puiOut = (USHORT) dValue;
    3945 
    3946         return S_OK;
    3947 }
    3948 
    3949 /******************************************************************************
    3950  *              VarUI2FromBool          [OLEAUT32.266]
     3940    if( dValue < UI2_MIN || dValue > UI2_MAX )
     3941    {
     3942        return DISP_E_OVERFLOW;
     3943    }
     3944
     3945    *puiOut = (USHORT) dValue;
     3946
     3947    return S_OK;
     3948}
     3949
     3950/******************************************************************************
     3951 *      VarUI2FromBool      [OLEAUT32.266]
    39513952 */
    39523953HRESULT WINAPI VarUI2FromBool(VARIANT_BOOL boolIn, USHORT* puiOut)
    39533954{
    3954         TRACE("( %d, %p ), stub\n", boolIn, puiOut );
    3955 
    3956         *puiOut = (USHORT) boolIn;
    3957 
    3958         return S_OK;
    3959 }
    3960 
    3961 /******************************************************************************
    3962  *              VarUI2FromI1            [OLEAUT32.267]
     3955    TRACE("( %d, %p ), stub\n", boolIn, puiOut );
     3956
     3957    *puiOut = (USHORT) boolIn;
     3958
     3959    return S_OK;
     3960}
     3961
     3962/******************************************************************************
     3963 *      VarUI2FromI1        [OLEAUT32.267]
    39633964 */
    39643965HRESULT WINAPI VarUI2FromI1(CHAR cIn, USHORT* puiOut)
    39653966{
    3966         TRACE("( %c, %p ), stub\n", cIn, puiOut );
    3967 
    3968         *puiOut = (USHORT) cIn;
    3969 
    3970         return S_OK;
    3971 }
    3972 
    3973 /******************************************************************************
    3974  *              VarUI2FromUI4           [OLEAUT32.268]
     3967    TRACE("( %c, %p ), stub\n", cIn, puiOut );
     3968
     3969    *puiOut = (USHORT) cIn;
     3970
     3971    return S_OK;
     3972}
     3973
     3974/******************************************************************************
     3975 *      VarUI2FromUI4       [OLEAUT32.268]
    39753976 */
    39763977HRESULT WINAPI VarUI2FromUI4(ULONG ulIn, USHORT* puiOut)
    39773978{
    3978         TRACE("( %ld, %p ), stub\n", ulIn, puiOut );
    3979 
    3980         if( ulIn < UI2_MIN || ulIn > UI2_MAX )
    3981         {
    3982                 return DISP_E_OVERFLOW;
    3983         }
    3984 
    3985         *puiOut = (USHORT) ulIn;
    3986 
    3987         return S_OK;
    3988 }
    3989 
    3990 /******************************************************************************
    3991  *              VarUI4FromStr           [OLEAUT32.277]
     3979    TRACE("( %ld, %p ), stub\n", ulIn, puiOut );
     3980
     3981    if( ulIn < UI2_MIN || ulIn > UI2_MAX )
     3982    {
     3983        return DISP_E_OVERFLOW;
     3984    }
     3985
     3986    *puiOut = (USHORT) ulIn;
     3987
     3988    return S_OK;
     3989}
     3990
     3991/******************************************************************************
     3992 *      VarUI4FromStr       [OLEAUT32.277]
    39923993 */
    39933994HRESULT WINAPI VarUI4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, ULONG* pulOut)
    39943995{
    3995         double dValue = 0.0;
    3996         LPSTR pNewString = NULL;
    3997 
    3998         TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pulOut );
    3999 
    4000         /* Check if we have a valid argument
    4001         */
    4002         pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    4003         RemoveCharacterFromString( pNewString, "," );
    4004         if( IsValidRealString( pNewString ) == FALSE )
    4005         {
    4006                 return DISP_E_TYPEMISMATCH;
    4007         }
    4008 
    4009         /* Convert the valid string to a floating point number.
    4010         */
    4011         dValue = atof( pNewString );
    4012  
    4013         /* We don't need the string anymore so free it.
    4014         */
    4015         HeapFree( GetProcessHeap(), 0, pNewString );
    4016 
    4017         /* Check range of value.
     3996    double dValue = 0.0;
     3997    LPSTR pNewString = NULL;
     3998
     3999    TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pulOut );
     4000
     4001    /* Check if we have a valid argument
     4002    */
     4003    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
     4004    RemoveCharacterFromString( pNewString, "," );
     4005    if( IsValidRealString( pNewString ) == FALSE )
     4006    {
     4007        return DISP_E_TYPEMISMATCH;
     4008    }
     4009
     4010    /* Convert the valid string to a floating point number.
     4011    */
     4012    dValue = atof( pNewString );
     4013
     4014    /* We don't need the string anymore so free it.
     4015    */
     4016    HeapFree( GetProcessHeap(), 0, pNewString );
     4017
     4018    /* Check range of value.
    40184019     */
    40194020    dValue = round( dValue );
    4020         if( dValue < UI4_MIN || dValue > UI4_MAX )
    4021         {
    4022                 return DISP_E_OVERFLOW;
    4023         }
    4024 
    4025         *pulOut = (ULONG) dValue;
    4026 
    4027         return S_OK;
     4021    if( dValue < UI4_MIN || dValue > UI4_MAX )
     4022    {
     4023        return DISP_E_OVERFLOW;
     4024    }
     4025
     4026    *pulOut = (ULONG) dValue;
     4027
     4028    return S_OK;
    40284029}
    40294030
     
    40344035HRESULT WINAPI VarUI2FromCy(CY cyIn, USHORT* pusOut) {
    40354036   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    4036    
     4037
    40374038   if (t > UI2_MAX || t < UI2_MIN) return DISP_E_OVERFLOW;
    4038      
     4039
    40394040   *pusOut = (USHORT)t;
    4040    
     4041
    40414042   return S_OK;
    40424043}
    40434044
    40444045/******************************************************************************
    4045  *              VarUI4FromUI1           [OLEAUT32.270]
     4046 *      VarUI4FromUI1       [OLEAUT32.270]
    40464047 */
    40474048HRESULT WINAPI VarUI4FromUI1(BYTE bIn, ULONG* pulOut)
    40484049{
    4049         TRACE("( %d, %p ), stub\n", bIn, pulOut );
    4050 
    4051         *pulOut = (USHORT) bIn;
    4052 
    4053         return S_OK;
    4054 }
    4055 
    4056 /******************************************************************************
    4057  *              VarUI4FromI2            [OLEAUT32.271]
     4050    TRACE("( %d, %p ), stub\n", bIn, pulOut );
     4051
     4052    *pulOut = (USHORT) bIn;
     4053
     4054    return S_OK;
     4055}
     4056
     4057/******************************************************************************
     4058 *      VarUI4FromI2        [OLEAUT32.271]
    40584059 */
    40594060HRESULT WINAPI VarUI4FromI2(short uiIn, ULONG* pulOut)
    40604061{
    4061         TRACE("( %d, %p ), stub\n", uiIn, pulOut );
    4062 
    4063         if( uiIn < UI4_MIN )
    4064         {
    4065                 return DISP_E_OVERFLOW;
    4066         }
    4067 
    4068         *pulOut = (ULONG) uiIn;
    4069 
    4070         return S_OK;
    4071 }
    4072 
    4073 /******************************************************************************
    4074  *              VarUI4FromI4            [OLEAUT32.272]
     4062    TRACE("( %d, %p ), stub\n", uiIn, pulOut );
     4063
     4064    if( uiIn < UI4_MIN )
     4065    {
     4066        return DISP_E_OVERFLOW;
     4067    }
     4068
     4069    *pulOut = (ULONG) uiIn;
     4070
     4071    return S_OK;
     4072}
     4073
     4074/******************************************************************************
     4075 *      VarUI4FromI4        [OLEAUT32.272]
    40754076 */
    40764077HRESULT WINAPI VarUI4FromI4(LONG lIn, ULONG* pulOut)
    40774078{
    4078         TRACE("( %ld, %p ), stub\n", lIn, pulOut );
    4079 
    4080         if( lIn < UI4_MIN )
    4081         {
    4082                 return DISP_E_OVERFLOW;
    4083         }
    4084 
    4085         *pulOut = (ULONG) lIn;
    4086 
    4087         return S_OK;
    4088 }
    4089 
    4090 /******************************************************************************
    4091  *              VarUI4FromR4            [OLEAUT32.273]
     4079    TRACE("( %ld, %p ), stub\n", lIn, pulOut );
     4080
     4081    if( lIn < UI4_MIN )
     4082    {
     4083        return DISP_E_OVERFLOW;
     4084    }
     4085
     4086    *pulOut = (ULONG) lIn;
     4087
     4088    return S_OK;
     4089}
     4090
     4091/******************************************************************************
     4092 *      VarUI4FromR4        [OLEAUT32.273]
    40924093 */
    40934094HRESULT WINAPI VarUI4FromR4(FLOAT fltIn, ULONG* pulOut)
     
    40954096    fltIn = round( fltIn );
    40964097    if( fltIn < UI4_MIN || fltIn > UI4_MAX )
    4097         {
    4098                 return DISP_E_OVERFLOW;
    4099         }
    4100 
    4101         *pulOut = (ULONG) fltIn;
    4102 
    4103         return S_OK;
    4104 }
    4105 
    4106 /******************************************************************************
    4107  *              VarUI4FromR8            [OLEAUT32.274]
     4098    {
     4099        return DISP_E_OVERFLOW;
     4100    }
     4101
     4102    *pulOut = (ULONG) fltIn;
     4103
     4104    return S_OK;
     4105}
     4106
     4107/******************************************************************************
     4108 *      VarUI4FromR8        [OLEAUT32.274]
    41084109 */
    41094110HRESULT WINAPI VarUI4FromR8(double dblIn, ULONG* pulOut)
    41104111{
    4111         TRACE("( %f, %p ), stub\n", dblIn, pulOut );
     4112    TRACE("( %f, %p ), stub\n", dblIn, pulOut );
    41124113
    41134114    dblIn = round( dblIn );
    4114         if( dblIn < UI4_MIN || dblIn > UI4_MAX )
    4115         {
    4116                 return DISP_E_OVERFLOW;
    4117     }
    4118 
    4119         *pulOut = (ULONG) dblIn;
    4120 
    4121         return S_OK;
    4122 }
    4123 
    4124 /******************************************************************************
    4125  *              VarUI4FromDate          [OLEAUT32.275]
     4115    if( dblIn < UI4_MIN || dblIn > UI4_MAX )
     4116    {
     4117        return DISP_E_OVERFLOW;
     4118    }
     4119
     4120    *pulOut = (ULONG) dblIn;
     4121
     4122    return S_OK;
     4123}
     4124
     4125/******************************************************************************
     4126 *      VarUI4FromDate      [OLEAUT32.275]
    41264127 */
    41274128HRESULT WINAPI VarUI4FromDate(DATE dateIn, ULONG* pulOut)
    41284129{
    4129         TRACE("( %f, %p ), stub\n", dateIn, pulOut );
     4130    TRACE("( %f, %p ), stub\n", dateIn, pulOut );
    41304131
    41314132    dateIn = round( dateIn );
    41324133    if( dateIn < UI4_MIN || dateIn > UI4_MAX )
    4133         {
    4134                 return DISP_E_OVERFLOW;
    4135         }
    4136 
    4137         *pulOut = (ULONG) dateIn;
    4138 
    4139         return S_OK;
    4140 }
    4141 
    4142 /******************************************************************************
    4143  *              VarUI4FromBool          [OLEAUT32.279]
     4134    {
     4135        return DISP_E_OVERFLOW;
     4136    }
     4137
     4138    *pulOut = (ULONG) dateIn;
     4139
     4140    return S_OK;
     4141}
     4142
     4143/******************************************************************************
     4144 *      VarUI4FromBool      [OLEAUT32.279]
    41444145 */
    41454146HRESULT WINAPI VarUI4FromBool(VARIANT_BOOL boolIn, ULONG* pulOut)
    41464147{
    4147         TRACE("( %d, %p ), stub\n", boolIn, pulOut );
    4148 
    4149         *pulOut = (ULONG) boolIn;
    4150 
    4151         return S_OK;
    4152 }
    4153 
    4154 /******************************************************************************
    4155  *              VarUI4FromI1            [OLEAUT32.280]
     4148    TRACE("( %d, %p ), stub\n", boolIn, pulOut );
     4149
     4150    *pulOut = (ULONG) boolIn;
     4151
     4152    return S_OK;
     4153}
     4154
     4155/******************************************************************************
     4156 *      VarUI4FromI1        [OLEAUT32.280]
    41564157 */
    41574158HRESULT WINAPI VarUI4FromI1(CHAR cIn, ULONG* pulOut)
    41584159{
    4159         TRACE("( %c, %p ), stub\n", cIn, pulOut );
    4160 
    4161         *pulOut = (ULONG) cIn;
    4162 
    4163         return S_OK;
    4164 }
    4165 
    4166 /******************************************************************************
    4167  *              VarUI4FromUI2           [OLEAUT32.281]
     4160    TRACE("( %c, %p ), stub\n", cIn, pulOut );
     4161
     4162    *pulOut = (ULONG) cIn;
     4163
     4164    return S_OK;
     4165}
     4166
     4167/******************************************************************************
     4168 *      VarUI4FromUI2       [OLEAUT32.281]
    41684169 */
    41694170HRESULT WINAPI VarUI4FromUI2(USHORT uiIn, ULONG* pulOut)
    41704171{
    4171         TRACE("( %d, %p ), stub\n", uiIn, pulOut );
    4172 
    4173         *pulOut = (ULONG) uiIn;
    4174 
    4175         return S_OK;
     4172    TRACE("( %d, %p ), stub\n", uiIn, pulOut );
     4173
     4174    *pulOut = (ULONG) uiIn;
     4175
     4176    return S_OK;
    41764177}
    41774178
     
    41824183HRESULT WINAPI VarUI4FromCy(CY cyIn, ULONG* pulOut) {
    41834184   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    4184    
     4185
    41854186   if (t > UI4_MAX || t < UI4_MIN) return DISP_E_OVERFLOW;
    41864187
     
    41974198   pcyOut->s.Hi = 0;
    41984199   pcyOut->s.Lo = ((ULONG)bIn) * 10000;
    4199    
     4200
    42004201   return S_OK;
    42014202}
     
    42094210   else pcyOut->s.Hi = 0;
    42104211   pcyOut->s.Lo = ((ULONG)sIn) * 10000;
    4211    
     4212
    42124213   return S_OK;
    42134214}
     
    42224223      pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
    42234224      if (lIn < 0) pcyOut->s.Hi--;
    4224    
     4225
    42254226      return S_OK;
    42264227}
     
    42354236   pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
    42364237   if (fltIn < 0) pcyOut->s.Hi--;
    4237    
     4238
    42384239   return S_OK;
    42394240}
     
    42694270 */
    42704271HRESULT WINAPI VarCyFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, CY *pcyOut) {
    4271                                 /* FIXME */
    4272                 return E_NOTIMPL;
    4273 }
    4274 
    4275  
     4272                /* FIXME */
     4273        return E_NOTIMPL;
     4274}
     4275
     4276
    42764277/**********************************************************************
    42774278 *              VarCyFromBool [OLEAUT32.106]
     
    42824283   else pcyOut->s.Hi = 0;
    42834284   pcyOut->s.Lo = (ULONG)boolIn * (ULONG)10000;
    4284    
     4285
    42854286   return S_OK;
    42864287}
     
    42944295   else pcyOut->s.Hi = 0;
    42954296   pcyOut->s.Lo = (ULONG)cIn * (ULONG)10000;
    4296    
     4297
    42974298   return S_OK;
    42984299}
     
    43054306   pcyOut->s.Hi = 0;
    43064307   pcyOut->s.Lo = (ULONG)usIn * (ULONG)10000;
    4307    
     4308
    43084309   return S_OK;
    43094310}
     
    43174318   pcyOut->s.Hi = (LONG)(t / (double)4294967296.0);
    43184319   pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
    4319      
     4320
    43204321   return S_OK;
    43214322}
     
    43334334
    43344335    TRACE("( 0x%x, 0x%x, 0x%p ), stub\n", wDosDate, wDosTime, pvtime );
    4335    
     4336
    43364337    t.tm_sec = (wDosTime & 0x001f) * 2;
    43374338    t.tm_min = (wDosTime & 0x07e0) >> 5;
    43384339    t.tm_hour = (wDosTime & 0xf800) >> 11;
    4339    
     4340
    43404341    t.tm_mday = (wDosDate & 0x001f);
    43414342    t.tm_mon = (wDosDate & 0x01e0) >> 5;
     
    43634364    cDig = 0;
    43644365    for (i=0; strIn[i] ;i++) {
    4365         if ((strIn[i]>='0') && (strIn[i]<='9')) {
    4366             if (pnumprs->cDig > cDig) {
    4367                 *(rgbDig++)=strIn[i]-'0';
    4368                 cDig++;
    4369                 lastent = i;
    4370             }
    4371         }
    4372     }
    4373     pnumprs->cDig       = cDig;
     4366    if ((strIn[i]>='0') && (strIn[i]<='9')) {
     4367        if (pnumprs->cDig > cDig) {
     4368        *(rgbDig++)=strIn[i]-'0';
     4369        cDig++;
     4370        lastent = i;
     4371        }
     4372    }
     4373    }
     4374    pnumprs->cDig   = cDig;
    43744375
    43754376    /* FIXME: Just patching some values in */
    4376     pnumprs->nPwr10     = 0;
    4377     pnumprs->nBaseShift = 0;
    4378     pnumprs->cchUsed    = lastent;
    4379     pnumprs->dwOutFlags = NUMPRS_DECIMAL;
     4377    pnumprs->nPwr10 = 0;
     4378    pnumprs->nBaseShift = 0;
     4379    pnumprs->cchUsed    = lastent;
     4380    pnumprs->dwOutFlags = NUMPRS_DECIMAL;
    43804381    return S_OK;
    43814382}
     
    43944395    xint = 0;
    43954396    for (i=0;i<pnumprs->cDig;i++)
    4396         xint = xint*10 + rgbDig[i];
     4397    xint = xint*10 + rgbDig[i];
    43974398
    43984399    VariantInit(pvar);
    43994400    if (dwVtBits & VTBIT_I4) {
    4400         V_VT(pvar) = VT_I4;
    4401         V_UNION(pvar,intVal) = xint;
    4402         return S_OK;
     4401    V_VT(pvar) = VT_I4;
     4402    V_UNION(pvar,intVal) = xint;
     4403    return S_OK;
    44034404    }
    44044405    if (dwVtBits & VTBIT_R8) {
    4405         V_VT(pvar) = VT_R8;
    4406         V_UNION(pvar,dblVal) = xint;
    4407         return S_OK;
     4406    V_VT(pvar) = VT_R8;
     4407    V_UNION(pvar,dblVal) = xint;
     4408    return S_OK;
    44084409    } else {
    4409         FIXME("vtbitmask is unsupported %lx\n",dwVtBits);
    4410         return E_FAIL;
     4410    FIXME("vtbitmask is unsupported %lx\n",dwVtBits);
     4411    return E_FAIL;
    44114412    }
    44124413}
     
    46594660 *              VarBstrCmp [OLEAUT32.440]
    46604661 *
    4661  * flags can be: 
     4662 * flags can be:
    46624663 *   NORM_IGNORECASE, NORM_IGNORENONSPACE, NORM_IGNORESYMBOLS
    46634664 *   NORM_IGNORESTRINGWIDTH, NORM_IGNOREKANATYPE, NORM_IGNOREKASHIDA
Note: See TracChangeset for help on using the changeset viewer.