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

  1. /*------------------------------------------------------------------------
  2.  * filename - instdata.c
  3.  *
  4.  * Functions to manage instance data for RTL DLL
  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 <windows.h>
  16. #include <dos.h>
  17. #include <mem.h>
  18. #include <instdata.h>
  19.  
  20. #if defined(__DLL__)
  21.  
  22. TInstanceDataTable::TInstanceDataTable(int InitialCount)
  23. {
  24.     if (InitialCount != 0)
  25.     Table = AllocTable(InitialCount);
  26.  
  27.     if (Table)
  28.          NumEntries = InitialCount;
  29.     else
  30.          NumEntries = 0;
  31. }
  32.  
  33. // TInstanceDataTable::~TInstanceDataTable()
  34. // {
  35. //     if (NumEntries != 0 && Table)
  36. //     {
  37. //         FreeTable(Table);
  38. //         Table = NULL;
  39. //         NumEntries = 0;
  40. //     }
  41. // }
  42.  
  43. BOOL TInstanceDataTable::AddEntry(HANDLE hTask,
  44.                                   TInstanceDataBase far *pClientData)
  45. {
  46.     TInstanceDataEntry *pFreeEntry = NULL;  // no free entry yet
  47.  
  48.     // First see if table already.  If so, replace entry
  49.  
  50.     for (TInstanceDataEntry * pEntry = Table; pEntry < &Table[NumEntries];
  51.          pEntry++)
  52.     {
  53.         if (pEntry->hTask == hTask) // already in table?
  54.         {
  55.             pEntry->pInstanceData = pClientData;
  56.             return TRUE;
  57.         }
  58.         else                    // see if entry is free
  59.         {
  60.             if (!pFreeEntry && pEntry->hTask == 0)  // remember this entry
  61.                 pFreeEntry = pEntry;
  62.         }
  63.     }
  64.  
  65.     // Not in table.  See if we encountered a free entry in table.  If
  66.     // so, use it.  Otherwise grow table.
  67.  
  68.     if ((pEntry = (pFreeEntry ? pFreeEntry : GrowTable())) != NULL)
  69.     {
  70.         pEntry->hTask = hTask;
  71.         pEntry->pInstanceData = pClientData;
  72.         return TRUE;
  73.     }
  74.     else
  75.         return FALSE;
  76. }
  77.  
  78. TInstanceDataTable::DeleteEntry(HANDLE hTask,
  79.                                 TInstanceDataBase far *pClientData)
  80. {
  81.     for (TInstanceDataEntry * pEntry = Table; pEntry < &Table[NumEntries];
  82.          pEntry++)
  83.     {
  84.         if (pEntry->hTask == hTask && pEntry->pInstanceData == pClientData)
  85.         {
  86.             pEntry->hTask = 0;       // found entry.  Zero it.
  87.             pEntry->pInstanceData = 0;
  88.             return TRUE;            // indicate success
  89.         }
  90.     }
  91.     return FALSE;   // not found
  92. }
  93.  
  94. TInstanceDataEntry *TInstanceDataTable::GrowTable(int Increment)
  95. {
  96.     int OldNumEntries = NumEntries;
  97.     TInstanceDataEntry * OldInstanceDataTable = Table;
  98.  
  99.     NumEntries = NumEntries + Increment;
  100.  
  101.     Table = AllocTable(NumEntries);
  102.  
  103.     // copy old table to new location
  104.     _fmemcpy(Table, OldInstanceDataTable,
  105.         OldNumEntries * sizeof(TInstanceDataEntry));
  106.  
  107.     FreeTable(OldInstanceDataTable);
  108.  
  109.     // return pointer to first entry in new block
  110.     return Table;
  111. }
  112.  
  113. TInstanceDataBase far *TInstanceDataTable::GetClientData(HANDLE hTask)
  114. {
  115.     TInstanceDataBase far *InstanceDataPtr;
  116.     WORD Temp;
  117.  
  118.     for (TInstanceDataEntry * pEntry = Table; pEntry < &Table[NumEntries];
  119.          pEntry++)
  120.     {
  121.         if (pEntry->hTask == hTask)
  122.         {
  123.             InstanceDataPtr = pEntry->pInstanceData;
  124.             Temp = FP_SEG(InstanceDataPtr);
  125.  
  126.             asm lar ax, Temp;       // get access rights
  127.             asm jnz invalid;        // invalid selector
  128.  
  129.             asm and ax, 0x0800;     // code or data
  130.             asm jnz invalid;        // code
  131.  
  132.             if (InstanceDataPtr->Verify())
  133.                 return InstanceDataPtr;
  134.         invalid:
  135.             // Selector invalid.  Create a new client data object
  136.             // and set pEntry->InstanceData to point to it.
  137.             return (pEntry->pInstanceData = NewEntry());
  138.         }
  139.     }
  140.     // no entry found in table.  Add one.
  141.     InstanceDataPtr = NewEntry();
  142.     AddEntry(hTask, InstanceDataPtr);
  143.     return InstanceDataPtr;
  144. }
  145.  
  146. TInstanceDataEntry * TInstanceDataTable::AllocTable(int Count)
  147. {
  148.     TInstanceDataEntry * pTable;
  149.     pTable = (TInstanceDataEntry *)
  150.         LocalLock(LocalAlloc(LMEM_ZEROINIT,
  151.             Count * sizeof(TInstanceDataEntry)));
  152.     return pTable;
  153. }
  154.  
  155. void TInstanceDataTable::FreeTable(TInstanceDataEntry *pTable)
  156. {
  157.     HANDLE hMem = LocalHandle(FP_OFF(pTable));
  158.     if (LocalUnlock(hMem))
  159.         LocalFree(hMem);
  160. }
  161.  
  162. #endif // __DLL__
  163.