/*
 * WINElib-Resources
 *
 * Copied and modified heavily from loader/resource.c
 */

#include <stdio.h>
#include <stdlib.h>
#include "libres.h"
#include "windows.h"
#include "xmalloc.h"

typedef struct RLE
{
    const struct resource* const * Resources;  /* NULL-terminated array of pointers */
    struct RLE* next;
} ResListE;

static ResListE* ResourceList=NULL;

void LIBRES_RegisterResources(const struct resource* const * Res)
{
  ResListE** Curr;
  ResListE* n;
  for(Curr=&ResourceList; *Curr; Curr=&((*Curr)->next)) { }
  n=xmalloc(sizeof(ResListE));
  n->Resources=Res;
  n->next=NULL;
  *Curr=n;
}

/**********************************************************************
 *	    LIBRES_FindResource    
 */
HRSRC LIBRES_FindResource( HINSTANCE hModule, LPCSTR name, LPCSTR type )
{
  int nameid=0,typeid;
  ResListE* ResBlock;
  const struct resource* const * Res;

  if(HIWORD(name))
  {
    if(*name=='#')
    {
      nameid=atoi(name+1);
      name=NULL;
    }
  }
  else
  {
    nameid=LOWORD(name);
    name=NULL;
  }
  if(HIWORD(type))
  {
    if(*type=='#')
      typeid=atoi(type+1);
    else
    {
      WINELIB_UNIMP("LIBRES_FindResource(*,*,type=string)");
      return 0;
    }
  }
  else
    typeid=LOWORD(type);
  
  for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
    for(Res=ResBlock->Resources; *Res; Res++)
      if(name)
      {
	if((*Res)->type==typeid && !lstrcmpi((*Res)->name,name))
	  return (HRSRC)*Res;
      }
      else
	if((*Res)->type==typeid && (*Res)->id==nameid)
	  return (HRSRC)*Res;
  return 0;
}


/**********************************************************************
 *	    LIBRES_LoadResource    
 */
HGLOBAL LIBRES_LoadResource( HINSTANCE hModule, HRSRC hRsrc )
{
  return (HGLOBAL)(((struct resource*)hRsrc)->bytes);
}


/**********************************************************************
 *	    LIBRES_LockResource    
 */
LPVOID LIBRES_LockResource( HGLOBAL handle )
{
  return (LPVOID)handle;
}


/**********************************************************************
 *	    LIBRES_FreeResource    
 */
BOOL LIBRES_FreeResource( HGLOBAL handle )
{
  return 0; /* Obsolete in Win32 */
}


/**********************************************************************
 *	    LIBRES_AccessResource    
 */
INT LIBRES_AccessResource( HINSTANCE hModule, HRSRC hRsrc )
{
  WINELIB_UNIMP("LIBRES_AccessResource()");
  return -1; /* Obsolete in Win32 */
}


/**********************************************************************
 *	    LIBRES_SizeofResource    
 */
DWORD LIBRES_SizeofResource( HINSTANCE hModule, HRSRC hRsrc )
{
  return (DWORD)(((struct resource*)hRsrc)->size);
}


/**********************************************************************
 *	    LIBRES_AllocResource    
 */
HGLOBAL LIBRES_AllocResource( HINSTANCE hModule, HRSRC hRsrc, DWORD size )
{
  WINELIB_UNIMP("LIBRES_AllocResource()");
  return 0; /* Obsolete in Win32 */
}

