Changeset 6711 for trunk/src/oleaut32


Ignore:
Timestamp:
Sep 15, 2001, 11:32:00 AM (24 years ago)
Author:
sandervl
Message:

restored old version + wine update

Location:
trunk/src/oleaut32
Files:
12 edited

Legend:

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

    r6689 r6711  
    7272  CONNECTDATA *pCD;
    7373  DWORD nConns;
    74 
     74 
    7575  /* Next connection to enumerate from */
    7676  DWORD nCur;
     
    7979
    8080static EnumConnectionsImpl *EnumConnectionsImpl_Construct(IUnknown *pUnk,
    81                               DWORD nSinks,
    82                               CONNECTDATA *pCD);
     81                                                          DWORD nSinks,
     82                                                          CONNECTDATA *pCD);
    8383
    8484
     
    8787 */
    8888static ConnectionPointImpl *ConnectionPointImpl_Construct(IUnknown *pUnk,
    89                               REFIID riid)
     89                                                          REFIID riid)
    9090{
    9191  ConnectionPointImpl *Obj;
     
    9797  Obj->iid =  *riid;
    9898  Obj->maxSinks = MAXSINKS;
    99   Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
    100             sizeof(IUnknown*) * MAXSINKS);
     99  Obj->sinks = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
     100                        sizeof(IUnknown*) * MAXSINKS);
    101101  Obj->nSinks = 0;
    102102  return Obj;
     
    139139  if ( (This==0) || (ppvObject==0) )
    140140    return E_INVALIDARG;
    141 
     141 
    142142  /*
    143143   * Initialize the return parameter.
    144144   */
    145145  *ppvObject = 0;
    146 
     146 
    147147  /*
    148148   * Compare the riid with the interface IDs implemented by this object.
    149149   */
    150   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
     150  if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 
    151151  {
    152152    *ppvObject = (IConnectionPoint*)This;
    153153  }
    154   else if (memcmp(&IID_IConnectionPoint, riid, sizeof(IID_IConnectionPoint)) == 0)
     154  else if (memcmp(&IID_IConnectionPoint, riid, sizeof(IID_IConnectionPoint)) == 0) 
    155155  {
    156156    *ppvObject = (IConnectionPoint*)This;
    157157  }
    158 
     158 
    159159  /*
    160160   * Check that we obtained an interface.
     
    165165    return E_NOINTERFACE;
    166166  }
    167 
     167 
    168168  /*
    169169   * Query Interface always increases the reference count by one when it is
     
    189189  return This->ref;
    190190}
    191 
     191       
    192192/************************************************************************
    193193 * ConnectionPointImpl_Release (IUnknown)
     
    195195 * See Windows documentation for more details on IUnknown methods.
    196196 */
    197 static ULONG WINAPI ConnectionPointImpl_Release(
     197static ULONG WINAPI ConnectionPointImpl_Release( 
    198198      IConnectionPoint* iface)
    199199{
     
    215215    return 0;
    216216  }
    217 
     217 
    218218  return This->ref;
    219219}
     
    224224 */
    225225static HRESULT WINAPI ConnectionPointImpl_GetConnectionInterface(
    226                            IConnectionPoint *iface,
    227                            IID              *piid)
     226                                               IConnectionPoint *iface,
     227                                               IID              *piid)
    228228{
    229229  ICOM_THIS(ConnectionPointImpl, iface);
     
    238238 */
    239239static HRESULT WINAPI ConnectionPointImpl_GetConnectionPointContainer(
    240                       IConnectionPoint           *iface,
    241                       IConnectionPointContainer  **ppCPC)
     240                                      IConnectionPoint           *iface,
     241                                      IConnectionPointContainer  **ppCPC)
    242242{
    243243  ICOM_THIS(ConnectionPointImpl, iface);
     
    245245
    246246  return IUnknown_QueryInterface(This->Obj,
    247                 &IID_IConnectionPointContainer,
    248                 (LPVOID)ppCPC);
     247                                &IID_IConnectionPointContainer,
     248                                (LPVOID)ppCPC);
    249249}
    250250
     
    254254 */
    255255static HRESULT WINAPI ConnectionPointImpl_Advise(IConnectionPoint *iface,
    256                         IUnknown *lpUnk,
    257                         DWORD *pdwCookie)
     256                                                IUnknown *lpUnk,
     257                                                DWORD *pdwCookie)
    258258{
    259259  DWORD i;
     
    273273    This->maxSinks += MAXSINKS;
    274274    This->sinks = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->sinks,
    275                   This->maxSinks * sizeof(IUnknown *));
     275                              This->maxSinks * sizeof(IUnknown *));
    276276  }
    277277  This->sinks[i] = lpSink;
     
    287287 */
    288288static HRESULT WINAPI ConnectionPointImpl_Unadvise(IConnectionPoint *iface,
    289                            DWORD dwCookie)
     289                                                   DWORD dwCookie)
    290290{
    291291  ICOM_THIS(ConnectionPointImpl, iface);
     
    307307 */
    308308static HRESULT WINAPI ConnectionPointImpl_EnumConnections(
    309                             IConnectionPoint *iface,
    310                             LPENUMCONNECTIONS *ppEnum)
    311 {
     309                                                    IConnectionPoint *iface,
     310                                                    LPENUMCONNECTIONS *ppEnum)
     311{ 
    312312  ICOM_THIS(ConnectionPointImpl, iface);
    313313  CONNECTDATA *pCD;
     
    317317
    318318  TRACE("(%p)->(%p)\n", This, ppEnum);
    319 
     319 
    320320  *ppEnum = NULL;
    321321
     
    339339  EnumObj = EnumConnectionsImpl_Construct((IUnknown*)This, This->nSinks, pCD);
    340340  hr = IEnumConnections_QueryInterface((IEnumConnections*)EnumObj,
    341                   &IID_IEnumConnections, (LPVOID)ppEnum);
     341                                  &IID_IEnumConnections, (LPVOID)ppEnum);
    342342  IEnumConnections_Release((IEnumConnections*)EnumObj);
    343343
     
    367367 */
    368368static EnumConnectionsImpl *EnumConnectionsImpl_Construct(IUnknown *pUnk,
    369                               DWORD nSinks,
    370                               CONNECTDATA *pCD)
     369                                                          DWORD nSinks,
     370                                                          CONNECTDATA *pCD)
    371371{
    372372  EnumConnectionsImpl *Obj = HeapAlloc(GetProcessHeap(), 0, sizeof(*Obj));
     
    420420  if ( (This==0) || (ppvObject==0) )
    421421    return E_INVALIDARG;
    422 
     422 
    423423  /*
    424424   * Initialize the return parameter.
    425425   */
    426426  *ppvObject = 0;
    427 
     427 
    428428  /*
    429429   * Compare the riid with the interface IDs implemented by this object.
    430430   */
    431   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
     431  if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 
    432432  {
    433433    *ppvObject = (IEnumConnections*)This;
    434434  }
    435   else if (memcmp(&IID_IEnumConnections, riid, sizeof(IID_IEnumConnections)) == 0)
     435  else if (memcmp(&IID_IEnumConnections, riid, sizeof(IID_IEnumConnections)) == 0) 
    436436  {
    437437    *ppvObject = (IEnumConnections*)This;
    438438  }
    439 
     439 
    440440  /*
    441441   * Check that we obtained an interface.
     
    446446    return E_NOINTERFACE;
    447447  }
    448 
     448 
    449449  /*
    450450   * Query Interface always increases the reference count by one when it is
     
    470470  return This->ref;
    471471}
    472 
     472       
    473473/************************************************************************
    474474 * EnumConnectionsImpl_Release (IUnknown)
     
    497497    return 0;
    498498  }
    499 
     499 
    500500  return This->ref;
    501501}
     
    506506 */
    507507static HRESULT WINAPI EnumConnectionsImpl_Next(IEnumConnections* iface,
    508                            ULONG cConn, LPCONNECTDATA pCD,
    509                            ULONG *pEnum)
     508                                               ULONG cConn, LPCONNECTDATA pCD,
     509                                               ULONG *pEnum)
    510510{
    511511  ICOM_THIS(EnumConnectionsImpl, iface);
     
    542542 */
    543543static HRESULT WINAPI EnumConnectionsImpl_Skip(IEnumConnections* iface,
    544                            ULONG cSkip)
     544                                               ULONG cSkip)
    545545{
    546546  ICOM_THIS(EnumConnectionsImpl, iface);
     
    576576 */
    577577static HRESULT WINAPI EnumConnectionsImpl_Clone(IEnumConnections* iface,
    578                         LPENUMCONNECTIONS *ppEnum)
     578                                                LPENUMCONNECTIONS *ppEnum)
    579579{
    580580  ICOM_THIS(EnumConnectionsImpl, iface);
    581581  EnumConnectionsImpl *newObj;
    582582  TRACE("(%p)->(%p)\n", This, ppEnum);
    583 
     583 
    584584  newObj = EnumConnectionsImpl_Construct(This->pUnk, This->nConns, This->pCD);
    585585  newObj->nCur = This->nCur;
     
    588588  return S_OK;
    589589}
    590 
     590 
    591591static ICOM_VTABLE(IEnumConnections) EnumConnectionsImpl_VTable =
    592592{
     
    616616 */
    617617HRESULT CreateConnectionPoint(IUnknown *pUnk, REFIID riid,
    618                   IConnectionPoint **pCP)
     618                              IConnectionPoint **pCP)
    619619{
    620620  ConnectionPointImpl *Obj;
     
    624624  if(!Obj) return E_OUTOFMEMORY;
    625625
    626   hr = IConnectionPoint_QueryInterface((IConnectionPoint *)Obj,
    627                        &IID_IConnectionPoint, (LPVOID)pCP);
     626  hr = IConnectionPoint_QueryInterface((IConnectionPoint *)Obj, 
     627                                       &IID_IConnectionPoint, (LPVOID)pCP);
    628628  IConnectionPoint_Release((IConnectionPoint *)Obj);
    629629  return hr;
  • trunk/src/oleaut32/dispatch.c

    r6689 r6711  
    3737 *
    3838 * NOTES
    39  *      - Defer method invocation to ITypeInfo::Invoke()
     39 *              - Defer method invocation to ITypeInfo::Invoke()
    4040 *
    4141 * RETURNS
    4242 *
    43  *      S_OK on success.
     43 *              S_OK on success.
    4444 */
    4545HRESULT WINAPI
     
    7676 *         DispGetIDsOfNames (OLEAUT32.29)
    7777 *
    78  * Convert a set of names to dispids, based on information
     78 * Convert a set of names to dispids, based on information 
    7979 * contained in object's type library.
    80  *
     80 * 
    8181 * NOTES
    82  *      - Defers to ITypeInfo::GetIDsOfNames()
     82 *              - Defers to ITypeInfo::GetIDsOfNames()
    8383 *
    8484 * RETURNS
    8585 *
    86  *      S_OK on success.
     86 *              S_OK on success.
    8787 */
    8888HRESULT WINAPI
     
    109109 *
    110110 * NOTES
    111  *      Coercion is done using system (0) locale.
     111 *              Coercion is done using system (0) locale.
    112112 *
    113113 * RETURNS
    114114 *
    115  *      S_OK on success.
     115 *              S_OK on success.
    116116 */
    117117HRESULT WINAPI DispGetParam(DISPPARAMS* pdispparams, UINT position,
  • trunk/src/oleaut32/initterm.cpp

    r6689 r6711  
    5959   {
    6060   case DLL_PROCESS_ATTACH:
    61     return TRUE;
     61        return TRUE;
    6262
    6363   case DLL_THREAD_ATTACH:
    6464   case DLL_THREAD_DETACH:
    65     return TRUE;
     65        return TRUE;
    6666
    6767   case DLL_PROCESS_DETACH:
    68     ctordtorTerm();
    69     ClosePrivateLogFiles();
    70     return TRUE;
     68        ctordtorTerm();
     69        ClosePrivateLogFiles();
     70        return TRUE;
    7171   }
    7272   return FALSE;
     
    9595      case 0 :
    9696      {
    97     loadNr = globLoadNr++;
     97        loadNr = globLoadNr++;
    9898
    99     DosQueryModuleName(hModule, sizeof(oleaut32Path), oleaut32Path);
    100     char *endofpath = strrchr(oleaut32Path, '\\');
    101     *(endofpath+1) = 0;
     99        DosQueryModuleName(hModule, sizeof(oleaut32Path), oleaut32Path);
     100        char *endofpath = strrchr(oleaut32Path, '\\');
     101        *(endofpath+1) = 0;
    102102
    103103         ctordtorInit();
     
    105105         CheckVersionFromHMOD(PE2LX_VERSION, hModule); /*PLF Wed  98-03-18 05:28:48*/
    106106
    107     dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
    108          if(dllHandle == 0)
    109         return 0UL;
     107        dllHandle = RegisterLxDll(hModule, LibMain, (PVOID)&_Resource_PEResTab);
     108         if(dllHandle == 0) 
     109                return 0UL;
    110110
    111111#ifdef DEFAULT_LOGGING_OFF
    112         if(getenv("WIN32LOG_ENABLED")) {
     112        if(getenv("WIN32LOG_ENABLED")) {
    113113#else
    114         if(!getenv("NOWIN32LOG")) {
     114        if(!getenv("NOWIN32LOG")) {
    115115#endif
    116             OpenPrivateLogFiles();
    117     }
     116                OpenPrivateLogFiles();
     117        }
    118118         Hash_Initialise();
    119119
     
    122122      case 1 :
    123123         if(dllHandle) {
    124         UnregisterLxDll(dllHandle);
     124                UnregisterLxDll(dllHandle);
    125125         }
    126126         break;
  • trunk/src/oleaut32/ole2disp.c

    r6689 r6711  
    11/*
    2  *  OLE2DISP library
     2 *      OLE2DISP library
    33 *
    4  *  Copyright 1995  Martin von Loewis
     4 *      Copyright 1995  Martin von Loewis
    55 */
    66#ifdef __WIN32OS2__
     
    3131
    3232/******************************************************************************
    33  *      BSTR_AllocBytes [Internal]
     33 *              BSTR_AllocBytes [Internal]
    3434 */
    3535static BSTR16 BSTR_AllocBytes(int n)
     
    5656
    5757/******************************************************************************
    58  *      SysAllocString16    [OLE2DISP.2]
     58 *              SysAllocString16        [OLE2DISP.2]
    5959 */
    6060BSTR16 WINAPI SysAllocString16(LPCOLESTR16 in)
    6161{
    62     BSTR16 out;
    63 
     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]
     75 */
     76BSTR WINAPI SysAllocString(LPCOLESTR in)
     77{
    6478    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]
    75  */
    76 BSTR WINAPI SysAllocString(LPCOLESTR in)
    77 {
    78     if (!in) return 0;
    79 
     79   
    8080    /* Delegate this to the SysAllocStringLen32 method. */
    8181    return SysAllocStringLen(in, lstrlenW(in));
     
    8484#ifndef __WIN32OS2__
    8585/******************************************************************************
    86  *      SysReAllocString16  [OLE2DISP.3]
     86 *              SysReAllocString16      [OLE2DISP.3]
    8787 */
    8888INT16 WINAPI SysReAllocString16(LPBSTR16 old,LPCOLESTR16 in)
    8989{
    90     BSTR16 new=SysAllocString16(in);
    91     BSTR_Free(*old);
    92     *old=new;
    93     return 1;
    94 }
    95 #endif
    96 
    97 /******************************************************************************
    98  *      SysReAllocString    [OLEAUT32.3]
     90        BSTR16 new=SysAllocString16(in);
     91        BSTR_Free(*old);
     92        *old=new;
     93        return 1;
     94}
     95#endif
     96
     97/******************************************************************************
     98 *              SysReAllocString        [OLEAUT32.3]
    9999 */
    100100INT WINAPI SysReAllocString(LPBSTR old,LPCOLESTR in)
     
    103103     * Sanity check
    104104     */
    105     if (old==NULL)
     105    if (old==NULL) 
    106106      return 0;
    107107
     
    109109     * Make sure we free the old string.
    110110     */
    111     if (*old!=NULL)
     111    if (*old!=NULL)     
    112112      SysFreeString(*old);
    113113
     
    122122#ifndef __WIN32OS2__
    123123/******************************************************************************
    124  *      SysAllocStringLen16 [OLE2DISP.4]
     124 *              SysAllocStringLen16     [OLE2DISP.4]
    125125 */
    126126BSTR16 WINAPI SysAllocStringLen16(const char *in, int len)
    127127{
    128     BSTR16 out=BSTR_AllocBytes(len+1);
    129 
    130     if (!out)
    131         return 0;
     128        BSTR16 out=BSTR_AllocBytes(len+1);
     129
     130        if (!out)
     131                return 0;
    132132
    133133    /*
     
    137137     */
    138138    if (in != 0)
    139     strcpy(BSTR_GetAddr(out),in);
     139        strcpy(BSTR_GetAddr(out),in);
    140140    else
    141141      memset(BSTR_GetAddr(out), 0, len+1);
    142142
    143     return out;
     143        return out;
    144144}
    145145#endif
     
    152152 * he describes it as a "DWORD count of characters". By experimenting with
    153153 * 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
     154 * the string. Meaning that the count is double the number of wide 
    155155 * characters in the string.
    156156 */
     
    214214#ifndef __WIN32OS2__
    215215/******************************************************************************
    216  *      SysReAllocStringLen16   [OLE2DISP.5]
     216 *              SysReAllocStringLen16   [OLE2DISP.5]
    217217 */
    218218int WINAPI SysReAllocStringLen16(BSTR16 *old,const char *in,int len)
    219219{
    220     BSTR16 new=SysAllocStringLen16(in,len);
    221     BSTR_Free(*old);
    222     *old=new;
     220        BSTR16 new=SysAllocStringLen16(in,len);
     221        BSTR_Free(*old);
     222        *old=new;
     223        return 1;
     224}
     225#endif
     226
     227 
     228/******************************************************************************
     229 *             SysReAllocStringLen   [OLEAUT32.5]
     230 */
     231int WINAPI SysReAllocStringLen(BSTR* old, const OLECHAR* in, unsigned int len)
     232{
     233    /*
     234     * Sanity check
     235     */
     236    if (old==NULL)
     237      return 0;
     238
     239    /*
     240     * Make sure we free the old string.
     241     */
     242    if (*old!=NULL)     
     243      SysFreeString(*old);
     244
     245    /*
     246     * Allocate the new string
     247     */
     248    *old = SysAllocStringLen(in, len);
     249
    223250    return 1;
    224251}
    225 #endif
    226 
    227 
    228 /******************************************************************************
    229  *             SysReAllocStringLen   [OLEAUT32.5]
    230  */
    231 int WINAPI SysReAllocStringLen(BSTR* old, const OLECHAR* in, unsigned int len)
    232 {
    233     /*
    234      * Sanity check
    235      */
    236     if (old==NULL)
    237       return 0;
    238 
    239     /*
    240      * Make sure we free the old string.
    241      */
    242     if (*old!=NULL)
    243       SysFreeString(*old);
    244 
    245     /*
    246      * Allocate the new string
    247      */
    248     *old = SysAllocStringLen(in, len);
    249 
    250     return 1;
    251 }
    252 
    253 #ifndef __WIN32OS2__
    254 /******************************************************************************
    255  *      SysFreeString16 [OLE2DISP.6]
     252
     253#ifndef __WIN32OS2__
     254/******************************************************************************
     255 *              SysFreeString16 [OLE2DISP.6]
    256256 */
    257257void WINAPI SysFreeString16(BSTR16 in)
    258258{
    259     BSTR_Free(in);
    260 }
    261 #endif
    262 
    263 /******************************************************************************
    264  *      SysFreeString   [OLEAUT32.6]
     259        BSTR_Free(in);
     260}
     261#endif
     262
     263/******************************************************************************
     264 *              SysFreeString   [OLEAUT32.6]
    265265 */
    266266void WINAPI SysFreeString(BSTR in)
    267267{
    268268    DWORD* bufferPointer;
    269 
     269   
    270270    /* NULL is a valid parameter */
    271271    if(!in) return;
     
    288288#ifndef __WIN32OS2__
    289289/******************************************************************************
    290  *      SysStringLen16  [OLE2DISP.7]
     290 *              SysStringLen16  [OLE2DISP.7]
    291291 */
    292292int WINAPI SysStringLen16(BSTR16 str)
    293293{
    294     return strlen(BSTR_GetAddr(str));
     294        return strlen(BSTR_GetAddr(str));
    295295}
    296296#endif
     
    310310     if (!str) return 0;
    311311    /*
    312      * The length of the string (in bytes) is contained in a DWORD placed
     312     * The length of the string (in bytes) is contained in a DWORD placed 
    313313     * just before the BSTR pointer
    314314     */
     
    334334     if (!str) return 0;
    335335    /*
    336      * The length of the string (in bytes) is contained in a DWORD placed
     336     * The length of the string (in bytes) is contained in a DWORD placed 
    337337     * just before the BSTR pointer
    338338     */
     
    349349 */
    350350HRESULT 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;
     351        INTERFACEDATA *pidata,
     352        LCID lcid,
     353        ITypeInfo **pptinfo)
     354{
     355        FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
     356        return 0;
    357357}
    358358#endif
     
    362362 */
    363363HRESULT 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;
     364        INTERFACEDATA *pidata,
     365        LCID lcid,
     366        ITypeInfo **pptinfo)
     367{
     368        FIXME("(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
     369        return 0;
    370370}
    371371
     
    377377        IUnknown* punkOuter,
    378378        void* pvThis,
    379     ITypeInfo* ptinfo,
    380     IUnknown** ppunkStdDisp)
    381 {
    382     FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,
     379        ITypeInfo* ptinfo,
     380        IUnknown** ppunkStdDisp)
     381{
     382        FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,
    383383               ppunkStdDisp);
    384     return 0;
     384        return 0;
    385385}
    386386#endif
     
    392392        IUnknown* punkOuter,
    393393        void* pvThis,
    394     ITypeInfo* ptinfo,
    395     IUnknown** ppunkStdDisp)
    396 {
    397     FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,
     394        ITypeInfo* ptinfo,
     395        IUnknown** ppunkStdDisp)
     396{
     397        FIXME("(%p,%p,%p,%p),stub\n",punkOuter, pvThis, ptinfo,
    398398               ppunkStdDisp);
    399     return 0;
     399        return 0;
    400400}
    401401
     
    405405 */
    406406HRESULT WINAPI RegisterActiveObject16(
    407     IUnknown *punk, REFCLSID rclsid, DWORD dwFlags, unsigned long *pdwRegister
     407        IUnknown *punk, REFCLSID rclsid, DWORD dwFlags, unsigned long *pdwRegister
    408408) {
    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]
     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]
    416416 *
    417417 * Converts an OLE_COLOR to a COLORREF.
    418418 * See the documentation for conversion rules.
    419  * pColorRef can be NULL. In that case the user only wants to test the
     419 * pColorRef can be NULL. In that case the user only wants to test the 
    420420 * conversion.
    421421 */
  • trunk/src/oleaut32/oleaut.c

    r6689 r6711  
    11/*
    2  *  OLEAUT32
     2 *      OLEAUT32
    33 *
    44 */
     
    1717DEFAULT_DEBUG_CHANNEL(ole);
    1818
    19 static WCHAR    _delimiter[2] = {'!',0}; /* default delimiter apparently */
    20 static WCHAR    *pdelimiter = &_delimiter[0];
     19static WCHAR    _delimiter[2] = {'!',0}; /* default delimiter apparently */
     20static WCHAR    *pdelimiter = &_delimiter[0];
    2121
    2222/***********************************************************************
    23  *      RegisterActiveObject (OLEAUT32.33)
     23 *              RegisterActiveObject (OLEAUT32.33)
    2424 */
    2525HRESULT WINAPI RegisterActiveObject(
    26     LPUNKNOWN punk,REFCLSID rcid,DWORD dwFlags,LPDWORD pdwRegister
     26        LPUNKNOWN punk,REFCLSID rcid,DWORD dwFlags,LPDWORD pdwRegister
    2727) {
    28     WCHAR           guidbuf[80];
    29     HRESULT         ret;
    30     LPRUNNINGOBJECTTABLE    runobtable;
    31     LPMONIKER       moniker;
     28        WCHAR                   guidbuf[80];
     29        HRESULT                 ret;
     30        LPRUNNINGOBJECTTABLE    runobtable;
     31        LPMONIKER               moniker;
    3232
    33     StringFromGUID2(rcid,guidbuf,39);
     33        StringFromGUID2(rcid,guidbuf,39);
    3434#ifdef __WIN32OS2__
    3535        dprintf(("RegisterActiveObject %x %ls (%x) %x %x", punk, guidbuf, rcid, dwFlags, pdwRegister));
    3636#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;
     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;
    4949}
    5050
    5151/***********************************************************************
    52  *      RevokeActiveObject (OLEAUT32.34)
     52 *              RevokeActiveObject (OLEAUT32.34)
    5353 */
    5454HRESULT WINAPI RevokeActiveObject(DWORD xregister,LPVOID reserved)
    5555{
    56     LPRUNNINGOBJECTTABLE    runobtable;
    57     HRESULT         ret;
     56        LPRUNNINGOBJECTTABLE    runobtable;
     57        HRESULT                 ret;
    5858
    5959#ifdef __WIN32OS2__
     
    6161#endif
    6262
    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;
     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;
    6969}
    7070
    7171/***********************************************************************
    72  *      GetActiveObject (OLEAUT32.35)
     72 *              GetActiveObject (OLEAUT32.35)
    7373 */
    7474HRESULT WINAPI GetActiveObject(REFCLSID rcid,LPVOID preserved,LPUNKNOWN *ppunk)
    7575{
    76     WCHAR           guidbuf[80];
    77     HRESULT         ret;
    78     LPRUNNINGOBJECTTABLE    runobtable;
    79     LPMONIKER       moniker;
     76        WCHAR                   guidbuf[80];
     77        HRESULT                 ret;
     78        LPRUNNINGOBJECTTABLE    runobtable;
     79        LPMONIKER               moniker;
    8080
    81     StringFromGUID2(rcid,guidbuf,39);
     81        StringFromGUID2(rcid,guidbuf,39);
    8282#ifdef __WIN32OS2__
    8383        dprintf(("GetActiveObject %ls (%x) %x %x", guidbuf, rcid, preserved, ppunk));
    8484#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;
     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;
    9797}
    9898
     
    101101 *
    102102 * 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
     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
    111111 */
    112112UINT WINAPI OaBuildVersion()
     
    120120    {
    121121    case 0x80000a03:  /* WIN31 */
    122         return MAKELONG(4049, 20); /* from Win32s 1.1e */
     122                return MAKELONG(4049, 20); /* from Win32s 1.1e */
    123123    case 0x80000004:  /* WIN95 */
    124         return MAKELONG(4265, 30);
     124                return MAKELONG(4265, 30);
    125125    case 0x80000a04:  /* WIN98 */
    126         return MAKELONG(4275, 40); /* value of W98 SE; orig. W98 AFAIK has 4265, 30 just as W95 */
     126                return MAKELONG(4275, 40); /* value of W98 SE; orig. W98 AFAIK has 4265, 30 just as W95 */
    127127    case 0x00003303:  /* NT351 */
    128         return MAKELONG(4265, 30); /* value borrowed from Win95 */
     128                return MAKELONG(4265, 30); /* value borrowed from Win95 */
    129129    case 0x00000004:  /* NT40 */
    130130#ifdef __WIN32OS2__
    131131                return 0x2810b5; //returned by NT4, SP6
    132132#else
    133         return MAKELONG(4122, 20); /* ouch ! Quite old, I guess */
     133                return MAKELONG(4122, 20); /* ouch ! Quite old, I guess */
    134134#endif
    135135    default:
    136         ERR("Version value not known yet. Please investigate it !\n");
    137         return 0x0;
     136                ERR("Version value not known yet. Please investigate it !\n");
     137                return 0x0;
    138138    }
    139139}
     
    141141#ifndef __WIN32OS2__
    142142/***********************************************************************
    143  *      DllRegisterServer
     143 *              DllRegisterServer
    144144 */
    145 HRESULT WINAPI OLEAUT32_DllRegisterServer() {
     145HRESULT WINAPI OLEAUT32_DllRegisterServer() { 
    146146    FIXME("stub!\n");
    147147    return S_OK;
     
    149149
    150150/***********************************************************************
    151  *      DllUnregisterServer
     151 *              DllUnregisterServer
    152152 */
    153153HRESULT WINAPI OLEAUT32_DllUnregisterServer() {
  • trunk/src/oleaut32/olefont.c

    r6689 r6711  
    4646{
    4747  /*
    48    * This class supports many interfaces. IUnknown, IFont,
     48   * This class supports many interfaces. IUnknown, IFont, 
    4949   * IDispatch, IDispFont IPersistStream and IConnectionPointContainer.
    5050   * The first two are supported by the first vtable, the next two are
     
    8585
    8686/*
    87  * Here, I define utility macros to help with the casting of the
     87 * Here, I define utility macros to help with the casting of the 
    8888 * "this" parameter.
    8989 * There is a version to accomodate all of the VTables implemented
     
    9191 */
    9292#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*));
     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*)); 
    9696
    9797
     
    134134 * interface
    135135 */
    136 static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(IDispatch* iface,
    137                             REFIID     riid,
    138                             VOID**     ppvoid);
     136static HRESULT WINAPI OLEFontImpl_IDispatch_QueryInterface(IDispatch* iface, 
     137                                                    REFIID     riid,
     138                                                    VOID**     ppvoid);
    139139static ULONG   WINAPI OLEFontImpl_IDispatch_AddRef(IDispatch* iface);
    140140static 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);
     141static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(IDispatch*    iface, 
     142                                                   unsigned int* pctinfo);
     143static HRESULT WINAPI OLEFontImpl_GetTypeInfo(IDispatch*  iface, 
     144                                              UINT      iTInfo,
     145                                              LCID        lcid,
     146                                              ITypeInfo** ppTInfo);
    147147static HRESULT WINAPI OLEFontImpl_GetIDsOfNames(IDispatch*  iface,
    148                             REFIID      riid,
    149                             LPOLESTR* rgszNames,
    150                             UINT      cNames,
    151                             LCID        lcid,
    152                             DISPID*     rgDispId);
     148                                                REFIID      riid,
     149                                                LPOLESTR* rgszNames,
     150                                                UINT      cNames,
     151                                                LCID        lcid,
     152                                                DISPID*     rgDispId);
    153153static 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);
     154                                         DISPID      dispIdMember,
     155                                         REFIID      riid,
     156                                         LCID        lcid,
     157                                         WORD        wFlags,
     158                                         DISPPARAMS* pDispParams,
     159                                         VARIANT*    pVarResult,
     160                                         EXCEPINFO*  pExepInfo,
     161                                         UINT*     puArgErr);
    162162
    163163/***********************************************************************
     
    165165 * interface
    166166 */
    167 static HRESULT WINAPI OLEFontImpl_IPersistStream_QueryInterface(IPersistStream* iface,
    168                             REFIID     riid,
    169                             VOID**     ppvoid);
     167static HRESULT WINAPI OLEFontImpl_IPersistStream_QueryInterface(IPersistStream* iface, 
     168                                                    REFIID     riid,
     169                                                    VOID**     ppvoid);
    170170static ULONG   WINAPI OLEFontImpl_IPersistStream_AddRef(IPersistStream* iface);
    171171static ULONG   WINAPI OLEFontImpl_IPersistStream_Release(IPersistStream* iface);
    172 static HRESULT WINAPI OLEFontImpl_GetClassID(IPersistStream* iface,
    173                          CLSID*                pClassID);
     172static HRESULT WINAPI OLEFontImpl_GetClassID(IPersistStream* iface, 
     173                                             CLSID*                pClassID);
    174174static HRESULT WINAPI OLEFontImpl_IsDirty(IPersistStream*  iface);
    175175static HRESULT WINAPI OLEFontImpl_Load(IPersistStream*  iface,
    176                        IStream*         pLoadStream);
     176                                       IStream*         pLoadStream);
    177177static HRESULT WINAPI OLEFontImpl_Save(IPersistStream*  iface,
    178                        IStream*         pOutStream,
    179                        BOOL             fClearDirty);
     178                                       IStream*         pOutStream,
     179                                       BOOL             fClearDirty);
    180180static HRESULT WINAPI OLEFontImpl_GetSizeMax(IPersistStream*  iface,
    181                          ULARGE_INTEGER*  pcbSize);
     181                                             ULARGE_INTEGER*  pcbSize);
    182182
    183183/***********************************************************************
     
    186186 */
    187187static HRESULT WINAPI OLEFontImpl_IConnectionPointContainer_QueryInterface(
    188                         IConnectionPointContainer* iface,
    189                         REFIID     riid,
    190                         VOID**     ppvoid);
     188                                            IConnectionPointContainer* iface,
     189                                            REFIID     riid,
     190                                            VOID**     ppvoid);
    191191static ULONG   WINAPI OLEFontImpl_IConnectionPointContainer_AddRef(
    192                         IConnectionPointContainer* iface);
     192                                            IConnectionPointContainer* iface);
    193193static ULONG   WINAPI OLEFontImpl_IConnectionPointContainer_Release(
    194                         IConnectionPointContainer* iface);
     194                                            IConnectionPointContainer* iface);
    195195static HRESULT WINAPI OLEFontImpl_EnumConnectionPoints(
    196                         IConnectionPointContainer* iface,
    197                         IEnumConnectionPoints **ppEnum);
     196                                            IConnectionPointContainer* iface,
     197                                            IEnumConnectionPoints **ppEnum);
    198198static HRESULT WINAPI OLEFontImpl_FindConnectionPoint(
    199                         IConnectionPointContainer* iface,
    200                         REFIID riid,
    201                         IConnectionPoint **ppCp);
     199                                            IConnectionPointContainer* iface,
     200                                            REFIID riid,
     201                                            IConnectionPoint **ppCp);
    202202
    203203/*
     
    227227  OLEFontImpl_put_Charset,
    228228  OLEFontImpl_get_hFont,
    229   OLEFontImpl_Clone,
     229  OLEFontImpl_Clone, 
    230230  OLEFontImpl_IsEqual,
    231231  OLEFontImpl_SetRatio,
     
    273273
    274274/******************************************************************************
    275  *      OleCreateFontIndirect   [OLEAUT32.420]
     275 *              OleCreateFontIndirect   [OLEAUT32.420]
    276276 */
    277277HRESULT WINAPI OleCreateFontIndirect(
     
    331331
    332332  IConnectionPoint_EnumConnections(this->pCP, &pEnum);
    333 
     333 
    334334  while(IEnumConnections_Next(pEnum, 1, &CD, NULL) == S_OK) {
    335335    IPropertyNotifySink *sink;
     
    343343  return;
    344344}
    345 
     345 
    346346/************************************************************************
    347347 * OLEFontImpl_Construct
     
    364364  if (newObject==0)
    365365    return newObject;
    366 
     366 
    367367  /*
    368368   * Initialize the virtual function table.
     
    372372  newObject->lpvtbl3 = &OLEFontImpl_IPersistStream_VTable;
    373373  newObject->lpvtbl4 = &OLEFontImpl_IConnectionPointContainer_VTable;
    374 
    375   /*
    376    * Start with one reference count. The caller of this function
     374 
     375  /*
     376   * Start with one reference count. The caller of this function 
    377377   * must release the interface pointer when it is done.
    378378   */
     
    386386  newObject->description.cbSizeofstruct = sizeof(FONTDESC);
    387387  newObject->description.lpstrName = HeapAlloc(GetProcessHeap(),
    388                            0,
    389                            (lstrlenW(fontDesc->lpstrName)+1) * sizeof(WCHAR));
     388                                               0,
     389                                               (lstrlenW(fontDesc->lpstrName)+1) * sizeof(WCHAR));
    390390  strcpyW(newObject->description.lpstrName, fontDesc->lpstrName);
    391391  newObject->description.cySize         = fontDesc->cySize;
     
    448448  if ( (this==0) || (ppvObject==0) )
    449449    return E_INVALIDARG;
    450 
     450 
    451451  /*
    452452   * Initialize the return parameter.
    453453   */
    454454  *ppvObject = 0;
    455 
     455 
    456456  /*
    457457   * Compare the riid with the interface IDs implemented by this object.
    458458   */
    459   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
     459  if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 
    460460  {
    461461    *ppvObject = (IFont*)this;
    462462  }
    463   else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0)
     463  else if (memcmp(&IID_IFont, riid, sizeof(IID_IFont)) == 0) 
    464464  {
    465465    *ppvObject = (IFont*)this;
    466466  }
    467   else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0)
     467  else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 
    468468  {
    469469    *ppvObject = (IDispatch*)&(this->lpvtbl2);
    470470  }
    471   else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0)
     471  else if (memcmp(&IID_IFontDisp, riid, sizeof(IID_IFontDisp)) == 0) 
    472472  {
    473473    *ppvObject = (IDispatch*)&(this->lpvtbl2);
    474474  }
    475   else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0)
     475  else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 
    476476  {
    477477    *ppvObject = (IPersistStream*)&(this->lpvtbl3);
    478478  }
    479479  else if (memcmp(&IID_IConnectionPointContainer, riid,
    480           sizeof(IID_IConnectionPointContainer)) == 0)
     480                  sizeof(IID_IConnectionPointContainer)) == 0)
    481481  {
    482482    *ppvObject = (IPersistStream*)&(this->lpvtbl4);
    483483  }
    484 
     484 
    485485  /*
    486486   * Check that we obtained an interface.
     
    491491    return E_NOINTERFACE;
    492492  }
    493 
     493 
    494494  /*
    495495   * Query Interface always increases the reference count by one when it is
     
    500500  return S_OK;;
    501501}
    502 
     502       
    503503/************************************************************************
    504504 * OLEFontImpl_AddRef (IUnknown)
     
    506506 * See Windows documentation for more details on IUnknown methods.
    507507 */
    508 ULONG WINAPI OLEFontImpl_AddRef(
     508ULONG WINAPI OLEFontImpl_AddRef( 
    509509  IFont* iface)
    510510{
     
    515515  return this->ref;
    516516}
    517 
     517       
    518518/************************************************************************
    519519 * OLEFontImpl_Release (IUnknown)
     
    521521 * See Windows documentation for more details on IUnknown methods.
    522522 */
    523 ULONG WINAPI OLEFontImpl_Release(
     523ULONG WINAPI OLEFontImpl_Release( 
    524524      IFont* iface)
    525525{
     
    541541    return 0;
    542542  }
    543 
     543 
    544544  return this->ref;
    545545}
    546 
     546       
    547547/************************************************************************
    548548 * OLEFontImpl_get_Name (IFont)
     
    551551 */
    552552static HRESULT WINAPI OLEFontImpl_get_Name(
    553   IFont*  iface,
     553  IFont*  iface, 
    554554  BSTR* pname)
    555555{
     
    576576 */
    577577static HRESULT WINAPI OLEFontImpl_put_Name(
    578   IFont* iface,
     578  IFont* iface, 
    579579  BSTR name)
    580580{
     
    585585  {
    586586    this->description.lpstrName = HeapAlloc(GetProcessHeap(),
    587                         0,
    588                         (lstrlenW(name)+1) * sizeof(WCHAR));
     587                                            0,
     588                                            (lstrlenW(name)+1) * sizeof(WCHAR));
    589589  }
    590590  else
    591591  {
    592592    this->description.lpstrName = HeapReAlloc(GetProcessHeap(),
    593                           0,
    594                           this->description.lpstrName,
    595                           (lstrlenW(name)+1) * sizeof(WCHAR));
     593                                              0,
     594                                              this->description.lpstrName,
     595                                              (lstrlenW(name)+1) * sizeof(WCHAR));
    596596  }
    597597
     
    611611 */
    612612static HRESULT WINAPI OLEFontImpl_get_Size(
    613   IFont* iface,
     613  IFont* iface, 
    614614  CY*    psize)
    615615{
     
    635635 */
    636636static HRESULT WINAPI OLEFontImpl_put_Size(
    637   IFont* iface,
     637  IFont* iface, 
    638638  CY     size)
    639639{
     
    653653 */
    654654static HRESULT WINAPI OLEFontImpl_get_Bold(
    655   IFont*  iface,
     655  IFont*  iface, 
    656656  BOOL* pbold)
    657657{
     
    692692 */
    693693static HRESULT WINAPI OLEFontImpl_get_Italic(
    694   IFont*  iface,
     694  IFont*  iface, 
    695695  BOOL* pitalic)
    696696{
     
    714714 */
    715715static HRESULT WINAPI OLEFontImpl_put_Italic(
    716   IFont* iface,
     716  IFont* iface, 
    717717  BOOL italic)
    718718{
     
    732732 */
    733733static HRESULT WINAPI OLEFontImpl_get_Underline(
    734   IFont*  iface,
     734  IFont*  iface, 
    735735  BOOL* punderline)
    736736{
     
    773773 */
    774774static HRESULT WINAPI OLEFontImpl_get_Strikethrough(
    775   IFont*  iface,
     775  IFont*  iface, 
    776776  BOOL* pstrikethrough)
    777777{
     
    796796 */
    797797static HRESULT WINAPI OLEFontImpl_put_Strikethrough(
    798  IFont* iface,
     798 IFont* iface, 
    799799 BOOL strikethrough)
    800800{
     
    814814 */
    815815static HRESULT WINAPI OLEFontImpl_get_Weight(
    816   IFont* iface,
     816  IFont* iface, 
    817817  short* pweight)
    818818{
     
    837837 */
    838838static HRESULT WINAPI OLEFontImpl_put_Weight(
    839   IFont* iface,
     839  IFont* iface, 
    840840  short  weight)
    841841{
     
    855855 */
    856856static HRESULT WINAPI OLEFontImpl_get_Charset(
    857   IFont* iface,
     857  IFont* iface, 
    858858  short* pcharset)
    859859{
     
    878878 */
    879879static HRESULT WINAPI OLEFontImpl_put_Charset(
    880   IFont* iface,
     880  IFont* iface, 
    881881  short charset)
    882882{
     
    912912    INT      fontHeight;
    913913    CY       cySize;
    914 
     914   
    915915    /*
    916916     * The height of the font returned by the get_Size property is the
     
    982982   */
    983983  newObject->description.lpstrName = HeapAlloc(
    984     GetProcessHeap(),0,
    985     (1+strlenW(this->description.lpstrName))*2
     984        GetProcessHeap(),0,
     985        (1+strlenW(this->description.lpstrName))*2
    986986  );
    987987  /* We need to clone the HFONT too. This is just cut & paste from above */
     
    994994
    995995  logFont.lfHeight          = ((fontHeight%10000L)>5000L) ? (-fontHeight/10000L)-1 :
    996                                 (-fontHeight/10000L);
     996                                                            (-fontHeight/10000L);
    997997  logFont.lfItalic          = this->description.fItalic;
    998998  logFont.lfUnderline       = this->description.fUnderline;
     
    10231023 */
    10241024static HRESULT WINAPI OLEFontImpl_IsEqual(
    1025   IFont* iface,
     1025  IFont* iface, 
    10261026  IFont* pFontOther)
    10271027{
     
    10551055 */
    10561056static HRESULT      WINAPI OLEFontImpl_QueryTextMetrics(
    1057   IFont*         iface,
     1057  IFont*         iface, 
    10581058  TEXTMETRICOLE* ptm)
    10591059{
     
    10681068 */
    10691069static HRESULT WINAPI OLEFontImpl_AddRefHfont(
    1070   IFont*  iface,
     1070  IFont*  iface, 
    10711071  HFONT hfont)
    10721072{
     
    11071107  {
    11081108    DeleteObject(this->gdiFont);
    1109     this->gdiFont = 0;
     1109    this->gdiFont = 0; 
    11101110  }
    11111111
     
    11741174 */
    11751175static HRESULT WINAPI OLEFontImpl_GetTypeInfoCount(
    1176   IDispatch*    iface,
     1176  IDispatch*    iface, 
    11771177  unsigned int* pctinfo)
    11781178{
     
    11891189 */
    11901190static HRESULT WINAPI OLEFontImpl_GetTypeInfo(
    1191   IDispatch*  iface,
     1191  IDispatch*  iface, 
    11921192  UINT      iTInfo,
    1193   LCID        lcid,
     1193  LCID        lcid, 
    11941194  ITypeInfo** ppTInfo)
    11951195{
     
    12071207static HRESULT WINAPI OLEFontImpl_GetIDsOfNames(
    12081208  IDispatch*  iface,
    1209   REFIID      riid,
    1210   LPOLESTR* rgszNames,
    1211   UINT      cNames,
     1209  REFIID      riid, 
     1210  LPOLESTR* rgszNames, 
     1211  UINT      cNames, 
    12121212  LCID        lcid,
    12131213  DISPID*     rgDispId)
     
    12261226static HRESULT WINAPI OLEFontImpl_Invoke(
    12271227  IDispatch*  iface,
    1228   DISPID      dispIdMember,
    1229   REFIID      riid,
    1230   LCID        lcid,
     1228  DISPID      dispIdMember, 
     1229  REFIID      riid, 
     1230  LCID        lcid, 
    12311231  WORD        wFlags,
    12321232  DISPPARAMS* pDispParams,
    1233   VARIANT*    pVarResult,
     1233  VARIANT*    pVarResult, 
    12341234  EXCEPINFO*  pExepInfo,
    12351235  UINT*     puArgErr)
     
    12891289 */
    12901290static HRESULT WINAPI OLEFontImpl_GetClassID(
    1291   IPersistStream* iface,
     1291  IPersistStream* iface, 
    12921292  CLSID*                pClassID)
    12931293{
     
    13431343
    13441344  _ICOM_THIS_From_IPersistStream(OLEFontImpl, iface);
    1345 
     1345 
    13461346  /*
    13471347   * Read the version byte
     
    13721372  this->description.fStrikethrough = (bAttributes & FONTPERSIST_STRIKETHROUGH) != 0;
    13731373  this->description.fUnderline     = (bAttributes & FONTPERSIST_UNDERLINE) != 0;
    1374 
     1374   
    13751375  /*
    13761376   * Weight
     
    14081408    HeapFree(GetProcessHeap(), 0, this->description.lpstrName);
    14091409
    1410   this->description.lpstrName = HEAP_strdupAtoW(GetProcessHeap(),
    1411                             HEAP_ZERO_MEMORY,
    1412                             readBuffer);
     1410  this->description.lpstrName = HEAP_strdupAtoW(GetProcessHeap(), 
     1411                                                    HEAP_ZERO_MEMORY,
     1412                                                    readBuffer);
    14131413
    14141414  return S_OK;
     
    14301430  BYTE  bAttributes;
    14311431  BYTE  bStringSize;
    1432 
     1432 
    14331433  _ICOM_THIS_From_IPersistStream(OLEFontImpl, iface);
    14341434
     
    14591459  if (this->description.fStrikethrough)
    14601460    bAttributes |= FONTPERSIST_STRIKETHROUGH;
    1461 
     1461 
    14621462  if (this->description.fUnderline)
    14631463    bAttributes |= FONTPERSIST_UNDERLINE;
     
    14671467  if (cbWritten!=1)
    14681468    return E_FAIL;
    1469 
     1469 
    14701470  /*
    14711471   * Weight
     
    14991499  if (bStringSize!=0)
    15001500  {
    1501     writeBuffer = HEAP_strdupWtoA(GetProcessHeap(),
    1502                   HEAP_ZERO_MEMORY,
    1503                   this->description.lpstrName);
     1501    writeBuffer = HEAP_strdupWtoA(GetProcessHeap(), 
     1502                                  HEAP_ZERO_MEMORY,
     1503                                  this->description.lpstrName);
    15041504
    15051505    if (writeBuffer==0)
     
    15071507
    15081508    IStream_Write(pOutStream, writeBuffer, bStringSize, &cbWritten);
    1509 
     1509   
    15101510    HeapFree(GetProcessHeap(), 0, writeBuffer);
    15111511
     
    16201620  if(memcmp(riid, &IID_IPropertyNotifySink, sizeof(IID_IPropertyNotifySink)) == 0) {
    16211621    return IConnectionPoint_QueryInterface(this->pCP, &IID_IConnectionPoint,
    1622                        (LPVOID)ppCp);
     1622                                           (LPVOID)ppCp);
    16231623  } else {
    16241624    FIXME("Tried to find connection point on %s\n", debugstr_guid(riid));
     
    16371637} IClassFactoryImpl;
    16381638
    1639 static HRESULT WINAPI
     1639static HRESULT WINAPI 
    16401640SFCF_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;
     1641        ICOM_THIS(IClassFactoryImpl,iface);
     1642
     1643        FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
     1644        return E_NOINTERFACE;
    16451645}
    16461646
    16471647static ULONG WINAPI
    16481648SFCF_AddRef(LPCLASSFACTORY iface) {
    1649     ICOM_THIS(IClassFactoryImpl,iface);
    1650     return ++(This->ref);
     1649        ICOM_THIS(IClassFactoryImpl,iface);
     1650        return ++(This->ref);
    16511651}
    16521652
    16531653static ULONG WINAPI SFCF_Release(LPCLASSFACTORY iface) {
    1654     ICOM_THIS(IClassFactoryImpl,iface);
    1655     /* static class, won't be  freed */
    1656     return --(This->ref);
     1654        ICOM_THIS(IClassFactoryImpl,iface);
     1655        /* static class, won't be  freed */
     1656        return --(This->ref);
    16571657}
    16581658
    16591659static HRESULT WINAPI SFCF_CreateInstance(
    1660     LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj
     1660        LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj
    16611661) {
    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;
     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;
    16831683}
    16841684
    16851685static 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;
     1686        ICOM_THIS(IClassFactoryImpl,iface);
     1687        FIXME("(%p)->(%d),stub!\n",This,dolock);
     1688        return S_OK;
    16891689}
    16901690
    16911691static 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
     1692        ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
     1693        SFCF_QueryInterface,
     1694        SFCF_AddRef,
     1695        SFCF_Release,
     1696        SFCF_CreateInstance,
     1697        SFCF_LockServer
    16981698};
    16991699static IClassFactoryImpl STDFONT_CF = {&SFCF_Vtbl, 1 };
  • trunk/src/oleaut32/olepicture.c

    r6689 r6711  
    5050#ifdef HAVE_LIBJPEG
    5151/* This is a hack, so jpeglib.h does not redefine INT32 and the like*/
    52 #define XMD_H
     52#define XMD_H 
    5353#ifdef HAVE_JPEGLIB_H
    5454# include <jpeglib.h>
     
    9090  /* We own the object and must destroy it ourselves */
    9191    BOOL fOwn;
    92 
     92 
    9393  /* Picture description */
    9494    PICTDESC desc;
     
    105105
    106106    BOOL keepOrigFormat;
    107     HDC hDCCur;
     107    HDC hDCCur;
    108108} OLEPictureImpl;
    109109
     
    174174  if (newObject==0)
    175175    return newObject;
    176 
     176 
    177177  /*
    178178   * Initialize the virtual function table.
     
    186186
    187187  /*
    188    * Start with one reference count. The caller of this function
     188   * Start with one reference count. The caller of this function 
    189189   * must release the interface pointer when it is done.
    190190   */
    191   newObject->ref    = 1;
    192   newObject->hDCCur = 0;
    193 
    194   newObject->fOwn   = fOwn;
     191  newObject->ref        = 1;
     192  newObject->hDCCur     = 0;
     193
     194  newObject->fOwn       = fOwn;
    195195
    196196  /* dunno about original value */
     
    199199  if (pictDesc) {
    200200      if(pictDesc->cbSizeofstruct != sizeof(PICTDESC)) {
    201       FIXME("struct size = %d\n", pictDesc->cbSizeofstruct);
     201          FIXME("struct size = %d\n", pictDesc->cbSizeofstruct);
    202202      }
    203203      memcpy(&newObject->desc, pictDesc, sizeof(PICTDESC));
     
    206206      switch(pictDesc->picType) {
    207207      case PICTYPE_BITMAP:
    208     OLEPictureImpl_SetBitmap(newObject);
    209     break;
     208        OLEPictureImpl_SetBitmap(newObject);
     209        break;
    210210
    211211      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;
     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;
    216216
    217217      case PICTYPE_ICON:
    218218      case PICTYPE_ENHMETAFILE:
    219219      default:
    220     FIXME("Unsupported type %d\n", pictDesc->picType);
    221     newObject->himetricWidth = newObject->himetricHeight = 0;
    222     break;
     220        FIXME("Unsupported type %d\n", pictDesc->picType);
     221        newObject->himetricWidth = newObject->himetricHeight = 0;
     222        break;
    223223      }
    224224  } else {
    225225      newObject->desc.picType = PICTYPE_UNINITIALIZED;
    226226  }
    227 
     227   
    228228  TRACE("returning %p\n", newObject);
    229229  return newObject;
     
    237237 * this object.  */
    238238static void OLEPictureImpl_Destroy(OLEPictureImpl* Obj)
    239 {
     239{ 
    240240  TRACE("(%p)\n", Obj);
    241241
     
    282282  if ( (This==0) || (ppvObject==0) )
    283283    return E_INVALIDARG;
    284 
     284 
    285285  /*
    286286   * Initialize the return parameter.
    287287   */
    288288  *ppvObject = 0;
    289 
     289 
    290290  /*
    291291   * Compare the riid with the interface IDs implemented by this object.
    292292   */
    293   if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0)
     293  if (memcmp(&IID_IUnknown, riid, sizeof(IID_IUnknown)) == 0) 
    294294  {
    295295    *ppvObject = (IPicture*)This;
    296296  }
    297   else if (memcmp(&IID_IPicture, riid, sizeof(IID_IPicture)) == 0)
     297  else if (memcmp(&IID_IPicture, riid, sizeof(IID_IPicture)) == 0) 
    298298  {
    299299    *ppvObject = (IPicture*)This;
    300300  }
    301   else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0)
     301  else if (memcmp(&IID_IDispatch, riid, sizeof(IID_IDispatch)) == 0) 
    302302  {
    303303    *ppvObject = (IDispatch*)&(This->lpvtbl2);
    304304  }
    305   else if (memcmp(&IID_IPictureDisp, riid, sizeof(IID_IPictureDisp)) == 0)
     305  else if (memcmp(&IID_IPictureDisp, riid, sizeof(IID_IPictureDisp)) == 0) 
    306306  {
    307307    *ppvObject = (IDispatch*)&(This->lpvtbl2);
    308308  }
    309   else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0)
     309  else if (memcmp(&IID_IPersistStream, riid, sizeof(IID_IPersistStream)) == 0) 
    310310  {
    311311  *ppvObject = (IPersistStream*)&(This->lpvtbl3);
    312312  }
    313   else if (memcmp(&IID_IConnectionPointContainer, riid, sizeof(IID_IConnectionPointContainer)) == 0)
     313  else if (memcmp(&IID_IConnectionPointContainer, riid, sizeof(IID_IConnectionPointContainer)) == 0) 
    314314  {
    315315  *ppvObject = (IConnectionPointContainer*)&(This->lpvtbl4);
     
    323323    return E_NOINTERFACE;
    324324  }
    325 
     325 
    326326  /*
    327327   * Query Interface always increases the reference count by one when it is
     
    362362 * See Windows documentation for more details on IUnknown methods.
    363363 */
    364 static ULONG WINAPI OLEPictureImpl_AddRef(
     364static ULONG WINAPI OLEPictureImpl_AddRef( 
    365365  IPicture* iface)
    366366{
     
    371371  return This->ref;
    372372}
    373 
     373       
    374374/************************************************************************
    375375 * OLEPictureImpl_Release (IUnknown)
     
    377377 * See Windows documentation for more details on IUnknown methods.
    378378 */
    379 static ULONG WINAPI OLEPictureImpl_Release(
     379static ULONG WINAPI OLEPictureImpl_Release( 
    380380      IPicture* iface)
    381381{
     
    397397    return 0;
    398398  }
    399 
     399 
    400400  return This->ref;
    401401}
     
    404404/************************************************************************
    405405 * OLEPictureImpl_get_Handle
    406  */
     406 */ 
    407407static HRESULT WINAPI OLEPictureImpl_get_Handle(IPicture *iface,
    408                         OLE_HANDLE *phandle)
     408                                                OLE_HANDLE *phandle)
    409409{
    410410  ICOM_THIS(OLEPictureImpl, iface);
     
    433433/************************************************************************
    434434 * OLEPictureImpl_get_hPal
    435  */
     435 */ 
    436436static HRESULT WINAPI OLEPictureImpl_get_hPal(IPicture *iface,
    437                           OLE_HANDLE *phandle)
     437                                              OLE_HANDLE *phandle)
    438438{
    439439  ICOM_THIS(OLEPictureImpl, iface);
     
    444444/************************************************************************
    445445 * OLEPictureImpl_get_Type
    446  */
     446 */ 
    447447static HRESULT WINAPI OLEPictureImpl_get_Type(IPicture *iface,
    448                           short *ptype)
     448                                              short *ptype)
    449449{
    450450  ICOM_THIS(OLEPictureImpl, iface);
     
    456456/************************************************************************
    457457 * OLEPictureImpl_get_Width
    458  */
     458 */ 
    459459static HRESULT WINAPI OLEPictureImpl_get_Width(IPicture *iface,
    460                            OLE_XSIZE_HIMETRIC *pwidth)
     460                                               OLE_XSIZE_HIMETRIC *pwidth)
    461461{
    462462  ICOM_THIS(OLEPictureImpl, iface);
     
    468468/************************************************************************
    469469 * OLEPictureImpl_get_Height
    470  */
     470 */ 
    471471static HRESULT WINAPI OLEPictureImpl_get_Height(IPicture *iface,
    472                         OLE_YSIZE_HIMETRIC *pheight)
     472                                                OLE_YSIZE_HIMETRIC *pheight)
    473473{
    474474  ICOM_THIS(OLEPictureImpl, iface);
     
    480480/************************************************************************
    481481 * OLEPictureImpl_Render
    482  */
     482 */ 
    483483static 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)
     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)
    490490{
    491491  ICOM_THIS(OLEPictureImpl, iface);
    492492  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);
     493        This, hdc, x, y, cx, cy, xSrc, ySrc, cxSrc, cySrc, prcWBounds);
    494494  if(prcWBounds)
    495495    TRACE("prcWBounds (%d,%d) - (%d,%d)\n", prcWBounds->left, prcWBounds->top,
    496       prcWBounds->right, prcWBounds->bottom);
     496          prcWBounds->right, prcWBounds->bottom);
    497497
    498498  /*
     
    542542/************************************************************************
    543543 * OLEPictureImpl_set_hPal
    544  */
     544 */ 
    545545static HRESULT WINAPI OLEPictureImpl_set_hPal(IPicture *iface,
    546                           OLE_HANDLE hpal)
     546                                              OLE_HANDLE hpal)
    547547{
    548548  ICOM_THIS(OLEPictureImpl, iface);
     
    554554/************************************************************************
    555555 * OLEPictureImpl_get_CurDC
    556  */
     556 */ 
    557557static HRESULT WINAPI OLEPictureImpl_get_CurDC(IPicture *iface,
    558                            HDC *phdc)
     558                                               HDC *phdc)
    559559{
    560560  ICOM_THIS(OLEPictureImpl, iface);
     
    566566/************************************************************************
    567567 * OLEPictureImpl_SelectPicture
    568  */
     568 */ 
    569569static HRESULT WINAPI OLEPictureImpl_SelectPicture(IPicture *iface,
    570                            HDC hdcIn,
    571                            HDC *phdcOut,
    572                            OLE_HANDLE *phbmpOut)
     570                                                   HDC hdcIn,
     571                                                   HDC *phdcOut,
     572                                                   OLE_HANDLE *phbmpOut)
    573573{
    574574  ICOM_THIS(OLEPictureImpl, iface);
     
    578578
    579579      if (phdcOut)
    580       *phdcOut = This->hDCCur;
     580          *phdcOut = This->hDCCur;
    581581      This->hDCCur = hdcIn;
    582582      if (phbmpOut)
    583       *phbmpOut = This->desc.u.bmp.hbitmap;
     583          *phbmpOut = This->desc.u.bmp.hbitmap;
    584584      return S_OK;
    585585  } else {
     
    591591/************************************************************************
    592592 * OLEPictureImpl_get_KeepOriginalFormat
    593  */
     593 */ 
    594594static HRESULT WINAPI OLEPictureImpl_get_KeepOriginalFormat(IPicture *iface,
    595                                 BOOL *pfKeep)
     595                                                            BOOL *pfKeep)
    596596{
    597597  ICOM_THIS(OLEPictureImpl, iface);
     
    605605/************************************************************************
    606606 * OLEPictureImpl_put_KeepOriginalFormat
    607  */
     607 */ 
    608608static HRESULT WINAPI OLEPictureImpl_put_KeepOriginalFormat(IPicture *iface,
    609                                 BOOL keep)
     609                                                            BOOL keep)
    610610{
    611611  ICOM_THIS(OLEPictureImpl, iface);
     
    618618/************************************************************************
    619619 * OLEPictureImpl_PictureChanged
    620  */
     620 */ 
    621621static HRESULT WINAPI OLEPictureImpl_PictureChanged(IPicture *iface)
    622622{
     
    629629/************************************************************************
    630630 * OLEPictureImpl_SaveAsFile
    631  */
     631 */ 
    632632static HRESULT WINAPI OLEPictureImpl_SaveAsFile(IPicture *iface,
    633                         IStream *pstream,
    634                         BOOL SaveMemCopy,
    635                         LONG *pcbSize)
     633                                                IStream *pstream,
     634                                                BOOL SaveMemCopy,
     635                                                LONG *pcbSize)
    636636{
    637637  ICOM_THIS(OLEPictureImpl, iface);
     
    642642/************************************************************************
    643643 * OLEPictureImpl_get_Attributes
    644  */
     644 */ 
    645645static HRESULT WINAPI OLEPictureImpl_get_Attributes(IPicture *iface,
    646                             DWORD *pdwAttr)
     646                                                    DWORD *pdwAttr)
    647647{
    648648  ICOM_THIS(OLEPictureImpl, iface);
     
    650650  *pdwAttr = 0;
    651651  switch (This->desc.picType) {
    652   case PICTYPE_BITMAP:  break;  /* not 'truely' scalable, see MSDN. */
     652  case PICTYPE_BITMAP:  break;  /* not 'truely' scalable, see MSDN. */
    653653  case PICTYPE_ICON: *pdwAttr     = PICTURE_TRANSPARENT;break;
    654654  case PICTYPE_METAFILE: *pdwAttr = PICTURE_TRANSPARENT|PICTURE_SCALABLE;break;
     
    706706  ICOM_THIS_From_IConnectionPointContainer(OLEPictureImpl, iface);
    707707  TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppCP);
    708   if (!ppCP)
     708  if (!ppCP) 
    709709      return E_POINTER;
    710710  *ppCP = NULL;
     
    805805 * Loads the binary data from the IStream. Starts at current position.
    806806 * There appears to be an 2 DWORD header:
    807  *  DWORD magic;
    808  *  DWORD len;
     807 *      DWORD magic;
     808 *      DWORD len;
    809809 *
    810810 * Currently implemented: BITMAP, ICON, JPEG.
    811811 */
    812812static 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;
     813  HRESULT       hr = E_FAIL;
     814  ULONG         xread;
     815  BYTE          *xbuf;
     816  DWORD         header[2];
     817  WORD          magic;
    818818  ICOM_THIS_From_IPersistStream(OLEPictureImpl, iface);
    819819
     
    828828  xbuf = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,header[1]);
    829829  while (xread < header[1]) {
    830     ULONG nread;
     830    ULONG nread; 
    831831    hr = IStream_Read(pStm,xbuf+xread,header[1]-xread,&nread);
    832832    xread+=nread;
     
    841841  case 0xd8ff: { /* JPEG */
    842842#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;
     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;
    852852
    853853    /* This is basically so we can use in-memory data for jpeg decompression.
    854854     * We need to have all the functions.
    855855     */
    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;
     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;
    863863
    864864    jd.err = jpeg_std_error(&jerr);
     
    868868    jpeg_start_decompress(&jd);
    869869    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;
     870        ERR("Jpeg image in stream has bad format, read header returned %d.\n",ret);
     871        HeapFree(GetProcessHeap(),0,xbuf);
     872        return E_FAIL;
    873873    }
    874874    bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(jd.output_height+1)*jd.output_width*jd.output_components);
     
    877877      x = jpeg_read_scanlines(&jd,&samprow,1);
    878878      if (x != 1) {
    879     FIXME("failed to read current scanline?\n");
    880     break;
     879        FIXME("failed to read current scanline?\n");
     880        break;
    881881      }
    882882      memcpy( bits+jd.output_scanline*jd.output_width*jd.output_components,
    883           samprow,
    884               jd.output_width*jd.output_components
     883              samprow,
     884              jd.output_width*jd.output_components
    885885      );
    886886    }
    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;
     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;
    898898
    899899    HeapFree(GetProcessHeap(),0,samprow);
     
    902902    hdcref = GetDC(0);
    903903    This->desc.u.bmp.hbitmap=CreateDIBitmap(
    904         hdcref,
    905         &bmi,
    906         CBM_INIT,
    907         bits,
    908         (BITMAPINFO*)&bmi,
    909         DIB_RGB_COLORS
     904            hdcref,
     905            &bmi,
     906            CBM_INIT,
     907            bits,
     908            (BITMAPINFO*)&bmi,
     909            DIB_RGB_COLORS
    910910    );
    911911    DeleteDC(hdcref);
     
    921921  }
    922922  case 0x4d42: { /* Bitmap */
    923     BITMAPFILEHEADER    *bfh = (BITMAPFILEHEADER*)xbuf;
    924     BITMAPINFO      *bi = (BITMAPINFO*)(bfh+1);
    925     HDC         hdcref;
     923    BITMAPFILEHEADER    *bfh = (BITMAPFILEHEADER*)xbuf;
     924    BITMAPINFO          *bi = (BITMAPINFO*)(bfh+1);
     925    HDC                 hdcref;
    926926
    927927    /* Does not matter whether this is a coreheader or not, we only use
     
    930930    hdcref = GetDC(0);
    931931    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
     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
    938938    );
    939939    DeleteDC(hdcref);
     
    945945  case 0x0000: { /* ICON , first word is dwReserved */
    946946    HICON hicon;
    947     CURSORICONFILEDIR   *cifd = (CURSORICONFILEDIR*)xbuf;
    948     int i;
     947    CURSORICONFILEDIR   *cifd = (CURSORICONFILEDIR*)xbuf;
     948    int i;
    949949
    950950    /*
     
    954954
    955955    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);
     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);
    964964    }
    965965    */
     
    969969     */
    970970    if (cifd->idCount!=1) {
    971     for (i=0;i<cifd->idCount;i++) {
    972         if (cifd->idEntries[i].bWidth == 32)
    973         break;
     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;
    974976    }
    975     if (i==cifd->idCount) i=0;
    976     }
    977977
    978978    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
     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
    986986    );
    987987    if (!hicon) {
    988     FIXME("CreateIcon failed.\n");
    989     hr = E_FAIL;
     988        FIXME("CreateIcon failed.\n");
     989        hr = E_FAIL;
    990990    } else {
    991     This->desc.picType = PICTYPE_ICON;
    992     This->desc.u.icon.hicon = hicon;
    993     hr = S_OK;
     991        This->desc.picType = PICTYPE_ICON;
     992        This->desc.u.icon.hicon = hicon;
     993        hr = S_OK;
    994994    }
    995995    break;
     
    10741074 */
    10751075static HRESULT WINAPI OLEPictureImpl_GetTypeInfoCount(
    1076   IDispatch*    iface,
     1076  IDispatch*    iface, 
    10771077  unsigned int* pctinfo)
    10781078{
     
    10881088 */
    10891089static HRESULT WINAPI OLEPictureImpl_GetTypeInfo(
    1090   IDispatch*  iface,
     1090  IDispatch*  iface, 
    10911091  UINT      iTInfo,
    1092   LCID        lcid,
     1092  LCID        lcid, 
    10931093  ITypeInfo** ppTInfo)
    10941094{
     
    11051105static HRESULT WINAPI OLEPictureImpl_GetIDsOfNames(
    11061106  IDispatch*  iface,
    1107   REFIID      riid,
    1108   LPOLESTR* rgszNames,
    1109   UINT      cNames,
     1107  REFIID      riid, 
     1108  LPOLESTR* rgszNames, 
     1109  UINT      cNames, 
    11101110  LCID        lcid,
    11111111  DISPID*     rgDispId)
     
    11231123static HRESULT WINAPI OLEPictureImpl_Invoke(
    11241124  IDispatch*  iface,
    1125   DISPID      dispIdMember,
    1126   REFIID      riid,
    1127   LCID        lcid,
     1125  DISPID      dispIdMember, 
     1126  REFIID      riid, 
     1127  LCID        lcid, 
    11281128  WORD        wFlags,
    11291129  DISPPARAMS* pDispParams,
    1130   VARIANT*    pVarResult,
     1130  VARIANT*    pVarResult, 
    11311131  EXCEPINFO*  pExepInfo,
    11321132  UINT*     puArgErr)
     
    12021202 */
    12031203HRESULT WINAPI OleCreatePictureIndirect(LPPICTDESC lpPictDesc, REFIID riid,
    1204                     BOOL fOwn, LPVOID *ppvObj )
     1204                            BOOL fOwn, LPVOID *ppvObj )
    12051205{
    12061206  OLEPictureImpl* newPict = NULL;
     
    12441244 */
    12451245HRESULT WINAPI OleLoadPicture( LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
    1246                     REFIID riid, LPVOID *ppvObj )
     1246                            REFIID riid, LPVOID *ppvObj )
    12471247{
    12481248  LPPERSISTSTREAM ps;
    1249   IPicture  *newpic;
     1249  IPicture      *newpic;
    12501250  HRESULT hr;
    12511251
    12521252  TRACE("(%p,%ld,%d,%s,%p), partially implemented.\n",
    1253     lpstream, lSize, fRunmode, debugstr_guid(riid), ppvObj);
     1253        lpstream, lSize, fRunmode, debugstr_guid(riid), ppvObj);
    12541254
    12551255  hr = OleCreatePictureIndirect(NULL,riid,!fRunmode,(LPVOID*)&newpic);
     
    12761276 */
    12771277HRESULT WINAPI OleLoadPictureEx( LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
    1278                     REFIID reed, DWORD xsiz, DWORD ysiz, DWORD flags, LPVOID *ppvObj )
     1278                            REFIID reed, DWORD xsiz, DWORD ysiz, DWORD flags, LPVOID *ppvObj )
    12791279{
    12801280  FIXME("(%p,%ld,%d,%p,%lx,%lx,%lx,%p), not implemented\n",
    1281     lpstream, lSize, fRunmode, reed, xsiz, ysiz, flags, ppvObj);
     1281        lpstream, lSize, fRunmode, reed, xsiz, ysiz, flags, ppvObj);
    12821282  return S_OK;
    12831283}
    1284 
     1284 
    12851285#ifdef __WIN32OS2__
    12861286
     
    13081308// ----------------------------------------------------------------------
    13091309HRESULT WIN32API OleLoadPicturePath
    1310    (LPOLESTR        szURLorPath,
    1311     LPUNKNOWN       punkCaller,
    1312     DWORD           dwReserved,
    1313     OLE_COLOR       clrReserved,
    1314     REFIID          riid,
    1315     LPVOID *        ppvRet )
     1310   (LPOLESTR            szURLorPath,
     1311    LPUNKNOWN           punkCaller,
     1312    DWORD               dwReserved,
     1313    OLE_COLOR           clrReserved,
     1314    REFIID              riid,
     1315    LPVOID *            ppvRet )
    13161316{
    13171317    dprintf(("OLEAUT32: OleLoadPicturePath - stub"));
  • trunk/src/oleaut32/parsedt.c

    r6689 r6711  
    2626 *
    2727 * dt.c--
    28  *    Functions for the built-in type "dt".
     28 *        Functions for the built-in type "dt".
    2929 *
    3030 * Copyright (c) 1994, Regents of the University of California
     
    4545
    4646static datetkn *datebsearch(char *key, datetkn *base, unsigned int nel);
    47 static int  DecodeDate(char *str, int fmask, int *tmask, struct tm * tm);
     47static int      DecodeDate(char *str, int fmask, int *tmask, struct tm * tm);
    4848static int DecodeNumber(int flen, char *field,
    49             int fmask, int *tmask, struct tm * tm, double *fsec);
     49                        int fmask, int *tmask, struct tm * tm, double *fsec);
    5050static 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);
     51                                  int fmask, int *tmask, struct tm * tm, double *fsec);
     52static int      DecodeSpecial(int field, char *lowtoken, int *val);
    5353static int DecodeTime(char *str, int fmask, int *tmask,
    54            struct tm * tm, double *fsec);
    55 static int  DecodeTimezone(char *str, int *tzp);
     54                   struct tm * tm, double *fsec);
     55static int      DecodeTimezone(char *str, int *tzp);
    5656
    5757#define USE_DATE_CACHE 1
     
    6666"Thursday", "Friday", "Saturday", NULL};
    6767
    68 /* those three vars are useless, and not even initialized, so
     68/* those three vars are useless, and not even initialized, so 
    6969 * I'd rather remove them all (EPP)
    7070 */
    71 int DateStyle;
    72 bool    EuroDates;
    73 int CTimeZone;
     71int     DateStyle;
     72bool    EuroDates;
     73int     CTimeZone;
    7474
    7575#define UTIME_MINYEAR (1901)
     
    9191
    9292/*****************************************************************************
    93  *   PRIVATE ROUTINES                                                        *
     93 *       PRIVATE ROUTINES                                                                                                                *
    9494 *****************************************************************************/
    9595
    9696/* 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))
     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))
    103103
    104104/*
     
    108108 */
    109109static 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 */
     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 */
    154154#if USE_AUSTRALIAN_RULES
    155     {"est", TZ, 60},            /* Australia Eastern Std Time */
     155        {"est", TZ, 60},                        /* Australia Eastern Std Time */
    156156#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 */
     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 */
    260260};
    261261
     
    275275 * Calendar time to Julian date conversions.
    276276 * Julian date is commonly used in astronomical applications,
    277  *  since it is numerically accurate and computationally simple.
     277 *      since it is numerically accurate and computationally simple.
    278278 * 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).
     279 *      and calendar date for all non-negative Julian days
     280 *      (i.e. from Nov 23, -4713 on).
    281281 *
    282282 * Ref: Explanatory Supplement to the Astronomical Almanac, 1992.
    283  *  University Science Books, 20 Edgehill Rd. Mill Valley CA 94941.
     283 *      University Science Books, 20 Edgehill Rd. Mill Valley CA 94941.
    284284 *
    285285 * Use the algorithm by Henry Fliegel, a former NASA/JPL colleague
    286  *  now at Aerospace Corp. (hi, Henry!)
     286 *      now at Aerospace Corp. (hi, Henry!)
    287287 *
    288288 * These routines will be used by other date/time packages - tgl 97/02/25
     
    290290
    291291/* 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
     292 *      to avoid having to check year and day both. - tgl 97/05/08
    293293 */
    294294
     
    304304date2j(int y, int m, int d)
    305305{
    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() */
     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() */
    311311
    312312void
    313313j2date(int jd, int *year, int *month, int *day)
    314314{
    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() */
     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() */
    340340
    341341
     
    353353int
    354354ParseDateTime(char *timestr, char *lowstr,
    355               char **field, int *ftype, int maxfields, int *numfields)
     355                          char **field, int *ftype, int maxfields, int *numfields)
    356356{
    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() */
     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() */
    482482
    483483
     
    485485 * Interpret previously parsed fields for general date and time.
    486486 * 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"
     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"
    497497 *
    498498 * Use the system-provided functions to get the current time zone
    499  *  if not specified in the input string.
     499 *      if not specified in the input string.
    500500 * If the date is outside the time_t system-supported time range,
    501  *  then assume GMT time zone. - tgl 97/05/27
     501 *      then assume GMT time zone. - tgl 97/05/27
    502502 */
    503503int
    504504DecodeDateTime(char **field, int *ftype, int nf,
    505                int *dtype, struct tm * tm, double *fsec, int *tzp)
     505                           int *dtype, struct tm * tm, double *fsec, int *tzp)
    506506{
    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         {
     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                {
    706706#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;
     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;
    713713
    714714#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() */
     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() */
    734734
    735735
     
    740740DecodeTimeOnly(char **field, int *ftype, int nf, int *dtype, struct tm * tm, double *fsec)
    741741{
    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() */
     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() */
    846846
    847847
     
    853853DecodeDate(char *str, int fmask, int *tmask, struct tm * tm)
    854854{
    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() */
     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() */
    952952
    953953
     
    955955 * Decode time string which includes delimiters.
    956956 * Only check the lower limit on hours, since this same code
    957  *  can be used to represent time spans.
     957 *      can be used to represent time spans.
    958958 */
    959959static int
    960960DecodeTime(char *str, int fmask, int *tmask, struct tm * tm, double *fsec)
    961961{
    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() */
     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() */
    10071007
    10081008
     
    10131013DecodeNumber(int flen, char *str, int fmask, int *tmask, struct tm * tm, double *fsec)
    10141014{
    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() */
     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() */
    11301130
    11311131
     
    11361136DecodeNumberField(int len, char *str, int fmask, int *tmask, struct tm * tm, double *fsec)
    11371137{
    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() */
     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() */
    12111211
    12121212
     
    12171217DecodeTimezone(char *str, int *tzp)
    12181218{
    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() */
     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() */
    12521252
    12531253
     
    12551255 * Decode text string using lookup table.
    12561256 * Implement a cache lookup since it is likely that dates
    1257  *  will be related in format.
     1257 *      will be related in format.
    12581258 */
    12591259static int
    12601260DecodeSpecial(int field, char *lowtoken, int *val)
    12611261{
    1262     int         type;
    1263     datetkn    *tp;
     1262        int                     type;
     1263        datetkn    *tp;
    12641264
    12651265#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);
     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);
    12731273#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() */
     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() */
    13011301
    13021302
     
    13091309datebsearch(char *key, datetkn *base, unsigned int nel)
    13101310{
    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;
     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;
    13311331}
    13321332
  • trunk/src/oleaut32/safearray.c

    r6689 r6711  
    2525
    2626/* Localy used methods */
    27 static INT
     27static INT 
    2828endOfDim(LONG *coor, SAFEARRAYBOUND *mat, LONG dim, LONG realDim);
    2929
    30 static ULONG
     30static ULONG   
    3131calcDisplacement(LONG *coor, SAFEARRAYBOUND *mat, LONG dim);
    3232
    33 static BOOL
     33static BOOL 
    3434isPointer(USHORT feature);
    3535
    36 static INT
     36static INT   
    3737getFeatures(VARTYPE vt);
    3838
    39 static BOOL
     39static BOOL 
    4040validCoordinate(LONG *coor, SAFEARRAY *psa);
    4141
    42 static BOOL
     42static BOOL 
    4343resizeSafeArray(SAFEARRAY *psa, LONG lDelta);
    4444
    45 static BOOL
     45static BOOL 
    4646validArg(SAFEARRAY *psa);
    4747
    48 static ULONG
     48static ULONG   
    4949getArraySize(SAFEARRAY *psa);
    5050
    51 static HRESULT
     51static HRESULT 
    5252duplicateData(SAFEARRAY *psa, SAFEARRAY **ppsaOut);
    5353
     
    5959{
    6060  /* 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 */
     61VARTYPE_NOT_SUPPORTED,  /* VT_EMPTY    [V]   [P]    nothing                     */
     62VARTYPE_NOT_SUPPORTED,  /* VT_NULL     [V]   [P]    SQL style Nul       */
     632,                          /* VT_I2       [V][T][P][S] 2 byte signed int */
     644,                          /* VT_I4       [V][T][P][S] 4 byte signed int */
     654,                          /* VT_R4       [V][T][P][S] 4 byte real     */
     668,                          /* VT_R8       [V][T][P][S] 8 byte real     */
    67678,                      /* 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 */
     688,                          /* VT_DATE     [V][T][P][S] date */
     694,                          /* VT_BSTR     [V][T][P][S] OLE Automation string*/
     704,                          /* VT_DISPATCH [V][T][P][S] IDispatch *     */
     714,                      /* VT_ERROR    [V][T]   [S] SCODE       */
     724,                          /* VT_BOOL     [V][T][P][S] True=-1, False=0*/
     7324,                     /* VT_VARIANT  [V][T][P][S] VARIANT *   */
     744,                          /* VT_UNKNOWN  [V][T]   [S] IUnknown * */
     7516,                         /* VT_DECIMAL  [V][T]   [S] 16 byte fixed point     */
    7676VARTYPE_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 */
     77VARTYPE_NOT_SUPPORTED,  /* VT_I1          [T]       signed char */
     781,                          /* VT_UI1      [V][T][P][S] unsigned char                   */
     79VARTYPE_NOT_SUPPORTED,  /* VT_UI2         [T][P]    unsigned short      */
     80VARTYPE_NOT_SUPPORTED,  /* VT_UI4         [T][P]    unsigned short      */
     81VARTYPE_NOT_SUPPORTED,  /* VT_I8          [T][P]    signed 64-bit int                   */
     82VARTYPE_NOT_SUPPORTED,  /* VT_UI8         [T][P]    unsigned 64-bit int         */
     83VARTYPE_NOT_SUPPORTED,  /* VT_INT         [T]       signed machine int          */
     84VARTYPE_NOT_SUPPORTED,  /* VT_UINT        [T]       unsigned machine int        */
     85VARTYPE_NOT_SUPPORTED,  /* VT_VOID        [T]       C style void                        */
     86VARTYPE_NOT_SUPPORTED,  /* VT_HRESULT     [T]       Standard return type        */
     87VARTYPE_NOT_SUPPORTED,  /* VT_PTR         [T]       pointer type                        */
     88VARTYPE_NOT_SUPPORTED,  /* VT_SAFEARRAY   [T]       (use VT_ARRAY in VARIANT)*/
     89VARTYPE_NOT_SUPPORTED,  /* VT_CARRAY      [T]       C style array                       */
     90VARTYPE_NOT_SUPPORTED,  /* VT_USERDEFINED [T]       user defined type                   */
     91VARTYPE_NOT_SUPPORTED,  /* VT_LPSTR       [T][P]    null terminated string      */
     92VARTYPE_NOT_SUPPORTED,  /* VT_LPWSTR      [T][P]    wide null term string               */
     93VARTYPE_NOT_SUPPORTED,  /* VT_FILETIME       [P]    FILETIME                    */
     94VARTYPE_NOT_SUPPORTED,  /* VT_BLOB           [P]    Length prefixed bytes */
     95VARTYPE_NOT_SUPPORTED,  /* VT_STREAM         [P]    Name of stream follows              */
     96VARTYPE_NOT_SUPPORTED,  /* VT_STORAGE        [P]    Name of storage follows     */
     97VARTYPE_NOT_SUPPORTED,  /* VT_STREAMED_OBJECT[P]    Stream contains an object*/
     98VARTYPE_NOT_SUPPORTED,  /* VT_STORED_OBJECT  [P]    Storage contains object*/
     99VARTYPE_NOT_SUPPORTED,  /* VT_BLOB_OBJECT    [P]    Blob contains an object*/
     100VARTYPE_NOT_SUPPORTED,  /* VT_CF             [P]    Clipboard format                    */
     101VARTYPE_NOT_SUPPORTED,  /* VT_CLSID          [P]    A Class ID                  */
     102VARTYPE_NOT_SUPPORTED,  /* VT_VECTOR         [P]    simple counted array                */
     103VARTYPE_NOT_SUPPORTED,  /* VT_ARRAY    [V]          SAFEARRAY*                  */
     104VARTYPE_NOT_SUPPORTED   /* VT_BYREF    [V]          void* for local use */
    105105};
    106106
     
    109109
    110110/*************************************************************************
    111  *      SafeArrayAllocDescriptor
     111 *              SafeArrayAllocDescriptor
    112112 * Allocate the appropriate amount of memory for the SafeArray descriptor
    113113 */
    114 HRESULT WINAPI SafeArrayAllocDescriptor(
    115   UINT    cDims,
    116   SAFEARRAY **ppsaOut)
     114HRESULT WINAPI SafeArrayAllocDescriptor( 
     115  UINT    cDims, 
     116  SAFEARRAY **ppsaOut) 
    117117{
    118118  SAFEARRAYBOUND *sab;
     
    124124
    125125  /* Allocate memory for SAFEARRAY struc */
    126   if(( (*ppsaOut)=HeapAlloc(
     126  if(( (*ppsaOut)=HeapAlloc( 
    127127        GetProcessHeap(), HEAP_ZERO_MEMORY, allocSize)) == NULL){
    128128    return(E_UNEXPECTED);
     
    134134
    135135/*************************************************************************
    136  *      SafeArrayAllocData
     136 *              SafeArrayAllocData
    137137 * Allocate the appropriate amount of data for the SafeArray data
    138138 */
    139139HRESULT WINAPI SafeArrayAllocData(
    140   SAFEARRAY *psa)
     140  SAFEARRAY *psa) 
    141141{
    142142  ULONG  ulWholeArraySize;   /* to store the size of the whole thing */
     
    144144  dprintf(("SafeArrayAllocData %x", psa));
    145145
    146   if(! validArg(psa))
     146  if(! validArg(psa)) 
    147147    return E_INVALIDARG;
    148148
     
    150150
    151151  /* Allocate memory for the data itself */
    152   if((psa->pvData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
     152  if((psa->pvData = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, 
    153153        psa->cbElements*ulWholeArraySize)) == NULL)
    154154    return(E_UNEXPECTED);
    155155
    156   TRACE("SafeArray: %lu bytes allocated for data at %p (%lu objects).\n",
     156  TRACE("SafeArray: %lu bytes allocated for data at %p (%lu objects).\n", 
    157157    psa->cbElements*ulWholeArraySize, psa->pvData, ulWholeArraySize);
    158158
     
    161161
    162162/*************************************************************************
    163  *      SafeArrayCreate
    164  * Create a SafeArray object by encapsulating AllocDescriptor and AllocData
     163 *              SafeArrayCreate
     164 * Create a SafeArray object by encapsulating AllocDescriptor and AllocData 
    165165 */
    166166SAFEARRAY* WINAPI SafeArrayCreate(
    167   VARTYPE        vt,
    168   UINT         cDims,
     167  VARTYPE        vt, 
     168  UINT         cDims, 
    169169  SAFEARRAYBOUND *rgsabound)
    170170{
     
    184184    return NULL;
    185185
    186   /* setup data members... */
     186  /* setup data members... */ 
    187187  psa->cDims     = cDims;
    188188  psa->fFeatures = getFeatures(vt);
     
    197197  }
    198198
    199   /* allocate memory for the data... */
     199  /* allocate memory for the data... */ 
    200200  if( FAILED( hRes = SafeArrayAllocData(psa))) {
    201     SafeArrayDestroyDescriptor(psa);
     201    SafeArrayDestroyDescriptor(psa); 
    202202    ERR("() : Failed to allocate the Safe Array data\n");
    203203    return NULL;
    204204  }
    205205
    206   return(psa);
    207 }
    208 
    209 /*************************************************************************
    210  *      SafeArrayDestroyDescriptor
     206  return(psa); 
     207}
     208
     209/*************************************************************************
     210 *              SafeArrayDestroyDescriptor
    211211 * Frees the memory associated with the descriptor.
    212212 */
     
    217217
    218218  /* Check for lockness before to free... */
    219   if(psa->cLocks > 0)
     219  if(psa->cLocks > 0) 
    220220    return DISP_E_ARRAYISLOCKED;
    221221
    222222  /* The array is unlocked, then, deallocate memory */
    223   if(HeapFree( GetProcessHeap(), 0, psa) == FALSE)
     223  if(HeapFree( GetProcessHeap(), 0, psa) == FALSE) 
    224224    return E_UNEXPECTED;
    225 
     225 
    226226  return(S_OK);
    227227}
     
    229229
    230230/*************************************************************************
    231  *      SafeArrayLock
     231 *              SafeArrayLock
    232232 * Increment the lock counter
    233233 *
    234234 * 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
     235 * only when psa->cLocks is > 0... I don't get it since pvData is allocated 
     236 * before the array is locked, therefore 
    237237 */
    238238HRESULT WINAPI SafeArrayLock(
     
    241241  dprintf(("SafeArrayLock %x", psa));
    242242
    243   if(! validArg(psa))
     243  if(! validArg(psa))     
    244244    return E_INVALIDARG;
    245245
     
    250250
    251251/*************************************************************************
    252  *      SafeArrayUnlock
     252 *              SafeArrayUnlock
    253253 * Decrement the lock counter
    254254 */
     
    258258  dprintf(("SafeArrayUnlock %x", psa));
    259259
    260   if(! validArg(psa))
    261     return E_INVALIDARG;
    262 
    263   if (psa->cLocks > 0)
     260  if(! validArg(psa)) 
     261    return E_INVALIDARG;
     262
     263  if (psa->cLocks > 0) 
    264264    psa->cLocks--;
    265265
     
    269269
    270270/*************************************************************************
    271  *      SafeArrayPutElement
     271 *              SafeArrayPutElement
    272272 * Set the data at the given coordinate
    273273 */
    274274HRESULT WINAPI SafeArrayPutElement(
    275   SAFEARRAY *psa,
    276   LONG      *rgIndices,
     275  SAFEARRAY *psa, 
     276  LONG      *rgIndices, 
    277277  void      *pv)
    278278{
    279   ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to
     279  ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to 
    280280                                         the desired one... */
    281281  PVOID elementStorageAddress = NULL; /* Adress to store the data */
     
    285285
    286286  /* Validate the index given */
    287   if(! validCoordinate(rgIndices, psa))
     287  if(! validCoordinate(rgIndices, psa)) 
    288288    return DISP_E_BADINDEX;
    289289  if(! validArg(psa))
     
    294294    /* Figure out the number of items to skip */
    295295    stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims);
    296 
     296 
    297297    /* Figure out the number of byte to skip ... */
    298298    elementStorageAddress = (char *) psa->pvData+(stepCountInSAData*psa->cbElements);
    299 
     299 
    300300    if(isPointer(psa->fFeatures)) { /* increment ref count for this pointer */
    301301
    302       *((VOID**)elementStorageAddress) = *(VOID**)pv;
     302      *((VOID**)elementStorageAddress) = *(VOID**)pv; 
    303303      IUnknown_AddRef( *(IUnknown**)pv);
    304304
    305     } else {
     305    } else { 
    306306
    307307      if(psa->fFeatures == FADF_BSTR) { /* Create a new object */
    308308
    309309        if((pbstrReAllocStr = SysAllocString( (OLECHAR*)pv )) == NULL) {
    310           SafeArrayUnlock(psa);
     310          SafeArrayUnlock(psa); 
    311311          return E_OUTOFMEMORY;
    312         } else
     312        } else 
    313313          *((BSTR*)elementStorageAddress) = pbstrReAllocStr;
    314314
     
    323323
    324324  TRACE("SafeArray: item put at adress %p.\n",elementStorageAddress);
    325   return SafeArrayUnlock(psa);
    326 }
    327 
    328 
    329 /*************************************************************************
    330  *      SafeArrayGetElement
     325  return SafeArrayUnlock(psa); 
     326}
     327
     328
     329/*************************************************************************
     330 *              SafeArrayGetElement
    331331 * Return the data element corresponding the the given coordinate
    332332 */
    333333HRESULT WINAPI SafeArrayGetElement(
    334   SAFEARRAY *psa,
    335   LONG      *rgIndices,
     334  SAFEARRAY *psa, 
     335  LONG      *rgIndices, 
    336336  void      *pv)
    337337{
    338   ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to
     338  ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to 
    339339                                         the desired one... */
    340340  PVOID elementStorageAddress = NULL; /* Adress to store the data */
     
    343343  dprintf(("SafeArrayGetElement %x %x %x", psa, rgIndices, pv));
    344344
    345   if(! validArg(psa))
    346     return E_INVALIDARG;
    347 
     345  if(! validArg(psa)) 
     346    return E_INVALIDARG;
     347 
    348348  if(! validCoordinate(rgIndices, psa)) /* Validate the index given */
    349349    return(DISP_E_BADINDEX);
     
    353353    /* Figure out the number of items to skip */
    354354    stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims);
    355 
     355 
    356356    /* Figure out the number of byte to skip ... */
    357357    elementStorageAddress = (char *) psa->pvData+(stepCountInSAData*psa->cbElements);
    358 
     358 
    359359    if( psa->fFeatures == FADF_BSTR) {           /* reallocate the obj */
    360       if( (pbstrReturnedStr =
     360      if( (pbstrReturnedStr = 
    361361          SysAllocString( *(OLECHAR**)elementStorageAddress )) == NULL) {
    362362        SafeArrayUnlock(psa);
    363363        return E_OUTOFMEMORY;
    364       } else
    365         *((BSTR*)pv) = pbstrReturnedStr;
    366 
     364      } else 
     365        *((BSTR*)pv) = pbstrReturnedStr; 
     366       
    367367    } else if( isPointer(psa->fFeatures) )       /* simply copy the pointer */
    368        pv = *((PVOID*)elementStorageAddress);
     368       pv = *((PVOID*)elementStorageAddress); 
    369369    else                                         /* copy the bytes */
    370370      memcpy(pv, elementStorageAddress, SafeArrayGetElemsize(psa) );
     
    375375  }
    376376
    377   return( SafeArrayUnlock(psa) );
    378 }
    379 
    380 /*************************************************************************
    381  *      SafeArrayGetUBound
     377  return( SafeArrayUnlock(psa) ); 
     378}
     379
     380/*************************************************************************
     381 *              SafeArrayGetUBound
    382382 * return the UP bound for a given array dimension
    383383 */
    384384HRESULT WINAPI SafeArrayGetUBound(
    385   SAFEARRAY *psa,
     385  SAFEARRAY *psa, 
    386386  UINT    nDim,
    387387  LONG      *plUbound)
     
    390390  dprintf(("SafeArrayGetUBound %x %x %x", psa, nDim, plUbound));
    391391
    392   if(! validArg(psa))
    393     return E_INVALIDARG;
    394 
    395   if(nDim > psa->cDims)
     392  if(! validArg(psa))   
     393    return E_INVALIDARG;
     394
     395  if(nDim > psa->cDims) 
    396396    return DISP_E_BADINDEX;
    397397
    398   *plUbound = psa->rgsabound[nDim-1].lLbound +
     398  *plUbound = psa->rgsabound[nDim-1].lLbound + 
    399399              psa->rgsabound[nDim-1].cElements - 1;
    400400
     
    403403
    404404/*************************************************************************
    405  *      SafeArrayGetLBound
    406  * Return the LO bound for a given array dimension
     405 *              SafeArrayGetLBound
     406 * Return the LO bound for a given array dimension 
    407407 */
    408408HRESULT WINAPI SafeArrayGetLBound(
    409409  SAFEARRAY *psa,
    410   UINT    nDim,
     410  UINT    nDim, 
    411411  LONG      *plLbound)
    412412{
    413   if(! validArg(psa))
    414     return E_INVALIDARG;
    415 
    416   if(nDim > psa->cDims)
     413  if(! validArg(psa))   
     414    return E_INVALIDARG;
     415
     416  if(nDim > psa->cDims) 
    417417    return DISP_E_BADINDEX;
    418418
     
    422422
    423423/*************************************************************************
    424  *      SafeArrayGetDim
     424 *              SafeArrayGetDim
    425425 * returns the number of dimension in the array
    426426 */
    427427UINT WINAPI SafeArrayGetDim(
    428428  SAFEARRAY * psa)
    429 {
     429{ 
    430430  /*
    431431   * A quick test in Windows shows that the behavior here for an invalid
    432432   * pointer is to return 0.
    433433   */
    434   if(! validArg(psa))
     434  if(! validArg(psa)) 
    435435    return 0;
    436436
     
    439439
    440440/*************************************************************************
    441  *      SafeArrayGetElemsize
     441 *              SafeArrayGetElemsize
    442442 * Return the size of the element in the array
    443443 */
    444444UINT WINAPI SafeArrayGetElemsize(
    445445  SAFEARRAY * psa)
    446 {
     446{ 
    447447  /*
    448448   * A quick test in Windows shows that the behavior here for an invalid
    449449   * pointer is to return 0.
    450450   */
    451   if(! validArg(psa))
     451  if(! validArg(psa)) 
    452452    return 0;
    453453
     
    456456
    457457/*************************************************************************
    458  *      SafeArrayAccessData
    459  * increment the access count and return the data
     458 *              SafeArrayAccessData
     459 * increment the access count and return the data 
    460460 */
    461461HRESULT WINAPI SafeArrayAccessData(
    462   SAFEARRAY *psa,
     462  SAFEARRAY *psa, 
    463463  void      **ppvData)
    464 {
     464{ 
    465465  HRESULT hRes;
    466466
    467   if(! validArg(psa))
     467  if(! validArg(psa)) 
    468468    return E_INVALIDARG;
    469469
     
    471471
    472472  switch (hRes) {
    473     case S_OK:
     473    case S_OK: 
    474474      (*ppvData) = psa->pvData;
    475475      break;
     
    478478      return E_INVALIDARG;
    479479  }
    480 
     480 
    481481  return S_OK;
    482482}
     
    484484
    485485/*************************************************************************
    486  *      SafeArrayUnaccessData
     486 *              SafeArrayUnaccessData
    487487 * Decrement the access count
    488488 */
    489489HRESULT WINAPI SafeArrayUnaccessData(
    490490  SAFEARRAY * psa)
    491 {
    492   if(! validArg(psa))
     491{ 
     492  if(! validArg(psa)) 
    493493    return E_INVALIDARG;
    494494
     
    496496}
    497497
    498 /************************************************************************
    499  *      SafeArrayPtrOfIndex
     498/************************************************************************ 
     499 *              SafeArrayPtrOfIndex
    500500 * Return a pointer to the element at rgIndices
    501501 */
    502502HRESULT WINAPI SafeArrayPtrOfIndex(
    503   SAFEARRAY *psa,
    504   LONG      *rgIndices,
     503  SAFEARRAY *psa, 
     504  LONG      *rgIndices, 
    505505  void      **ppvData)
    506 {
    507   ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to
     506{ 
     507  ULONG stepCountInSAData     = 0;    /* Number of array item to skip to get to 
    508508                                         the desired one... */
    509509
    510   if(! validArg(psa))
    511     return E_INVALIDARG;
    512 
    513   if(! validCoordinate(rgIndices, psa))
     510  if(! validArg(psa))                   
     511    return E_INVALIDARG;
     512
     513  if(! validCoordinate(rgIndices, psa)) 
    514514    return DISP_E_BADINDEX;
    515515
    516516  /* Figure out the number of items to skip */
    517517  stepCountInSAData = calcDisplacement(rgIndices, psa->rgsabound, psa->cDims);
    518 
     518 
    519519  *ppvData = (char *) psa->pvData+(stepCountInSAData*psa->cbElements);
    520520
     
    522522}
    523523
    524 /************************************************************************
    525  *      SafeArrayDestroyData
     524/************************************************************************ 
     525 *              SafeArrayDestroyData
    526526 * Frees the memory data bloc
    527527 */
    528528HRESULT WINAPI SafeArrayDestroyData(
    529529  SAFEARRAY *psa)
    530 {
     530{ 
    531531  HRESULT  hRes;
    532532  ULONG    ulWholeArraySize; /* count spot in array  */
     
    535535  BSTR   bstr;
    536536
    537   if(! validArg(psa))
    538     return E_INVALIDARG;
    539 
    540   if(psa->cLocks > 0)
     537  if(! validArg(psa)) 
     538    return E_INVALIDARG;
     539
     540  if(psa->cLocks > 0) 
    541541    return DISP_E_ARRAYISLOCKED;
    542542
     
    546546
    547547    for(ulDataIter=0; ulDataIter < ulWholeArraySize; ulDataIter++) {
    548       punk = *(IUnknown**)((char *) psa->pvData+(ulDataIter*(psa->cbElements)));
    549 
    550       if( punk != NULL)
     548      punk = *(IUnknown**)((char *) psa->pvData+(ulDataIter*(psa->cbElements)));       
     549
     550      if( punk != NULL) 
    551551        IUnknown_Release(punk);
    552552    }
     
    557557      bstr = *(BSTR*)((char *) psa->pvData+(ulDataIter*(psa->cbElements)));
    558558
    559       if( bstr != NULL)
     559      if( bstr != NULL) 
    560560        SysFreeString( bstr );
    561561    }
    562562  }
    563 
    564   /* check if this array is a Vector, in which case do not free the data
     563     
     564  /* check if this array is a Vector, in which case do not free the data 
    565565     block since it has been allocated by AllocDescriptor and therefore
    566566     deserve to be freed by DestroyDescriptor */
     
    573573    psa->pvData = NULL;
    574574  }
    575 
     575 
    576576  return S_OK;
    577577}
    578578
    579 /************************************************************************
    580  *      SafeArrayCopyData
     579/************************************************************************ 
     580 *              SafeArrayCopyData
    581581 * Copy the psaSource's data block into psaTarget if dimension and size
    582582 * permits it.
     
    585585  SAFEARRAY *psaSource,
    586586  SAFEARRAY **psaTarget)
    587 {
     587{ 
    588588  USHORT   cDimCount;        /* looper */
    589589  LONG     lDelta;           /* looper */
    590   IUnknown *punk;
     590  IUnknown *punk;   
    591591  ULONG    ulWholeArraySize; /* Number of item in SA */
    592592  BSTR   bstr;
    593593
    594   if(! (validArg(psaSource) && validArg(*psaTarget)) )
     594  if(! (validArg(psaSource) && validArg(*psaTarget)) ) 
    595595    return E_INVALIDARG;
    596596
     
    598598    return E_INVALIDARG;
    599599
    600   ulWholeArraySize = getArraySize(psaSource);
     600  ulWholeArraySize = getArraySize(psaSource); 
    601601
    602602  /* The two arrays boundaries must be of same lenght */
    603603  for(cDimCount=0;cDimCount < psaSource->cDims; cDimCount++)
    604     if( psaSource->rgsabound[cDimCount].cElements !=
     604    if( psaSource->rgsabound[cDimCount].cElements != 
    605605      (*psaTarget)->rgsabound[cDimCount].cElements)
    606606      return E_INVALIDARG;
    607607
    608   if( isPointer((*psaTarget)->fFeatures) ) {         /* the target contains ptr
     608  if( isPointer((*psaTarget)->fFeatures) ) {         /* the target contains ptr 
    609609                                                        that must be released */
    610610    for(lDelta=0;lDelta < ulWholeArraySize; lDelta++) {
     
    612612        ((char *) (*psaTarget)->pvData + (lDelta * (*psaTarget)->cbElements));
    613613
    614       if( punk != NULL)
     614      if( punk != NULL) 
    615615        IUnknown_Release(punk);
    616616    }
    617617
    618618  } else if( (*psaTarget)->fFeatures & FADF_BSTR) {  /* the target contain BSTR
    619                                                         that must be freed */
     619                                                        that must be freed */ 
    620620    for(lDelta=0;lDelta < ulWholeArraySize; lDelta++) {
    621       bstr =
     621      bstr = 
    622622        *(BSTR*)((char *) (*psaTarget)->pvData + (lDelta * (*psaTarget)->cbElements));
    623623
    624       if( bstr != NULL)
     624      if( bstr != NULL) 
    625625        SysFreeString( bstr );
    626626    }
     
    630630}
    631631
    632 /************************************************************************
    633  *      SafeArrayDestroy
     632/************************************************************************ 
     633 *              SafeArrayDestroy
    634634 * Deallocates all memory reserved for the SafeArray
    635635 */
    636636HRESULT WINAPI SafeArrayDestroy(
    637637  SAFEARRAY * psa)
    638 {
     638{ 
    639639  HRESULT hRes;
    640640
    641   if(! validArg(psa))
    642     return E_INVALIDARG;
    643 
    644   if(psa->cLocks > 0)
     641  if(! validArg(psa)) 
     642    return E_INVALIDARG;
     643
     644  if(psa->cLocks > 0) 
    645645    return DISP_E_ARRAYISLOCKED;
    646646
     
    652652}
    653653
    654 /************************************************************************
    655  *      SafeArrayCopy
     654/************************************************************************ 
     655 *              SafeArrayCopy
    656656 * Make a dupplicate of a SafeArray
    657657 */
    658658HRESULT WINAPI SafeArrayCopy(
    659   SAFEARRAY *psa,
     659  SAFEARRAY *psa, 
    660660  SAFEARRAY **ppsaOut)
    661 {
     661{ 
    662662  HRESULT hRes;
    663663  DWORD   dAllocSize;
    664664  ULONG   ulWholeArraySize; /* size of the thing */
    665665
    666   if(! validArg(psa))
     666  if(! validArg(psa)) 
    667667    return E_INVALIDARG;
    668668
     
    670670
    671671    /* Duplicate the SAFEARRAY struc */
    672     memcpy(*ppsaOut, psa,
     672    memcpy(*ppsaOut, psa, 
    673673            sizeof(*psa)+(sizeof(*(psa->rgsabound))*(psa->cDims-1)));
    674674
     
    677677    /* make sure the new safe array doesn't have the FADF_CREATEVECTOR flag,
    678678       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 */
     679    (*ppsaOut)->fFeatures &= ~FADF_CREATEVECTOR; 
     680 
     681    /* Get the allocated memory size for source and allocate it for target */ 
    682682    ulWholeArraySize = getArraySize(psa); /* Number of item in SA */
    683683    dAllocSize = ulWholeArraySize*psa->cbElements;
    684684
    685     (*ppsaOut)->pvData =
     685    (*ppsaOut)->pvData = 
    686686      HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dAllocSize);
    687687    if( (*ppsaOut)->pvData != NULL) {   /* HeapAlloc succeed */
     
    693693        return hRes;
    694694      }
    695 
     695       
    696696    } else { /* failed to allocate or dupplicate... */
    697697      SafeArrayDestroyDescriptor(*ppsaOut);
     
    705705}
    706706
    707 /************************************************************************
    708  *      SafeArrayCreateVector
    709  * Creates a one dimension safearray where the data is next to the
     707/************************************************************************ 
     708 *              SafeArrayCreateVector
     709 * Creates a one dimension safearray where the data is next to the 
    710710 * SAFEARRAY structure.
    711711 */
    712712SAFEARRAY* WINAPI SafeArrayCreateVector(
    713   VARTYPE vt,
    714   LONG    lLbound,
    715   ULONG   cElements)
    716 {
     713  VARTYPE vt, 
     714  LONG    lLbound, 
     715  ULONG   cElements) 
     716{ 
    717717  SAFEARRAY *psa;
    718718
     
    723723
    724724  /* Allocate memory for the array descriptor and data contiguously  */
    725   if( FAILED( psa = HeapAlloc( GetProcessHeap(),
    726                       HEAP_ZERO_MEMORY,
     725  if( FAILED( psa = HeapAlloc( GetProcessHeap(), 
     726                      HEAP_ZERO_MEMORY, 
    727727                      (sizeof(*psa) + (VARTYPE_SIZE[vt] * cElements))))) {
    728728    return NULL;
    729729  }
    730 
    731   /* setup data members... */
     730                                                                               
     731  /* setup data members... */ 
    732732  psa->cDims      = 1; /* always and forever */
    733733  psa->fFeatures  = getFeatures(vt) | FADF_CREATEVECTOR;  /* undocumented flag used by Microsoft */
     
    739739  psa->rgsabound[0].lLbound   = lLbound;
    740740
    741   return(psa);
    742 }
    743 
    744 /************************************************************************
    745  *      SafeArrayRedim
     741  return(psa);                           
     742} 
     743
     744/************************************************************************ 
     745 *              SafeArrayRedim
    746746 * Changes the caracteristics of the last dimension of the SafeArray
    747747 */
    748748HRESULT WINAPI SafeArrayRedim(
    749   SAFEARRAY      *psa,
     749  SAFEARRAY      *psa, 
    750750  SAFEARRAYBOUND *psaboundNew)
    751 {
     751{ 
    752752  LONG   lDelta;  /* hold difference in size */
    753753  USHORT cDims=1; /* dims counter */
    754754
    755   if( !validArg(psa) )
    756     return E_INVALIDARG;
    757 
    758   if( psa->cLocks > 0 )
     755  if( !validArg(psa) )                   
     756    return E_INVALIDARG;
     757
     758  if( psa->cLocks > 0 )                   
    759759    return DISP_E_ARRAYISLOCKED;
    760760
    761   if( psa->fFeatures & FADF_FIXEDSIZE )
    762     return E_INVALIDARG;
    763 
    764   if( SafeArrayLock(psa)==E_UNEXPECTED )
     761  if( psa->fFeatures & FADF_FIXEDSIZE )   
     762    return E_INVALIDARG;
     763
     764  if( SafeArrayLock(psa)==E_UNEXPECTED ) 
    765765    return E_UNEXPECTED;/* UNDOC error condition */
    766766
     
    774774
    775775  } else /* need to enlarge (lDelta +) reduce (lDelta -) */
    776     if(! resizeSafeArray(psa, lDelta))
     776    if(! resizeSafeArray(psa, lDelta)) 
    777777      return E_UNEXPECTED; /* UNDOC error condition */
    778778
    779   /* the only modifyable dimension sits in [0] as the dimensions were reversed
     779  /* the only modifyable dimension sits in [0] as the dimensions were reversed 
    780780     at array creation time... */
    781781  psa->rgsabound[0].cElements = psaboundNew->cElements;
     
    789789 ************************************************************************/
    790790
    791 /************************************************************************
     791/************************************************************************ 
    792792 * Used to validate the SAFEARRAY type of arg
    793793 */
    794794static BOOL validArg(
    795   SAFEARRAY *psa)
     795  SAFEARRAY *psa) 
    796796{
    797797  SAFEARRAYBOUND *sab;
     
    822822}
    823823
    824 /************************************************************************
     824/************************************************************************ 
    825825 * Used to reallocate memory
    826826 */
    827827static BOOL resizeSafeArray(
    828   SAFEARRAY *psa,
     828  SAFEARRAY *psa, 
    829829  LONG lDelta)
    830830{
    831831  ULONG    ulWholeArraySize;  /* use as multiplicator */
    832   PVOID    pvNewBlock = NULL;
     832  PVOID    pvNewBlock = NULL; 
    833833  IUnknown *punk;
    834834  BSTR   bstr;
     
    838838  if(lDelta < 0) {                    /* array needs to be shorthen  */
    839839    if( isPointer(psa->fFeatures))    /* ptr that need to be released */
    840         for(;lDelta < 0; lDelta++) {
    841           punk = *(IUnknown**)
     840            for(;lDelta < 0; lDelta++) {
     841              punk = *(IUnknown**)
    842842          ((char *) psa->pvData+((ulWholeArraySize+lDelta)*psa->cbElements));
    843 
     843       
    844844        if( punk != NULL )
    845845          IUnknown_Release(punk);
    846         }
     846            }
    847847
    848848    else if(psa->fFeatures & FADF_BSTR)  /* BSTR that need to be freed */
    849         for(;lDelta < 0; lDelta++) {
     849            for(;lDelta < 0; lDelta++) {
    850850        bstr = *(BSTR*)
    851851          ((char *) psa->pvData+((ulWholeArraySize+lDelta)*psa->cbElements));
     
    858858  if (!(psa->fFeatures & FADF_CREATEVECTOR))
    859859  {
    860     /* Ok now, if we are enlarging the array, we *MUST* move the whole block
     860    /* Ok now, if we are enlarging the array, we *MUST* move the whole block 
    861861       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
     862       optional but we do it anyway becuase the benefit is that we are 
    863863       releasing to the system the unused memory */
    864864
    865     if((pvNewBlock = HeapReAlloc(GetProcessHeap(), 0, psa->pvData,
    866        (ulWholeArraySize + lDelta) * psa->cbElements)) == NULL)
     865    if((pvNewBlock = HeapReAlloc(GetProcessHeap(), 0, psa->pvData, 
     866       (ulWholeArraySize + lDelta) * psa->cbElements)) == NULL) 
    867867        return FALSE; /* TODO If we get here it means:
    868868                         SHRINK situation :  we've deleted the undesired
     
    873873  else
    874874  {
    875     /* Allocate a new block, because the previous data has been allocated with
     875    /* Allocate a new block, because the previous data has been allocated with 
    876876       the descriptor in SafeArrayCreateVector function. */
    877877
    878878    if((pvNewBlock = HeapAlloc(GetProcessHeap(), 0,
    879        ulWholeArraySize * psa->cbElements)) == NULL)
     879       ulWholeArraySize * psa->cbElements)) == NULL) 
    880880        return FALSE;
    881881
     
    887887}
    888888
    889 /************************************************************************
    890  * Used to set the fFeatures data member of the SAFEARRAY structure.
     889/************************************************************************ 
     890 * Used to set the fFeatures data member of the SAFEARRAY structure. 
    891891 */
    892892static INT getFeatures(
    893   VARTYPE vt)
     893  VARTYPE vt) 
    894894{
    895895  switch(vt) {
     
    901901}
    902902
    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...
     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... 
    906906 */
    907907static BOOL isPointer(
    908   USHORT feature)
     908  USHORT feature) 
    909909{
    910910  switch(feature) {
     
    915915}
    916916
    917 /************************************************************************
    918  * Used to calculate the displacement when accessing or modifying
     917/************************************************************************ 
     918 * Used to calculate the displacement when accessing or modifying 
    919919 * safearray data set.
    920920 *
     
    926926 */
    927927static ULONG calcDisplacement(
    928   LONG           *coor,
    929   SAFEARRAYBOUND *mat,
    930   LONG           dim)
     928  LONG           *coor, 
     929  SAFEARRAYBOUND *mat, 
     930  LONG           dim) 
    931931{
    932932  ULONG res = 0;
    933933  LONG  iterDim;
    934934
    935   for(iterDim=0; iterDim<dim; iterDim++)
     935  for(iterDim=0; iterDim<dim; iterDim++) 
    936936    /* the -mat[dim] bring coor[dim] relative to 0 for calculation */
    937     res += ((coor[iterDim]-mat[iterDim].lLbound) *
     937    res += ((coor[iterDim]-mat[iterDim].lLbound) * 
    938938            endOfDim(coor, mat, iterDim+1, dim));
    939939
     
    942942}
    943943
    944 /************************************************************************
    945  * Recursivity agent for calcDisplacement method.  Used within Put and
     944/************************************************************************ 
     945 * Recursivity agent for calcDisplacement method.  Used within Put and 
    946946 * Get methods.
    947947 */
    948948static INT endOfDim(
    949   LONG           *coor,
    950   SAFEARRAYBOUND *mat,
    951   LONG           dim,
    952   LONG           realDim)
    953 {
    954   if(dim==realDim)
     949  LONG           *coor, 
     950  SAFEARRAYBOUND *mat, 
     951  LONG           dim, 
     952  LONG           realDim) 
     953{
     954  if(dim==realDim) 
    955955    return 1;
    956   else
     956  else 
    957957    return (endOfDim(coor, mat, dim+1, realDim) * mat[dim].cElements);
    958958}
    959959
    960960
    961 /************************************************************************
    962  * Method used to validate the coordinate received in Put and Get
     961/************************************************************************ 
     962 * Method used to validate the coordinate received in Put and Get 
    963963 * methods.
    964964 */
    965965static BOOL validCoordinate(
    966   LONG      *coor,
    967   SAFEARRAY *psa)
     966  LONG      *coor, 
     967  SAFEARRAY *psa) 
    968968{
    969969  INT   iter=0;
     
    977977    if((hRes = SafeArrayGetUBound(psa, iter, &lUBound)) != S_OK)
    978978      return FALSE;
    979 
    980     if(lLBound == lUBound)
    981       return FALSE;
    982 
     979 
     980    if(lLBound == lUBound) 
     981      return FALSE; 
     982   
    983983    if((coor[iter] >= lLBound) && (coor[iter] <= lUBound))
    984984      return TRUE;
     
    987987  }
    988988  return FALSE;
    989 }
    990 
    991 /************************************************************************
     989} 
     990
     991/************************************************************************ 
    992992 * Method used to calculate the number of cells of the SA
    993993 */
    994994static ULONG getArraySize(
    995   SAFEARRAY *psa)
    996 {
    997   USHORT cCount;
     995  SAFEARRAY *psa) 
     996{
     997  USHORT cCount; 
    998998  ULONG  ulWholeArraySize = 1;
    999999
     
    10011001    ulWholeArraySize *= psa->rgsabound[cCount].cElements;
    10021002
    1003   return ulWholeArraySize;
    1004 }
    1005 
    1006 
    1007 /************************************************************************
     1003  return ulWholeArraySize; 
     1004}
     1005
     1006
     1007/************************************************************************ 
    10081008 * Method used to handle data space dupplication for Copy32 and CopyData32
    10091009 */
    10101010static HRESULT duplicateData(
    1011   SAFEARRAY *psa,
    1012   SAFEARRAY **ppsaOut)
     1011  SAFEARRAY *psa, 
     1012  SAFEARRAY **ppsaOut) 
    10131013{
    10141014  ULONG    ulWholeArraySize; /* size of the thing */
     
    10181018
    10191019  ulWholeArraySize = getArraySize(psa); /* Number of item in SA */
    1020 
     1020 
    10211021  SafeArrayLock(*ppsaOut);
    10221022
    1023   if( isPointer(psa->fFeatures) ) {  /* If datatype is object increment
     1023  if( isPointer(psa->fFeatures) ) {  /* If datatype is object increment 
    10241024                                        object's reference count */
    10251025
     
    10321032
    10331033    /* Copy the source array data into target array */
    1034     memcpy((*ppsaOut)->pvData, psa->pvData,
     1034    memcpy((*ppsaOut)->pvData, psa->pvData, 
    10351035      ulWholeArraySize*psa->cbElements);
    10361036
    1037   } else if( psa->fFeatures & FADF_BSTR ) { /* if datatype is BSTR allocate
     1037  } else if( psa->fFeatures & FADF_BSTR ) { /* if datatype is BSTR allocate 
    10381038                                               the BSTR in the new array */
    10391039
     
    10461046      }
    10471047
    1048       *((BSTR*)((char *) (*ppsaOut)->pvData+(lDelta * psa->cbElements))) =
     1048      *((BSTR*)((char *) (*ppsaOut)->pvData+(lDelta * psa->cbElements))) = 
    10491049        pbstrReAllocStr;
    10501050    }
     
    10521052  } else { /* Simply copy the source array data into target array */
    10531053
    1054     memcpy((*ppsaOut)->pvData, psa->pvData,
     1054    memcpy((*ppsaOut)->pvData, psa->pvData, 
    10551055      ulWholeArraySize*psa->cbElements);
    10561056  }
     
    10621062
    10631063
    1064 /************************************************************************
    1065  *      SafeArrayGetVarType
     1064/************************************************************************ 
     1065 *              SafeArrayGetVarType
    10661066 * Returns the VARTYPE stored in the given safearray
    10671067 */
     
    10991099    hr = S_OK;
    11001100  }
    1101 
     1101 
    11021102  TRACE("HRESULT = %08lx", hr);
    11031103  return hr;
  • trunk/src/oleaut32/typelib.c

    r6689 r6711  
    23942394}
    23952395
    2396 static void SLTG_ProcessCoClass(char *pBlk, ITypeInfoImpl *pTI,
    2397                                 char *pNameTable)
     2396static SLTG_TypeInfoTail *SLTG_ProcessCoClass(char *pBlk, ITypeInfoImpl *pTI,
     2397                                              char *pNameTable)
    23982398{
    23992399    SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk;
     
    24152415    }
    24162416
    2417     return;
    2418 }
    2419 
    2420 
    2421 static void SLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI,
    2422                                   char *pNameTable)
     2417    return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra);
     2418}
     2419
     2420
     2421static SLTG_TypeInfoTail *SLTG_ProcessInterface(char *pBlk, ITypeInfoImpl *pTI,
     2422                                                char *pNameTable)
    24232423{
    24242424    SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk;
     
    24512451           pFunc->magic != SLTG_FUNCTION_WITH_FLAGS_MAGIC) {
    24522452            FIXME("func magic = %02x\n", pFunc->magic);
    2453             return;
     2453            return NULL;
    24542454        }
    24552455        *ppFuncDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
     
    25302530    pTI->TypeAttr.cFuncs = num;
    25312531    dump_TLBFuncDesc(pTI->funclist);
    2532 }
    2533 
    2534 static void SLTG_ProcessRecord(char *pBlk, ITypeInfoImpl *pTI, char *pNameTable)
     2532    return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra);
     2533}
     2534
     2535static SLTG_TypeInfoTail *SLTG_ProcessRecord(char *pBlk, ITypeInfoImpl *pTI,
     2536                                             char *pNameTable)
    25352537{
    25362538  SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk;
     
    25502552      if(pItem->magic != SLTG_RECORD_MAGIC) {
    25512553          FIXME("record magic = %02x\n", pItem->magic);
    2552           return;
     2554          return NULL;
    25532555      }
    25542556      *ppVarDesc = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
     
    25792581  }
    25802582  pTI->TypeAttr.cVars = num;
    2581 }
    2582 
    2583 static void SLTG_ProcessEnum(char *pBlk, ITypeInfoImpl *pTI, char *pNameTable)
     2583  return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra);
     2584}
     2585
     2586static SLTG_TypeInfoTail *SLTG_ProcessEnum(char *pBlk, ITypeInfoImpl *pTI,
     2587                                           char *pNameTable)
    25842588{
    25852589  SLTG_TypeInfoHeader *pTIHeader = (SLTG_TypeInfoHeader*)pBlk;
     
    26162620  }
    26172621  pTI->TypeAttr.cVars = num;
     2622  return (SLTG_TypeInfoTail*)(pFirstItem + pMemHeader->cbExtra);
    26182623}
    26192624
     
    28012806
    28022807      SLTG_TypeInfoHeader *pTIHeader;
     2808      SLTG_TypeInfoTail *pTITail;
    28032809
    28042810      if(strcmp(pBlkEntry[order].index_string + (char*)pMagic,
     
    28412847      switch(pTIHeader->typekind) {
    28422848      case TKIND_ENUM:
    2843         SLTG_ProcessEnum(pBlk, *ppTypeInfoImpl, pNameTable);
     2849        pTITail = SLTG_ProcessEnum(pBlk, *ppTypeInfoImpl, pNameTable);
    28442850        break;
    28452851
    28462852      case TKIND_RECORD:
    2847         SLTG_ProcessRecord(pBlk, *ppTypeInfoImpl, pNameTable);
     2853        pTITail = SLTG_ProcessRecord(pBlk, *ppTypeInfoImpl, pNameTable);
    28482854        break;
    28492855
    28502856      case TKIND_INTERFACE:
    2851         SLTG_ProcessInterface(pBlk, *ppTypeInfoImpl, pNameTable);
     2857        pTITail = SLTG_ProcessInterface(pBlk, *ppTypeInfoImpl, pNameTable);
    28522858        break;
    28532859
    28542860      case TKIND_COCLASS:
    2855         SLTG_ProcessCoClass(pBlk, *ppTypeInfoImpl, pNameTable);
     2861        pTITail = SLTG_ProcessCoClass(pBlk, *ppTypeInfoImpl, pNameTable);
    28562862        break;
    28572863
    28582864      default:
    28592865        FIXME("Not processing typekind %d\n", pTIHeader->typekind);
     2866        pTITail = NULL;
    28602867        break;
    28612868
    28622869      }
    28632870
     2871      if(pTITail) { /* could get cFuncs, cVars and cImplTypes from here
     2872                       but we've already set those */
     2873          (*ppTypeInfoImpl)->TypeAttr.cbAlignment = pTITail->cbAlignment;
     2874          (*ppTypeInfoImpl)->TypeAttr.cbSizeInstance = pTITail->cbSizeInstance;
     2875          (*ppTypeInfoImpl)->TypeAttr.cbSizeVft = pTITail->cbSizeVft;
     2876      }
    28642877      ppTypeInfoImpl = &((*ppTypeInfoImpl)->next);
    28652878#ifdef __WIN32OS2__
     
    30983111    ICOM_THIS( ITypeLibImpl, iface);
    30993112    TRACE("(%p)\n",This);
    3100     /* FIXME: must do a copy here */
    3101     *ppTLibAttr=&This->LibAttr;
     3113    *ppTLibAttr = HeapAlloc(GetProcessHeap(), 0, sizeof(**ppTLibAttr));
     3114    memcpy(*ppTLibAttr, &This->LibAttr, sizeof(**ppTLibAttr));
    31023115    return S_OK;
    31033116}
     
    32943307    ICOM_THIS( ITypeLibImpl, iface);
    32953308    TRACE("freeing (%p)\n",This);
    3296     /* nothing to do */
     3309    HeapFree(GetProcessHeap(),0,pTLibAttr);
     3310
    32973311}
    32983312
  • trunk/src/oleaut32/typelib.h

    r6689 r6711  
    2323
    2424/* There are two known file formats, those created with ICreateTypeLib
    25  * have the signature "SLGT" as their first four bytes, while those created
     25 * have the signature "SLTG" as their first four bytes, while those created
    2626 * with ICreateTypeLib2 have "MSFT".
    2727 */
     
    377377
    378378typedef struct {
     379/*00*/  WORD cFuncs;
     380/*02*/  WORD cVars;
     381/*04*/  WORD cImplTypes;
     382/*06*/  WORD res06;
     383/*08*/  WORD res08;
     384/*0a*/  WORD res0a;
     385/*0c*/  WORD res0c;
     386/*0e*/  WORD res0e;
     387/*10*/  WORD res10;
     388/*12*/  WORD res12;
     389/*14*/  WORD res14;
     390/*16*/  WORD res16;
     391/*18*/  WORD res18;
     392/*1a*/  WORD res1a;
     393/*1c*/  WORD res1c;
     394/*1e*/  WORD res1e;
     395/*20*/  WORD cbSizeInstance;
     396/*22*/  WORD cbAlignment;
     397/*24*/  WORD res24;
     398/*26*/  WORD res26;
     399/*28*/  WORD cbSizeVft;
     400/*2a*/  WORD res2a;
     401/*2c*/  WORD res2c;
     402/*2e*/  WORD res2e;
     403/*30*/  WORD res30;
     404/*32*/  WORD res32;
     405/*34*/  WORD res34;
     406} SLTG_TypeInfoTail;
     407
     408typedef struct {
    379409/*00*/ WORD res00; /* 0x0001 sometimes 0x0003 ?? */
    380410/*02*/ WORD res02; /* 0xffff */
  • trunk/src/oleaut32/variant.c

    r6689 r6711  
    2828
    2929#include "config.h"
    30 
     30 
    3131#include <string.h>
    3232#include <stdlib.h>
     
    106106
    107107/******************************************************************************
    108  *     DateTimeStringToTm   [INTERNAL]
     108 *         DateTimeStringToTm   [INTERNAL]
    109109 *
    110110 * Converts a string representation of a date and/or time to a tm structure.
     
    122122static BOOL DateTimeStringToTm( OLECHAR* strIn, DWORD dwFlags, struct tm* pTm )
    123123{
    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]
     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]
    202202 *
    203203 * The date is implemented using an 8 byte floating-point number.
     
    216216 * The tm structure is as follows:
    217217 * 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  *        };
     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 *                };
    228228 *
    229229 * Note: This function does not use the tm_wday, tm_yday, tm_wday,
     
    235235static BOOL TmToDATE( struct tm* pTm, DATE *pDateOut )
    236236{
    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]
     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]
    327327 *
    328328 * This function converts a windows DATE to a tm structure.
     
    339339static BOOL DateToTm( DATE dateIn, DWORD dwFlags, struct tm* pTm )
    340340{
    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]
     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]
    473473 *
    474474 * This function finds the size of the data referenced by a Variant based
     
    528528}
    529529/******************************************************************************
    530  *     StringDupAtoBstr     [INTERNAL]
    531  *
     530 *         StringDupAtoBstr             [INTERNAL]
     531 * 
    532532 */
    533533static BSTR StringDupAtoBstr( char* strIn )
    534534{
    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]
     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]
    545545 *
    546546 * Round the double value to the nearest integer value.
     
    556556   nSign = (d >= 0.0) ? 1 : -1;
    557557    d = fabs( d );
    558 
    559     /* Remove the decimals.
    560     */
     558   
     559        /* Remove the decimals.
     560        */
    561561   integerValue = floor( d );
    562562
     
    573573    decimals = d - integerValue;
    574574
    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     */
     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        */
    578578    if( decimals > 0.5 )
    579579    {
     
    603603    }
    604604
    605     return roundedValue * nSign;
    606 }
    607 
    608 /******************************************************************************
    609  *      RemoveCharacterFromString       [INTERNAL]
     605        return roundedValue * nSign;
     606}
     607
     608/******************************************************************************
     609 *              RemoveCharacterFromString               [INTERNAL]
    610610 *
    611611 * Removes any of the characters in "strOfCharToRemove" from the "str" argument.
     
    613613static void RemoveCharacterFromString( LPSTR str, LPSTR strOfCharToRemove )
    614614{
    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]
     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]
    637637 *
    638638 * Checks if the string is of proper format to be converted to a real value.
     
    640640static BOOL IsValidRealString( LPSTR strRealString )
    641641{
    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.
     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.
    696696     * Sign is either plus '+' or minus '-'.
    697697     * Digits are one or more decimal digits.
     
    700700     * The decimal digits may be followed by an exponent.
    701701     * 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             {
     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                        {
    745745                /* 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.
     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.
    812812                 * If we get anything else than a decimal following this
    813813                 * 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]
     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]
    877877 *
    878878 * This function dispatches execution to the proper conversion API
     
    880880 *
    881881 * FIXME: Passing down dwFlags to the conversion functions is wrong, this
    882  *    is a different flagmask. Check MSDN.
     882 *        is a different flagmask. Check MSDN.
    883883 */
    884884static HRESULT Coerce( VARIANTARG* pd, LCID lcid, ULONG dwFlags, VARIANTARG* ps, VARTYPE vt )
    885885{
    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     {
     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        {
    907907
    908908    case( VT_EMPTY ):
     
    916916        }
    917917        break;
    918     case( VT_I1 ):
    919         switch( vtFrom )
     918        case( VT_I1 ):
     919                switch( vtFrom )
    920920        {
    921921        case( VT_I1 ):
    922922            res = VariantCopy( pd, ps );
    923923            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;
     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;
    977977        case( VT_I2 ):
    978978            res = VariantCopy( pd, ps );
    979979            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) );
     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) );
    10331033            break;
    10341034        case( VT_INT ):
     
    10391039            res = VariantCopy( pd, ps );
    10401040            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;
     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;
    10941094        case( VT_UI1 ):
    10951095            res = VariantCopy( pd, ps );
    10961096            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;
     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;
    11501150        case( VT_UI2 ):
    11511151            res = VariantCopy( pd, ps );
    11521152            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;
     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;
    12071207        case( VT_UI4 ):
    12081208            res = VariantCopy( pd, ps );
    12091209            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;
     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;
    12631263        case( VT_R4 ):
    12641264            res = VariantCopy( pd, ps );
    12651265            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;
     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;
    13191319        case( VT_R8 ):
    13201320            res = VariantCopy( pd, ps );
    13211321            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;
     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;
    13791379        case( VT_DATE ):
    13801380            res = VariantCopy( pd, ps );
    13811381            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;
     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;
    14391439        case( VT_BOOL ):
    14401440            res = VariantCopy( pd, ps );
    14411441            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;
     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;
    15221522
    15231523     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]
     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]
    15921592 *
    15931593 * Used internally by the hi-level Variant API to determine
     
    16081608
    16091609/******************************************************************************
    1610  *      ValidateVartype [INTERNAL]
     1610 *              ValidateVartype [INTERNAL]
    16111611 *
    16121612 * Used internally by the hi-level Variant API to determine
     
    16151615static HRESULT WINAPI ValidateVariantType( VARTYPE vt )
    16161616{
    1617     HRESULT res = S_OK;
    1618 
    1619     /* check if we have a valid argument.
    1620     */
    1621     if( vt & VT_BYREF )
     1617        HRESULT res = S_OK;
     1618
     1619        /* check if we have a valid argument.
     1620        */
     1621        if( vt & VT_BYREF )
    16221622    {
    16231623        /* if by reference check that the type is in
     
    16261626        if( ( vt & VT_TYPEMASK ) == VT_EMPTY ||
    16271627            ( vt & VT_TYPEMASK ) == VT_NULL ||
    1628             ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )
    1629         {
    1630             res = E_INVALIDARG;
    1631         }
    1632 
     1628                        ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )
     1629                {
     1630                        res = E_INVALIDARG;
     1631                }
     1632                       
    16331633    }
    16341634    else
     
    16361636        res = ValidateVtRange( vt );
    16371637    }
    1638 
    1639     return res;
    1640 }
    1641 
    1642 /******************************************************************************
    1643  *      ValidateVt  [INTERNAL]
     1638               
     1639        return res;
     1640}
     1641
     1642/******************************************************************************
     1643 *              ValidateVt      [INTERNAL]
    16441644 *
    16451645 * Used internally by the hi-level Variant API to determine
     
    16481648static HRESULT WINAPI ValidateVt( VARTYPE vt )
    16491649{
    1650     HRESULT res = S_OK;
    1651 
    1652     /* check if we have a valid argument.
    1653     */
    1654     if( vt & VT_BYREF )
     1650        HRESULT res = S_OK;
     1651
     1652        /* check if we have a valid argument.
     1653        */
     1654        if( vt & VT_BYREF )
    16551655    {
    16561656        /* if by reference check that the type is in
     
    16591659        if( ( vt & VT_TYPEMASK ) == VT_EMPTY ||
    16601660            ( vt & VT_TYPEMASK ) == VT_NULL ||
    1661             ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )
    1662         {
    1663             res = DISP_E_BADVARTYPE;
    1664         }
    1665 
     1661                        ( vt & VT_TYPEMASK ) > VT_MAXVALIDTYPE )
     1662                {
     1663                        res = DISP_E_BADVARTYPE;
     1664                }
     1665                       
    16661666    }
    16671667    else
     
    16691669        res = ValidateVtRange( vt );
    16701670    }
    1671 
    1672     return res;
    1673 }
    1674 
    1675 
    1676 
    1677 
    1678 
    1679 /******************************************************************************
    1680  *      VariantInit [OLEAUT32.8]
     1671               
     1672        return res;
     1673}
     1674
     1675
     1676
     1677
     1678
     1679/******************************************************************************
     1680 *              VariantInit     [OLEAUT32.8]
    16811681 *
    16821682 * Initializes the Variant.  Unlike VariantClear it does not interpret the current
     
    16941694
    16951695/******************************************************************************
    1696  *      VariantClear    [OLEAUT32.9]
     1696 *              VariantClear    [OLEAUT32.9]
    16971697 *
    16981698 * 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
     1699 * sets the wReservedX field to 0.      The current contents of the VARIANT are
    17001700 * freed.  If the vt is VT_BSTR the string is freed. If VT_DISPATCH the object is
    17011701 * released. If VT_ARRAY the array is freed.
     
    17161716      if ( (V_VT(pvarg) & VT_ARRAY) != 0)
    17171717      {
    1718     SafeArrayDestroy(V_UNION(pvarg,parray));
     1718        SafeArrayDestroy(V_UNION(pvarg,parray));
    17191719      }
    17201720      else
    17211721      {
    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     }
     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        }
    17441744      }
    17451745    }
    1746 
     1746       
    17471747    /*
    17481748     * Empty all the fields and mark the type as empty.
     
    17561756
    17571757/******************************************************************************
    1758  *      VariantCopy [OLEAUT32.10]
     1758 *              VariantCopy     [OLEAUT32.10]
    17591759 *
    17601760 * Frees up the designation variant and makes a copy of the source.
     
    17741774  {
    17751775    res = VariantClear( pvargDest );
    1776 
     1776               
    17771777    if( res == S_OK )
    17781778    {
    17791779      if( V_VT(pvargSrc) & VT_BYREF )
    17801780      {
    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);
     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);
    17861786      }
    17871787      else
    17881788      {
    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       }
     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      }     
    18331833    }
    18341834  }
     
    18391839
    18401840/******************************************************************************
    1841  *      VariantCopyInd  [OLEAUT32.11]
     1841 *              VariantCopyInd  [OLEAUT32.11]
    18421842 *
    18431843 * Frees up the destination variant and makes a copy of the source.  If
     
    18541854  if( res != S_OK )
    18551855    return res;
    1856 
     1856 
    18571857  if( V_VT(pvargSrc) & VT_BYREF )
    18581858  {
     
    18761876      if( res == S_OK )
    18771877      {
    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;
     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;
    19541954      }
    19551955    }
     
    19681968
    19691969/******************************************************************************
    1970  *      VariantChangeType   [OLEAUT32.12]
     1970 *              VariantChangeType       [OLEAUT32.12]
    19711971 */
    19721972HRESULT 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]
     1973                                                        USHORT wFlags, VARTYPE vt)
     1974{
     1975        return VariantChangeTypeEx( pvargDest, pvargSrc, 0, wFlags, vt );
     1976}
     1977
     1978/******************************************************************************
     1979 *              VariantChangeTypeEx     [OLEAUT32.147]
    19801980 */
    19811981HRESULT 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]
     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]
    20582058 */
    20592059HRESULT WINAPI VarUI1FromI2(short sIn, BYTE* pbOut)
    20602060{
    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]
     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]
    20772077 */
    20782078HRESULT WINAPI VarUI1FromI4(LONG lIn, BYTE* pbOut)
    20792079{
    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]
     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]
    20972097 */
    20982098HRESULT WINAPI VarUI1FromR4(FLOAT fltIn, BYTE* pbOut)
    20992099{
    2100     TRACE("( %f, %p ), stub\n", fltIn, pbOut );
    2101 
    2102     /* Check range of value.
     2100        TRACE("( %f, %p ), stub\n", fltIn, pbOut );
     2101
     2102        /* Check range of value.
    21032103     */
    21042104    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]
     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]
    21172117 */
    21182118HRESULT WINAPI VarUI1FromR8(double dblIn, BYTE* pbOut)
    21192119{
    2120     TRACE("( %f, %p ), stub\n", dblIn, pbOut );
    2121 
    2122     /* Check range of value.
     2120        TRACE("( %f, %p ), stub\n", dblIn, pbOut );
     2121
     2122        /* Check range of value.
    21232123     */
    21242124    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]
     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]
    21372137 */
    21382138HRESULT WINAPI VarUI1FromDate(DATE dateIn, BYTE* pbOut)
    21392139{
    2140     TRACE("( %f, %p ), stub\n", dateIn, pbOut );
    2141 
    2142     /* Check range of value.
     2140        TRACE("( %f, %p ), stub\n", dateIn, pbOut );
     2141
     2142        /* Check range of value.
    21432143     */
    21442144    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]
     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]
    21572157 */
    21582158HRESULT WINAPI VarUI1FromBool(VARIANT_BOOL boolIn, BYTE* pbOut)
    21592159{
    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]
     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]
    21692169 */
    21702170HRESULT WINAPI VarUI1FromI1(CHAR cIn, BYTE* pbOut)
    21712171{
    2172     TRACE("( %c, %p ), stub\n", cIn, pbOut );
    2173 
    2174     *pbOut = cIn;
    2175 
    2176     return S_OK;
    2177 }
    2178 
    2179 /******************************************************************************
    2180  *      VarUI1FromUI2       [OLEAUT32.238]
     2172        TRACE("( %c, %p ), stub\n", cIn, pbOut );
     2173
     2174        *pbOut = cIn;
     2175
     2176        return S_OK;
     2177}
     2178
     2179/******************************************************************************
     2180 *              VarUI1FromUI2           [OLEAUT32.238]
    21812181 */
    21822182HRESULT WINAPI VarUI1FromUI2(USHORT uiIn, BYTE* pbOut)
    21832183{
    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]
     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]
    22002200 */
    22012201HRESULT WINAPI VarUI1FromUI4(ULONG ulIn, BYTE* pbOut)
    22022202{
    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]
     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]
    22202220 */
    22212221HRESULT WINAPI VarUI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, BYTE* pbOut)
    22222222{
    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.
     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.
    22462246     */
    22472247    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;
     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;
    22562256}
    22572257
     
    22622262HRESULT WINAPI VarUI1FromCy(CY cyIn, BYTE* pbOut) {
    22632263   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2264 
     2264   
    22652265   if (t > UI1_MAX || t < UI1_MIN) return DISP_E_OVERFLOW;
    2266 
     2266   
    22672267   *pbOut = (BYTE)t;
    22682268   return S_OK;
     
    22702270
    22712271/******************************************************************************
    2272  *      VarI2FromUI1        [OLEAUT32.48]
     2272 *              VarI2FromUI1            [OLEAUT32.48]
    22732273 */
    22742274HRESULT WINAPI VarI2FromUI1(BYTE bIn, short* psOut)
    22752275{
    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]
     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]
    22852285 */
    22862286HRESULT WINAPI VarI2FromI4(LONG lIn, short* psOut)
    22872287{
    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]
     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]
    23042304 */
    23052305HRESULT WINAPI VarI2FromR4(FLOAT fltIn, short* psOut)
    23062306{
    2307     TRACE("( %f, %p ), stub\n", fltIn, psOut );
    2308 
    2309     /* Check range of value.
     2307        TRACE("( %f, %p ), stub\n", fltIn, psOut );
     2308
     2309        /* Check range of value.
    23102310     */
    23112311    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]
     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]
    23242324 */
    23252325HRESULT WINAPI VarI2FromR8(double dblIn, short* psOut)
    23262326{
    2327     TRACE("( %f, %p ), stub\n", dblIn, psOut );
    2328 
    2329     /* Check range of value.
     2327        TRACE("( %f, %p ), stub\n", dblIn, psOut );
     2328
     2329        /* Check range of value.
    23302330     */
    23312331    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]
     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]
    23442344 */
    23452345HRESULT WINAPI VarI2FromDate(DATE dateIn, short* psOut)
    23462346{
    2347     TRACE("( %f, %p ), stub\n", dateIn, psOut );
    2348 
    2349     /* Check range of value.
     2347        TRACE("( %f, %p ), stub\n", dateIn, psOut );
     2348
     2349        /* Check range of value.
    23502350     */
    23512351    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]
     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]
    23642364 */
    23652365HRESULT WINAPI VarI2FromBool(VARIANT_BOOL boolIn, short* psOut)
    23662366{
    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]
     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]
    23762376 */
    23772377HRESULT WINAPI VarI2FromI1(CHAR cIn, short* psOut)
    23782378{
    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]
     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]
    23882388 */
    23892389HRESULT WINAPI VarI2FromUI2(USHORT uiIn, short* psOut)
    23902390{
    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]
     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]
    24072407 */
    24082408HRESULT WINAPI VarI2FromUI4(ULONG ulIn, short* psOut)
    24092409{
    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]
     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]
    24262426 */
    24272427HRESULT WINAPI VarI2FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, short* psOut)
    24282428{
    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.
     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.
    24522452     */
    24532453    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;
     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;
    24622462}
    24632463
     
    24682468HRESULT WINAPI VarI2FromCy(CY cyIn, short* psOut) {
    24692469   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2470 
     2470   
    24712471   if (t > I2_MAX || t < I2_MIN) return DISP_E_OVERFLOW;
    2472 
     2472   
    24732473   *psOut = (SHORT)t;
    24742474   return S_OK;
     
    24762476
    24772477/******************************************************************************
    2478  *      VarI4FromUI1        [OLEAUT32.58]
     2478 *              VarI4FromUI1            [OLEAUT32.58]
    24792479 */
    24802480HRESULT WINAPI VarI4FromUI1(BYTE bIn, LONG* plOut)
    24812481{
    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]
     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]
    24922492 */
    24932493HRESULT WINAPI VarI4FromR4(FLOAT fltIn, LONG* plOut)
    24942494{
    2495     TRACE("( %f, %p ), stub\n", fltIn, plOut );
    2496 
    2497     /* Check range of value.
     2495        TRACE("( %f, %p ), stub\n", fltIn, plOut );
     2496
     2497        /* Check range of value.
    24982498     */
    24992499    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]
     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]
    25122512 */
    25132513HRESULT WINAPI VarI4FromR8(double dblIn, LONG* plOut)
    25142514{
    2515     TRACE("( %f, %p ), stub\n", dblIn, plOut );
    2516 
    2517     /* Check range of value.
     2515        TRACE("( %f, %p ), stub\n", dblIn, plOut );
     2516
     2517        /* Check range of value.
    25182518     */
    25192519    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]
     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]
    25322532 */
    25332533HRESULT WINAPI VarI4FromDate(DATE dateIn, LONG* plOut)
    25342534{
    2535     TRACE("( %f, %p ), stub\n", dateIn, plOut );
    2536 
    2537     /* Check range of value.
     2535        TRACE("( %f, %p ), stub\n", dateIn, plOut );
     2536
     2537        /* Check range of value.
    25382538     */
    25392539    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]
     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]
    25522552 */
    25532553HRESULT WINAPI VarI4FromBool(VARIANT_BOOL boolIn, LONG* plOut)
    25542554{
    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]
     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]
    25642564 */
    25652565HRESULT WINAPI VarI4FromI1(CHAR cIn, LONG* plOut)
    25662566{
    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]
     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]
    25762576 */
    25772577HRESULT WINAPI VarI4FromUI2(USHORT uiIn, LONG* plOut)
    25782578{
    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]
     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]
    25882588 */
    25892589HRESULT WINAPI VarI4FromUI4(ULONG ulIn, LONG* plOut)
    25902590{
    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]
     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]
    26072607 */
    26082608HRESULT WINAPI VarI4FromI2(short sIn, LONG* plOut)
    26092609{
    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]
     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]
    26192619 */
    26202620HRESULT WINAPI VarI4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, LONG* plOut)
    26212621{
    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.
     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.
    26452645     */
    26462646    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;
     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;
    26552655}
    26562656
     
    26612661HRESULT WINAPI VarI4FromCy(CY cyIn, LONG* plOut) {
    26622662   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2663 
     2663   
    26642664   if (t > I4_MAX || t < I4_MIN) return DISP_E_OVERFLOW;
    2665 
     2665   
    26662666   *plOut = (LONG)t;
    26672667   return S_OK;
     
    26692669
    26702670/******************************************************************************
    2671  *      VarR4FromUI1        [OLEAUT32.68]
     2671 *              VarR4FromUI1            [OLEAUT32.68]
    26722672 */
    26732673HRESULT WINAPI VarR4FromUI1(BYTE bIn, FLOAT* pfltOut)
    26742674{
    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]
     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]
    26842684 */
    26852685HRESULT WINAPI VarR4FromI2(short sIn, FLOAT* pfltOut)
    26862686{
    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]
     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]
    26962696 */
    26972697HRESULT WINAPI VarR4FromI4(LONG lIn, FLOAT* pfltOut)
    26982698{
    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]
     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]
    27082708 */
    27092709HRESULT WINAPI VarR4FromR8(double dblIn, FLOAT* pfltOut)
    27102710{
    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]
     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]
    27272727 */
    27282728HRESULT WINAPI VarR4FromDate(DATE dateIn, FLOAT* pfltOut)
    27292729{
    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]
     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]
    27462746 */
    27472747HRESULT WINAPI VarR4FromBool(VARIANT_BOOL boolIn, FLOAT* pfltOut)
    27482748{
    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]
     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]
    27582758 */
    27592759HRESULT WINAPI VarR4FromI1(CHAR cIn, FLOAT* pfltOut)
    27602760{
    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]
     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]
    27702770 */
    27712771HRESULT WINAPI VarR4FromUI2(USHORT uiIn, FLOAT* pfltOut)
    27722772{
    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]
     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]
    27822782 */
    27832783HRESULT WINAPI VarR4FromUI4(ULONG ulIn, FLOAT* pfltOut)
    27842784{
    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]
     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]
    27942794 */
    27952795HRESULT WINAPI VarR4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, FLOAT* pfltOut)
    27962796{
    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;
     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;
    28292829}
    28302830
     
    28352835HRESULT WINAPI VarR4FromCy(CY cyIn, FLOAT* pfltOut) {
    28362836   *pfltOut = (FLOAT)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2837 
     2837   
    28382838   return S_OK;
    28392839}
    28402840
    28412841/******************************************************************************
    2842  *      VarR8FromUI1        [OLEAUT32.78]
     2842 *              VarR8FromUI1            [OLEAUT32.78]
    28432843 */
    28442844HRESULT WINAPI VarR8FromUI1(BYTE bIn, double* pdblOut)
    28452845{
    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]
     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]
    28552855 */
    28562856HRESULT WINAPI VarR8FromI2(short sIn, double* pdblOut)
    28572857{
    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]
     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]
    28672867 */
    28682868HRESULT WINAPI VarR8FromI4(LONG lIn, double* pdblOut)
    28692869{
    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]
     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]
    28792879 */
    28802880HRESULT WINAPI VarR8FromR4(FLOAT fltIn, double* pdblOut)
    28812881{
    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]
     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]
    28912891 */
    28922892HRESULT WINAPI VarR8FromDate(DATE dateIn, double* pdblOut)
    28932893{
    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]
     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]
    29032903 */
    29042904HRESULT WINAPI VarR8FromBool(VARIANT_BOOL boolIn, double* pdblOut)
    29052905{
    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]
     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]
    29152915 */
    29162916HRESULT WINAPI VarR8FromI1(CHAR cIn, double* pdblOut)
    29172917{
    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]
     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]
    29272927 */
    29282928HRESULT WINAPI VarR8FromUI2(USHORT uiIn, double* pdblOut)
    29292929{
    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]
     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]
    29392939 */
    29402940HRESULT WINAPI VarR8FromUI4(ULONG ulIn, double* pdblOut)
    29412941{
    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]
     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]
    29512951 */
    29522952HRESULT WINAPI VarR8FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, double* pdblOut)
    29532953{
    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;
     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;
    29792979}
    29802980
     
    29852985HRESULT WINAPI VarR8FromCy(CY cyIn, double* pdblOut) {
    29862986   *pdblOut = (double)((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    2987 
     2987   
    29882988   return S_OK;
    29892989}
    29902990
    29912991/******************************************************************************
    2992  *      VarDateFromUI1      [OLEAUT32.88]
     2992 *              VarDateFromUI1          [OLEAUT32.88]
    29932993 */
    29942994HRESULT WINAPI VarDateFromUI1(BYTE bIn, DATE* pdateOut)
    29952995{
    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]
     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]
    30053005 */
    30063006HRESULT WINAPI VarDateFromI2(short sIn, DATE* pdateOut)
    30073007{
    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]
     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]
    30173017 */
    30183018HRESULT WINAPI VarDateFromI4(LONG lIn, DATE* pdateOut)
    30193019{
    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]
     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]
    30343034 */
    30353035HRESULT WINAPI VarDateFromR4(FLOAT fltIn, DATE* pdateOut)
     
    30383038
    30393039    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]
     3040        {
     3041                return DISP_E_OVERFLOW;
     3042        }
     3043
     3044        *pdateOut = (DATE) fltIn;
     3045
     3046        return S_OK;
     3047}
     3048
     3049/******************************************************************************
     3050 *              VarDateFromR8           [OLEAUT32.92]
    30513051 */
    30523052HRESULT WINAPI VarDateFromR8(double dblIn, DATE* pdateOut)
     
    30543054    TRACE("( %f, %p ), stub\n", dblIn, pdateOut );
    30553055
    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]
     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]
    30683068 * The string representing the date is composed of two parts, a date and time.
    30693069 *
     
    30743074 *
    30753075 * The formats for the date part are has follows:
    3076  * mm/[dd/][yy]yy
     3076 * mm/[dd/][yy]yy 
    30773077 * [dd/]mm/[yy]yy
    3078  * [yy]yy/mm/dd
     3078 * [yy]yy/mm/dd 
    30793079 * January dd[,] [yy]yy
    30803080 * dd January [yy]yy
     
    30833083 *
    30843084 * The formats for the date and time string are has follows.
    3085  * date[whitespace][time]
     3085 * date[whitespace][time] 
    30863086 * [time][whitespace]date
    30873087 *
     
    31113111
    31123112
    3113     return ret;
    3114 }
    3115 
    3116 /******************************************************************************
    3117  *      VarDateFromI1       [OLEAUT32.221]
     3113        return ret;
     3114}
     3115
     3116/******************************************************************************
     3117 *              VarDateFromI1           [OLEAUT32.221]
    31183118 */
    31193119HRESULT WINAPI VarDateFromI1(CHAR cIn, DATE* pdateOut)
    31203120{
    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]
     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]
    31303130 */
    31313131HRESULT WINAPI VarDateFromUI2(USHORT uiIn, DATE* pdateOut)
    31323132{
    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]
     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]
    31473147 */
    31483148HRESULT WINAPI VarDateFromUI4(ULONG ulIn, DATE* pdateOut)
    31493149{
    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]
     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]
    31643164 */
    31653165HRESULT WINAPI VarDateFromBool(VARIANT_BOOL boolIn, DATE* pdateOut)
    31663166{
    3167     TRACE("( %d, %p ), stub\n", boolIn, pdateOut );
    3168 
    3169     *pdateOut = (DATE) boolIn;
    3170 
    3171     return S_OK;
     3167        TRACE("( %d, %p ), stub\n", boolIn, pdateOut );
     3168
     3169        *pdateOut = (DATE) boolIn;
     3170
     3171        return S_OK;
    31723172}
    31733173
     
    31843184
    31853185/******************************************************************************
    3186  *      VarBstrFromUI1      [OLEAUT32.108]
     3186 *              VarBstrFromUI1          [OLEAUT32.108]
    31873187 */
    31883188HRESULT WINAPI VarBstrFromUI1(BYTE bVal, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    31893189{
    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]
     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]
    32003200 */
    32013201HRESULT WINAPI VarBstrFromI2(short iVal, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    32023202{
    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]
     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]
    32123212 */
    32133213HRESULT WINAPI VarBstrFromI4(LONG lIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    32143214{
    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]
     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]
    32253225 */
    32263226HRESULT WINAPI VarBstrFromR4(FLOAT fltIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    32273227{
    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]
     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]
    32383238 */
    32393239HRESULT WINAPI VarBstrFromR8(double dblIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    32403240{
    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;
     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;
    32473247}
    32483248
     
    32513251 */
    32523252HRESULT WINAPI VarBstrFromCy(CY cyIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut) {
    3253                 /* FIXME */
    3254     return E_NOTIMPL;
    3255 }
    3256 
    3257 
    3258 /******************************************************************************
    3259  *      VarBstrFromDate     [OLEAUT32.114]
     3253                                /* FIXME */
     3254        return E_NOTIMPL;
     3255}
     3256
     3257 
     3258/******************************************************************************
     3259 *              VarBstrFromDate         [OLEAUT32.114]
    32603260 *
    32613261 * The date is implemented using an 8 byte floating-point number.
     
    32743274 * The tm structure is as follows:
    32753275 * 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  *        };
     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 *                };
    32863286 */
    32873287HRESULT WINAPI VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
     
    32933293
    32943294    if( DateToTm( dateIn, dwFlags, &TM ) == FALSE )
    3295             {
     3295                        {
    32963296        return E_INVALIDARG;
    3297         }
     3297                }
    32983298
    32993299    if( dwFlags & VAR_DATEVALUEONLY )
    3300             strftime( pBuffer, BUFFER_MAX, "%x", &TM );
     3300                        strftime( pBuffer, BUFFER_MAX, "%x", &TM );
    33013301    else if( dwFlags & VAR_TIMEVALUEONLY )
    3302             strftime( pBuffer, BUFFER_MAX, "%X", &TM );
    3303         else
     3302                        strftime( pBuffer, BUFFER_MAX, "%X", &TM );
     3303                else
    33043304        strftime( pBuffer, BUFFER_MAX, "%x %X", &TM );
    33053305
    3306         *pbstrOut = StringDupAtoBstr( pBuffer );
    3307 
    3308     return S_OK;
    3309 }
    3310 
    3311 /******************************************************************************
    3312  *      VarBstrFromBool     [OLEAUT32.116]
     3306                *pbstrOut = StringDupAtoBstr( pBuffer );
     3307
     3308        return S_OK;
     3309}
     3310
     3311/******************************************************************************
     3312 *              VarBstrFromBool         [OLEAUT32.116]
    33133313 */
    33143314HRESULT WINAPI VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    33153315{
    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]
     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]
    33343334 */
    33353335HRESULT WINAPI VarBstrFromI1(CHAR cIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    33363336{
    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]
     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]
    33463346 */
    33473347HRESULT WINAPI VarBstrFromUI2(USHORT uiIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    33483348{
    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]
     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]
    33583358 */
    33593359HRESULT WINAPI VarBstrFromUI4(ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR* pbstrOut)
    33603360{
    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]
     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]
    33703370 */
    33713371HRESULT WINAPI VarBoolFromUI1(BYTE bIn, VARIANT_BOOL* pboolOut)
    33723372{
    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]
     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]
    33893389 */
    33903390HRESULT WINAPI VarBoolFromI2(short sIn, VARIANT_BOOL* pboolOut)
    33913391{
    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]
     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]
    34083408 */
    34093409HRESULT WINAPI VarBoolFromI4(LONG lIn, VARIANT_BOOL* pboolOut)
    34103410{
    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]
     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]
    34273427 */
    34283428HRESULT WINAPI VarBoolFromR4(FLOAT fltIn, VARIANT_BOOL* pboolOut)
    34293429{
    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]
     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]
    34463446 */
    34473447HRESULT WINAPI VarBoolFromR8(double dblIn, VARIANT_BOOL* pboolOut)
    34483448{
    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]
     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]
    34653465 */
    34663466HRESULT WINAPI VarBoolFromDate(DATE dateIn, VARIANT_BOOL* pboolOut)
    34673467{
    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]
     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]
    34843484 */
    34853485HRESULT WINAPI VarBoolFromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, VARIANT_BOOL* pboolOut)
    34863486{
    3487     HRESULT ret = S_OK;
    3488     char* pNewString = NULL;
    3489 
    3490     TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pboolOut );
     3487        HRESULT ret = S_OK;
     3488        char* pNewString = NULL;
     3489
     3490        TRACE("( %p, %ld, %ld, %p ), stub\n", strIn, lcid, dwFlags, pboolOut );
    34913491
    34923492    pNewString = HEAP_strdupWtoA( GetProcessHeap(), 0, strIn );
    34933493
    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]
     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]
    35373537 */
    35383538HRESULT WINAPI VarBoolFromI1(CHAR cIn, VARIANT_BOOL* pboolOut)
    35393539{
    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]
     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]
    35563556 */
    35573557HRESULT WINAPI VarBoolFromUI2(USHORT uiIn, VARIANT_BOOL* pboolOut)
    35583558{
    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]
     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]
    35753575 */
    35763576HRESULT WINAPI VarBoolFromUI4(ULONG ulIn, VARIANT_BOOL* pboolOut)
    35773577{
    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;
     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;
    35903590}
    35913591
     
    35973597      if (cyIn.s.Hi || cyIn.s.Lo) *pboolOut = -1;
    35983598      else *pboolOut = 0;
    3599 
     3599     
    36003600      return S_OK;
    36013601}
    36023602
    36033603/******************************************************************************
    3604  *      VarI1FromUI1        [OLEAUT32.244]
     3604 *              VarI1FromUI1            [OLEAUT32.244]
    36053605 */
    36063606HRESULT WINAPI VarI1FromUI1(BYTE bIn, CHAR* pcOut)
    36073607{
    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]
     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]
    36243624 */
    36253625HRESULT WINAPI VarI1FromI2(short uiIn, CHAR* pcOut)
    36263626{
    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]
     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]
    36413641 */
    36423642HRESULT WINAPI VarI1FromI4(LONG lIn, CHAR* pcOut)
    36433643{
    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]
     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]
    36583658 */
    36593659HRESULT WINAPI VarI1FromR4(FLOAT fltIn, CHAR* pcOut)
    36603660{
    3661     TRACE("( %f, %p ), stub\n", fltIn, pcOut );
     3661        TRACE("( %f, %p ), stub\n", fltIn, pcOut );
    36623662
    36633663    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]
     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]
    36763676 */
    36773677HRESULT WINAPI VarI1FromR8(double dblIn, CHAR* pcOut)
    36783678{
    3679     TRACE("( %f, %p ), stub\n", dblIn, pcOut );
     3679        TRACE("( %f, %p ), stub\n", dblIn, pcOut );
    36803680
    36813681    dblIn = round( dblIn );
    36823682    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]
     3683        {
     3684                return DISP_E_OVERFLOW;
     3685        }
     3686
     3687        *pcOut = (CHAR) dblIn;
     3688
     3689        return S_OK;
     3690}
     3691
     3692/******************************************************************************
     3693 *              VarI1FromDate           [OLEAUT32.249]
    36943694 */
    36953695HRESULT WINAPI VarI1FromDate(DATE dateIn, CHAR* pcOut)
    36963696{
    3697     TRACE("( %f, %p ), stub\n", dateIn, pcOut );
     3697        TRACE("( %f, %p ), stub\n", dateIn, pcOut );
    36983698
    36993699    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]
     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]
    37123712 */
    37133713HRESULT WINAPI VarI1FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, CHAR* pcOut)
    37143714{
    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.
     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.
    37383738     */
    37393739    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]
     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]
    37523752 */
    37533753HRESULT WINAPI VarI1FromBool(VARIANT_BOOL boolIn, CHAR* pcOut)
    37543754{
    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]
     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]
    37643764 */
    37653765HRESULT WINAPI VarI1FromUI2(USHORT uiIn, CHAR* pcOut)
    37663766{
    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]
     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]
    37813781 */
    37823782HRESULT WINAPI VarI1FromUI4(ULONG ulIn, CHAR* pcOut)
    37833783{
    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;
     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;
    37943794}
    37953795
     
    38003800HRESULT WINAPI VarI1FromCy(CY cyIn, CHAR* pcOut) {
    38013801   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    3802 
     3802   
    38033803   if (t > CHAR_MAX || t < CHAR_MIN) return DISP_E_OVERFLOW;
    3804 
     3804   
    38053805   *pcOut = (CHAR)t;
    38063806   return S_OK;
     
    38083808
    38093809/******************************************************************************
    3810  *      VarUI2FromUI1       [OLEAUT32.257]
     3810 *              VarUI2FromUI1           [OLEAUT32.257]
    38113811 */
    38123812HRESULT WINAPI VarUI2FromUI1(BYTE bIn, USHORT* puiOut)
    38133813{
    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]
     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]
    38233823 */
    38243824HRESULT WINAPI VarUI2FromI2(short uiIn, USHORT* puiOut)
    38253825{
    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]
     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]
    38403840 */
    38413841HRESULT WINAPI VarUI2FromI4(LONG lIn, USHORT* puiOut)
    38423842{
    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]
     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]
    38573857 */
    38583858HRESULT WINAPI VarUI2FromR4(FLOAT fltIn, USHORT* puiOut)
    38593859{
    3860     TRACE("( %f, %p ), stub\n", fltIn, puiOut );
     3860        TRACE("( %f, %p ), stub\n", fltIn, puiOut );
    38613861
    38623862    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]
     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]
    38753875 */
    38763876HRESULT WINAPI VarUI2FromR8(double dblIn, USHORT* puiOut)
    38773877{
    3878     TRACE("( %f, %p ), stub\n", dblIn, puiOut );
     3878        TRACE("( %f, %p ), stub\n", dblIn, puiOut );
    38793879
    38803880    dblIn = round( dblIn );
    38813881    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]
     3882        {
     3883                return DISP_E_OVERFLOW;
     3884        }
     3885
     3886        *puiOut = (USHORT) dblIn;
     3887
     3888        return S_OK;
     3889}
     3890
     3891/******************************************************************************
     3892 *              VarUI2FromDate          [OLEAUT32.262]
    38933893 */
    38943894HRESULT WINAPI VarUI2FromDate(DATE dateIn, USHORT* puiOut)
    38953895{
    3896     TRACE("( %f, %p ), stub\n", dateIn, puiOut );
     3896        TRACE("( %f, %p ), stub\n", dateIn, puiOut );
    38973897
    38983898    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]
     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]
    39113911 */
    39123912HRESULT WINAPI VarUI2FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, USHORT* puiOut)
    39133913{
    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.
     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.
    39373937     */
    39383938    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]
     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]
    39513951 */
    39523952HRESULT WINAPI VarUI2FromBool(VARIANT_BOOL boolIn, USHORT* puiOut)
    39533953{
    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]
     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]
    39633963 */
    39643964HRESULT WINAPI VarUI2FromI1(CHAR cIn, USHORT* puiOut)
    39653965{
    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]
     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]
    39753975 */
    39763976HRESULT WINAPI VarUI2FromUI4(ULONG ulIn, USHORT* puiOut)
    39773977{
    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]
     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]
    39923992 */
    39933993HRESULT WINAPI VarUI4FromStr(OLECHAR* strIn, LCID lcid, ULONG dwFlags, ULONG* pulOut)
    39943994{
    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.
     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.
    40184018     */
    40194019    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;
     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;
    40284028}
    40294029
     
    40344034HRESULT WINAPI VarUI2FromCy(CY cyIn, USHORT* pusOut) {
    40354035   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    4036 
     4036   
    40374037   if (t > UI2_MAX || t < UI2_MIN) return DISP_E_OVERFLOW;
    4038 
     4038     
    40394039   *pusOut = (USHORT)t;
    4040 
     4040   
    40414041   return S_OK;
    40424042}
    40434043
    40444044/******************************************************************************
    4045  *      VarUI4FromUI1       [OLEAUT32.270]
     4045 *              VarUI4FromUI1           [OLEAUT32.270]
    40464046 */
    40474047HRESULT WINAPI VarUI4FromUI1(BYTE bIn, ULONG* pulOut)
    40484048{
    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]
     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]
    40584058 */
    40594059HRESULT WINAPI VarUI4FromI2(short uiIn, ULONG* pulOut)
    40604060{
    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]
     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]
    40754075 */
    40764076HRESULT WINAPI VarUI4FromI4(LONG lIn, ULONG* pulOut)
    40774077{
    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]
     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]
    40924092 */
    40934093HRESULT WINAPI VarUI4FromR4(FLOAT fltIn, ULONG* pulOut)
     
    40954095    fltIn = round( fltIn );
    40964096    if( fltIn < UI4_MIN || fltIn > UI4_MAX )
    4097     {
    4098         return DISP_E_OVERFLOW;
     4097        {
     4098                return DISP_E_OVERFLOW;
     4099        }
     4100
     4101        *pulOut = (ULONG) fltIn;
     4102
     4103        return S_OK;
     4104}
     4105
     4106/******************************************************************************
     4107 *              VarUI4FromR8            [OLEAUT32.274]
     4108 */
     4109HRESULT WINAPI VarUI4FromR8(double dblIn, ULONG* pulOut)
     4110{
     4111        TRACE("( %f, %p ), stub\n", dblIn, pulOut );
     4112
     4113    dblIn = round( dblIn );
     4114        if( dblIn < UI4_MIN || dblIn > UI4_MAX )
     4115        {
     4116                return DISP_E_OVERFLOW;
    40994117    }
    41004118
    4101     *pulOut = (ULONG) fltIn;
    4102 
    4103     return S_OK;
    4104 }
    4105 
    4106 /******************************************************************************
    4107  *      VarUI4FromR8        [OLEAUT32.274]
    4108  */
    4109 HRESULT WINAPI VarUI4FromR8(double dblIn, ULONG* pulOut)
    4110 {
    4111     TRACE("( %f, %p ), stub\n", dblIn, pulOut );
    4112 
    4113     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]
     4119        *pulOut = (ULONG) dblIn;
     4120
     4121        return S_OK;
     4122}
     4123
     4124/******************************************************************************
     4125 *              VarUI4FromDate          [OLEAUT32.275]
    41264126 */
    41274127HRESULT WINAPI VarUI4FromDate(DATE dateIn, ULONG* pulOut)
    41284128{
    4129     TRACE("( %f, %p ), stub\n", dateIn, pulOut );
     4129        TRACE("( %f, %p ), stub\n", dateIn, pulOut );
    41304130
    41314131    dateIn = round( dateIn );
    41324132    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]
     4133        {
     4134                return DISP_E_OVERFLOW;
     4135        }
     4136
     4137        *pulOut = (ULONG) dateIn;
     4138
     4139        return S_OK;
     4140}
     4141
     4142/******************************************************************************
     4143 *              VarUI4FromBool          [OLEAUT32.279]
    41444144 */
    41454145HRESULT WINAPI VarUI4FromBool(VARIANT_BOOL boolIn, ULONG* pulOut)
    41464146{
    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]
     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]
    41564156 */
    41574157HRESULT WINAPI VarUI4FromI1(CHAR cIn, ULONG* pulOut)
    41584158{
    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]
     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]
    41684168 */
    41694169HRESULT WINAPI VarUI4FromUI2(USHORT uiIn, ULONG* pulOut)
    41704170{
    4171     TRACE("( %d, %p ), stub\n", uiIn, pulOut );
    4172 
    4173     *pulOut = (ULONG) uiIn;
    4174 
    4175     return S_OK;
     4171        TRACE("( %d, %p ), stub\n", uiIn, pulOut );
     4172
     4173        *pulOut = (ULONG) uiIn;
     4174
     4175        return S_OK;
    41764176}
    41774177
     
    41824182HRESULT WINAPI VarUI4FromCy(CY cyIn, ULONG* pulOut) {
    41834183   double t = round((((double)cyIn.s.Hi * 4294967296.0) + (double)cyIn.s.Lo) / 10000);
    4184 
     4184   
    41854185   if (t > UI4_MAX || t < UI4_MIN) return DISP_E_OVERFLOW;
    41864186
     
    41974197   pcyOut->s.Hi = 0;
    41984198   pcyOut->s.Lo = ((ULONG)bIn) * 10000;
    4199 
     4199   
    42004200   return S_OK;
    42014201}
     
    42094209   else pcyOut->s.Hi = 0;
    42104210   pcyOut->s.Lo = ((ULONG)sIn) * 10000;
    4211 
     4211   
    42124212   return S_OK;
    42134213}
     
    42224222      pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
    42234223      if (lIn < 0) pcyOut->s.Hi--;
    4224 
     4224   
    42254225      return S_OK;
    42264226}
     
    42354235   pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
    42364236   if (fltIn < 0) pcyOut->s.Hi--;
    4237 
     4237   
    42384238   return S_OK;
    42394239}
     
    42694269 */
    42704270HRESULT WINAPI VarCyFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, CY *pcyOut) {
    4271                 /* FIXME */
    4272         return E_NOTIMPL;
    4273 }
    4274 
    4275 
     4271                                /* FIXME */
     4272                return E_NOTIMPL;
     4273}
     4274
     4275 
    42764276/**********************************************************************
    42774277 *              VarCyFromBool [OLEAUT32.106]
     
    42824282   else pcyOut->s.Hi = 0;
    42834283   pcyOut->s.Lo = (ULONG)boolIn * (ULONG)10000;
    4284 
     4284   
    42854285   return S_OK;
    42864286}
     
    42944294   else pcyOut->s.Hi = 0;
    42954295   pcyOut->s.Lo = (ULONG)cIn * (ULONG)10000;
    4296 
     4296   
    42974297   return S_OK;
    42984298}
     
    43054305   pcyOut->s.Hi = 0;
    43064306   pcyOut->s.Lo = (ULONG)usIn * (ULONG)10000;
    4307 
     4307   
    43084308   return S_OK;
    43094309}
     
    43174317   pcyOut->s.Hi = (LONG)(t / (double)4294967296.0);
    43184318   pcyOut->s.Lo = (ULONG)fmod(t, (double)4294967296.0);
    4319 
     4319     
    43204320   return S_OK;
    43214321}
     
    43334333
    43344334    TRACE("( 0x%x, 0x%x, 0x%p ), stub\n", wDosDate, wDosTime, pvtime );
    4335 
     4335   
    43364336    t.tm_sec = (wDosTime & 0x001f) * 2;
    43374337    t.tm_min = (wDosTime & 0x07e0) >> 5;
    43384338    t.tm_hour = (wDosTime & 0xf800) >> 11;
    4339 
     4339   
    43404340    t.tm_mday = (wDosDate & 0x001f);
    43414341    t.tm_mon = (wDosDate & 0x01e0) >> 5;
     
    43634363    cDig = 0;
    43644364    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         }
     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        }
    43714372    }
    4372     }
    4373     pnumprs->cDig   = cDig;
     4373    pnumprs->cDig       = cDig;
    43744374
    43754375    /* FIXME: Just patching some values in */
    4376     pnumprs->nPwr10 = 0;
    4377     pnumprs->nBaseShift = 0;
    4378     pnumprs->cchUsed    = lastent;
    4379     pnumprs->dwOutFlags = NUMPRS_DECIMAL;
     4376    pnumprs->nPwr10     = 0;
     4377    pnumprs->nBaseShift = 0;
     4378    pnumprs->cchUsed    = lastent;
     4379    pnumprs->dwOutFlags = NUMPRS_DECIMAL;
    43804380    return S_OK;
    43814381}
     
    43944394    xint = 0;
    43954395    for (i=0;i<pnumprs->cDig;i++)
    4396     xint = xint*10 + rgbDig[i];
     4396        xint = xint*10 + rgbDig[i];
    43974397
    43984398    VariantInit(pvar);
    43994399    if (dwVtBits & VTBIT_I4) {
    4400     V_VT(pvar) = VT_I4;
    4401     V_UNION(pvar,intVal) = xint;
    4402     return S_OK;
     4400        V_VT(pvar) = VT_I4;
     4401        V_UNION(pvar,intVal) = xint;
     4402        return S_OK;
    44034403    }
    44044404    if (dwVtBits & VTBIT_R8) {
    4405     V_VT(pvar) = VT_R8;
    4406     V_UNION(pvar,dblVal) = xint;
    4407     return S_OK;
     4405        V_VT(pvar) = VT_R8;
     4406        V_UNION(pvar,dblVal) = xint;
     4407        return S_OK;
    44084408    } else {
    4409     FIXME("vtbitmask is unsupported %lx\n",dwVtBits);
    4410     return E_FAIL;
     4409        FIXME("vtbitmask is unsupported %lx\n",dwVtBits);
     4410        return E_FAIL;
    44114411    }
    44124412}
     
    46594659 *              VarBstrCmp [OLEAUT32.440]
    46604660 *
    4661  * flags can be:
     4661 * flags can be: 
    46624662 *   NORM_IGNORECASE, NORM_IGNORENONSPACE, NORM_IGNORESYMBOLS
    46634663 *   NORM_IGNORESTRINGWIDTH, NORM_IGNOREKANATYPE, NORM_IGNOREKASHIDA
Note: See TracChangeset for help on using the changeset viewer.