Andrew Eikum : oleaut32: Convert TLBImpLib to use standard linked list.

Alexandre Julliard julliard at winehq.org
Wed Mar 16 12:22:41 CDT 2011


Module: wine
Branch: master
Commit: 3d03a5e23975e11ee4600e194ad70f92cc73b2d8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3d03a5e23975e11ee4600e194ad70f92cc73b2d8

Author: Andrew Eikum <aeikum at codeweavers.com>
Date:   Tue Mar 15 15:52:46 2011 -0500

oleaut32: Convert TLBImpLib to use standard linked list.

---

 dlls/oleaut32/typelib.c |   72 ++++++++++++++++++++++++-----------------------
 1 files changed, 37 insertions(+), 35 deletions(-)

diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 4637bf2..7d5b85a 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -977,7 +977,7 @@ typedef struct tagTLBImpLib
 
     struct tagITypeLibImpl *pImpTypeLib; /* pointer to loaded typelib, or
 					    NULL if not yet loaded */
-    struct tagTLBImpLib * next;
+    struct list entry;
 } TLBImpLib;
 
 /* internal ITypeLib data */
@@ -1000,7 +1000,7 @@ typedef struct tagITypeLibImpl
     int TypeInfoCount;          /* nr of typeinfo's in librarry */
     struct tagITypeInfoImpl **typeinfos;
     struct list custdata_list;
-    TLBImpLib   * pImpLibs;     /* linked list to all imported typelibs */
+    struct list implib_list;
     int ctTypeDesc;             /* number of items in type desc array */
     TYPEDESC * pTypeDesc;       /* array of TypeDescriptions found in the
 				   library. Only used while reading MSFT
@@ -2275,17 +2275,18 @@ static void MSFT_DoRefType(TLBContext *pcx, ITypeLibImpl *pTL,
     if(!MSFT_HREFTYPE_INTHISFILE( offset)) {
         /* external typelib */
         MSFT_ImpInfo impinfo;
-        TLBImpLib *pImpLib=(pcx->pLibInfo->pImpLibs);
+        TLBImpLib *pImpLib;
 
         TRACE_(typelib)("offset %x, masked offset %x\n", offset, offset + (offset & 0xfffffffc));
 
         MSFT_ReadLEDWords(&impinfo, sizeof(impinfo), pcx,
                           pcx->pTblDir->pImpInfo.offset + (offset & 0xfffffffc));
-        while (pImpLib){   /* search the known offsets of all import libraries */
-            if(pImpLib->offset==impinfo.oImpFile) break;
-            pImpLib=pImpLib->next;
-        }
-        if(pImpLib){
+
+        LIST_FOR_EACH_ENTRY(pImpLib, &pcx->pLibInfo->implib_list, TLBImpLib, entry)
+            if(pImpLib->offset==impinfo.oImpFile)
+                break;
+
+        if(&pImpLib->entry != &pcx->pLibInfo->implib_list){
             ref->reference = offset;
             ref->pImpTLInfo = pImpLib;
             if(impinfo.flags & MSFT_IMPINFO_OFFSET_IS_GUID) {
@@ -2979,6 +2980,7 @@ static ITypeLibImpl* TypeLibImpl_Constructor(void)
     pTypeLibImpl->lpVtblTypeComp = &tlbtcvt;
     pTypeLibImpl->ref = 1;
 
+    list_init(&pTypeLibImpl->implib_list);
     list_init(&pTypeLibImpl->custdata_list);
     list_init(&pTypeLibImpl->ref_list);
     pTypeLibImpl->dispatch_href = -1;
@@ -3140,7 +3142,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
     /* imported type libs */
     if(tlbSegDir.pImpFiles.offset>0)
     {
-        TLBImpLib **ppImpLib = &(pTypeLibImpl->pImpLibs);
+        TLBImpLib *pImpLib;
         int oGuid, offset = tlbSegDir.pImpFiles.offset;
         UINT16 size;
 
@@ -3148,25 +3150,25 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength)
 	{
             char *name;
 
-            *ppImpLib = heap_alloc_zero(sizeof(TLBImpLib));
-            (*ppImpLib)->offset = offset - tlbSegDir.pImpFiles.offset;
+            pImpLib = heap_alloc_zero(sizeof(TLBImpLib));
+            pImpLib->offset = offset - tlbSegDir.pImpFiles.offset;
             MSFT_ReadLEDWords(&oGuid, sizeof(INT), &cx, offset);
 
-            MSFT_ReadLEDWords(&(*ppImpLib)->lcid,         sizeof(LCID),   &cx, DO_NOT_SEEK);
-            MSFT_ReadLEWords(&(*ppImpLib)->wVersionMajor, sizeof(WORD),   &cx, DO_NOT_SEEK);
-            MSFT_ReadLEWords(&(*ppImpLib)->wVersionMinor, sizeof(WORD),   &cx, DO_NOT_SEEK);
+            MSFT_ReadLEDWords(&pImpLib->lcid,         sizeof(LCID),   &cx, DO_NOT_SEEK);
+            MSFT_ReadLEWords(&pImpLib->wVersionMajor, sizeof(WORD),   &cx, DO_NOT_SEEK);
+            MSFT_ReadLEWords(&pImpLib->wVersionMinor, sizeof(WORD),   &cx, DO_NOT_SEEK);
             MSFT_ReadLEWords(& size,                      sizeof(UINT16), &cx, DO_NOT_SEEK);
 
             size >>= 2;
             name = heap_alloc_zero(size+1);
             MSFT_Read(name, size, &cx, DO_NOT_SEEK);
-            (*ppImpLib)->name = TLB_MultiByteToBSTR(name);
+            pImpLib->name = TLB_MultiByteToBSTR(name);
             heap_free(name);
 
-            MSFT_ReadGuid(&(*ppImpLib)->guid, oGuid, &cx);
+            MSFT_ReadGuid(&pImpLib->guid, oGuid, &cx);
             offset = (offset + sizeof(INT) + sizeof(DWORD) + sizeof(LCID) + sizeof(UINT16) + size + 3) & ~3;
 
-            ppImpLib = &(*ppImpLib)->next;
+            list_add_tail(&pTypeLibImpl->implib_list, &pImpLib->entry);
         }
     }
 
@@ -3434,25 +3436,24 @@ static sltg_ref_lookup_t *SLTG_DoRefs(SLTG_RefInfo *pRef, ITypeLibImpl *pTL,
 	if(sscanf(refname, "*\\R%x*#%x", &lib_offs, &type_num) != 2)
 	    FIXME_(typelib)("Can't sscanf ref\n");
 	if(lib_offs != 0xffff) {
-	    TLBImpLib **import = &pTL->pImpLibs;
+	    TLBImpLib *import;
 
-	    while(*import) {
-	        if((*import)->offset == lib_offs)
-		    break;
-		import = &(*import)->next;
-	    }
-	    if(!*import) {
+            LIST_FOR_EACH_ENTRY(import, &pTL->implib_list, TLBImpLib, entry)
+                if(import->offset == lib_offs)
+                    break;
+
+            if(&import->entry == &pTL->implib_list) {
 	        char fname[MAX_PATH+1];
 		int len;
 
-		*import = heap_alloc_zero(sizeof(**import));
-		(*import)->offset = lib_offs;
+		import = heap_alloc_zero(sizeof(*import));
+		import->offset = lib_offs;
 		TLB_GUIDFromString( pNameTable + lib_offs + 4,
-				    &(*import)->guid);
+				    &import->guid);
 		if(sscanf(pNameTable + lib_offs + 40, "}#%hd.%hd#%x#%s",
-			  &(*import)->wVersionMajor,
-			  &(*import)->wVersionMinor,
-			  &(*import)->lcid, fname) != 4) {
+			  &import->wVersionMajor,
+			  &import->wVersionMinor,
+			  &import->lcid, fname) != 4) {
 		  FIXME_(typelib)("can't sscanf ref %s\n",
 			pNameTable + lib_offs + 40);
 		}
@@ -3460,12 +3461,13 @@ static sltg_ref_lookup_t *SLTG_DoRefs(SLTG_RefInfo *pRef, ITypeLibImpl *pTL,
 		if(fname[len-1] != '#')
 		    FIXME("fname = %s\n", fname);
 		fname[len-1] = '\0';
-		(*import)->name = TLB_MultiByteToBSTR(fname);
+		import->name = TLB_MultiByteToBSTR(fname);
+		list_add_tail(&pTL->implib_list, &import->entry);
 	    }
-	    ref_type->pImpTLInfo = *import;
+	    ref_type->pImpTLInfo = import;
 
             /* Store a reference to IDispatch */
-            if(pTL->dispatch_href == -1 && IsEqualGUID(&(*import)->guid, &IID_StdOle) && type_num == 4)
+            if(pTL->dispatch_href == -1 && IsEqualGUID(&import->guid, &IID_StdOle) && type_num == 4)
                 pTL->dispatch_href = typelib_ref;
 
 	} else { /* internal ref */
@@ -4281,13 +4283,13 @@ static ULONG WINAPI ITypeLib2_fnRelease( ITypeLib2 *iface)
 
       heap_free(This->pTypeDesc);
 
-      for (pImpLib = This->pImpLibs; pImpLib; pImpLib = pImpLibNext)
+      LIST_FOR_EACH_ENTRY_SAFE(pImpLib, pImpLibNext, &This->implib_list, TLBImpLib, entry)
       {
           if (pImpLib->pImpTypeLib)
               ITypeLib_Release((ITypeLib *)pImpLib->pImpTypeLib);
           SysFreeString(pImpLib->name);
 
-          pImpLibNext = pImpLib->next;
+          list_remove(&pImpLib->entry);
           heap_free(pImpLib);
       }
 




More information about the wine-cvs mailing list