1
/***************************************************************
7
You can freely use, copy, modify, and redistribute
9
***************************************************************/
15
/* global for GetCommandLineA */
18
extern char _currentdir[];
20
/* make up Win32API except wce_* functions. */
22
DWORD GetModuleFileNameA(
23
HMODULE hModule, LPSTR lpFileName,
30
if( size==0 ) return 0;
32
lpFileNameW = (LPWSTR)malloc( size*sizeof(wchar_t) );
33
ret = GetModuleFileNameW( hModule, lpFileNameW, size );
34
mb = wce_wctomb(lpFileNameW);
35
strcpy(lpFileName, mb);
43
FARPROC GetProcAddressA(HMODULE hModule, LPCSTR lpProcName)
48
lpwProcName = wce_mbtowc( lpProcName );
49
p = GetProcAddressW( hModule, lpwProcName );
55
char * GetCommandLineA(void)
60
/* this is not Win32API. GetCommandLineA helper. */
61
void wce_SetCommandLine(LPCWSTR wcmd)
65
acmd = wce_wctomb( wcmd );
66
_commandLine = (char*)malloc( strlen(acmd)+5 );
67
sprintf( _commandLine, "ruby %s", acmd );
71
/* this is not Win32API. GetCommandLineA helper. */
72
void wce_FreeCommandLine(void)
78
/* I have no idea how to replace this. */
79
BOOL GetProcessTimes(HANDLE hprocess,
80
LPFILETIME lpCreationTime, LPFILETIME lpExitTime,
81
LPFILETIME lpKernelTime, LPFILETIME lpUserTime)
86
/* -------------- file attributes functions. ------------------- */
87
DWORD GetFileAttributesA(LPCSTR lpFileName)
92
lpwFileName = wce_mbtowc(lpFileName);
93
dw = GetFileAttributesW(lpwFileName);
98
BOOL SetFileAttributesA(
99
LPCSTR lpFileName, DWORD attributes)
104
lpwFileName = wce_mbtowc(lpFileName);
105
b = SetFileAttributesW(lpwFileName, attributes);
110
/* --------------- move and remove functions. ------------------- */
111
BOOL MoveFileA(LPCSTR fn1, LPCSTR fn2)
116
wfn1 = wce_mbtowc(fn1);
117
wfn2 = wce_mbtowc(fn2);
118
b = MoveFileW(wfn1, wfn2);
124
BOOL MoveFileEx(LPCSTR oldname, LPCSTR newname, DWORD dwFlags)
126
LPWSTR woldname, wnewname;
129
woldname = wce_mbtowc(oldname);
130
wnewname = wce_mbtowc(newname);
132
if( (dwFlags&MOVEFILE_REPLACE_EXISTING)!=0 )
133
DeleteFileW( wnewname );
135
b = MoveFileW( woldname, wnewname );
143
BOOL DeleteFileA(LPCSTR path)
148
wpath = wce_mbtowc(path);
149
b = DeleteFileW(wpath);
154
/* --------------- EnvironmentVariable functions. ----------------- */
155
DWORD GetEnvironmentVariable(
156
LPCSTR name, LPSTR value, DWORD size)
158
/* use registry instead of "environment valuable". */
162
DWORD dwType=REG_SZ, cbData;
163
TCHAR buf[MAX_PATH]={0};
167
lret = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
168
_T("Software\\ruby_mswince"),
169
0, KEY_QUERY_VALUE, &hk );
171
if ( lret != ERROR_SUCCESS )
177
lpData = (LPBYTE)buf;
178
cbData = MAX_PATH*sizeof(*buf);
179
wname = wce_mbtowc( name );
181
lret = RegQueryValueEx( hk, wname,
182
NULL, &dwType, lpData, &cbData );
185
if ( lret != ERROR_SUCCESS )
192
avalue = wce_wctomb( (LPCTSTR)lpData );
193
strcpy( value, avalue );
197
return strlen(value);
200
BOOL SetEnvironmentVariable(LPCSTR name, LPCSTR value)
202
/* use registry instead of "environment valuable". */
206
DWORD ret, dwType=REG_SZ, cbData;
207
LPWSTR wname, wvalue;
209
lret = RegCreateKeyEx( HKEY_LOCAL_MACHINE,
210
_T("Software\\ruby_mswince"),
212
0, NULL, &hk, &ret );
213
if( lret != ERROR_SUCCESS )
216
wname = wce_mbtowc(name);
217
wvalue = wce_mbtowc(value);
219
lpData = (LPBYTE)wvalue;
220
cbData = (wcslen(wvalue) + 1) * sizeof(*wvalue);
221
lret = RegSetValueEx( hk, wname,
222
0, dwType, lpData, cbData );
226
return lret == ERROR_SUCCESS;
229
LPVOID GetEnvironmentStrings(VOID)
234
BOOL FreeEnvironmentStrings(LPSTR lpszEnvironmentBlock)
239
/* DuplicateHandle, LockFile, etc... */
240
/* I have no idea... */
241
BOOL GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,
242
DWORD dwProcessGroupID)
247
BOOL DuplicateHandle(
248
HANDLE source_process, HANDLE source,
249
HANDLE dest_process, HANDLE *dest,
250
DWORD access, BOOL inherit, DWORD options)
255
BOOL LockFile(HANDLE hFile,
256
DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
257
DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh)
262
BOOL LockFileEx(HANDLE hFile,
263
DWORD dwFlags, DWORD dwReserved,
264
DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh,
265
LPOVERLAPPED lpOverlapped)
270
BOOL UnlockFile( HFILE hFile,
271
DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh,
272
DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh)
277
BOOL UnlockFileEx(HANDLE hFile,
278
DWORD dwReserved, DWORD nNumberOfBytesToUnlockLow,
279
DWORD nNumberOfBytesToUnlockHigh, LPOVERLAPPED lpOverlapped)
284
/* --------------------- etc, etc, etc... ----------------------- */
285
BOOL GetVersionExA(OSVERSIONINFOA *v)
291
b = GetVersionExW(&wv);
292
mb = wce_wctomb(wv.szCSDVersion);
294
strcpy( v->szCSDVersion, mb );
299
DWORD WaitForMultipleObjectsEx(DWORD count,
300
const HANDLE *handles, BOOL wait_all,
301
DWORD timeout, BOOL alertable)
303
return WaitForMultipleObjects(
304
count, handles, wait_all,
308
BOOL CreateProcessA(LPCSTR appname, LPCSTR commandline,
309
LPSECURITY_ATTRIBUTES att, LPSECURITY_ATTRIBUTES threadatt,
310
BOOL bOpt, DWORD dwFlag, LPVOID lpEnv, LPSTR dir,
311
LPSTARTUPINFO lpsi, LPPROCESS_INFORMATION lppi)
313
LPWSTR wappname, wcommandline, wdir;
316
wappname = wce_mbtowc(appname);
317
wcommandline = wce_mbtowc(commandline);
318
wdir = wce_mbtowc(dir);
320
b = CreateProcessW(wappname, wcommandline,
321
att, threadatt, bOpt, dwFlag, lpEnv,
331
HANDLE CreateEventA(SECURITY_ATTRIBUTES *sa,
332
BOOL manual_reset, BOOL initial_state, LPCSTR name)
337
wname = wce_mbtowc(name);
338
h = CreateEventW(sa, manual_reset,
339
initial_state, wname);
345
DWORD FormatMessageA(DWORD dwFlags, LPCVOID lpSource,
346
DWORD dwMessageId, DWORD dwLanguageId, LPSTR lpBuffer,
347
DWORD nSize, va_list* args)
352
lpWBuffer = wce_mbtowc(lpBuffer);
353
dw = FormatMessageW( dwFlags, lpSource,
354
dwMessageId, dwLanguageId,
355
lpWBuffer, nSize, (va_list*)args );
360
/*---------------- FindFirstFile, FindNextFile ------------------ */
361
HANDLE FindFirstFileA(LPCSTR path,
362
WIN32_FIND_DATAA *data)
367
WIN32_FIND_DATAW wdata;
369
wpath = wce_mbtowc(path);
370
h = FindFirstFileW( wpath, &wdata );
373
mb = wce_wctomb( wdata.cFileName );
374
strcpy( data->cFileName, mb );
380
BOOL FindNextFileA(HANDLE handle,
381
WIN32_FIND_DATAA *data)
384
WIN32_FIND_DATAW wdata;
387
b = FindNextFileW(handle, &wdata);
389
mb1 = wce_wctomb( wdata.cFileName );
390
strcpy( data->cFileName, mb1 );
396
/* CreateFile doesn't support SECURITY_ATTRIBUTES in WinCE. */
397
/* it must be NULL. */
398
HANDLE CreateFileA(LPCSTR filename, DWORD access,
399
DWORD sharing, LPSECURITY_ATTRIBUTES sa,
400
DWORD creation, DWORD attributes, HANDLE template)
405
wfilename = wce_mbtowc(filename);
406
h = CreateFileW(wfilename, access, sharing,
407
NULL, creation, 0, NULL);
413
/* ---------------- CharNext, CharPrev. ---------------------*/
414
LPSTR CharNextA(LPCSTR a)
417
if( TRUE==IsDBCSLeadByteEx(CP_ACP, (BYTE)*a) )
425
LPSTR CharPrevA(LPCSTR start, LPCSTR ptr)
427
if( start==ptr ) return (LPSTR)start;
428
else if( start+1==ptr ) return (LPSTR)start;
429
else if( TRUE==IsDBCSLeadByteEx(CP_ACP, (BYTE)*(ptr-2)) )
430
return (LPSTR)(ptr-2);
432
return (LPSTR)(ptr-1);
435
/* WinCE doesn't have "drives". */
436
DWORD GetLogicalDrives(VOID)
441
/* WinCE doesn't have "user name". */
442
BOOL GetUserName(LPSTR lpBuffer, LPDWORD nSize)
447
/*------------------- LoadLibrary -----------------------*/
448
HINSTANCE LoadLibraryA(LPCSTR libname)
453
// if starts ".\", replace current directory.
454
// wlibname = wce_replaceRelativeDir(libname);
456
wlibname = wce_mbtowc(libname);
457
h = LoadLibraryW(wlibname);
462
HINSTANCE LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile,
468
wlibname = wce_mbtowc(lpLibFileName);
469
// wlibname = wce_replaceRelativeDir(lpLibFileName);
472
h = LoadLibraryW(wlibname);
474
h = LoadLibraryExW(wlibname, hFile, dwFlags);
480
/* WinCE doesn't have "CreatePipe". */
481
BOOL CreatePipe(PHANDLE hReadPipe, PHANDLE hWritePipe,
482
LPSECURITY_ATTRIBUTES lpPipeAttributes, DWORD nSize)
487
/* WinCE doesn't have "Standard Devices". */
488
HANDLE GetStdHandle(DWORD nStdHandle)
493
BOOL SetStdHandle(DWORD nStdHandle, HANDLE h)
499
VOID ZeroMemory(PVOID p, DWORD length)
506
/* need in ruby/io.c. */
507
int ReadDataPending()
512
/*---------------- helper functions. ---------------------------- */
513
FILE *wce_fopen( const char *fname, const char *mode )
515
TCHAR* tfname = wce_replaceRelativeDir(fname);
516
TCHAR* tmode = wce_mbtowc(mode);
517
FILE* fp = _tfopen(tfname, tmode);
518
free(tfname); free(tmode);
522
void wce_SetCurrentDir()
524
WCHAR tbuf[MAX_PATH+1]={0};
528
GetModuleFileNameW( NULL, tbuf, MAX_PATH );
529
tp = _tcsrchr( tbuf, '\\' );
530
if( tp!=NULL ) *tp=_T('\0');
531
buf = wce_wctomb(tbuf);
532
strcpy( _currentdir, buf );
536
TCHAR *wce_replaceRelativeDir(const char* str)
540
if( 2<=strlen(str) && str[0]=='.' &&
541
(str[1]=='/' || str[1]=='\\') )
544
int len = strlen(str) + strlen(_currentdir);
545
buf = malloc( len+1 );
546
sprintf(buf, "%s%s", _currentdir, &str[1]);
547
tbuf = wce_mbtowc(buf);
551
tbuf = wce_mbtowc(str);
555
/* char -> wchar_t */
556
wchar_t* wce_mbtowc(const char* a)
561
length = MultiByteToWideChar(CP_ACP, 0,
563
wbuf = (wchar_t*)malloc( (length+1)*sizeof(wchar_t) );
564
MultiByteToWideChar(CP_ACP, 0,
565
a, -1, wbuf, length);
570
/* wchar_t -> char */
571
char* wce_wctomb(const wchar_t* w)
576
charlength = WideCharToMultiByte(CP_ACP, 0, w,
577
-1, NULL, 0, NULL, NULL);
578
pChar = (char*)malloc(charlength+1);
579
WideCharToMultiByte(CP_ACP, 0, w,
580
-1, pChar, charlength, NULL, NULL);