Changeset 6712 for trunk/src/crtdll/crtdll_main.c
- Timestamp:
- Sep 15, 2001, 11:47:44 AM (24 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/crtdll/crtdll_main.c
r6645 r6712 1 /* $Id: crtdll_main.c,v 1.2 2001-09-05 12:14:24 bird Exp $ */2 1 /* 3 2 * The C RunTime DLL 4 * 3 * 5 4 * Implements C run-time functionality as known from UNIX. 6 5 * … … 14 13 Unresolved issues Uwe Bonnes 970904: 15 14 - tested with ftp://ftp.remcomp.com/pub/remcomp/lcc-win32.zip, a C-Compiler 16 15 for Win32, based on lcc, from Jacob Navia 17 16 UB 000416: 18 17 - probably not thread safe 19 18 */ 20 19 21 /* NOTE: This file also implements the wcs* functions. They _ARE_ in 20 /* NOTE: This file also implements the wcs* functions. They _ARE_ in 22 21 * the newer Linux libcs, but use 4 byte wide characters, so are unusable, 23 22 * since we need 2 byte wide characters. - Marcus Meissner, 981031 … … 64 63 UINT CRTDLL_winminor_dll; /* CRTDLL.330 */ 65 64 UINT CRTDLL_winver_dll; /* CRTDLL.331 */ 66 INT CRTDLL_doserrno = 0; 65 INT CRTDLL_doserrno = 0; 67 66 INT CRTDLL_errno = 0; 68 67 const INT CRTDLL__sys_nerr = 43; … … 78 77 * CRTDLL_MainInit (CRTDLL.init) 79 78 */ 80 79 81 80 BOOL WINAPI CRTDLL_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) 82 81 { 83 82 FS_OS2 84 83 85 84 // call i/o initializer in file.c 86 if (fdwReason == DLL_PROCESS_ATTACH) 85 if (fdwReason == DLL_PROCESS_ATTACH) 87 86 { 88 87 __CRTDLL__init_io(); 89 88 } 90 89 91 90 /* 92 91 PH 2000/11/21 this code doesn't look very useful 93 92 94 93 if (fdwReason == DLL_PROCESS_ATTACH) { 95 94 _fdopen(0,"r"); … … 104 103 } 105 104 */ 106 105 107 106 FS_WIN32 108 107 return TRUE; … … 177 176 char *cmdline; 178 177 char **xargv; 179 intxargc,end,last_arg,afterlastspace;180 DWORDversion;181 182 183 184 185 186 187 188 189 190 191 192 version= GetVersion();193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 178 int xargc,end,last_arg,afterlastspace; 179 DWORD version; 180 181 TRACE("(%p,%p,%p,%ld).\n", 182 argc,argv,environ,flag 183 ); 184 185 if (CRTDLL_acmdln_dll != NULL) 186 HeapFree(GetProcessHeap(), 0, CRTDLL_acmdln_dll); 187 188 CRTDLL_acmdln_dll = cmdline = CRTDLL__strdup( GetCommandLineA() ); 189 TRACE("got '%s'\n", cmdline); 190 191 version = GetVersion(); 192 CRTDLL_osver_dll = version >> 16; 193 CRTDLL_winminor_dll = version & 0xFF; 194 CRTDLL_winmajor_dll = (version>>8) & 0xFF; 195 CRTDLL_baseversion_dll = version >> 16; 196 CRTDLL_winver_dll = ((version >> 8) & 0xFF) + ((version & 0xFF) << 8); 197 CRTDLL_baseminor_dll = (version >> 16) & 0xFF; 198 CRTDLL_basemajor_dll = (version >> 24) & 0xFF; 199 CRTDLL_osversion_dll = version & 0xFFFF; 200 CRTDLL_osminor_dll = version & 0xFF; 201 CRTDLL_osmajor_dll = (version>>8) & 0xFF; 202 203 /* missing threading init */ 204 205 end=0;last_arg=0;xargv=NULL;xargc=0;afterlastspace=0; 206 while (1) 207 { 208 if ((cmdline[end]==' ') || (cmdline[end]=='\0')) 209 { 210 if (cmdline[end]=='\0') 211 last_arg=1; 212 else 213 cmdline[end]='\0'; 214 /* alloc xargc + NULL entry */ 215 xargv=(char**)HeapReAlloc( GetProcessHeap(), 0, xargv, 216 sizeof(char*)*(xargc+1)); 217 if (strlen(cmdline+afterlastspace)) 218 { 219 xargv[xargc] = CRTDLL__strdup(cmdline+afterlastspace); 220 xargc++; 222 221 if (!last_arg) /* need to seek to the next arg ? */ 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 CRTDLL_argc_dll= xargc;240 *argc= xargc;241 CRTDLL_argv_dll= xargv;242 *argv= xargv;243 244 245 246 247 222 { 223 end++; 224 while (cmdline[end]==' ') 225 end++; 226 } 227 afterlastspace=end; 228 } 229 else 230 { 231 xargv[xargc] = NULL; /* the last entry is NULL */ 232 break; 233 } 234 } 235 else 236 end++; 237 } 238 CRTDLL_argc_dll = xargc; 239 *argc = xargc; 240 CRTDLL_argv_dll = xargv; 241 *argv = xargv; 242 243 TRACE("found %d arguments\n", 244 CRTDLL_argc_dll); 245 CRTDLL_environ_dll = *environ = GetEnvironmentStringsA(); 246 return environ; 248 247 } 249 248 … … 254 253 DWORD CDECL CRTDLL__initterm(_INITTERMFUN *start,_INITTERMFUN *end) 255 254 { 256 _INITTERMFUN*current;257 258 259 260 261 262 263 264 255 _INITTERMFUN *current; 256 257 TRACE("(%p,%p)\n",start,end); 258 current=start; 259 while (current<end) { 260 if (*current) (*current)(); 261 current++; 262 } 263 return 0; 265 264 } 266 265 … … 310 309 INT CDECL CRTDLL_rand() 311 310 { 312 return (rand() & CRTDLL_RAND_MAX); 311 return (rand() & CRTDLL_RAND_MAX); 313 312 } 314 313 … … 320 319 { 321 320 // return (_rotl(value, shift)); 322 321 323 322 shift &= 31; 324 323 return (x << shift) | (x >> (32-shift)); … … 332 331 { 333 332 // return (_lrotl(value, shift)); 334 333 335 334 shift &= 31; 336 335 return (x << shift) | (x >> (32-shift)); … … 344 343 { 345 344 // return (_lrotr(value, shift)); 346 345 347 346 shift &= 0x1f; 348 347 return (x >> shift) | (x << (32-shift)); … … 356 355 { 357 356 // return (_rotr(value, shift)); 358 357 359 358 shift &= 0x1f; 360 359 return (x >> shift) | (x << (32-shift)); … … 368 367 { 369 368 // return (vswprintf(s, t, format, arg)); 370 369 371 370 return wvsprintfW( buffer, spec, args ); 372 371 } … … 389 388 { 390 389 return (setlocale(category, locale)); 391 390 392 391 /* 393 392 LPSTR categorystr; … … 438 437 { 439 438 // return (_fullpath(buf, path, size)); 440 439 441 440 if (!buf) 442 441 { … … 456 455 { 457 456 // _splitpath( path, drive, dir, fname, ext); 458 457 459 458 /* drive includes : 460 459 directory includes leading and trailing (forward and backward slashes) … … 520 519 { 521 520 // _makepath(path, drive, dir, fname, ext); 522 521 523 522 char ch; 524 523 TRACE("CRTDLL__makepath got %s %s %s %s\n", drive, directory, … … 568 567 { 569 568 // return (_errno()); 570 569 571 570 return &CRTDLL_errno; 572 571 } … … 575 574 /********************************************************************* 576 575 * __doserrno (CRTDLL.26) 577 * 576 * 578 577 * Return the address of the DOS errno (holding the last OS error). 579 578 * @@@PH Note: veeeery strange ... … … 584 583 { 585 584 // return (__doserrno()); 586 585 587 586 return &CRTDLL_doserrno; 588 587 } … … 602 601 { 603 602 // return (_strerror((char*)s)); 604 603 605 604 static char strerrbuff[256]; 606 605 sprintf(strerrbuff,"%s: %s\n",err,CRTDLL_strerror(CRTDLL_errno)); … … 617 616 { 618 617 // perror( s ); 619 618 620 619 char *err_str = CRTDLL_strerror(CRTDLL_errno); 621 620 CRTDLL_fprintf(CRTDLL_stderr,"%s: %s\n",err,err_str); 622 621 CRTDLL_free(err_str); 623 622 } 624 623 625 624 626 625 /********************************************************************* … … 632 631 * The caller does not own the string returned. 633 632 */ 634 extern char *strerror(int errnum); 633 extern char *strerror(int errnum); 635 634 636 635 LPSTR CDECL CRTDLL_strerror (INT err) … … 646 645 { 647 646 //return (signal(sig, ptr)); 648 647 649 648 FIXME("(%d %p):stub.\n", sig, ptr); 650 649 return (void*)-1; … … 668 667 { 669 668 // return (getenv(name)); 670 669 671 670 LPSTR environ = GetEnvironmentStringsA(); 672 671 LPSTR pp,pos = NULL; … … 675 674 for (pp = environ; (*pp); pp = pp + strlen(pp) +1) 676 675 { 677 678 679 680 681 682 676 pos =strchr(pp,'='); 677 if (pos) 678 length = pos -pp; 679 else 680 length = strlen(pp); 681 if (!strncmp(pp,name,length)) break; 683 682 } 684 if ((pp)&& (pos)) 683 if ((pp)&& (pos)) 685 684 { 686 687 685 pp = pos+1; 686 TRACE("got %s\n",pp); 688 687 } 689 688 FreeEnvironmentStringsA( environ ); … … 696 695 */ 697 696 INT CDECL CRTDLL__except_handler2 ( 698 699 700 701 702 { 703 704 705 706 697 PEXCEPTION_RECORD rec, 698 PEXCEPTION_FRAME frame, 699 PCONTEXT context, 700 PEXCEPTION_FRAME *dispatcher) 701 { 702 FIXME ("exception %lx flags=%lx at %p handler=%p %p %p stub\n", 703 rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress, 704 frame->Handler, context, dispatcher); 705 return ExceptionContinueSearch; 707 706 } 708 707 … … 725 724 { 726 725 // return (_toascii(c)); 727 726 728 727 return c & 0x7f; 729 728 } … … 755 754 { 756 755 // return (_iscsym(c)); 757 756 758 757 return (isalnum(c) || c == '_'); 759 758 } … … 774 773 { 775 774 // return (_iscsymf(c)); 776 775 777 776 return (isalpha(c) || c == '_'); 778 777 } … … 847 846 { 848 847 if (cf((LPVOID*)match, (LPVOID*)pStart) == 0) 849 848 return pStart; /* found */ 850 849 pStart += elem_size; 851 850 } while (--size); … … 915 914 { 916 915 // return (_toupper(n)); 917 916 918 917 return toupper(c); 919 918 } … … 926 925 { 927 926 // return (_tolower(n)); 928 927 929 928 return tolower(c); 930 929 } … … 947 946 { 948 947 // return (_cabs(c)); 949 948 950 949 return sqrt(c.real * c.real + c.imaginary * c.imaginary); 951 950 } … … 1007 1006 * 1008 1007 * Reset the state of the floating point processor. 1009 * 1008 * 1010 1009 * PARAMS 1011 1010 * None.
Note:
See TracChangeset
for help on using the changeset viewer.