Ignore:
Timestamp:
Sep 5, 2001, 2:14:25 PM (24 years ago)
Author:
bird
Message:

Added $Id:$ keyword.

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 $ */
    12/*
    23 * The C RunTime DLL
    3  * 
     4 *
    45 * Implements C run-time functionality as known from UNIX.
    56 *
     
    1314Unresolved issues Uwe Bonnes 970904:
    1415- tested with ftp://ftp.remcomp.com/pub/remcomp/lcc-win32.zip, a C-Compiler
    15                 for Win32, based on lcc, from Jacob Navia
     16        for Win32, based on lcc, from Jacob Navia
    1617UB 000416:
    1718- probably not thread safe
    1819*/
    1920
    20 /* NOTE: This file also implements the wcs* functions. They _ARE_ in 
     21/* NOTE: This file also implements the wcs* functions. They _ARE_ in
    2122 * the newer Linux libcs, but use 4 byte wide characters, so are unusable,
    2223 * since we need 2 byte wide characters. - Marcus Meissner, 981031
     
    6364UINT CRTDLL_winminor_dll;     /* CRTDLL.330 */
    6465UINT CRTDLL_winver_dll;       /* CRTDLL.331 */
    65 INT  CRTDLL_doserrno = 0; 
     66INT  CRTDLL_doserrno = 0;
    6667INT  CRTDLL_errno = 0;
    6768const INT  CRTDLL__sys_nerr = 43;
     
    7778 *                  CRTDLL_MainInit  (CRTDLL.init)
    7879 */
    79  
     80
    8081BOOL WINAPI CRTDLL_Init(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
    8182{
    8283  FS_OS2
    83    
     84
    8485    // call i/o initializer in file.c
    85     if (fdwReason == DLL_PROCESS_ATTACH) 
     86    if (fdwReason == DLL_PROCESS_ATTACH)
    8687    {
    8788      __CRTDLL__init_io();
    8889    }
    89    
     90
    9091  /*
    9192    PH 2000/11/21 this code doesn't look very useful
    92    
     93
    9394    if (fdwReason == DLL_PROCESS_ATTACH) {
    9495      _fdopen(0,"r");
     
    103104      }
    104105  */
    105  
     106
    106107  FS_WIN32
    107108  return TRUE;
     
    176177        char *cmdline;
    177178        char  **xargv;
    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++;
     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++;
    221222                    if (!last_arg) /* need to seek to the next arg ? */
    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;
     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;
    247248}
    248249
     
    253254DWORD CDECL CRTDLL__initterm(_INITTERMFUN *start,_INITTERMFUN *end)
    254255{
    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;
     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;
    264265}
    265266
     
    309310INT CDECL CRTDLL_rand()
    310311{
    311     return (rand() & CRTDLL_RAND_MAX); 
     312    return (rand() & CRTDLL_RAND_MAX);
    312313}
    313314
     
    319320{
    320321  // return (_rotl(value, shift));
    321  
     322
    322323    shift &= 31;
    323324    return (x << shift) | (x >> (32-shift));
     
    331332{
    332333  // return (_lrotl(value, shift));
    333  
     334
    334335    shift &= 31;
    335336    return (x << shift) | (x >> (32-shift));
     
    343344{
    344345  // return (_lrotr(value, shift));
    345  
     346
    346347    shift &= 0x1f;
    347348    return (x >> shift) | (x << (32-shift));
     
    355356{
    356357  // return (_rotr(value, shift));
    357  
     358
    358359    shift &= 0x1f;
    359360    return (x >> shift) | (x << (32-shift));
     
    367368{
    368369  // return (vswprintf(s, t, format, arg));
    369  
     370
    370371    return wvsprintfW( buffer, spec, args );
    371372}
     
    388389{
    389390  return (setlocale(category, locale));
    390  
     391
    391392  /*
    392393    LPSTR categorystr;
     
    437438{
    438439  // return (_fullpath(buf, path, size));
    439  
     440
    440441  if (!buf)
    441442  {
     
    455456{
    456457  // _splitpath( path, drive, dir, fname, ext);
    457  
     458
    458459  /* drive includes :
    459460     directory includes leading and trailing (forward and backward slashes)
     
    519520{
    520521  // _makepath(path, drive, dir, fname, ext);
    521  
     522
    522523    char ch;
    523524    TRACE("CRTDLL__makepath got %s %s %s %s\n", drive, directory,
     
    567568{
    568569  // return (_errno());
    569  
     570
    570571  return &CRTDLL_errno;
    571572}
     
    574575/*********************************************************************
    575576 *                  __doserrno       (CRTDLL.26)
    576  * 
     577 *
    577578 * Return the address of the DOS errno (holding the last OS error).
    578579 * @@@PH Note: veeeery strange ...
     
    583584{
    584585  // return (__doserrno());
    585  
     586
    586587  return &CRTDLL_doserrno;
    587588}
     
    601602{
    602603  // return (_strerror((char*)s));
    603  
     604
    604605  static char strerrbuff[256];
    605606  sprintf(strerrbuff,"%s: %s\n",err,CRTDLL_strerror(CRTDLL_errno));
     
    616617{
    617618  // perror( s );
    618  
     619
    619620  char *err_str = CRTDLL_strerror(CRTDLL_errno);
    620621  CRTDLL_fprintf(CRTDLL_stderr,"%s: %s\n",err,err_str);
    621622  CRTDLL_free(err_str);
    622623}
    623  
     624
    624625
    625626/*********************************************************************
     
    631632 * The caller does not own the string returned.
    632633 */
    633 extern char *strerror(int errnum); 
     634extern char *strerror(int errnum);
    634635
    635636LPSTR CDECL CRTDLL_strerror (INT err)
     
    645646{
    646647  //return (signal(sig, ptr));
    647  
     648
    648649  FIXME("(%d %p):stub.\n", sig, ptr);
    649650  return (void*)-1;
     
    667668{
    668669  // return (getenv(name));
    669  
     670
    670671     LPSTR environ = GetEnvironmentStringsA();
    671672     LPSTR pp,pos = NULL;
     
    674675     for (pp = environ; (*pp); pp = pp + strlen(pp) +1)
    675676       {
    676         pos =strchr(pp,'=');
    677         if (pos)
    678            length = pos -pp;
    679         else
    680            length = strlen(pp);
    681         if (!strncmp(pp,name,length)) break;
     677    pos =strchr(pp,'=');
     678    if (pos)
     679       length = pos -pp;
     680    else
     681       length = strlen(pp);
     682    if (!strncmp(pp,name,length)) break;
    682683       }
    683      if ((pp)&& (pos)) 
     684     if ((pp)&& (pos))
    684685       {
    685         pp = pos+1;
    686         TRACE("got %s\n",pp);
     686    pp = pos+1;
     687    TRACE("got %s\n",pp);
    687688       }
    688689     FreeEnvironmentStringsA( environ );
     
    695696 */
    696697INT CDECL CRTDLL__except_handler2 (
    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;
     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;
    706707}
    707708
     
    724725{
    725726  // return (_toascii(c));
    726  
     727
    727728  return c & 0x7f;
    728729}
     
    754755{
    755756  // return (_iscsym(c));
    756  
     757
    757758  return (isalnum(c) || c == '_');
    758759}
     
    773774{
    774775  // return (_iscsymf(c));
    775  
     776
    776777  return (isalpha(c) || c == '_');
    777778}
     
    846847    {
    847848      if (cf((LPVOID*)match, (LPVOID*)pStart) == 0)
    848         return pStart; /* found */
     849    return pStart; /* found */
    849850      pStart += elem_size;
    850851    } while (--size);
     
    914915{
    915916  // return (_toupper(n));
    916  
     917
    917918  return toupper(c);
    918919}
     
    925926{
    926927  // return (_tolower(n));
    927  
     928
    928929  return tolower(c);
    929930}
     
    946947{
    947948  // return (_cabs(c));
    948  
     949
    949950  return sqrt(c.real * c.real + c.imaginary * c.imaginary);
    950951}
     
    10061007 *
    10071008 * Reset the state of the floating point processor.
    1008  * 
     1009 *
    10091010 * PARAMS
    10101011 *   None.
Note: See TracChangeset for help on using the changeset viewer.