Release 961222
[wine/multimedia.git] / misc / crtdll.c
blob0d83094ddd71a18def092025ed62b51e610d16e3
1 /*
2 * The C RunTime DLL
3 *
4 * Implements C run-time functionality as known from UNIX.
6 * Copyright 1996 Marcus Meissner
7 * Copyright 1996 Jukka Iivonen
8 */
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <unistd.h>
14 #include <time.h>
15 #include <ctype.h>
16 #include <math.h>
17 #include "win.h"
18 #include "windows.h"
19 #include "stddebug.h"
20 #include "debug.h"
21 #include "module.h"
22 #include "xmalloc.h"
23 #include "heap.h"
24 #include "crtdll.h"
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)
45 DWORD
46 CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv,LPSTR *environ,DWORD flag)
48 char *cmdline;
49 char **xargv;
50 int xargc,i,afterlastspace;
51 DWORD version;
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;
73 while (cmdline[i]) {
74 if (cmdline[i]==' ') {
75 xargv=(char**)xrealloc(xargv,sizeof(char*)*(++xargc));
76 cmdline[i]='\0';
77 xargv[xargc-1] = xstrdup(cmdline+afterlastspace);
78 i++;
79 while (cmdline[i]==' ')
80 i++;
81 if (cmdline[i])
82 afterlastspace=i;
83 } else
84 i++;
86 xargv=(char**)xrealloc(xargv,sizeof(char*)*(++xargc));
87 cmdline[i]='\0';
88 xargv[xargc-1] = xstrdup(cmdline+afterlastspace);
89 CRTDLL_argc_dll = xargc;
90 *argc = xargc;
91 CRTDLL_argv_dll = xargv;
92 *argv = xargv;
94 /* FIXME ... use real environment */
95 *environ = xmalloc(sizeof(LPSTR));
96 CRTDLL_environ_dll = *environ;
97 (*environ)[0] = NULL;
98 return 0;
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);
111 current=start;
112 while (current<end) {
113 if (*current) (*current)();
114 current++;
116 return 0;
119 /*********************************************************************
120 * srand (CRTDLL.460)
122 void CRTDLL_srand(DWORD seed)
124 /* FIXME: should of course be thread? process? local */
125 srand(seed);
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 /*********************************************************************
154 * time (CRTDLL.488)
156 time_t CRTDLL_time(time_t *timeptr)
158 time_t curtime = time(NULL);
160 if (timeptr)
161 *timeptr = curtime;
162 return curtime;
165 /*********************************************************************
166 * _isatty (CRTDLL.137)
168 BOOL32 CRTDLL__isatty(DWORD x)
170 dprintf_crtdll(stderr,"CRTDLL__isatty(%ld)\n",x);
171 return TRUE;
174 /*********************************************************************
175 * _write (CRTDLL.332)
177 INT32 CRTDLL__write(DWORD x,LPVOID buf,DWORD len)
179 if (x<=2)
180 return write(x,buf,len);
181 /* hmm ... */
182 dprintf_crtdll(stderr,"CRTDLL__write(%ld,%p,%ld)\n",x,buf,len);
183 return len;
187 /*********************************************************************
188 * exit (CRTDLL.359)
190 void CRTDLL_exit(DWORD ret)
192 dprintf_crtdll(stderr,"CRTDLL_exit(%ld)\n",ret);
193 ExitProcess(ret);
197 /*********************************************************************
198 * fflush (CRTDLL.365)
200 void CRTDLL_fflush(DWORD x)
202 dprintf_crtdll(stderr,"CRTDLL_fflush(%ld)\n",x);
206 /*********************************************************************
207 * gets (CRTDLL.391)
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.
214 return gets(buf);
218 /*********************************************************************
219 * abs (CRTDLL.339)
221 INT32 CRTDLL_abs(INT32 x)
223 return abs(x);
227 /*********************************************************************
228 * acos (CRTDLL.340)
230 float CRTDLL_acos(float x)
232 return acos(x);
236 /*********************************************************************
237 * asin (CRTDLL.342)
239 float CRTDLL_asin(float x)
241 return asin(x);
245 /*********************************************************************
246 * atan (CRTDLL.343)
248 float CRTDLL_atan(float x)
250 return atan(x);
254 /*********************************************************************
255 * atan2 (CRTDLL.344)
257 float CRTDLL_atan2(float x, float y)
259 return atan2(x,y);
263 /*********************************************************************
264 * atof (CRTDLL.346)
266 float CRTDLL_atof(LPCSTR x)
268 return atof(x);
272 /*********************************************************************
273 * atoi (CRTDLL.347)
275 INT32 CRTDLL_atoi(LPCSTR x)
277 return atoi(x);
281 /*********************************************************************
282 * atol (CRTDLL.348)
284 LONG CRTDLL_atol(LPCSTR x)
286 return atol(x);
290 /*********************************************************************
291 * cos (CRTDLL.354)
293 float CRTDLL_cos(float x)
295 return cos(x);
299 /*********************************************************************
300 * cosh (CRTDLL.355)
302 float CRTDLL_cosh(float x)
304 return cosh(x);
308 /*********************************************************************
309 * exp (CRTDLL.360)
311 float CRTDLL_exp(float x)
313 return exp(x);
317 /*********************************************************************
318 * fabs (CRTDLL.361)
320 float CRTDLL_fabs(float x)
322 return fabs(x);
326 /*********************************************************************
327 * isalnum (CRTDLL.394)
329 CHAR CRTDLL_isalnum(CHAR x)
331 return isalnum(x);
335 /*********************************************************************
336 * isalpha (CRTDLL.395)
338 CHAR CRTDLL_isalpha(CHAR x)
340 return isalpha(x);
344 /*********************************************************************
345 * iscntrl (CRTDLL.396)
347 CHAR CRTDLL_iscntrl(CHAR x)
349 return iscntrl(x);
353 /*********************************************************************
354 * isdigit (CRTDLL.397)
356 CHAR CRTDLL_isdigit(CHAR x)
358 return isdigit(x);
362 /*********************************************************************
363 * isgraph (CRTDLL.398)
365 CHAR CRTDLL_isgraph(CHAR x)
367 return isgraph(x);
371 /*********************************************************************
372 * islower (CRTDLL.400)
374 CHAR CRTDLL_islower(CHAR x)
376 return islower(x);
380 /*********************************************************************
381 * isprint (CRTDLL.401)
383 CHAR CRTDLL_isprint(CHAR x)
385 return isprint(x);
389 /*********************************************************************
390 * ispunct (CRTDLL.402)
392 CHAR CRTDLL_ispunct(CHAR x)
394 return ispunct(x);
398 /*********************************************************************
399 * isspace (CRTDLL.403)
401 CHAR CRTDLL_isspace(CHAR x)
403 return isspace(x);
407 /*********************************************************************
408 * isupper (CRTDLL.404)
410 CHAR CRTDLL_isupper(CHAR x)
412 return isupper(x);
416 /*********************************************************************
417 * isxdigit (CRTDLL.418)
419 CHAR CRTDLL_isxdigit(CHAR x)
421 return isxdigit(x);
425 /*********************************************************************
426 * labs (CRTDLL.419)
428 LONG CRTDLL_labs(LONG x)
430 return labs(x);
434 /*********************************************************************
435 * log (CRTDLL.424)
437 float CRTDLL_log(float x)
439 return log(x);
443 /*********************************************************************
444 * log10 (CRTDLL.425)
446 float CRTDLL_log10(float x)
448 return log10(x);
452 /*********************************************************************
453 * pow (CRTDLL.439)
455 float CRTDLL_pow(float x, float y)
457 return pow(x,y);
461 /*********************************************************************
462 * rand (CRTDLL.446)
464 INT32 CRTDLL_rand()
466 return rand();
470 /*********************************************************************
471 * sin (CRTDLL.456)
473 float CRTDLL_sin(float x)
475 return sin(x);
479 /*********************************************************************
480 * sinh (CRTDLL.457)
482 float CRTDLL_sinh(float x)
484 return sinh(x);
488 /*********************************************************************
489 * sqrt (CRTDLL.459)
491 float CRTDLL_sqrt(float x)
493 return sqrt(x);
497 /*********************************************************************
498 * tan (CRTDLL.486)
500 float CRTDLL_tan(float x)
502 return tan(x);
506 /*********************************************************************
507 * tanh (CRTDLL.487)
509 float CRTDLL_tanh(float x)
511 return tanh(x);
515 /*********************************************************************
516 * tolower (CRTDLL.491)
518 CHAR CRTDLL_tolower(CHAR x)
520 return tolower(x);
524 /*********************************************************************
525 * toupper (CRTDLL.492)
527 CHAR CRTDLL_toupper(CHAR x)
529 return toupper(x);
533 /*********************************************************************
534 * putchar (CRTDLL.442)
536 void CRTDLL_putchar(INT32 x)
538 putchar(x);
542 /*********************************************************************
543 * _mbsicmp (CRTDLL.204)
545 int CRTDLL__mbsicmp(unsigned char *x,unsigned char *y)
547 do {
548 if (!*x)
549 return !!*y;
550 if (!*y)
551 return !!*x;
552 /* FIXME: MBCS handling... */
553 if (*x!=*y)
554 return 1;
555 x++;
556 y++;
557 } while (1);
561 /*********************************************************************
562 * _mbsinc (CRTDLL.205)
564 unsigned char* CRTDLL__mbsinc(unsigned char *x)
566 /* FIXME: mbcs */
567 return 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)
593 return strcpy(x,y);
597 /*********************************************************************
598 * _mbscat (CRTDLL.197)
600 unsigned char* CRTDLL__mbscat(unsigned char *x,unsigned char *y)
602 return strcat(x,y);
605 /*********************************************************************
606 * _strupr (CRTDLL.300)
608 LPSTR CRTDLL__strupr(LPSTR x)
610 LPSTR y=x;
612 while (*y) {
613 *y=toupper(*y);
614 y++;
616 return x;
619 /*********************************************************************
620 * _wcsupr (CRTDLL.328)
622 LPWSTR CRTDLL__wcsupr(LPWSTR x)
624 LPWSTR y=x;
626 while (*y) {
627 *y=toupper(*y);
628 y++;
630 return x;
633 /*********************************************************************
634 * _wcslwr (CRTDLL.323)
636 LPWSTR CRTDLL__wcslwr(LPWSTR x)
638 LPWSTR y=x;
640 while (*y) {
641 *y=tolower(*y);
642 y++;
644 return 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 /*********************************************************************
673 * free (CRTDLL.427)
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);
694 return 0;
697 /*********************************************************************
698 * setlocale (CRTDLL.453)
700 LPSTR CRTDLL_setlocale(INT32 category,LPCSTR locale)
702 LPSTR categorystr;
704 switch (category) {
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);
714 return "C";
717 /*********************************************************************
718 * wcsspn (CRTDLL.516)
720 INT32 CRTDLL_wcsspn(LPWSTR str,LPWSTR accept)
722 LPWSTR s,t;
724 s=str;
725 do {
726 t=accept;
727 while (*t) { if (*t==*s) break;t++;}
728 if (!*t) break;
729 s++;
730 } while (*s);
731 return s-str; /* nr of wchars */
734 /*********************************************************************
735 * wcschr (CRTDLL.504)
737 LPWSTR CRTDLL_wcschr(LPWSTR str,WCHAR xchar)
739 LPWSTR s;
741 s=str;
742 do {
743 if (*s==xchar)
744 return s;
745 } while (*s++);
746 return NULL;
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)
788 LPWSTR x,y,c;
790 x=s;
791 while (*x) {
792 if (*x==*b) {
793 y=x;c=b;
794 while (*y && *c && *y==*c) { c++;y++; }
795 if (!*c)
796 return x;
798 x++;
800 return NULL;
803 /*********************************************************************
804 * wcsrchr (CRTDLL.515)
806 LPWSTR CRTDLL_wcsrchr(LPWSTR str,WCHAR xchar)
808 LPWSTR s;
810 s=str+lstrlen32W(str);
811 do {
812 if (*s==xchar)
813 return s;
814 s--;
815 } while (s>=str);
816 return NULL;