4 * Implements C run-time functionality as known from UNIX.
6 * Copyright 1996 Marcus Meissner
7 * Copyright 1996 Jukka Iivonen
26 UINT32 CRTDLL_argc_dll
; /* CRTDLL.23 */
27 LPSTR
*CRTDLL_argv_dll
; /* CRTDLL.24 */
28 LPSTR CRTDLL_acmdln_dll
; /* CRTDLL.38 */
29 UINT32 CRTDLL_basemajor_dll
; /* CRTDLL.42 */
30 UINT32 CRTDLL_baseminor_dll
; /* CRTDLL.43 */
31 UINT32 CRTDLL_baseversion_dll
; /* CRTDLL.44 */
32 LPSTR CRTDLL_environ_dll
; /* CRTDLL.75 */
33 UINT32 CRTDLL_osmajor_dll
; /* CRTDLL.241 */
34 UINT32 CRTDLL_osminor_dll
; /* CRTDLL.242 */
35 UINT32 CRTDLL_osver_dll
; /* CRTDLL.244 */
36 UINT32 CRTDLL_osversion_dll
; /* CRTDLL.245 */
37 UINT32 CRTDLL_winmajor_dll
; /* CRTDLL.329 */
38 UINT32 CRTDLL_winminor_dll
; /* CRTDLL.330 */
39 UINT32 CRTDLL_winver_dll
; /* CRTDLL.331 */
42 /*********************************************************************
43 * _GetMainArgs (CRTDLL.022)
46 CRTDLL__GetMainArgs(LPDWORD argc
,LPSTR
**argv
,LPSTR
*environ
,DWORD flag
)
50 int xargc
,i
,afterlastspace
;
53 dprintf_crtdll(stderr
,"__GetMainArgs(%p,%p,%p,%ld).\n",
54 argc
,argv
,environ
,flag
56 CRTDLL_acmdln_dll
= cmdline
= xstrdup( GetCommandLine32A() );
58 version
= GetVersion32();
59 CRTDLL_osver_dll
= version
>> 16;
60 CRTDLL_winminor_dll
= version
& 0xFF;
61 CRTDLL_winmajor_dll
= (version
>>8) & 0xFF;
62 CRTDLL_baseversion_dll
= version
>> 16;
63 CRTDLL_winver_dll
= ((version
>> 8) & 0xFF) + ((version
& 0xFF) << 8);
64 CRTDLL_baseminor_dll
= (version
>> 16) & 0xFF;
65 CRTDLL_basemajor_dll
= (version
>> 24) & 0xFF;
66 CRTDLL_osversion_dll
= version
& 0xFFFF;
67 CRTDLL_osminor_dll
= version
& 0xFF;
68 CRTDLL_osmajor_dll
= (version
>>8) & 0xFF;
70 /* missing threading init */
72 i
=0;xargv
=NULL
;xargc
=0;afterlastspace
=0;
74 if (cmdline
[i
]==' ') {
75 xargv
=(char**)xrealloc(xargv
,sizeof(char*)*(++xargc
));
77 xargv
[xargc
-1] = xstrdup(cmdline
+afterlastspace
);
79 while (cmdline
[i
]==' ')
86 xargv
=(char**)xrealloc(xargv
,sizeof(char*)*(++xargc
));
88 xargv
[xargc
-1] = xstrdup(cmdline
+afterlastspace
);
89 CRTDLL_argc_dll
= xargc
;
91 CRTDLL_argv_dll
= xargv
;
94 /* FIXME ... use real environment */
95 *environ
= xmalloc(sizeof(LPSTR
));
96 CRTDLL_environ_dll
= *environ
;
101 typedef void (*_INITTERMFUN
)();
103 /*********************************************************************
104 * _initterm (CRTDLL.135)
106 DWORD
CRTDLL__initterm(_INITTERMFUN
*start
,_INITTERMFUN
*end
)
108 _INITTERMFUN
*current
;
110 dprintf_crtdll(stddeb
,"_initterm(%p,%p)\n",start
,end
);
112 while (current
<end
) {
113 if (*current
) (*current
)();
119 /*********************************************************************
122 void CRTDLL_srand(DWORD seed
)
124 /* FIXME: should of course be thread? process? local */
128 /*********************************************************************
129 * fprintf (CRTDLL.373)
131 int CRTDLL_fprintf(DWORD
*args
)
133 /* FIXME: use args[0] */
134 return vfprintf(stderr
,(LPSTR
)(args
[1]),args
+2);
137 /*********************************************************************
138 * printf (CRTDLL.440)
140 int CRTDLL_printf(DWORD
*args
)
142 return vfprintf(stdout
,(LPSTR
)(args
[0]),args
+1);
145 /*********************************************************************
146 * sprintf (CRTDLL.458)
148 int CRTDLL_sprintf(DWORD
*args
)
150 return vsprintf((LPSTR
)(args
[0]),(LPSTR
)(args
[1]),args
+2);
153 /*********************************************************************
156 time_t CRTDLL_time(time_t *timeptr
)
158 time_t curtime
= time(NULL
);
165 /*********************************************************************
166 * _isatty (CRTDLL.137)
168 BOOL32
CRTDLL__isatty(DWORD x
)
170 dprintf_crtdll(stderr
,"CRTDLL__isatty(%ld)\n",x
);
174 /*********************************************************************
175 * _write (CRTDLL.332)
177 INT32
CRTDLL__write(DWORD x
,LPVOID buf
,DWORD len
)
180 return write(x
,buf
,len
);
182 dprintf_crtdll(stderr
,"CRTDLL__write(%ld,%p,%ld)\n",x
,buf
,len
);
187 /*********************************************************************
190 void CRTDLL_exit(DWORD ret
)
192 dprintf_crtdll(stderr
,"CRTDLL_exit(%ld)\n",ret
);
197 /*********************************************************************
198 * fflush (CRTDLL.365)
200 void CRTDLL_fflush(DWORD x
)
202 dprintf_crtdll(stderr
,"CRTDLL_fflush(%ld)\n",x
);
206 /*********************************************************************
209 LPSTR
CRTDLL_gets(LPSTR buf
)
211 /* BAD, for the whole WINE process blocks... just done this way to test
212 * windows95's ftp.exe.
218 /*********************************************************************
221 INT32
CRTDLL_abs(INT32 x
)
227 /*********************************************************************
230 float CRTDLL_acos(float x
)
236 /*********************************************************************
239 float CRTDLL_asin(float x
)
245 /*********************************************************************
248 float CRTDLL_atan(float x
)
254 /*********************************************************************
257 float CRTDLL_atan2(float x
, float y
)
263 /*********************************************************************
266 float CRTDLL_atof(LPCSTR x
)
272 /*********************************************************************
275 INT32
CRTDLL_atoi(LPCSTR x
)
281 /*********************************************************************
284 LONG
CRTDLL_atol(LPCSTR x
)
290 /*********************************************************************
293 float CRTDLL_cos(float x
)
299 /*********************************************************************
302 float CRTDLL_cosh(float x
)
308 /*********************************************************************
311 float CRTDLL_exp(float x
)
317 /*********************************************************************
320 float CRTDLL_fabs(float x
)
326 /*********************************************************************
327 * isalnum (CRTDLL.394)
329 CHAR
CRTDLL_isalnum(CHAR x
)
335 /*********************************************************************
336 * isalpha (CRTDLL.395)
338 CHAR
CRTDLL_isalpha(CHAR x
)
344 /*********************************************************************
345 * iscntrl (CRTDLL.396)
347 CHAR
CRTDLL_iscntrl(CHAR x
)
353 /*********************************************************************
354 * isdigit (CRTDLL.397)
356 CHAR
CRTDLL_isdigit(CHAR x
)
362 /*********************************************************************
363 * isgraph (CRTDLL.398)
365 CHAR
CRTDLL_isgraph(CHAR x
)
371 /*********************************************************************
372 * islower (CRTDLL.400)
374 CHAR
CRTDLL_islower(CHAR x
)
380 /*********************************************************************
381 * isprint (CRTDLL.401)
383 CHAR
CRTDLL_isprint(CHAR x
)
389 /*********************************************************************
390 * ispunct (CRTDLL.402)
392 CHAR
CRTDLL_ispunct(CHAR x
)
398 /*********************************************************************
399 * isspace (CRTDLL.403)
401 CHAR
CRTDLL_isspace(CHAR x
)
407 /*********************************************************************
408 * isupper (CRTDLL.404)
410 CHAR
CRTDLL_isupper(CHAR x
)
416 /*********************************************************************
417 * isxdigit (CRTDLL.418)
419 CHAR
CRTDLL_isxdigit(CHAR x
)
425 /*********************************************************************
428 LONG
CRTDLL_labs(LONG x
)
434 /*********************************************************************
437 float CRTDLL_log(float x
)
443 /*********************************************************************
446 float CRTDLL_log10(float x
)
452 /*********************************************************************
455 float CRTDLL_pow(float x
, float y
)
461 /*********************************************************************
470 /*********************************************************************
473 float CRTDLL_sin(float x
)
479 /*********************************************************************
482 float CRTDLL_sinh(float x
)
488 /*********************************************************************
491 float CRTDLL_sqrt(float x
)
497 /*********************************************************************
500 float CRTDLL_tan(float x
)
506 /*********************************************************************
509 float CRTDLL_tanh(float x
)
515 /*********************************************************************
516 * tolower (CRTDLL.491)
518 CHAR
CRTDLL_tolower(CHAR x
)
524 /*********************************************************************
525 * toupper (CRTDLL.492)
527 CHAR
CRTDLL_toupper(CHAR x
)
533 /*********************************************************************
534 * putchar (CRTDLL.442)
536 void CRTDLL_putchar(INT32 x
)
542 /*********************************************************************
543 * _mbsicmp (CRTDLL.204)
545 int CRTDLL__mbsicmp(unsigned char *x
,unsigned char *y
)
552 /* FIXME: MBCS handling... */
561 /*********************************************************************
562 * _mbsinc (CRTDLL.205)
564 unsigned char* CRTDLL__mbsinc(unsigned char *x
)
571 /*********************************************************************
572 * vsprintf (CRTDLL.500)
574 int CRTDLL_vsprintf(DWORD
*args
)
576 return vsprintf((char *)args
[0],(char *)args
[1],args
+2);
579 /*********************************************************************
580 * vsprintf (CRTDLL.500) (NTDLL.913)
582 int CRTDLL_sscanf(DWORD
*args
)
584 return vsscanf((char *)args
[0],(char *)args
[1],args
+2);
588 /*********************************************************************
589 * _mbscpy (CRTDLL.200)
591 unsigned char* CRTDLL__mbscpy(unsigned char *x
,unsigned char *y
)
597 /*********************************************************************
598 * _mbscat (CRTDLL.197)
600 unsigned char* CRTDLL__mbscat(unsigned char *x
,unsigned char *y
)
605 /*********************************************************************
606 * _strupr (CRTDLL.300)
608 LPSTR
CRTDLL__strupr(LPSTR x
)
619 /*********************************************************************
620 * _wcsupr (CRTDLL.328)
622 LPWSTR
CRTDLL__wcsupr(LPWSTR x
)
633 /*********************************************************************
634 * _wcslwr (CRTDLL.323)
636 LPWSTR
CRTDLL__wcslwr(LPWSTR x
)
648 /*********************************************************************
649 * malloc (CRTDLL.427)
651 VOID
* CRTDLL_malloc(DWORD size
)
653 return HeapAlloc(GetProcessHeap(),0,size
);
656 /*********************************************************************
657 * calloc (CRTDLL.350)
659 VOID
* CRTDLL_calloc(DWORD size
, DWORD count
)
661 return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY
, size
* count
);
664 /*********************************************************************
665 * realloc (CRTDLL.447)
667 VOID
* CRTDLL_realloc( VOID
*ptr
, DWORD size
)
669 return HeapReAlloc( GetProcessHeap(), 0, ptr
, size
);
672 /*********************************************************************
675 VOID
CRTDLL_free(LPVOID ptr
)
677 HeapFree(GetProcessHeap(),0,ptr
);
680 /*********************************************************************
681 * _strdup (CRTDLL.285)
683 LPSTR
CRTDLL__strdup(LPSTR ptr
)
685 return HEAP_strdupA(GetProcessHeap(),0,ptr
);
688 /*********************************************************************
689 * fclose (CRTDLL.362)
691 DWORD
CRTDLL_fclose(LPVOID x
)
693 dprintf_crtdll(stdnimp
,"fclose(%p)\n",x
);
697 /*********************************************************************
698 * setlocale (CRTDLL.453)
700 LPSTR
CRTDLL_setlocale(INT32 category
,LPCSTR locale
)
705 case CRTDLL_LC_ALL
: categorystr
="LC_ALL";break;
706 case CRTDLL_LC_COLLATE
: categorystr
="LC_COLLATE";break;
707 case CRTDLL_LC_CTYPE
: categorystr
="LC_CTYPE";break;
708 case CRTDLL_LC_MONETARY
: categorystr
="LC_MONETARY";break;
709 case CRTDLL_LC_NUMERIC
: categorystr
="LC_NUMERIC";break;
710 case CRTDLL_LC_TIME
: categorystr
="LC_TIME";break;
711 default: categorystr
= "UNKNOWN?";break;
713 fprintf(stderr
,"CRTDLL.setlocale(%s,%s),stub!\n",categorystr
,locale
);
717 /*********************************************************************
718 * wcsspn (CRTDLL.516)
720 INT32
CRTDLL_wcsspn(LPWSTR str
,LPWSTR accept
)
727 while (*t
) { if (*t
==*s
) break;t
++;}
731 return s
-str
; /* nr of wchars */
734 /*********************************************************************
735 * wcschr (CRTDLL.504)
737 LPWSTR
CRTDLL_wcschr(LPWSTR str
,WCHAR xchar
)
749 /*********************************************************************
750 * towupper (CRTDLL.494)
752 WCHAR
CRTDLL_towupper(WCHAR x
)
754 return (WCHAR
)toupper((CHAR
)x
);
757 /*********************************************************************
758 * swprintf (CRTDLL.483)
760 DWORD
CRTDLL_swprintf(DWORD
*args
)
762 return WIN32_wsprintf32W(args
);
765 /*********************************************************************
766 * _wcsicoll (CRTDLL.322)
768 DWORD
CRTDLL__wcsicoll(LPWSTR a1
,LPWSTR a2
)
770 /* FIXME: handle collates */
771 return lstrcmpi32W(a1
,a2
);
774 /*********************************************************************
775 * wcscoll (CRTDLL.506)
777 DWORD
CRTDLL_wcscoll(LPWSTR a1
,LPWSTR a2
)
779 /* FIXME: handle collates */
780 return lstrcmp32W(a1
,a2
);
783 /*********************************************************************
784 * wcsstr (CRTDLL.517)
786 LPWSTR
CRTDLL_wcsstr(LPWSTR s
,LPWSTR b
)
794 while (*y
&& *c
&& *y
==*c
) { c
++;y
++; }
803 /*********************************************************************
804 * wcsrchr (CRTDLL.515)
806 LPWSTR
CRTDLL_wcsrchr(LPWSTR str
,WCHAR xchar
)
810 s
=str
+lstrlen32W(str
);