#include <stdlib.h>
#include "dde.h"
#include <wintypes.h>
#include "global.h"
#include <win.h>
#define DEBUG_DEFINE_VARIABLES
#define DEBUG_ALL
#include <stddebug.h>
#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 FreeSelector(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 GetCurrentPDB(void)
{
  printf("GetCurrentPDB()\n");
  
  return 0;
}

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