/*
 * File dbgmain.c - main wrapper for internal debugger test bed.
 *
 * Copyright (C) 1997, Eric Youngdale.
 */
#include <signal.h>

#include <ldt.h>
#include "windows.h"
#include "toolhelp.h"
#include "module.h"
#include "debugger.h"
#include "class.h"
#include <X11/Xlib.h>

#include "debugger.h"
#include "peexe.h"
#include "pe_image.h"

ldt_copy_entry ldt_copy[LDT_SIZE];
unsigned char ldt_flags_copy[LDT_SIZE];

Display * display;

int
XUngrabPointer( Display * d, Time t)
{
  return(0);
}

int
XUngrabServer( Display * d )
{
  return(0);
}

int
XFlush(Display * d )
{
  return(0);
}

HTASK16    GetCurrentTask()
{
  exit(0);
}

HMODULE16  GetExePtr(HANDLE16 h)
{
  exit(0);
}

LPSTR MODULE_GetModuleName( HMODULE16 hModule )
{
  exit(0);
}

int PROFILE_GetWineIniString( const char *section, const char *key_name,
                                     const char *def, char *buffer, int len )
{
  exit(0);
}


void CLASS_DumpClass( CLASS *class )
{
  exit(0);
}

void MODULE_DumpModule( HMODULE16 hmodule )
{
  exit(0);
}

void QUEUE_DumpQueue( HQUEUE16 hQueue )
{
  exit(0);
}

void WIN_DumpWindow( HWND32 hwnd )
{
  exit(0);
}


void CLASS_WalkClasses()
{
  exit(0);
}

void MODULE_WalkModules()
{
  exit(0);
}

void QUEUE_WalkQueues()
{
  exit(0);
}

void WIN_WalkWindows( HWND32 hwnd, int indent )
{
  exit(0);
}

NE_MODULE *MODULE_GetPtr( HMODULE16 hModule )
{
  exit(0);
}

FARPROC16 MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal )
{
  exit(0);
}

void LDT_Print( int start, int length )
{
  exit(0);
}

LPVOID     GlobalLock16(HGLOBAL16 h)
{
  exit(0);
}

BOOL16 ModuleFirst(MODULEENTRY *lpModule)
{
  return 0;
}

BOOL16 ModuleNext(MODULEENTRY *lpModule)
{
  return 0;
}

BOOL16     IsBadReadPtr16(SEGPTR s,UINT16 o)
{
  exit(0);
}

BOOL32     IsBadReadPtr32(LPCVOID s,UINT32 o)
{
  exit(0);
}

struct qwert
{
  unsigned flag1:1;
  unsigned flag3:3;
  signed remain:11;
  unsigned whatsup:17;
} vvv;

int xyzzy(const char * qwe, int ijk)
{
  return strlen(qwe) + ijk;
}

unsigned int * xxx;
unsigned int * yyy;

int xxx3[10];

char vdv[100];

struct deferred_debug_info
{
	struct deferred_debug_info	* next;
	char				* load_addr;
	char				* module_name;
	char				* dbg_info;
	int				  dbg_size;
	struct PE_Debug_dir		* dbgdir;
	struct pe_data			* pe;
        LPIMAGE_SECTION_HEADER            sectp;
	int				  nsect;
	short int			  dbg_index;			
	char				  loaded;
};

struct CodeViewDebug
{
	char		    cv_nbtype[8];
	unsigned int	    cv_timestamp;
	char		    cv_unknown[4];
	char		    cv_name[1];
};

test_pdbstuff()
{
  struct deferred_debug_info deefer;
  struct PE_Debug_dir	dinfo;
  struct CodeViewDebug cdebug;
  IMAGE_SECTION_HEADER  sects[10];

  memset(&deefer, 0, sizeof(deefer));
  memset(&dinfo, 0, sizeof(dinfo));
  memset(&cdebug, 0, sizeof(cdebug));
  memset(&sects, 0, sizeof(sects));

  deefer.dbg_info = (char *) &cdebug;
  dinfo.timestamp = 812932395;
  cdebug.cv_timestamp = 833392137  /* 841951397 */;
  deefer.dbgdir = &dinfo;
  deefer.sectp = sects;
  deefer.nsect = 10;

  DEBUG_InitTypes();
  DEBUG_ProcessPDBFile(&deefer, "../dumpexe.pdb");
}

int
main(int argc, char * argv[])
{
  extern char * DEBUG_argv0;
  SIGCONTEXT  reg;
  
  strcpy(vdv, "This is a test");
  memset(&vvv, 0xff, sizeof(vvv));
  vvv.whatsup = 0;
  vvv.flag3 = 0;
  vvv.remain = 0x401;
  DEBUG_argv0 = argv[0];
  xxx = (unsigned int*) &vvv;
  yyy = xxx + 5;
  xxx3[5] = 7;

  test_pdbstuff();

  memset(&reg, 0, sizeof(reg));
  wine_debug(SIGSEGV, &reg);
  return 0;
}
