#include <stdio.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/types.h>
#include "gdb_stat.h"
#if defined (SIGTSTP) && defined (SIGIO)
#include <sys/time.h>
#include <sys/resource.h>
#endif
#include "defs.h"
#include <signal.h>
#include "symtab.h"
#include "frame.h"
#include "inferior.h"
#include "gdb_wait.h"
ioctl (int desc, int code, int arg)
{
}
int (*signal ()) ()
{
}
kill (void)
{
}
getpid (void)
{
return 0;
}
sigsetmask (void)
{
}
chdir (void)
{
}
char *
getcwd (char *buf, unsigned int len)
{
buf[0] = '/';
buf[1] = 0;
return buf;
}
access (void)
{
return -1;
}
exit (void)
{
error ("Fatal error; restarting.");
}
char *files_start;
char *sourcebeg;
int sourcesize;
char *sourceptr;
int sourceleft;
int sourcedesc;
open (char *filename, int modes)
{
register char *next;
if (modes)
{
errno = EROFS;
return -1;
}
if (sourceptr)
{
errno = EMFILE;
return -1;
}
for (next = files_start; *(int *) next; next += *(int *) next)
{
if (!strcmp (next + 4, filename))
{
sourcebeg = next + 4 + strlen (next + 4) + 1;
sourcebeg = (char *) (((int) sourcebeg + 3) & (-4));
sourceptr = sourcebeg;
sourcesize = next + *(int *) next - sourceptr;
sourceleft = sourcesize;
return sourcedesc;
}
}
return 0;
}
close (int desc)
{
sourceptr = 0;
sourcedesc++;
if (sourcedesc == 100)
sourcedesc = 5;
}
FILE *
fopen (char *filename, char *modes)
{
return (FILE *) open (filename, *modes == 'w');
}
FILE *
fdopen (int desc)
{
return (FILE *) desc;
}
fclose (int desc)
{
close (desc);
}
fstat (int desc, struct stat *statbuf)
{
if (desc != sourcedesc)
{
errno = EBADF;
return -1;
}
statbuf->st_size = sourcesize;
}
myread (int desc, char *destptr, int size, char *filename)
{
int len = min (sourceleft, size);
if (desc != sourcedesc)
{
errno = EBADF;
return -1;
}
memcpy (destptr, sourceptr, len);
sourceleft -= len;
return len;
}
int
fread (int bufp, int numelts, int eltsize, int stream)
{
register int elts = min (numelts, sourceleft / eltsize);
register int len = elts * eltsize;
if (stream != sourcedesc)
{
errno = EBADF;
return -1;
}
memcpy (bufp, sourceptr, len);
sourceleft -= len;
return elts;
}
int
fgetc (int desc)
{
if (desc == (int) stdin)
return tty_input ();
if (desc != sourcedesc)
{
errno = EBADF;
return -1;
}
if (sourceleft-- <= 0)
return EOF;
return *sourceptr++;
}
lseek (int desc, int pos)
{
if (desc != sourcedesc)
{
errno = EBADF;
return -1;
}
if (pos < 0 || pos > sourcesize)
{
errno = EINVAL;
return -1;
}
sourceptr = sourcebeg + pos;
sourceleft = sourcesize - pos;
}
printf (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)
{
char buffer[1024];
sprintf (buffer, a1, a2, a3, a4, a5, a6, a7, a8, a9);
display_string (buffer);
}
fprintf (int ign, int a1, int a2, int a3, int a4, int a5, int a6, int a7,
int a8, int a9)
{
char buffer[1024];
sprintf (buffer, a1, a2, a3, a4, a5, a6, a7, a8, a9);
display_string (buffer);
}
fwrite (register char *buf, int numelts, int size, int stream)
{
register int i = numelts * size;
while (i-- > 0)
fputc (*buf++, stream);
}
fputc (int c, int ign)
{
char buf[2];
buf[0] = c;
buf[1] = 0;
display_string (buf);
}
_flsbuf (void)
{
error ("_flsbuf was actually called.");
}
fflush (int ign)
{
}
exec_file_command (void)
{
}
core_file_command (void)
{
}
char *
get_exec_file (int err)
{
return "run";
}
have_core_file_p (void)
{
return 0;
}
kill_command (void)
{
inferior_ptid = null_ptid;
}
terminal_inferior (void)
{
}
terminal_ours (void)
{
}
terminal_init_inferior (void)
{
}
write_inferior_register (void)
{
}
read_inferior_register (void)
{
}
read_memory (CORE_ADDR memaddr, char *myaddr, int len)
{
memcpy (myaddr, memaddr, len);
}
write_memory (CORE_ADDR memaddr, char *myaddr, int len)
{
memcpy (memaddr, myaddr, len);
return 0;
}
static REGISTER_TYPE saved_regs[NUM_REGS];
REGISTER_TYPE
read_register (int regno)
{
if (regno < 0 || regno >= NUM_REGS)
error ("Register number %d out of range.", regno);
return saved_regs[regno];
}
void
write_register (int regno, REGISTER_TYPE value)
{
if (regno < 0 || regno >= NUM_REGS)
error ("Register number %d out of range.", regno);
saved_regs[regno] = value;
}
vfork (void)
{
return 1;
}
ptrace (void)
{
}
setpgrp (void)
{
}
execle (void)
{
}
_exit (void)
{
}
malloc_warning (char *str)
{
printf ("\n%s.\n\n", str);
}
char *next_free;
char *memory_limit;
char *
sbrk (int amount)
{
if (next_free + amount > memory_limit)
return (char *) -1;
next_free += amount;
return next_free - amount;
}
char *
ulimit (void)
{
return memory_limit;
}
int
vlimit (void)
{
return memory_limit - next_free;
}
getrlimit (struct rlimit *addr)
{
addr->rlim_cur = memory_limit - next_free;
}
static int fault_code;
static REGISTER_TYPE gdb_stack;
resume (void)
{
REGISTER_TYPE restore[NUM_REGS];
PUSH_FRAME_PTR;
save_frame_pointer ();
memcpy (restore, saved_regs, sizeof restore);
POP_REGISTERS;
}
save_frame_pointer (CORE_ADDR val)
{
gdb_stack = val;
}
fault (void)
{
PUSH_REGISTERS;
save_registers ();
restore_gdb ();
}
restore_gdb (void)
{
CORE_ADDR new_fp = gdb_stack;
POP_FRAME_PTR;
}
save_registers (int firstreg)
{
memcpy (saved_regs, &firstreg, sizeof saved_regs);
fault_code = (&firstreg)[NUM_REGS];
}
static int fault_table[] = FAULT_TABLE;
int
wait (WAITTYPE *w)
{
WSETSTOP (*w, fault_table[fault_code / FAULT_CODE_UNITS]);
return PIDGET (inferior_ptid);
}
#ifndef HEAP_SIZE
#define HEAP_SIZE 400000
#endif
char heap[HEAP_SIZE] =
{0};
#ifndef STACK_SIZE
#define STACK_SIZE 100000
#endif
int kdb_stack_beg[STACK_SIZE / sizeof (int)];
int kdb_stack_end;
_initialize_standalone (void)
{
register char *next;
files_start = heap;
for (next = files_start; *(int *) next; next += *(int *) next)
{
}
next_free = next;
memory_limit = heap + sizeof heap;
}