#include <stdlib.h>
#include "dde.h"
#include "windef.h"
#include "global.h"
#include <win.h>
#define DEBUG_DEFINE_VARIABLES
#define DEBUG_ALL
#include <debug.h>

#define DDE_PROC2WIN(proc_idx)   (  (HWND) ~( (proc_idx)+1)  )
#define DDE_WIN2PROC(win)        (  (int) ~(short) ((win)+1) )
#define DDE_IsRemoteWindow(win)  (  (win)<0xffff && (win)>=(0xffff-DDE_PROCS))


char *MessageTypeNames[0x400]={NULL};
char *dummy_store_for_debug_msg_name;

ldt_copy_entry ldt_copy[LDT_SIZE];

int LDT_GetEntry( int entry, ldt_entry *content )
{
    return 0;
}

int LDT_SetEntry( int entry, ldt_entry const *content )
{
    return 0;
}

void dummy_usage_of_debug_msg_name()
{
  dummy_store_for_debug_msg_name=debug_msg_name[0];
}

/* stub */
HWND GetDesktopWindow()
{
  printf("GetDesktopWindow\n");
  return 0;
}
/* stub */
/* smart stub */
LONG SendMessage(HWND a,WORD b,WORD c,LONG d)
{
  MSG msg;
  printf("SendMessage(%04x,%04x,%04x,%04lx)\n",a,b,c,d);
  if (DDE_IsRemoteWindow(a) || a==(HWND)-1)
     return 0;
  if (b!=WM_DDE_INITIATE)
     return 0;
  msg.hwnd=c;
  msg.message= WM_DDE_ACK;
  msg.lParam= 0;
  msg.wParam= 0;
  return DDE_SendMessage(&msg);
}
/* stub */
BOOL PostMessage(HWND a,WORD b,WORD c,LONG d)
{
  printf("PostMessage(%04x,%04x,%04x,%04lx)\n",a,b,c,d);
  return 0;
}
/* stub */
HWND GetTopWindow(HWND a)
{
  printf("GetTopWindow(%04x)\n",a);
  return 1;
}
/* stub */
WORD FreeSelector16(WORD a)
{
  printf("FreeSelector(%04x)\n",a);
  return 0;
}

/* stub that partially emulates the true GLOBAL_CreateBlock function */
HGLOBAL16 GLOBAL_CreateBlock( WORD flags, void *ptr, DWORD size,
                            HGLOBAL16 hOwner, BOOL isCode,
                            BOOL is32Bit, BOOL isReadOnly,
			    SHMDATA *shmdata  )
{
  
  printf("GLOBAL_CreateBlock(flags=0x%x,ptr=0x%08lx, size=0x%x,hOwner=0x%x\n",
	 (int)flags, (long)ptr, (int)size, (int)hOwner);
  printf("isCode=%d, is32Bit=%d, isReadOnly=%d, \n", isCode, is32Bit,
	 isReadOnly);
  printf("*shmdata={handle=0x%x,sel=0x%x, shmid=%d})\n",
	 shmdata->handle, shmdata->sel, shmdata->shmid);
  return 1;
}

/* stub */
WND *WIN_FindWndPtr(HWND hwnd)
{
  static WND win;
  printf("WIN_FindWndPtr(%d)\n",hwnd);
  if (hwnd==0)
     return NULL;
  win.next=NULL;
  win.dwStyle=WS_POPUP;
  
  return &win;
}

/* stub */
WORD GetCurrentPDB16(void)
{
  printf("GetCurrentPDB()\n");
  
  return 0;
}

/* stub */
void Yield(void)
{
}
