Implemented the remaining 64-bit file functions, and added a few other

functions and exported variables.
Removed the almost empty lconv.c file.
This commit is contained in:
Alexandre Julliard 2004-01-13 05:45:05 +00:00
parent 16e5634a3b
commit dec198afe0
10 changed files with 204 additions and 59 deletions

View file

@ -21,7 +21,6 @@ C_SRCS = \
exit.c \
file.c \
heap.c \
lconv.c \
locale.c \
lock.c \
main.c \

View file

@ -46,8 +46,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
/* INTERNAL: Translate finddata_t to PWIN32_FIND_DATAA */
static void msvcrt_fttofd(LPWIN32_FIND_DATAA fd, struct _finddata_t* ft)
/* INTERNAL: Translate WIN32_FIND_DATAA to finddata_t */
static void msvcrt_fttofd( const WIN32_FIND_DATAA *fd, struct _finddata_t* ft)
{
DWORD dw;
@ -66,8 +66,8 @@ static void msvcrt_fttofd(LPWIN32_FIND_DATAA fd, struct _finddata_t* ft)
strcpy(ft->name, fd->cFileName);
}
/* INTERNAL: Translate wfinddata_t to PWIN32_FIND_DATAA */
static void msvcrt_wfttofd(LPWIN32_FIND_DATAW fd, struct _wfinddata_t* ft)
/* INTERNAL: Translate WIN32_FIND_DATAW to wfinddata_t */
static void msvcrt_wfttofd( const WIN32_FIND_DATAW *fd, struct _wfinddata_t* ft)
{
DWORD dw;
@ -86,6 +86,46 @@ static void msvcrt_wfttofd(LPWIN32_FIND_DATAW fd, struct _wfinddata_t* ft)
strcpyW(ft->name, fd->cFileName);
}
/* INTERNAL: Translate WIN32_FIND_DATAA to finddatai64_t */
static void msvcrt_fttofdi64( const WIN32_FIND_DATAA *fd, struct _finddatai64_t* ft)
{
DWORD dw;
if (fd->dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
ft->attrib = 0;
else
ft->attrib = fd->dwFileAttributes;
RtlTimeToSecondsSince1970( (LARGE_INTEGER *)&fd->ftCreationTime, &dw );
ft->time_create = dw;
RtlTimeToSecondsSince1970( (LARGE_INTEGER *)&fd->ftLastAccessTime, &dw );
ft->time_access = dw;
RtlTimeToSecondsSince1970( (LARGE_INTEGER *)&fd->ftLastWriteTime, &dw );
ft->time_write = dw;
ft->size = ((__int64)fd->nFileSizeHigh) << 32 | fd->nFileSizeLow;
strcpy(ft->name, fd->cFileName);
}
/* INTERNAL: Translate WIN32_FIND_DATAW to wfinddatai64_t */
static void msvcrt_wfttofdi64( const WIN32_FIND_DATAW *fd, struct _wfinddatai64_t* ft)
{
DWORD dw;
if (fd->dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
ft->attrib = 0;
else
ft->attrib = fd->dwFileAttributes;
RtlTimeToSecondsSince1970( (LARGE_INTEGER *)&fd->ftCreationTime, &dw );
ft->time_create = dw;
RtlTimeToSecondsSince1970( (LARGE_INTEGER *)&fd->ftLastAccessTime, &dw );
ft->time_access = dw;
RtlTimeToSecondsSince1970( (LARGE_INTEGER *)&fd->ftLastWriteTime, &dw );
ft->time_write = dw;
ft->size = ((__int64)fd->nFileSizeHigh) << 32 | fd->nFileSizeLow;
strcpyW(ft->name, fd->cFileName);
}
/*********************************************************************
* _chdir (MSVCRT.@)
*/
@ -181,6 +221,44 @@ long _wfindfirst(const MSVCRT_wchar_t * fspec, struct _wfinddata_t* ft)
return (long)hfind;
}
/*********************************************************************
* _findfirsti64 (MSVCRT.@)
*/
long _findfirsti64(const char * fspec, struct _finddatai64_t* ft)
{
WIN32_FIND_DATAA find_data;
HANDLE hfind;
hfind = FindFirstFileA(fspec, &find_data);
if (hfind == INVALID_HANDLE_VALUE)
{
MSVCRT__set_errno(GetLastError());
return -1;
}
msvcrt_fttofdi64(&find_data,ft);
TRACE(":got handle %p\n",hfind);
return (long)hfind;
}
/*********************************************************************
* _wfindfirsti64 (MSVCRT.@)
*/
long _wfindfirsti64(const MSVCRT_wchar_t * fspec, struct _wfinddatai64_t* ft)
{
WIN32_FIND_DATAW find_data;
HANDLE hfind;
hfind = FindFirstFileW(fspec, &find_data);
if (hfind == INVALID_HANDLE_VALUE)
{
MSVCRT__set_errno(GetLastError());
return -1;
}
msvcrt_wfttofdi64(&find_data,ft);
TRACE(":got handle %p\n",hfind);
return (long)hfind;
}
/*********************************************************************
* _findnext (MSVCRT.@)
*/
@ -215,6 +293,40 @@ int _wfindnext(long hand, struct _wfinddata_t * ft)
return 0;
}
/*********************************************************************
* _findnexti64 (MSVCRT.@)
*/
int _findnexti64(long hand, struct _finddatai64_t * ft)
{
WIN32_FIND_DATAA find_data;
if (!FindNextFileA((HANDLE)hand, &find_data))
{
*MSVCRT__errno() = MSVCRT_ENOENT;
return -1;
}
msvcrt_fttofdi64(&find_data,ft);
return 0;
}
/*********************************************************************
* _wfindnexti64 (MSVCRT.@)
*/
int _wfindnexti64(long hand, struct _wfinddatai64_t * ft)
{
WIN32_FIND_DATAW find_data;
if (!FindNextFileW((HANDLE)hand, &find_data))
{
*MSVCRT__errno() = MSVCRT_ENOENT;
return -1;
}
msvcrt_wfttofdi64(&find_data,ft);
return 0;
}
/*********************************************************************
* _getcwd (MSVCRT.@)
*/

View file

@ -164,3 +164,11 @@ int _set_error_mode(int mode)
}
return old;
}
/******************************************************************************
* _seterrormode (MSVCRT.@)
*/
void _seterrormode(int mode)
{
SetErrorMode( mode );
}

View file

@ -42,6 +42,8 @@ static LPCSTR szMsgBoxTitle = "Wine C++ Runtime Library";
extern int MSVCRT_app_type;
extern char *MSVCRT__pgmptr;
void (*_aexit_rtn)(int) = MSVCRT__exit;
/* INTERNAL: call atexit functions */
void __MSVCRT__call_atexit(void)
{
@ -142,7 +144,7 @@ void MSVCRT__amsg_exit(int errnum)
}
else
_cprintf("\nruntime error R60%d\n",errnum);
MSVCRT__exit(255);
_aexit_rtn(255);
}
/*********************************************************************

View file

@ -551,7 +551,7 @@ int _fcloseall(void)
}
/*********************************************************************
* _lseek (MSVCRT.@)
* _lseeki64 (MSVCRT.@)
*/
__int64 _lseeki64(int fd, __int64 offset, int whence)
{
@ -715,6 +715,25 @@ LONG _filelength(int fd)
return -1;
}
/*********************************************************************
* _filelengthi64 (MSVCRT.@)
*/
__int64 _filelengthi64(int fd)
{
__int64 curPos = _lseeki64(fd, 0, SEEK_CUR);
if (curPos != -1)
{
__int64 endPos = _lseeki64(fd, 0, SEEK_END);
if (endPos != -1)
{
if (endPos != curPos)
_lseeki64(fd, curPos, SEEK_SET);
return endPos;
}
}
return -1;
}
/*********************************************************************
* _fileno (MSVCRT.@)
*/
@ -1368,9 +1387,9 @@ int MSVCRT__stat(const char* path, struct _stat * buf)
}
/*********************************************************************
* _wstat (MSVCRT.@)
* _wstati64 (MSVCRT.@)
*/
int _wstat(const MSVCRT_wchar_t* path, struct _stat * buf)
int _wstati64(const MSVCRT_wchar_t* path, struct _stati64 * buf)
{
DWORD dw;
WIN32_FILE_ATTRIBUTE_DATA hfi;
@ -1418,24 +1437,46 @@ int _wstat(const MSVCRT_wchar_t* path, struct _stat * buf)
buf->st_mode = mode;
buf->st_nlink = 1;
buf->st_size = hfi.nFileSizeLow;
buf->st_size = ((__int64)hfi.nFileSizeHigh << 32) + hfi.nFileSizeLow;
RtlTimeToSecondsSince1970((LARGE_INTEGER *)&hfi.ftLastAccessTime, &dw);
buf->st_atime = dw;
RtlTimeToSecondsSince1970((LARGE_INTEGER *)&hfi.ftLastWriteTime, &dw);
buf->st_mtime = buf->st_ctime = dw;
TRACE("\n%d %d %d %ld %ld %ld\n", buf->st_mode,buf->st_nlink,buf->st_size,
TRACE("%d %d 0x%08lx%08lx %ld %ld %ld\n", buf->st_mode,buf->st_nlink,
(long)(buf->st_size >> 32),(long)buf->st_size,
buf->st_atime,buf->st_mtime, buf->st_ctime);
return 0;
}
/*********************************************************************
* _wstat (MSVCRT.@)
*/
int _wstat(const MSVCRT_wchar_t* path, struct _stat * buf)
{
int ret;
struct _stati64 bufi64;
ret = _wstati64( path, &bufi64 );
if (!ret) msvcrt_cp_from_stati64(&bufi64, buf);
return ret;
}
/*********************************************************************
* _tell (MSVCRT.@)
*/
LONG _tell(int fd)
long _tell(int fd)
{
return _lseek(fd, 0, SEEK_CUR);
}
/*********************************************************************
* _telli64 (MSVCRT.@)
*/
__int64 _telli64(int fd)
{
return _lseeki64(fd, 0, SEEK_CUR);
}
/*********************************************************************
* _tempnam (MSVCRT.@)
*/

View file

@ -1,34 +0,0 @@
/*
* msvcrt.dll lconv functions
*
* Copyright 2002 Uwe Bonnes
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* NOTE: just stubs for now 020325
*/
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
/*********************************************************************
* __lconv_init (MSVCRT.@)
*/
void __lconv_init(void)
{
FIXME(" stub\n");
}

View file

@ -583,6 +583,14 @@ struct MSVCRT_lconv *MSVCRT_localeconv(void) {
return &xlconv;
}
/*********************************************************************
* __lconv_init (MSVCRT.@)
*/
void __lconv_init(void)
{
FIXME(" stub\n");
}
/*********************************************************************
* _Gettnames (MSVCRT.@)
*/

View file

@ -467,6 +467,14 @@ unsigned int _clearfp(void)
return retVal;
}
/*********************************************************************
* __fpecode (MSVCRT.@)
*/
int *__fpecode(void)
{
return &msvcrt_get_thread_data()->fpecode;
}
/*********************************************************************
* ldexp (MSVCRT.@)
*/

View file

@ -40,6 +40,7 @@ typedef struct __MSVCRT_thread_data
unsigned long doserrno;
char *mbstok_next; /* next ptr for mbstok() */
char *efcvt_buffer; /* buffer for ecvt/fcvt */
int fpecode;
terminate_function terminate_handler;
unexpected_function unexpected_handler;
_se_translator_function se_translator;

View file

@ -89,7 +89,7 @@
@ cdecl __crtLCMapStringA(long long str long ptr long long long)
@ cdecl __dllonexit(ptr ptr ptr)
@ cdecl __doserrno()
@ stub __fpecode #()
@ cdecl __fpecode()
@ cdecl __getmainargs(ptr ptr ptr long ptr)
@ extern __initenv MSVCRT___initenv
@ cdecl __isascii(long) MSVCRT___isascii
@ -160,7 +160,7 @@
@ cdecl _adj_fprem1()
@ cdecl _adj_fptan()
@ cdecl _adjust_fdiv()
@ stub _aexit_rtn
@ extern _aexit_rtn
@ cdecl _amsg_exit(long) MSVCRT__amsg_exit
@ cdecl _assert(str str long) MSVCRT__assert
@ stub _atodbl #(ptr str)
@ -223,13 +223,13 @@
@ cdecl _filbuf(ptr)
@ stub _fileinfo
@ cdecl _filelength(long)
@ stub _filelengthi64 #(long)
@ cdecl -ret64 _filelengthi64(long)
@ cdecl _fileno(ptr)
@ cdecl _findclose(long)
@ cdecl _findfirst(str ptr)
@ stub _findfirsti64 #(str ptr)
@ cdecl _findfirsti64(str ptr)
@ cdecl _findnext(long ptr)
@ stub _findnexti64 #(long ptr)
@ cdecl _findnexti64(long ptr)
@ cdecl _finite( double )
@ cdecl _flsbuf(long ptr)
@ cdecl _flushall()
@ -322,7 +322,7 @@
@ cdecl _lock(long)
@ cdecl _locking(long long long)
@ cdecl _logb( double )
@ stub _longjmpex
@ cdecl -i386 longjmpex(ptr long) MSVCRT_longjmp
@ cdecl _lrotl(long long)
@ cdecl _lrotr(long long)
@ cdecl _lsearch(ptr ptr long long ptr)
@ -344,7 +344,7 @@
@ cdecl _mbctolower(long)
@ stub _mbctombb #(long)
@ cdecl _mbctoupper(long)
@ stub _mbctype
@ extern _mbctype MSVCRT_mbctype
@ stub _mbsbtype #(str long)
@ cdecl _mbscat(str str) strcat
@ cdecl _mbschr(str long)
@ -396,7 +396,7 @@
@ cdecl _onexit(ptr)
@ varargs _open(str long)
@ cdecl _open_osfhandle(long long)
@ stub _osver
@ extern _osver MSVCRT__osver
@ stub _outp #(long long)
@ stub _outpd #(long long)
@ stub _outpw #(long long)
@ -425,7 +425,7 @@
@ stdcall -i386 _seh_longjmp_unwind(ptr)
@ cdecl _set_error_mode(long)
@ stub _set_sbh_threshold #(long)
@ stub _seterrormode #(long)
@ cdecl _seterrormode(long)
@ cdecl -i386 _setjmp(ptr) MSVCRT__setjmp
@ cdecl -i386 _setjmp3(ptr long) MSVCRT__setjmp3
@ stub _setmaxstdio #(long)
@ -467,7 +467,7 @@
@ extern _sys_errlist MSVCRT__sys_errlist
@ extern _sys_nerr MSVCRT__sys_nerr
@ cdecl _tell(long)
@ stub _telli64 #(long)
@ cdecl -ret64 _telli64(long)
@ cdecl _tempnam(str str)
@ stub _timezone # extern
@ cdecl _tolower(long) MSVCRT__tolower
@ -515,9 +515,9 @@
@ stub _wexecvpe #(wstr ptr ptr)
@ cdecl _wfdopen(long wstr)
@ cdecl _wfindfirst(wstr ptr)
@ stub _wfindfirsti64 #(wstr ptr)
@ cdecl _wfindfirsti64(wstr ptr)
@ cdecl _wfindnext(long ptr)
@ stub _wfindnexti64 #(long ptr)
@ cdecl _wfindnexti64(long ptr)
@ cdecl _wfopen(wstr wstr)
@ stub _wfreopen #(wstr wstr ptr)
@ cdecl _wfsopen(wstr wstr long)
@ -553,7 +553,7 @@
@ stub _wspawnvpe #(long wstr ptr ptr)
@ cdecl _wsplitpath(wstr wstr wstr wstr wstr)
@ cdecl _wstat(wstr ptr)
@ stub _wstati64 #(wstr ptr)
@ cdecl _wstati64(wstr ptr)
@ stub _wstrdate #(ptr)
@ stub _wstrtime #(ptr)
@ stub _wsystem #(wstr)