home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c082_122 / 1.ddi / WINLBSRC.ZIP / RTLDATA.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-10  |  4.3 KB  |  187 lines

  1. /*------------------------------------------------------------------------
  2.  * filename - rtldata.cpp
  3.  *
  4.  * Functions to initialize and access DLL RTL instance data
  5.  *-----------------------------------------------------------------------*/
  6.  
  7. /*
  8.  *      C/C++ Run Time Library - Version 5.0
  9.  *
  10.  *      Copyright (c) 1991, 1992 by Borland International
  11.  *      All Rights Reserved.
  12.  *
  13.  */
  14.  
  15. #include <InstData.h>
  16. #include <RtlData.h>
  17. #include <fcntl.h>
  18. #include <dos.h>
  19. #include <stdio.h>
  20. #include <_nfile.h>
  21.  
  22. class _RTLDataClass : TInstanceDataBase, public _RTLData
  23. {
  24.  
  25. public:
  26.  
  27.     _RTLDataClass();
  28.     void *operator new (size_t s);
  29.     void operator delete(void *ptr);
  30.  
  31. };
  32.  
  33. static _RTLData initValues =
  34. {
  35.     //  _streams initial values
  36.     {
  37.         { 0, _F_STDIN,   0, 0, 0, NULL, NULL, 0, 0 },
  38.         { 0, _F_STDOUT,  1, 0, 0, NULL, NULL, 0, 0 },
  39.         { 0, _F_STDERR,  2, 0, 0, NULL, NULL, 0, 0 },
  40.         { 0, _F_STDAUX,  3, 0, 0, NULL, NULL, 0, 0 },
  41.         { 0, _F_STDPRN,  4, 0, 0, NULL, NULL, 0, 0 }
  42.     //  remainder are initialized to all 0's
  43.     },
  44.  
  45.     //  _openfd initial values
  46.     {
  47.     O_RDONLY | O_DEVICE,
  48.     O_WRONLY | O_DEVICE,
  49.     O_WRONLY | O_DEVICE,
  50.     O_RDWR   | O_DEVICE | O_BINARY,
  51.     O_WRONLY | O_DEVICE | O_BINARY,
  52.  
  53.     ~0, ~0, ~0,
  54.     ~0, ~0, ~0, ~0,
  55.     ~0, ~0, ~0, ~0,
  56.     ~0, ~0, ~0, ~0
  57.     },
  58.  
  59.     _NFILE_,    // _nfiles
  60.  
  61.     O_TEXT,     // _fmode
  62.     ~0,         // _notUmask
  63.     0,          // _doserrno
  64.     0,          // _new_handler
  65.     {'\0'},     // strbuf (strerror.c)
  66.     0,          // Ss (strtok.c)
  67.     {'\0'},     // template (tmpnam.c)
  68.     0,          // _tmpnum (tmpnam.c)
  69.     {'\0'},     // a (ctime.c)
  70.     {'\0'},     // _DfltZone (tzset.cas)
  71.     {'\0'},     // _DfltLight (tzset.cas)
  72.     DefaultTimeZone * 60L * 60L,        // timezone set for EST (tzset.cas)
  73.     DefaultDaylight     // daylight set for daylight savings (tzset.cas)
  74. };
  75.  
  76. _RTLDataClass::_RTLDataClass()
  77. {
  78.     int i;
  79.  
  80.     (_RTLData&)*this = initValues;
  81.     for( i = 5; i < _NFILE_; i++ )
  82.         _streams[i].fd = -1;
  83.     for( i = 0; i < _NFILE_; i++ )
  84.         _streams[i].token = (short)&_streams[i];
  85.     _AH = 0;
  86.     geninterrupt( 0x1A );
  87.     _StartTime = ((long)_DX << 16) | _CX;
  88.     tzname_[0] = &_DfltZone[0];
  89.     tzname_[1] = &_DfltLight[0];
  90. };
  91.  
  92. void *_RTLDataClass::operator new (size_t s)
  93. {
  94.     return GlobalLock(GlobalAlloc(GMEM_ZEROINIT, s));
  95. }
  96.  
  97. void _RTLDataClass::operator delete(void *ptr)
  98. {
  99.     HANDLE hMem = LOWORD(GlobalHandle(FP_SEG(ptr)));
  100.     if (hMem)
  101.         if (GlobalUnlock(hMem))
  102.             GlobalFree(hMem);
  103. }
  104.  
  105. const DEFTABLESIZE = 10;
  106.  
  107. class TRTLDataTable : public TInstanceDataTable
  108. {
  109.  
  110. public:
  111.  
  112.     TRTLDataTable( int initCount = DEFTABLESIZE ) :
  113.         TInstanceDataTable( initCount ) {}
  114.     _RTLDataClass _FAR * GetClientData(HANDLE hTask)
  115.         { return (_RTLDataClass _FAR *)
  116.                     TInstanceDataTable::GetClientData(hTask); }
  117. protected:
  118.  
  119.     virtual TInstanceDataBase far *NewEntry();
  120.  
  121. };
  122.  
  123. TInstanceDataBase far *TRTLDataTable::NewEntry()
  124. {
  125.     return (TInstanceDataBase far *) new _RTLDataClass;
  126. }
  127.  
  128. extern "C" _RTLData _FAR * _export pascal __getRTLInstanceData()
  129. {
  130.     static TRTLDataTable RTLData;
  131.     return (_RTLData _FAR *)RTLData.GetClientData(GetCurrentTask());
  132. }
  133.  
  134. extern "C" int far * _export __getErrno()
  135. {
  136.     return &(__getRTLInstanceData()->errno_);
  137. }
  138.  
  139. extern "C" int far * _export __getDOSErrno()
  140. {
  141.     return &(__getRTLInstanceData()->_doserrno_);
  142. }
  143.  
  144. extern "C" FILE far * _export __getStream( int strm )
  145. {
  146.     return &((__getRTLInstanceData()->_streams)[strm]);
  147. }
  148.  
  149. extern "C" TSubAllocClientData far *__GetSubAllocClientData(void)
  150. {
  151.     return &(__getRTLInstanceData()->subAllocData);
  152. }
  153.  
  154. #undef sys_errlist
  155.  
  156. extern char _FAR *_Cdecl sys_errlist[];
  157.  
  158. extern "C" char far * far * _export __get_sys_errlist()
  159. {
  160.     return sys_errlist;
  161. }
  162.  
  163. #undef sys_nerr
  164.  
  165. extern  int _Cdecl sys_nerr;
  166.  
  167. extern "C" int _export __get_sys_nerr()
  168. {
  169.     return sys_nerr;
  170. }
  171.  
  172. extern "C" int far * _export __getDaylight()
  173. {
  174.     return &(__getRTLInstanceData()->daylight_);
  175. }
  176.  
  177. extern "C" long far * _export __getTimezone()
  178. {
  179.     return &(__getRTLInstanceData()->timezone_);
  180. }
  181.  
  182. extern "C" char far * far * _export __getTzname()
  183. {
  184.     return (__getRTLInstanceData()->tzname_);
  185. }
  186.  
  187.