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