*** empty log message ***
This commit is contained in:
		@ -1,5 +1,5 @@
 | 
				
			|||||||
/* 
 | 
					/* 
 | 
				
			||||||
 * $Id: awk.c,v 1.52 2006-06-19 04:38:51 bacon Exp $ 
 | 
					 * $Id: awk.c,v 1.53 2006-06-19 09:08:50 bacon Exp $ 
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk_i.h>
 | 
					#include <xp/awk/awk_i.h>
 | 
				
			||||||
@ -14,6 +14,7 @@ static void __free_func (void* awk, void* func);
 | 
				
			|||||||
xp_awk_t* xp_awk_open (void)
 | 
					xp_awk_t* xp_awk_open (void)
 | 
				
			||||||
{	
 | 
					{	
 | 
				
			||||||
	xp_awk_t* awk;
 | 
						xp_awk_t* awk;
 | 
				
			||||||
 | 
						xp_size_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	awk = (xp_awk_t*) xp_malloc (xp_sizeof(xp_awk_t));
 | 
						awk = (xp_awk_t*) xp_malloc (xp_sizeof(xp_awk_t));
 | 
				
			||||||
	if (awk == XP_NULL) return XP_NULL;
 | 
						if (awk == XP_NULL) return XP_NULL;
 | 
				
			||||||
@ -84,9 +85,7 @@ xp_awk_t* xp_awk_open (void)
 | 
				
			|||||||
	awk->lex.line = 1;
 | 
						awk->lex.line = 1;
 | 
				
			||||||
	awk->lex.column = 1;
 | 
						awk->lex.column = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	awk->extio.pipe = XP_NULL;
 | 
						for (i = 0; i < xp_countof(awk->extio); i++) awk->extio[i] = XP_NULL;
 | 
				
			||||||
	awk->extio.coproc = XP_NULL;
 | 
					 | 
				
			||||||
	awk->extio.file = XP_NULL;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return awk;
 | 
						return awk;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -227,9 +226,14 @@ xp_size_t xp_awk_getsrcline (xp_awk_t* awk)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TODO: redo it */
 | 
					/* TODO: redo it */
 | 
				
			||||||
int xp_awk_setextio (xp_awk_t* awk, xp_awk_io_t io, void* arg)
 | 
					int xp_awk_setextio (xp_awk_t* awk, int id, xp_awk_io_t handler, void* arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	awk->extio.pipe = io;
 | 
						if (id < 0 || id >= xp_countof(awk->extio)) 
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							awk->errnum = XP_AWK_EINVAL;
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						awk->extio[id] = handler;
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/* 
 | 
					/* 
 | 
				
			||||||
 * $Id: awk.h,v 1.65 2006-06-19 04:38:51 bacon Exp $
 | 
					 * $Id: awk.h,v 1.66 2006-06-19 09:08:50 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _XP_AWK_AWK_H_
 | 
					#ifndef _XP_AWK_AWK_H_
 | 
				
			||||||
@ -13,13 +13,13 @@ typedef struct xp_awk_t xp_awk_t;
 | 
				
			|||||||
typedef xp_ssize_t (*xp_awk_io_t) (
 | 
					typedef xp_ssize_t (*xp_awk_io_t) (
 | 
				
			||||||
	int cmd, void* arg, xp_char_t* data, xp_size_t count);
 | 
						int cmd, void* arg, xp_char_t* data, xp_size_t count);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct xp_awk_cmd_t xp_awk_cmd_t;
 | 
					typedef struct xp_awk_extio_t xp_awk_extio_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct xp_awk_cmd_t 
 | 
					struct xp_awk_extio_t 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	xp_char_t* name;
 | 
						xp_char_t* name;
 | 
				
			||||||
	void* handle;
 | 
						void* handle;
 | 
				
			||||||
	xp_awk_cmd_t* next;
 | 
						xp_awk_extio_t* next;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* io function commands */
 | 
					/* io function commands */
 | 
				
			||||||
@ -61,6 +61,7 @@ enum
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	XP_AWK_ENOERR,         /* no error */
 | 
						XP_AWK_ENOERR,         /* no error */
 | 
				
			||||||
	XP_AWK_ENOMEM,         /* out of memory */
 | 
						XP_AWK_ENOMEM,         /* out of memory */
 | 
				
			||||||
 | 
						XP_AWK_EINVAL,         /* invalid parameter */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	XP_AWK_ENOSRCIO,       /* no source io handler set */
 | 
						XP_AWK_ENOSRCIO,       /* no source io handler set */
 | 
				
			||||||
	XP_AWK_ESRCINOPEN,
 | 
						XP_AWK_ESRCINOPEN,
 | 
				
			||||||
@ -112,9 +113,22 @@ enum
 | 
				
			|||||||
	XP_AWK_ENOTINDEXABLE,  /* not indexable value */
 | 
						XP_AWK_ENOTINDEXABLE,  /* not indexable value */
 | 
				
			||||||
	XP_AWK_EWRONGINDEX,    /* wrong index */
 | 
						XP_AWK_EWRONGINDEX,    /* wrong index */
 | 
				
			||||||
	XP_AWK_EPIPE,          /* pipe operation error */
 | 
						XP_AWK_EPIPE,          /* pipe operation error */
 | 
				
			||||||
 | 
						XP_AWK_EIOIMPL,        /* wrong implementation of user io handler */
 | 
				
			||||||
	XP_AWK_EINTERNAL       /* internal error */
 | 
						XP_AWK_EINTERNAL       /* internal error */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* extio types */
 | 
				
			||||||
 | 
					enum
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* extio types available */
 | 
				
			||||||
 | 
						XP_AWK_EXTIO_PIPE,
 | 
				
			||||||
 | 
						XP_AWK_EXTIO_COPROC,
 | 
				
			||||||
 | 
						XP_AWK_EXTIO_FILE,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* reserved for internal use only */
 | 
				
			||||||
 | 
						XP_AWK_EXTIO_NUM
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
extern "C" {
 | 
					extern "C" {
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@ -132,7 +146,7 @@ void xp_awk_setrunopt (xp_awk_t* awk, int opt);
 | 
				
			|||||||
int xp_awk_attsrc (xp_awk_t* awk, xp_awk_io_t src, void* arg);
 | 
					int xp_awk_attsrc (xp_awk_t* awk, xp_awk_io_t src, void* arg);
 | 
				
			||||||
int xp_awk_detsrc (xp_awk_t* awk);
 | 
					int xp_awk_detsrc (xp_awk_t* awk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int xp_awk_setextio (xp_awk_t* awk, xp_awk_io_t io, void* arg);
 | 
					int xp_awk_setextio (xp_awk_t* awk, int id, xp_awk_io_t handler, void* arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
xp_size_t xp_awk_getsrcline (xp_awk_t* awk);
 | 
					xp_size_t xp_awk_getsrcline (xp_awk_t* awk);
 | 
				
			||||||
/* TODO: xp_awk_parse (xp_awk_t* awk, xp_awk_io_t src, void* arg)??? */
 | 
					/* TODO: xp_awk_parse (xp_awk_t* awk, xp_awk_io_t src, void* arg)??? */
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: awk_i.h,v 1.16 2006-06-19 04:38:51 bacon Exp $
 | 
					 * $Id: awk_i.h,v 1.17 2006-06-19 09:08:50 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _XP_AWK_AWKI_H_
 | 
					#ifndef _XP_AWK_AWKI_H_
 | 
				
			||||||
@ -111,12 +111,7 @@ struct xp_awk_t
 | 
				
			|||||||
		xp_size_t column;
 | 
							xp_size_t column;
 | 
				
			||||||
	} lex;
 | 
						} lex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct
 | 
						xp_awk_io_t extio[XP_AWK_EXTIO_NUM];
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		xp_awk_io_t pipe;
 | 
					 | 
				
			||||||
		xp_awk_io_t coproc;
 | 
					 | 
				
			||||||
		xp_awk_io_t file;
 | 
					 | 
				
			||||||
	} extio;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* token */
 | 
						/* token */
 | 
				
			||||||
	struct 
 | 
						struct 
 | 
				
			||||||
@ -168,17 +163,20 @@ struct xp_awk_run_t
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	struct
 | 
						struct
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		xp_awk_cmd_t* incmd;
 | 
							xp_awk_extio_t* in_pipe;
 | 
				
			||||||
		xp_awk_cmd_t* iocmd;
 | 
							xp_awk_extio_t* in_file;
 | 
				
			||||||
		xp_awk_cmd_t* outcmd;
 | 
							/*
 | 
				
			||||||
		/*xp_awk_infile_t* infile;*/
 | 
							xp_awk_extio_t* out_pipe;
 | 
				
			||||||
 | 
							xp_awk_extio_t* out_file;
 | 
				
			||||||
 | 
							xp_awk_extio_t* coproc;
 | 
				
			||||||
 | 
							*/
 | 
				
			||||||
	} extio;
 | 
						} extio;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int opt;
 | 
						int opt;
 | 
				
			||||||
	int errnum;
 | 
						int errnum;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xp_awk_tree_t* tree;
 | 
						/*xp_awk_tree_t* tree;
 | 
				
			||||||
	/*xp_size_t nglobals;*/
 | 
						xp_size_t nglobals;*/
 | 
				
			||||||
	xp_awk_t* awk;
 | 
						xp_awk_t* awk;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: err.c,v 1.20 2006-06-18 10:53:06 bacon Exp $
 | 
					 * $Id: err.c,v 1.21 2006-06-19 09:08:50 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk_i.h>
 | 
					#include <xp/awk/awk_i.h>
 | 
				
			||||||
@ -15,6 +15,7 @@ const xp_char_t* xp_awk_geterrstr (xp_awk_t* awk)
 | 
				
			|||||||
 	{
 | 
					 	{
 | 
				
			||||||
		XP_T("no error"),
 | 
							XP_T("no error"),
 | 
				
			||||||
		XP_T("out of memory"),
 | 
							XP_T("out of memory"),
 | 
				
			||||||
 | 
							XP_T("invalid parameter"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		XP_T("no source io handler set"),
 | 
							XP_T("no source io handler set"),
 | 
				
			||||||
		XP_T("cannot open source input"),
 | 
							XP_T("cannot open source input"),
 | 
				
			||||||
@ -65,6 +66,7 @@ const xp_char_t* xp_awk_geterrstr (xp_awk_t* awk)
 | 
				
			|||||||
		XP_T("value not indexable"),
 | 
							XP_T("value not indexable"),
 | 
				
			||||||
		XP_T("wrong index value"),
 | 
							XP_T("wrong index value"),
 | 
				
			||||||
		XP_T("pipe operation error"),
 | 
							XP_T("pipe operation error"),
 | 
				
			||||||
 | 
							XP_T("wrong implementation of user-defined io handler"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		XP_T("internal error that should never have happened")
 | 
							XP_T("internal error that should never have happened")
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: extio.c,v 1.4 2006-06-19 04:38:51 bacon Exp $
 | 
					 * $Id: extio.c,v 1.5 2006-06-19 09:08:50 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk_i.h>
 | 
					#include <xp/awk/awk_i.h>
 | 
				
			||||||
@ -10,30 +10,29 @@
 | 
				
			|||||||
#include <xp/bas/memory.h>
 | 
					#include <xp/bas/memory.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TODO: a lot of todo's here... */
 | 
					int xp_awk_readextio (xp_awk_run_t* run, 
 | 
				
			||||||
#include <tchar.h>
 | 
						xp_awk_extio_t** extio, xp_awk_io_t handler,
 | 
				
			||||||
#include <stdio.h>
 | 
						const xp_char_t* name, int* errnum)
 | 
				
			||||||
 | 
					 | 
				
			||||||
int xp_awk_readcmd (xp_awk_run_t* run, const xp_char_t* cmd, int* errnum)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	xp_awk_cmd_t* p = run->extio.incmd;
 | 
						xp_awk_extio_t* p = *extio;
 | 
				
			||||||
 | 
						xp_bool_t extio_created = xp_false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (p != XP_NULL)
 | 
						while (p != XP_NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (xp_strcmp(p->name,cmd) == 0) break;
 | 
							if (xp_strcmp(p->name,name) == 0) break;
 | 
				
			||||||
		p = p->next;
 | 
							p = p->next;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p == XP_NULL)
 | 
						if (p == XP_NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		p = (xp_awk_cmd_t*) xp_malloc (xp_sizeof(xp_awk_cmd_t));
 | 
							p = (xp_awk_extio_t*) xp_malloc (xp_sizeof(xp_awk_extio_t));
 | 
				
			||||||
		if (p == XP_NULL)
 | 
							if (p == XP_NULL)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			*errnum = XP_AWK_ENOMEM;
 | 
								*errnum = XP_AWK_ENOMEM;
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		p->name = xp_strdup (cmd);
 | 
							p->name = xp_strdup (name);
 | 
				
			||||||
		if (p->name == XP_NULL)
 | 
							if (p->name == XP_NULL)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			xp_free (p);
 | 
								xp_free (p);
 | 
				
			||||||
@ -42,40 +41,54 @@ int xp_awk_readcmd (xp_awk_run_t* run, const xp_char_t* cmd, int* errnum)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		p->handle = XP_NULL;
 | 
							p->handle = XP_NULL;
 | 
				
			||||||
		p->next = run->extio.incmd;
 | 
							p->next = XP_NULL;
 | 
				
			||||||
		run->extio.incmd = p;
 | 
							extio_created = xp_true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (p->handle == XP_NULL)
 | 
						if (p->handle == XP_NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		xp_awk_io_t pipe_io = run->awk->extio.pipe;
 | 
							if (handler (XP_AWK_INPUT_OPEN, p, XP_NULL, 0) == -1)
 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (pipe_io (XP_AWK_INPUT_OPEN, p, XP_NULL, 0) == -1)
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* this is treated as pipe open error.
 | 
								if (extio_created)
 | 
				
			||||||
			 * the return value of getline should be -1
 | 
								{
 | 
				
			||||||
			 * set ERRNO as well....
 | 
									xp_free (p->name);
 | 
				
			||||||
			 */
 | 
									xp_free (p);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
									
 | 
				
			||||||
 | 
								/* TODO: set ERRNO */
 | 
				
			||||||
 | 
								*errnum = XP_AWK_ENOERR;
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (p->handle == XP_NULL)
 | 
							if (p->handle == XP_NULL)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* TODO: break the chain ... */
 | 
								if (extio_created)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									xp_free (p->name);
 | 
				
			||||||
 | 
									xp_free (p);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* wrong implementation of user io handler.
 | 
				
			||||||
			/* *errnum = XP_AWK_EEXTIO; external io handler error */
 | 
								 * the correct io handler should set p->handle to
 | 
				
			||||||
			*errnum = XP_AWK_EINTERNAL;
 | 
								 * non XP_NULL when it returns 0. */
 | 
				
			||||||
 | 
								*errnum = XP_AWK_EIOIMPL;
 | 
				
			||||||
			return -1;
 | 
								return -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* link it to the extio chain */
 | 
				
			||||||
 | 
						if (extio_created)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							p->next = *extio;
 | 
				
			||||||
 | 
							*extio = p;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
xp_char_t buf[1024];
 | 
					xp_char_t buf[1024];
 | 
				
			||||||
xp_awk_io_t pipe_io = run->awk->extio.pipe;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (pipe_io (XP_AWK_INPUT_DATA, p, buf, xp_countof(buf)) == 0)
 | 
						if (handler (XP_AWK_INPUT_DATA, p, buf, xp_countof(buf)) == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
							/* no more data. end of data stream */
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -85,28 +98,28 @@ xp_printf(XP_TEXT("%s"), buf);
 | 
				
			|||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int xp_awk_closecmd (xp_awk_run_t* run, const xp_char_t* cmd, int* errnum)
 | 
					int xp_awk_closeextio (xp_awk_run_t* run, 
 | 
				
			||||||
 | 
						xp_awk_extio_t** extio, xp_awk_io_t handler,
 | 
				
			||||||
 | 
						const xp_char_t* name, int* errnum)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	xp_awk_cmd_t* p = run->extio.incmd, * px = XP_NULL;
 | 
						xp_awk_extio_t* p = *extio, * px = XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (p != XP_NULL)
 | 
						while (p != XP_NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		if (xp_strcmp(p->name,cmd) == 0) 
 | 
							if (xp_strcmp(p->name,name) == 0) 
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			xp_awk_io_t pipe_io = run->awk->extio.pipe;
 | 
								if (handler (XP_AWK_INPUT_CLOSE, p, XP_NULL, 0) == -1)
 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (pipe_io (XP_AWK_INPUT_CLOSE, p, XP_NULL, 0) == -1)
 | 
					 | 
				
			||||||
			{
 | 
								{
 | 
				
			||||||
				/* TODO: how to handle this... */
 | 
									/* this is not a run-time error.*/
 | 
				
			||||||
				p->handle = XP_NULL;
 | 
									*errnum = XP_AWK_ENOERR;
 | 
				
			||||||
				return -1;
 | 
									return -1;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			p->handle = XP_NULL;
 | 
								p->handle = XP_NULL;
 | 
				
			||||||
			//if (opt_remove_closed_cmd)
 | 
								//if (opt_remove_closed_extio) // TODO:...
 | 
				
			||||||
			//{
 | 
								//{
 | 
				
			||||||
				if (px != XP_NULL) px->next = p->next;
 | 
									if (px != XP_NULL) px->next = p->next;
 | 
				
			||||||
				else run->extio.incmd = p->next;
 | 
									else *extio = p->next;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				xp_free (p->name);
 | 
									xp_free (p->name);
 | 
				
			||||||
				xp_free (p);
 | 
									xp_free (p);
 | 
				
			||||||
@ -118,5 +131,7 @@ int xp_awk_closecmd (xp_awk_run_t* run, const xp_char_t* cmd, int* errnum)
 | 
				
			|||||||
		p = p->next;
 | 
							p = p->next;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* this is not a run-time error */
 | 
				
			||||||
 | 
						*errnum = XP_AWK_ENOERR;
 | 
				
			||||||
	return -1;
 | 
						return -1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
SRCS = awk.c err.c tree.c tab.c map.c parse.c run.c sa.c val.c misc.c extio.c
 | 
					SRCS = awk.c err.c tree.c tab.c map.c parse.c run.c sa.c val.c func.c misc.c extio.c
 | 
				
			||||||
OBJS = $(SRCS:.c=.o)
 | 
					OBJS = $(SRCS:.c=.o)
 | 
				
			||||||
OUT = libxpawk.a
 | 
					OUT = libxpawk.a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: run.c,v 1.98 2006-06-19 04:38:51 bacon Exp $
 | 
					 * $Id: run.c,v 1.99 2006-06-19 09:08:50 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk_i.h>
 | 
					#include <xp/awk/awk_i.h>
 | 
				
			||||||
@ -22,7 +22,7 @@
 | 
				
			|||||||
#define STACK_RETVAL(run) STACK_AT(run,2)
 | 
					#define STACK_RETVAL(run) STACK_AT(run,2)
 | 
				
			||||||
#define STACK_GLOBAL(run,n) ((run)->stack[(n)])
 | 
					#define STACK_GLOBAL(run,n) ((run)->stack[(n)])
 | 
				
			||||||
/*#define STACK_RETVAL_GLOBAL(run) ((run)->stack[(run)->nglobals+2])*/
 | 
					/*#define STACK_RETVAL_GLOBAL(run) ((run)->stack[(run)->nglobals+2])*/
 | 
				
			||||||
#define STACK_RETVAL_GLOBAL(run) ((run)->stack[(run)->tree->nglobals+2])
 | 
					#define STACK_RETVAL_GLOBAL(run) ((run)->stack[(run)->awk->tree.nglobals+2])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define EXIT_NONE      0
 | 
					#define EXIT_NONE      0
 | 
				
			||||||
#define EXIT_BREAK     1
 | 
					#define EXIT_BREAK     1
 | 
				
			||||||
@ -212,7 +212,7 @@ static int __open_run (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	run->opt = awk->opt.run;
 | 
						run->opt = awk->opt.run;
 | 
				
			||||||
	run->errnum = XP_AWK_ENOERR;
 | 
						run->errnum = XP_AWK_ENOERR;
 | 
				
			||||||
	run->tree = &awk->tree;
 | 
						/*run->tree = &awk->tree; */
 | 
				
			||||||
	/*run->nglobals = awk->tree.nglobals;*/
 | 
						/*run->nglobals = awk->tree.nglobals;*/
 | 
				
			||||||
	run->awk = awk;
 | 
						run->awk = awk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -233,9 +233,8 @@ static int __open_run (
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* TODO: */
 | 
						/* TODO: */
 | 
				
			||||||
	run->extio.incmd = XP_NULL;
 | 
						run->extio.in_pipe = XP_NULL;
 | 
				
			||||||
	run->extio.iocmd = XP_NULL;
 | 
						run->extio.in_file = XP_NULL;
 | 
				
			||||||
	run->extio.outcmd = XP_NULL;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -287,7 +286,7 @@ static int __run_main (xp_awk_run_t* run)
 | 
				
			|||||||
	saved_stack_top = run->stack_top;
 | 
						saved_stack_top = run->stack_top;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*nglobals = run->nglobals;*/
 | 
						/*nglobals = run->nglobals;*/
 | 
				
			||||||
	nglobals = run->tree->nglobals;
 | 
						nglobals = run->awk->tree.nglobals;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (nglobals > 0)
 | 
						while (nglobals > 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -342,7 +341,7 @@ static int __run_main (xp_awk_run_t* run)
 | 
				
			|||||||
			run->stack_top = saved_stack_top;
 | 
								run->stack_top = saved_stack_top;
 | 
				
			||||||
			/* pops off global variables in a decent way */	
 | 
								/* pops off global variables in a decent way */	
 | 
				
			||||||
			/*__raw_pop_times (run, run->nglobals);*/
 | 
								/*__raw_pop_times (run, run->nglobals);*/
 | 
				
			||||||
			__raw_pop_times (run, run->tree->nglobals);
 | 
								__raw_pop_times (run, run->awk->tree.nglobals);
 | 
				
			||||||
			PANIC_I (run, XP_AWK_ENOMEM);
 | 
								PANIC_I (run, XP_AWK_ENOMEM);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -350,7 +349,7 @@ static int __run_main (xp_awk_run_t* run)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			run->stack_top = saved_stack_top;
 | 
								run->stack_top = saved_stack_top;
 | 
				
			||||||
			/*__raw_pop_times (run, run->nglobals);*/
 | 
								/*__raw_pop_times (run, run->nglobals);*/
 | 
				
			||||||
			__raw_pop_times (run, run->tree->nglobals);
 | 
								__raw_pop_times (run, run->awk->tree.nglobals);
 | 
				
			||||||
			PANIC_I (run, XP_AWK_ENOMEM);
 | 
								PANIC_I (run, XP_AWK_ENOMEM);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -359,7 +358,7 @@ static int __run_main (xp_awk_run_t* run)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			run->stack_top = saved_stack_top;
 | 
								run->stack_top = saved_stack_top;
 | 
				
			||||||
			/*__raw_pop_times (run, run->nglobals);*/
 | 
								/*__raw_pop_times (run, run->nglobals);*/
 | 
				
			||||||
			__raw_pop_times (run, run->tree->nglobals);
 | 
								__raw_pop_times (run, run->awk->tree.nglobals);
 | 
				
			||||||
			PANIC_I (run, XP_AWK_ENOMEM);
 | 
								PANIC_I (run, XP_AWK_ENOMEM);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -368,7 +367,7 @@ static int __run_main (xp_awk_run_t* run)
 | 
				
			|||||||
		{
 | 
							{
 | 
				
			||||||
			run->stack_top = saved_stack_top;
 | 
								run->stack_top = saved_stack_top;
 | 
				
			||||||
			/*__raw_pop_times (run, run->nglobals);*/
 | 
								/*__raw_pop_times (run, run->nglobals);*/
 | 
				
			||||||
			__raw_pop_times (run, run->tree->nglobals);
 | 
								__raw_pop_times (run, run->awk->tree.nglobals);
 | 
				
			||||||
			PANIC_I (run, XP_AWK_ENOMEM);
 | 
								PANIC_I (run, XP_AWK_ENOMEM);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
@ -379,14 +378,14 @@ static int __run_main (xp_awk_run_t* run)
 | 
				
			|||||||
		STACK_NARGS(run) = (void*)nargs;
 | 
							STACK_NARGS(run) = (void*)nargs;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
		/* stack set up properly. ready to exeucte statement blocks */
 | 
							/* stack set up properly. ready to exeucte statement blocks */
 | 
				
			||||||
		if (n == 0 && run->tree->begin != XP_NULL) 
 | 
							if (n == 0 && run->awk->tree.begin != XP_NULL) 
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			xp_assert (run->tree->begin->type == XP_AWK_NDE_BLK);
 | 
								xp_assert (run->awk->tree.begin->type == XP_AWK_NDE_BLK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			run->exit_level = EXIT_NONE;
 | 
								run->exit_level = EXIT_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (__run_block (run, 
 | 
								if (__run_block (run, 
 | 
				
			||||||
				(xp_awk_nde_blk_t*)run->tree->begin) == -1) n = -1;
 | 
									(xp_awk_nde_blk_t*)run->awk->tree.begin) == -1) n = -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (n == 0 && run->txtio != XP_NULL)
 | 
							if (n == 0 && run->txtio != XP_NULL)
 | 
				
			||||||
@ -394,14 +393,14 @@ static int __run_main (xp_awk_run_t* run)
 | 
				
			|||||||
			if (__run_pattern_blocks (run) == -1) n = -1;
 | 
								if (__run_pattern_blocks (run) == -1) n = -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (n == 0 && run->tree->end != XP_NULL) 
 | 
							if (n == 0 && run->awk->tree.end != XP_NULL) 
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			xp_assert (run->tree->end->type == XP_AWK_NDE_BLK);
 | 
								xp_assert (run->awk->tree.end->type == XP_AWK_NDE_BLK);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			run->exit_level = EXIT_NONE;
 | 
								run->exit_level = EXIT_NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (__run_block (run, 
 | 
								if (__run_block (run, 
 | 
				
			||||||
				(xp_awk_nde_blk_t*)run->tree->end) == -1) n = -1;
 | 
									(xp_awk_nde_blk_t*)run->awk->tree.end) == -1) n = -1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* restore stack */
 | 
							/* restore stack */
 | 
				
			||||||
@ -428,7 +427,7 @@ xp_printf (XP_T("\n"));
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* pops off the global variables */
 | 
						/* pops off the global variables */
 | 
				
			||||||
	nglobals = run->tree->nglobals; /*run->nglobals */
 | 
						nglobals = run->awk->tree.nglobals; /*run->nglobals */
 | 
				
			||||||
	while (nglobals > 0)
 | 
						while (nglobals > 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		--nglobals;
 | 
							--nglobals;
 | 
				
			||||||
@ -483,7 +482,7 @@ xp_printf (XP_T("**** line [%s]\n"), XP_STR_BUF(&run->input.line));
 | 
				
			|||||||
		/* for each block { run it }
 | 
							/* for each block { run it }
 | 
				
			||||||
		 * TODO: handle according if next and nextfile has been called 
 | 
							 * TODO: handle according if next and nextfile has been called 
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		if (__run_pattern_block_chain (run, run->tree->chain) == -1)
 | 
							if (__run_pattern_block_chain (run, run->awk->tree.chain) == -1)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* don't care about the result of input close */
 | 
								/* don't care about the result of input close */
 | 
				
			||||||
			run->txtio (XP_AWK_INPUT_CLOSE, 
 | 
								run->txtio (XP_AWK_INPUT_CLOSE, 
 | 
				
			||||||
@ -2541,7 +2540,7 @@ static xp_awk_val_t* __eval_call (xp_awk_run_t* run, xp_awk_nde_t* nde)
 | 
				
			|||||||
	int n;
 | 
						int n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*xp_printf (XP_T(".....__eval_call\n"));*/
 | 
					/*xp_printf (XP_T(".....__eval_call\n"));*/
 | 
				
			||||||
	pair = xp_awk_map_get (&run->tree->funcs, call->name);
 | 
						pair = xp_awk_map_get (&run->awk->tree.funcs, call->name);
 | 
				
			||||||
	if (pair == XP_NULL) PANIC (run, XP_AWK_ENOSUCHFUNC);
 | 
						if (pair == XP_NULL) PANIC (run, XP_AWK_ENOSUCHFUNC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	func = (xp_awk_func_t*)pair->val;
 | 
						func = (xp_awk_func_t*)pair->val;
 | 
				
			||||||
@ -2884,9 +2883,12 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		xp_awk_refdownval (run, in);
 | 
							xp_awk_refdownval (run, in);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		n = xp_awk_readcmd (run, str, &errnum);
 | 
							n = xp_awk_readextio (
 | 
				
			||||||
 | 
								run, &run->extio.in_pipe, 
 | 
				
			||||||
 | 
								run->awk->extio[XP_AWK_EXTIO_PIPE], str, &errnum);
 | 
				
			||||||
		xp_free (str);
 | 
							xp_free (str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (n < 0 && errnum != XP_AWK_ENOERR) PANIC (run, errnum);
 | 
				
			||||||
		return xp_awk_makeintval (run, n);
 | 
							return xp_awk_makeintval (run, n);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else if (p->in_type == XP_AWK_GETLINE_COPROC)
 | 
						else if (p->in_type == XP_AWK_GETLINE_COPROC)
 | 
				
			||||||
@ -2896,8 +2898,29 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
	else if (p->in_type == XP_AWK_GETLINE_FILE)
 | 
						else if (p->in_type == XP_AWK_GETLINE_FILE)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		xp_printf (XP_T("eval_getline file not properly implemented....\n"));
 | 
							xp_awk_val_t* in;
 | 
				
			||||||
		return XP_NULL;
 | 
							xp_char_t* str;
 | 
				
			||||||
 | 
							int errnum, n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							in = __eval_expression (run, p->in);
 | 
				
			||||||
 | 
							if (in == XP_NULL) return XP_NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							xp_awk_refupval (in);
 | 
				
			||||||
 | 
							str = __val_to_str (in, &errnum, XP_NULL);
 | 
				
			||||||
 | 
							if (str == XP_NULL) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								xp_awk_refdownval (run, in);
 | 
				
			||||||
 | 
								PANIC (run, errnum);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							xp_awk_refdownval (run, in);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							n = xp_awk_readextio (
 | 
				
			||||||
 | 
								run, &run->extio.in_file,
 | 
				
			||||||
 | 
								run->awk->extio[XP_AWK_EXTIO_FILE], str, &errnum);
 | 
				
			||||||
 | 
							xp_free (str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (n < 0 && errnum != XP_AWK_ENOERR) PANIC (run, errnum);
 | 
				
			||||||
 | 
							return xp_awk_makeintval (run, n);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: awk.c,v 1.37 2006-06-19 04:38:51 bacon Exp $
 | 
					 * $Id: awk.c,v 1.38 2006-06-19 09:08:50 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk.h>
 | 
					#include <xp/awk/awk.h>
 | 
				
			||||||
@ -137,7 +137,7 @@ static xp_ssize_t process_data (
 | 
				
			|||||||
static xp_ssize_t process_extio_pipe (
 | 
					static xp_ssize_t process_extio_pipe (
 | 
				
			||||||
	int cmd, void* arg, xp_char_t* data, xp_size_t size)
 | 
						int cmd, void* arg, xp_char_t* data, xp_size_t size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	xp_awk_cmd_t* epa = (xp_awk_cmd_t*)arg;
 | 
						xp_awk_extio_t* epa = (xp_awk_extio_t*)arg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (cmd)
 | 
						switch (cmd)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -180,6 +180,53 @@ static xp_ssize_t process_extio_pipe (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static xp_ssize_t process_extio_file (
 | 
				
			||||||
 | 
						int cmd, void* arg, xp_char_t* data, xp_size_t size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						xp_awk_extio_t* epa = (xp_awk_extio_t*)arg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (cmd)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							case XP_AWK_INPUT_OPEN:
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								FILE* handle;
 | 
				
			||||||
 | 
								handle = _tfopen (epa->name, XP_T("r"));
 | 
				
			||||||
 | 
								if (handle == NULL) return -1;
 | 
				
			||||||
 | 
								epa->handle = (void*)handle;
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case XP_AWK_INPUT_CLOSE:
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								fclose ((FILE*)epa->handle);
 | 
				
			||||||
 | 
								epa->handle = NULL;
 | 
				
			||||||
 | 
								return 0;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case XP_AWK_INPUT_DATA:
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								if (_fgetts (data, size, epa->handle) == XP_NULL) 
 | 
				
			||||||
 | 
									return 0;
 | 
				
			||||||
 | 
								return xp_strlen(data);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case XP_AWK_INPUT_NEXT:
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							case XP_AWK_OUTPUT_OPEN:
 | 
				
			||||||
 | 
							case XP_AWK_OUTPUT_CLOSE:
 | 
				
			||||||
 | 
							case XP_AWK_OUTPUT_DATA:
 | 
				
			||||||
 | 
							case XP_AWK_OUTPUT_NEXT:
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								return -1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(__STAND_ALONE) && !defined(_WIN32)
 | 
					#if defined(__STAND_ALONE) && !defined(_WIN32)
 | 
				
			||||||
static int __main (int argc, char* argv[])
 | 
					static int __main (int argc, char* argv[])
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
@ -203,10 +250,20 @@ static int __main (int argc, xp_char_t* argv[])
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TODO: */
 | 
					/* TODO: */
 | 
				
			||||||
	if (xp_awk_setextio (awk, process_extio_pipe, XP_NULL) == -1)
 | 
						if (xp_awk_setextio (awk, 
 | 
				
			||||||
 | 
							XP_AWK_EXTIO_PIPE, process_extio_pipe, XP_NULL) == -1)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		xp_awk_close (awk);
 | 
							xp_awk_close (awk);
 | 
				
			||||||
		xp_printf (XP_T("Error: cannot attach source\n"));
 | 
							xp_printf (XP_T("Error: cannot set extio pipe\n"));
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* TODO: */
 | 
				
			||||||
 | 
						if (xp_awk_setextio (awk, 
 | 
				
			||||||
 | 
							XP_AWK_EXTIO_FILE, process_extio_file, XP_NULL) == -1)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							xp_awk_close (awk);
 | 
				
			||||||
 | 
							xp_printf (XP_T("Error: cannot set extio file\n"));
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user