#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 *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 */
HGLOBAL GLOBAL_CreateBlock( WORD flags, void *ptr, DWORD size,
                            HGLOBAL 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.hwndNext=0;
  win.dwStyle=WS_POPUP;
  
  return &win;
}

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

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