Ignore:
Timestamp:
Jul 16, 2001, 9:30:08 PM (24 years ago)
Author:
sandervl
Message:

faster resource lookup functions (Wine)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/winimgres.cpp

    r5474 r6347  
    1 /* $Id: winimgres.cpp,v 1.51 2001-04-04 10:12:05 sandervl Exp $ */
     1/* $Id: winimgres.cpp,v 1.52 2001-07-16 19:30:08 sandervl Exp $ */
    22
    33/*
     
    88 *
    99 * Language order based on Wine Code (loader\pe_resource.c)
     10 * + find_entry_by_id & find_entry_by_name
    1011 * Copyright 1995 Thomas Sandford
    1112 * Copyright 1996 Martin von Loewis
     
    332333}
    333334
     335/**********************************************************************
     336 *  find_entry_by_id
     337 *
     338 * Find an entry by id in a resource directory
     339 */
     340IMAGE_RESOURCE_DIRECTORY *find_entry_by_id( const IMAGE_RESOURCE_DIRECTORY *dir,
     341                                            WORD id, const void *root )
     342{
     343    const IMAGE_RESOURCE_DIRECTORY_ENTRY *entry;
     344    int min, max, pos;
     345
     346    entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1);
     347    min = dir->NumberOfNamedEntries;
     348    max = min + dir->NumberOfIdEntries - 1;
     349    while (min <= max)
     350    {
     351        pos = (min + max) / 2;
     352        if (entry[pos].u1.Id == id)
     353            return (IMAGE_RESOURCE_DIRECTORY *)((char *)root + entry[pos].u2.s.OffsetToDirectory);
     354        if (entry[pos].u1.Id > id) max = pos - 1;
     355        else min = pos + 1;
     356    }
     357    return NULL;
     358}
     359
     360
     361/**********************************************************************
     362 *  find_entry_by_nameW
     363 *
     364 * Find an entry by name in a resource directory
     365 */
     366IMAGE_RESOURCE_DIRECTORY *find_entry_by_nameW( const IMAGE_RESOURCE_DIRECTORY *dir,
     367                                               LPCWSTR name, const void *root )
     368{
     369    const IMAGE_RESOURCE_DIRECTORY_ENTRY *entry;
     370    const IMAGE_RESOURCE_DIR_STRING_U *str;
     371    int min, max, res, pos, namelen;
     372
     373    entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1);
     374    namelen = strlenW(name);
     375    min = 0;
     376    max = dir->NumberOfNamedEntries - 1;
     377    while (min <= max)
     378    {
     379        pos = (min + max) / 2;
     380        str = (IMAGE_RESOURCE_DIR_STRING_U *)((char *)root + entry[pos].u1.s.NameOffset);
     381        res = strncmpiW( name, str->NameString, str->Length );
     382        if (!res && namelen == str->Length)
     383            return (IMAGE_RESOURCE_DIRECTORY *)((char *)root + entry[pos].u2.s.OffsetToDirectory);
     384        if (res < 0) max = pos - 1;
     385        else min = pos + 1;
     386    }
     387    return NULL;
     388}
     389
    334390/**
    335391 * This function finds a resource (sub)directory within a given resource directory.
     
    380436        paResDirEntries += pResDirToSearch->NumberOfNamedEntries;
    381437
     438#if 1
     439        return find_entry_by_id(pResDirToSearch, idName, pResRootDir);
     440#else
    382441        for (i = 0; i < pResDirToSearch->NumberOfIdEntries; i++)
    383442            if (paResDirEntries[i].u1.Id == (WORD)idName)
     
    386445                                                 /*- ulRVAResourceSection*/)
    387446                    : NULL;
     447#endif
    388448    }
    389449    else
    390     {   /* string name */
     450    {
     451#if 1
     452        return find_entry_by_nameW(pResDirToSearch, lpszName, pResRootDir);
     453#else
     454        /* string name */
    391455        int cusName = lstrlenW(lpszName);
    392456
     
    406470            }
    407471        }
     472#endif
    408473    }
    409474
Note: See TracChangeset for help on using the changeset viewer.