/* --- Copyright University of Sussex 1994. All rights reserved. ----------
 * File:			C.win32/extern/src/poplog.h
 * Purpose:			Header file for Poplog --> Win32 interface
 * Author:			Robert John Duncan, Jun 14 1994
 * Documentation:
 * Related Files:
 */

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>


typedef struct _POP_AST
{
	DWORD	type;
	DWORD	data;
} POP_AST;
	/* ASynchronous Trap */

#define POP_AST_SIGNAL      0	/* Unix-style signal */
#define POP_AST_TIMER       1	/* timer */
#define POP_AST_APP_PENDING 2	/* events pending for Xt appcontext */
#define POP_AST_QUEUE_CHECK 3	/* dummy to check AST queue */
#define POP_AST_DEV         4	/* condition on device */
	/* AST types (cf. "signals.ph") */

#define POP_SIG_HUP		1
#define POP_SIG_INT		2
#define POP_SIG_QUIT	3
#define POP_SIG_ILL		4
#define POP_SIG_EXN		5
#define POP_SIG_CHLD	6
#define POP_SIG_ALRM	7
#define POP_SIG_FPE		8
#define POP_SIG_BUS		10
#define POP_SIG_SEGV	11
	/* signal numbers for AST_SIGNAL, cf. "sigdefs.ph" */

typedef struct _POP_SIGNAL_CONTEXT /* psc */
{
	DWORD	SignalNumber;
	DWORD	ExceptionCode;
	PVOID	ExceptionAddress;
	PVOID	FaultAddress;
	DWORD	ReadWriteFlag;
} POP_SIGNAL_CONTEXT;
	/* same as struct PSC in "signal.p" */

#define POP_EXCEPTION(n) (0xefefbe60|(n))

#define POP_EXCEPTION_INIT_FAILED	POP_EXCEPTION(1)
	/* indicates some initialisation step failed */

typedef struct _POP_DEVICE_BUFFER
{
	DWORD	size;
	DWORD	count;
	DWORD	posn;
	BYTE	data[sizeof(DWORD)/sizeof(BYTE)];
} POP_DEVICE_BUFFER;

typedef struct _POP_DEVICE
{
	HANDLE	handle;
	WORD	mode;
	WORD	status;
	DWORD	error_code;
	TCHAR	*prompt;
	POP_DEVICE_BUFFER
			*in_buffer,
			*out_buffer;
} POP_DEVICE;
	/* same as struct DEV_CONTROL_BLOCK in "wntdefs.ph" */

#define POP_DEVICE_BUFFER_SIZE(nbytes) \
	(sizeof(POP_DEVICE_BUFFER) - sizeof(DWORD)/sizeof(BYTE) + (nbytes))

#define POP_DEVICE_MODE_TEXT	0x01
#define POP_DEVICE_MODE_LINE	0x02
#define POP_DEVICE_MODE_CONSOLE	0x04
#define POP_DEVICE_MODE_RAW		0x08
	/* device mode flags */

#define POP_DEVICE_STATUS_EOF	0x01
#define POP_DEVICE_STATUS_INTR	0x02
#define POP_DEVICE_STATUS_ERROR	0x04
	/* device status flags */

#define POP_M_PROT_NONE		0x0
#define POP_M_PROT_EXEC		0x1
#define POP_M_PROT_WRITE	0x2
#define POP_M_PROT_READ		0x4
#define POP_M_PROT_ALL		0x7
	/* bit masks for memory protection */

typedef struct _POP_PROCESS_INFO
{
	DWORD	pid;
	HANDLE	handle;
	DWORD	status;
} POP_PROCESS_INFO;
	/* status of a child process */

#define POP_TIME_ERROR (DWORD)-1


extern DWORD *_pop_signals_pending;
	/* pointer to Poplog _trap flag defined in "asignals.s" */

extern void __pop_errsig(void);
	/* system error routine defined in "asignals.s" */

extern int (*_WEAK_pop_external_callback)(void *);
	/* weak reference to _external_callback_func defined in "asignals.s" */

extern int pop_main(void);
	/* entry point to Poplog defined in "amain.s" */

extern HANDLE pop_ast_queue_non_empty;

extern void _pop_add_ast(DWORD type, DWORD data);
extern BOOL _pop_rem_ast(DWORD *type, DWORD *data);
extern void _pop_timer_trap(DWORD ident);
extern void _pop_keyboard_trap(DWORD signal);
extern void pause_popintr(void);
extern void pop_init_ast(void);
	/* from "ast.c" */

extern void pop_init_console(void);
extern void pop_set_console_mode(POP_DEVICE *device, BOOL for_output);
	/* from "console.c" */

extern BOOL pop_alloc_device_buffers(POP_DEVICE *device, DWORD access);
extern DWORD pop_read(HANDLE handle, BYTE *addr, DWORD nbytes);
extern DWORD pop_read_device(POP_DEVICE *device, BYTE *addr, DWORD nbytes);
extern DWORD pop_read_special_device(POP_DEVICE *device, BYTE *addr, DWORD nbytes);
extern DWORD pop_test_input_device(POP_DEVICE *device);
extern void pop_clear_input_device(POP_DEVICE *device);
extern DWORD pop_write_device(POP_DEVICE *device, BYTE *addr, DWORD nbytes);
extern DWORD pop_write_special_device(POP_DEVICE *device, BYTE *addr, DWORD nbytes);
extern BOOL pop_flush_device(POP_DEVICE *device);
extern DWORD pop_seek_device(POP_DEVICE *device, LONG nbytes, DWORD method);
extern void pop_close_device(POP_DEVICE *device);
	/* from "device.c" */

extern void pop_init_environment(DWORD version);
extern DWORD pop_get_environment_variable(TCHAR *var, TCHAR *value, DWORD nchars);
extern BOOL pop_set_environment_variable(TCHAR *var, TCHAR *value);
extern DWORD pop_expand_environment_strings(TCHAR *string, TCHAR *value, DWORD nchars);
	/* from "environment.c" */

extern POP_SIGNAL_CONTEXT __pop_sigcontext;
extern DWORD __pop_fpe_handler;

extern LONG pop_exception_filter(LPEXCEPTION_POINTERS exp);
	/* from "exception.c" */

extern int __pop_in_user_extern;

extern HINSTANCE pop_load_library(TCHAR *name);
extern BOOL pop_free_library(HINSTANCE handle);
extern FARPROC pop_get_proc_address(HINSTANCE handle, TCHAR *symbol);
extern DWORD _pop_exfunc_callback(DWORD arg, ...);
	/* from "external.c" */

extern HANDLE pop_get_std_handle(DWORD device_id);
extern BOOL pop_set_std_handle(DWORD device_id, HANDLE handle);
extern HANDLE pop_create_file(
		TCHAR *name,
		DWORD access,
		DWORD share,
		LPSECURITY_ATTRIBUTES security,
		DWORD create,
		DWORD attributes,
		HANDLE template);
extern BOOL pop_create_pipe(HANDLE *ihandle, HANDLE *ohandle);
extern BOOL pop_close_handle(HANDLE handle);
extern BOOL pop_is_console(HANDLE handle);
extern DWORD pop_get_file_size(HANDLE handle, DWORD *size_hi);
extern DWORD pop_get_file_type(HANDLE handle);
extern DWORD pop_get_file_attributes(TCHAR *path);
extern DWORD pop_get_file_time(HANDLE handle);
extern BOOL pop_get_file_id(
		HANDLE handle,
		DWORD *volume,
		DWORD *index_hi,
		DWORD *index_lo);
extern DWORD pop_get_full_pathname(TCHAR *file, TCHAR *buffer, DWORD len);
extern DWORD pop_get_current_directory(TCHAR *buffer, DWORD len);
extern BOOL pop_set_current_directory(TCHAR *path);
extern DWORD pop_start_file_search(
		TCHAR *pattern,
		char *buffer,
		DWORD len,
		BOOL *hidden,
		HANDLE *handle);
extern DWORD pop_file_search(
		HANDLE handle,
		char *buffer,
		DWORD len,
		BOOL *hidden);
extern BOOL pop_end_file_search(HANDLE handle);
extern BOOL pop_move_file(TCHAR *from_name, TCHAR *to_name, BOOL replace_existing);
extern BOOL pop_copy_file(TCHAR *from_name, TCHAR *to_name, BOOL replace_existing);
extern BOOL pop_delete_file(TCHAR *name);
	/* from "file.c" */

extern DWORD __pop_nr_seg[];
extern DWORD __pop_nr_seg_nbytes;

extern void pop_init_heap(void);
extern void *pop_alloc(DWORD nbytes);
extern void *pop_realloc(void *ptr, DWORD nbytes);
extern BOOL pop_free(void *ptr);
extern BYTE *pop_get_heap_ptr(void);
extern BYTE *pop_set_heap_ptr(BYTE *hi, BYTE *lo);
extern PVOID pop_get_callstack_base(void);
extern BOOL pop_virtual_protect(BYTE *base, BYTE *limit, DWORD prot);
extern BOOL pop_has_read_access(VOID *address);
	/* from "memory.c" */

extern DWORD pop_get_last_error();
extern DWORD pop_get_oem_id(void);
extern DWORD pop_get_computer_name(TCHAR *buffer, DWORD len);
extern DWORD pop_get_user_name(TCHAR *buffer, DWORD len);
extern DWORD pop_get_current_process_id(void);
extern void pop_exit_process(UINT exit_code);
extern TCHAR *pop_get_command_line(void);
	/* from "misc.c" */

extern BOOL pop_create_process(
		TCHAR *path,
		TCHAR *command_line,
		HANDLE std_in,
		HANDLE std_out,
		HANDLE std_err,
		DWORD flags,
		BOOL notify,
		POP_PROCESS_INFO *proc
	);
	/* from "process.c" */

extern DWORD pop_get_process_time(void);
extern DWORD pop_get_real_time(DWORD *usecs);
extern DWORD pop_convert_date(BOOL local, DWORD time, TCHAR *buffer, DWORD len);
extern void pop_sleep(DWORD millisecs);
	/* from "time.c" */

extern DWORD pop_time_from_file_time(DWORD *popTime, FILETIME *fileTime);
extern void pop_time_to_file_time(DWORD popTime, FILETIME *fileTime);
extern DWORD pop_sum_process_times(FILETIME *kernelTime, FILETIME *userTime);
	/* from "util.asm" */
