*** empty log message ***
This commit is contained in:
		| @ -1,5 +1,5 @@ | |||||||
| /*  | /*  | ||||||
|  * $Id: awk.c,v 1.55 2006-06-20 15:27:50 bacon Exp $  |  * $Id: awk.c,v 1.56 2006-06-22 04:25:44 bacon Exp $  | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <xp/awk/awk_i.h> | #include <xp/awk/awk_i.h> | ||||||
| @ -160,18 +160,18 @@ void xp_awk_setrunopt (xp_awk_t* awk, int opt) | |||||||
| 	awk->opt.run = opt; | 	awk->opt.run = 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 handler, void* arg) | ||||||
| { | { | ||||||
| 	if (xp_awk_detsrc(awk) == -1) return -1; | 	if (xp_awk_detsrc(awk) == -1) return -1; | ||||||
|  |  | ||||||
| 	xp_assert (awk->srcio == XP_NULL); | 	xp_assert (awk->srcio == XP_NULL); | ||||||
| 	if (src(XP_AWK_INPUT_OPEN, arg, XP_NULL, 0) == -1)  | 	if (handler (XP_AWK_IO_OPEN, 0, arg, XP_NULL, 0) == -1)  | ||||||
| 	{ | 	{ | ||||||
| 		awk->errnum = XP_AWK_ESRCINOPEN; | 		awk->errnum = XP_AWK_ESRCINOPEN; | ||||||
| 		return -1; | 		return -1; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	awk->srcio = src; | 	awk->srcio = handler; | ||||||
| 	awk->srcio_arg = arg; | 	awk->srcio_arg = arg; | ||||||
| 	awk->lex.curc = XP_CHAR_EOF; | 	awk->lex.curc = XP_CHAR_EOF; | ||||||
| 	awk->lex.ungotc_count = 0; | 	awk->lex.ungotc_count = 0; | ||||||
| @ -188,7 +188,8 @@ int xp_awk_detsrc (xp_awk_t* awk) | |||||||
| 	{ | 	{ | ||||||
| 		xp_ssize_t n; | 		xp_ssize_t n; | ||||||
|  |  | ||||||
| 		n = awk->srcio (XP_AWK_INPUT_CLOSE, awk->srcio_arg, XP_NULL, 0); | 		n = awk->srcio ( | ||||||
|  | 			XP_AWK_IO_CLOSE, 0, awk->srcio_arg, XP_NULL, 0); | ||||||
| 		if (n == -1) | 		if (n == -1) | ||||||
| 		{ | 		{ | ||||||
| 			awk->errnum = XP_AWK_ESRCINCLOSE; | 			awk->errnum = XP_AWK_ESRCINCLOSE; | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /*  | /*  | ||||||
|  * $Id: awk.h,v 1.70 2006-06-21 15:37:51 bacon Exp $ |  * $Id: awk.h,v 1.71 2006-06-22 04:25:44 bacon Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #ifndef _XP_AWK_AWK_H_ | #ifndef _XP_AWK_AWK_H_ | ||||||
| @ -9,12 +9,11 @@ | |||||||
| #include <xp/macros.h> | #include <xp/macros.h> | ||||||
|  |  | ||||||
| typedef struct xp_awk_t xp_awk_t; | typedef struct xp_awk_t xp_awk_t; | ||||||
|  | typedef struct xp_awk_val_t xp_awk_val_t; | ||||||
|  | typedef struct xp_awk_extio_t xp_awk_extio_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, int opt, void* arg, xp_char_t* data, xp_size_t count); | ||||||
|  |  | ||||||
| typedef struct xp_awk_extio_t xp_awk_extio_t; |  | ||||||
| typedef struct xp_awk_val_t xp_awk_val_t; |  | ||||||
|  |  | ||||||
| struct xp_awk_extio_t  | struct xp_awk_extio_t  | ||||||
| { | { | ||||||
| @ -27,15 +26,21 @@ struct xp_awk_extio_t | |||||||
| /* io function commands */ | /* io function commands */ | ||||||
| enum  | enum  | ||||||
| { | { | ||||||
| 	XP_AWK_INPUT_OPEN   = 0, | 	XP_AWK_IO_OPEN   = 0, | ||||||
| 	XP_AWK_INPUT_CLOSE  = 1, | 	XP_AWK_IO_CLOSE  = 1, | ||||||
| 	XP_AWK_INPUT_NEXT   = 2, | 	XP_AWK_IO_READ   = 2, | ||||||
| 	XP_AWK_INPUT_DATA   = 3, | 	XP_AWK_IO_WRITE  = 3, | ||||||
|  | 	XP_AWK_IO_NEXT   = 4   | ||||||
|  | }; | ||||||
|  |  | ||||||
| 	XP_AWK_OUTPUT_OPEN  = 4, | enum | ||||||
| 	XP_AWK_OUTPUT_CLOSE = 5, | { | ||||||
| 	XP_AWK_OUTPUT_NEXT  = 6, | 	XP_AWK_IO_FILE_READ   = 0, | ||||||
| 	XP_AWK_OUTPUT_DATA  = 7 | 	XP_AWK_IO_FILE_WRITE  = 1, | ||||||
|  | 	XP_AWK_IO_FILE_APPEND = 2, | ||||||
|  |  | ||||||
|  | 	XP_AWK_IO_PIPE_READ   = 0, | ||||||
|  | 	XP_AWK_IO_PIPE_WRITE  = 1 | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* parse options */ | /* parse options */ | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: extio.c,v 1.7 2006-06-21 15:37:51 bacon Exp $ |  * $Id: extio.c,v 1.8 2006-06-22 04:25:44 bacon Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <xp/awk/awk_i.h> | #include <xp/awk/awk_i.h> | ||||||
| @ -15,6 +15,7 @@ int xp_awk_readextio ( | |||||||
| { | { | ||||||
| 	xp_awk_extio_t* p = run->extio; | 	xp_awk_extio_t* p = run->extio; | ||||||
| 	xp_awk_io_t handler = run->awk->extio[type]; | 	xp_awk_io_t handler = run->awk->extio[type]; | ||||||
|  | 	int ioopt; | ||||||
|  |  | ||||||
| 	if (handler == XP_NULL) | 	if (handler == XP_NULL) | ||||||
| 	{ | 	{ | ||||||
| @ -51,7 +52,13 @@ int xp_awk_readextio ( | |||||||
| 		p->handle = XP_NULL; | 		p->handle = XP_NULL; | ||||||
| 		p->next = XP_NULL; | 		p->next = XP_NULL; | ||||||
|  |  | ||||||
| 		if (handler (XP_AWK_INPUT_OPEN, p, XP_NULL, 0) == -1) | 		if (type == XP_AWK_EXTIO_PIPE)  | ||||||
|  | 			ioopt = XP_AWK_IO_PIPE_READ; | ||||||
|  | 		else if (type == XP_AWK_EXTIO_FILE)  | ||||||
|  | 			ioopt = XP_AWK_IO_FILE_READ; | ||||||
|  | 		else ioopt = 0; /* TODO: how to handle this??? */ | ||||||
|  |  | ||||||
|  | 		if (handler (XP_AWK_IO_OPEN, ioopt, p, XP_NULL, 0) == -1) | ||||||
| 		{ | 		{ | ||||||
| 			xp_free (p->name); | 			xp_free (p->name); | ||||||
| 			xp_free (p); | 			xp_free (p); | ||||||
| @ -81,7 +88,7 @@ int xp_awk_readextio ( | |||||||
| 	{ | 	{ | ||||||
| xp_char_t buf[1024]; | xp_char_t buf[1024]; | ||||||
|  |  | ||||||
| 	if (handler (XP_AWK_INPUT_DATA, p, buf, xp_countof(buf)) == 0) | 	if (handler (XP_AWK_IO_READ, 0, p, buf, xp_countof(buf)) == 0) | ||||||
| 	{ | 	{ | ||||||
| 		/* no more data. end of data stream */ | 		/* no more data. end of data stream */ | ||||||
| 		return 0; | 		return 0; | ||||||
| @ -107,9 +114,9 @@ int xp_awk_closeextio (xp_awk_run_t* run, const xp_char_t* name, int* errnum) | |||||||
|  |  | ||||||
| 			if (handler != NULL) | 			if (handler != NULL) | ||||||
| 			{ | 			{ | ||||||
| 	/* TODO: io command should not be XP_AWK_INPUT_CLOSE  | 	/* TODO: io command should not be XP_AWK_IO_CLOSE  | ||||||
| 	 *       it should be more generic form than this... */ | 	 *       it should be more generic form than this... */ | ||||||
| 				if (handler (XP_AWK_INPUT_CLOSE, p, XP_NULL, 0) == -1) | 				if (handler (XP_AWK_IO_CLOSE, 0, p, XP_NULL, 0) == -1) | ||||||
| 				{ | 				{ | ||||||
| 					/* this is not a run-time error.*/ | 					/* this is not a run-time error.*/ | ||||||
| 					*errnum = XP_AWK_ENOERR; | 					*errnum = XP_AWK_ENOERR; | ||||||
| @ -149,7 +156,7 @@ void xp_awk_clearextio (xp_awk_run_t* run) | |||||||
| 		{ | 		{ | ||||||
| 	/* TODO: io command should not be XP_AWK_INPUT_CLOSE  | 	/* TODO: io command should not be XP_AWK_INPUT_CLOSE  | ||||||
| 	 *       it should be more generic form than this... */ | 	 *       it should be more generic form than this... */ | ||||||
| 			n = handler (XP_AWK_INPUT_CLOSE, run->extio, XP_NULL, 0); | 			n = handler (XP_AWK_IO_CLOSE, 0, run->extio, XP_NULL, 0); | ||||||
| 			if (n == -1) | 			if (n == -1) | ||||||
| 			{ | 			{ | ||||||
| 				/* TODO:  | 				/* TODO:  | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: parse.c,v 1.119 2006-06-21 15:37:51 bacon Exp $ |  * $Id: parse.c,v 1.120 2006-06-22 04:25:44 bacon Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <xp/awk/awk_i.h> | #include <xp/awk/awk_i.h> | ||||||
| @ -3443,7 +3443,7 @@ static int __get_char (xp_awk_t* awk) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/* | 	/* | ||||||
| 	n = awk->srcio (XP_AWK_INPUT_DATA, awk->srcio_arg, &c, 1); | 	n = awk->srcio (XP_AWK_IO_READ, awk->srcio_arg, &c, 1); | ||||||
| 	if (n == -1)  | 	if (n == -1)  | ||||||
| 	{ | 	{ | ||||||
| 		awk->errnum = XP_AWK_ESRCINDATA; | 		awk->errnum = XP_AWK_ESRCINDATA; | ||||||
| @ -3453,7 +3453,7 @@ static int __get_char (xp_awk_t* awk) | |||||||
| 	*/ | 	*/ | ||||||
| 	if (awk->lex.buf_pos >= awk->lex.buf_len) | 	if (awk->lex.buf_pos >= awk->lex.buf_len) | ||||||
| 	{ | 	{ | ||||||
| 		n = awk->srcio (XP_AWK_INPUT_DATA,  | 		n = awk->srcio (XP_AWK_IO_READ, 0, | ||||||
| 			awk->srcio_arg, awk->lex.buf, xp_countof(awk->lex.buf)); | 			awk->srcio_arg, awk->lex.buf, xp_countof(awk->lex.buf)); | ||||||
| 		if (n == -1) | 		if (n == -1) | ||||||
| 		{ | 		{ | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: run.c,v 1.104 2006-06-21 15:37:51 bacon Exp $ |  * $Id: run.c,v 1.105 2006-06-22 04:25:44 bacon Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <xp/awk/awk_i.h> | #include <xp/awk/awk_i.h> | ||||||
| @ -481,7 +481,7 @@ static int __run_pattern_blocks (xp_awk_run_t* run) | |||||||
|  |  | ||||||
| 	xp_assert (run->txtio != XP_NULL); | 	xp_assert (run->txtio != XP_NULL); | ||||||
|  |  | ||||||
| 	n = run->txtio (XP_AWK_INPUT_OPEN, run->txtio_arg, XP_NULL, 0); | 	n = run->txtio (XP_AWK_IO_OPEN, 0, run->txtio_arg, XP_NULL, 0); | ||||||
| 	if (n == -1) PANIC_I (run, XP_AWK_ETXTINOPEN); | 	if (n == -1) PANIC_I (run, XP_AWK_ETXTINOPEN); | ||||||
|  |  | ||||||
| 	run->input.buf_pos = 0; | 	run->input.buf_pos = 0; | ||||||
| @ -499,7 +499,7 @@ static int __run_pattern_blocks (xp_awk_run_t* run) | |||||||
| 		if (x == -1) | 		if (x == -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_IO_CLOSE, 0,  | ||||||
| 				run->txtio_arg, XP_NULL, 0); | 				run->txtio_arg, XP_NULL, 0); | ||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
| @ -515,13 +515,13 @@ xp_printf (XP_T("**** line [%s]\n"), XP_STR_BUF(&run->input.line)); | |||||||
| 		if (__run_pattern_block_chain (run, run->awk->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_IO_CLOSE, 0,  | ||||||
| 				run->txtio_arg, XP_NULL, 0); | 				run->txtio_arg, XP_NULL, 0); | ||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	n = run->txtio (XP_AWK_INPUT_CLOSE, run->txtio_arg, XP_NULL, 0); | 	n = run->txtio (XP_AWK_IO_CLOSE, 0, run->txtio_arg, XP_NULL, 0); | ||||||
| 	if (n == -1) PANIC_I (run, XP_AWK_ETXTINCLOSE); | 	if (n == -1) PANIC_I (run, XP_AWK_ETXTINCLOSE); | ||||||
|  |  | ||||||
| 	return 0; | 	return 0; | ||||||
| @ -1070,7 +1070,9 @@ xp_printf (XP_T("**** next NOT IMPLEMENTED...\n")); | |||||||
| static int __run_nextfile_statement (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde) | static int __run_nextfile_statement (xp_awk_run_t* run, xp_awk_nde_nextfile_t* nde) | ||||||
| { | { | ||||||
| 	xp_ssize_t n; | 	xp_ssize_t n; | ||||||
| 	n = run->txtio (XP_AWK_INPUT_NEXT, run->txtio_arg, XP_NULL, 0); |  | ||||||
|  | 	/* TODO: how to pass opt properly for IO_NEXT??? -> READ? WRITE? */ | ||||||
|  | 	n = run->txtio (XP_AWK_IO_NEXT, 0, run->txtio_arg, XP_NULL, 0); | ||||||
| 	if (n == -1) PANIC_I (run, XP_AWK_ETXTINNEXT); | 	if (n == -1) PANIC_I (run, XP_AWK_ETXTINNEXT); | ||||||
| 	return (n == -1)? -1: 0; | 	return (n == -1)? -1: 0; | ||||||
| } | } | ||||||
| @ -3048,7 +3050,7 @@ static int __read_text_input (xp_awk_run_t* run) | |||||||
| 	{ | 	{ | ||||||
| 		if (run->input.buf_pos >= run->input.buf_len) | 		if (run->input.buf_pos >= run->input.buf_len) | ||||||
| 		{ | 		{ | ||||||
| 			n = run->txtio (XP_AWK_INPUT_DATA, run->txtio_arg, | 			n = run->txtio (XP_AWK_IO_READ, 0, run->txtio_arg, | ||||||
| 				run->input.buf, xp_countof(run->input.buf)); | 				run->input.buf, xp_countof(run->input.buf)); | ||||||
| 			if (n == -1) PANIC_I (run, XP_AWK_ETXTINDATA); | 			if (n == -1) PANIC_I (run, XP_AWK_ETXTINDATA); | ||||||
| 			if (n == 0) | 			if (n == 0) | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: awk.c,v 1.40 2006-06-21 13:52:15 bacon Exp $ |  * $Id: awk.c,v 1.41 2006-06-22 04:25:44 bacon Exp $ | ||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include <xp/awk/awk.h> | #include <xp/awk/awk.h> | ||||||
| @ -37,20 +37,20 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| static xp_ssize_t process_source ( | static xp_ssize_t process_source ( | ||||||
| 	int cmd, void* arg, xp_char_t* data, xp_size_t size) | 	int cmd, int opt, void* arg, xp_char_t* data, xp_size_t size) | ||||||
| { | { | ||||||
| 	xp_char_t c; | 	xp_char_t c; | ||||||
|  |  | ||||||
| 	switch (cmd)  | 	switch (cmd)  | ||||||
| 	{ | 	{ | ||||||
| 		case XP_AWK_INPUT_OPEN: | 		case XP_AWK_IO_OPEN: | ||||||
| 		case XP_AWK_INPUT_CLOSE: | 		case XP_AWK_IO_CLOSE: | ||||||
| 		case XP_AWK_INPUT_NEXT: | 		case XP_AWK_IO_NEXT: | ||||||
| 		{ | 		{ | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_DATA: | 		case XP_AWK_IO_READ: | ||||||
| 		{ | 		{ | ||||||
| 			if (size <= 0) return -1; | 			if (size <= 0) return -1; | ||||||
| 		#ifdef XP_CHAR_IS_MCHAR | 		#ifdef XP_CHAR_IS_MCHAR | ||||||
| @ -63,18 +63,16 @@ static xp_ssize_t process_source ( | |||||||
| 			return 1; | 			return 1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_OUTPUT_OPEN: | 		case XP_AWK_IO_WRITE: | ||||||
| 		case XP_AWK_OUTPUT_CLOSE: |  | ||||||
| 		case XP_AWK_OUTPUT_NEXT: |  | ||||||
| 		case XP_AWK_OUTPUT_DATA: |  | ||||||
| 		{ | 		{ | ||||||
| 			return 0; | 			return -1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| struct data_io | struct data_io | ||||||
| { | { | ||||||
| 	const char* input_file; | 	const char* input_file; | ||||||
| @ -82,34 +80,28 @@ struct data_io | |||||||
| }; | }; | ||||||
|  |  | ||||||
| static xp_ssize_t process_data ( | static xp_ssize_t process_data ( | ||||||
| 	int cmd, void* arg, xp_char_t* data, xp_size_t size) | 	int cmd, int opt, void* arg, xp_char_t* data, xp_size_t size) | ||||||
| { | { | ||||||
| 	struct data_io* io = (struct data_io*)arg; | 	struct data_io* io = (struct data_io*)arg; | ||||||
| 	xp_char_t c; | 	xp_char_t c; | ||||||
|  |  | ||||||
| 	switch (cmd)  | 	switch (cmd)  | ||||||
| 	{ | 	{ | ||||||
| 		case XP_AWK_INPUT_OPEN: | 		case XP_AWK_IO_OPEN: | ||||||
| 		{ | 		{ | ||||||
| 			io->input_handle = fopen (io->input_file, "r"); | 			io->input_handle = fopen (io->input_file, "r"); | ||||||
| 			if (io->input_handle == NULL) return -1; | 			if (io->input_handle == NULL) return -1; | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_CLOSE: | 		case XP_AWK_IO_CLOSE: | ||||||
| 		{ | 		{ | ||||||
| 			fclose (io->input_handle); | 			fclose (io->input_handle); | ||||||
| 			io->input_handle = NULL; | 			io->input_handle = NULL; | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_NEXT: | 		case XP_AWK_IO_READ: | ||||||
| 		{ |  | ||||||
| 			/* input switching not supported for the time being... */ |  | ||||||
| 			return -1; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_DATA: |  | ||||||
| 		{ | 		{ | ||||||
| 			if (size <= 0) return -1; | 			if (size <= 0) return -1; | ||||||
| 		#ifdef XP_CHAR_IS_MCHAR | 		#ifdef XP_CHAR_IS_MCHAR | ||||||
| @ -122,35 +114,46 @@ static xp_ssize_t process_data ( | |||||||
| 			return 1; | 			return 1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_OUTPUT_OPEN: | 		case XP_AWK_IO_WRITE: | ||||||
| 		case XP_AWK_OUTPUT_CLOSE: |  | ||||||
| 		case XP_AWK_OUTPUT_NEXT: |  | ||||||
| 		case XP_AWK_OUTPUT_DATA: |  | ||||||
| 		{ | 		{ | ||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		case XP_AWK_IO_NEXT: | ||||||
|  | 		{ | ||||||
|  | 			/* input switching not supported for the time being... */ | ||||||
|  | 			return -1; | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
|  |  | ||||||
| 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, int opt, void* arg, xp_char_t* data, xp_size_t size) | ||||||
| { | { | ||||||
| 	xp_awk_extio_t* epa = (xp_awk_extio_t*)arg; | 	xp_awk_extio_t* epa = (xp_awk_extio_t*)arg; | ||||||
|  |  | ||||||
| 	switch (cmd) | 	switch (cmd) | ||||||
| 	{ | 	{ | ||||||
| 		case XP_AWK_INPUT_OPEN: | 		case XP_AWK_IO_OPEN: | ||||||
| 		{ | 		{ | ||||||
| 			FILE* handle; | 			FILE* handle; | ||||||
| 			handle = _tpopen (epa->name, XP_T("r")); | 			const xp_char_t* mode; | ||||||
|  |  | ||||||
|  | 			if (opt == XP_AWK_IO_PIPE_READ) | ||||||
|  | 				mode = XP_T("r"); | ||||||
|  | 			else if (opt == XP_AWK_IO_PIPE_WRITE) | ||||||
|  | 				mode = XP_T("w"); | ||||||
|  | 			else return -1; /* TODO: any way to set the error number? */ | ||||||
|  | 			handle = _tpopen (epa->name, mode); | ||||||
| 			if (handle == NULL) return -1; | 			if (handle == NULL) return -1; | ||||||
| 			epa->handle = (void*)handle; | 			epa->handle = (void*)handle; | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_CLOSE: | 		case XP_AWK_IO_CLOSE: | ||||||
| 		{ | 		{ | ||||||
| xp_printf (XP_TEXT("closing %s of type %d\n"),  epa->name, epa->type); | xp_printf (XP_TEXT("closing %s of type %d\n"),  epa->name, epa->type); | ||||||
| 			fclose ((FILE*)epa->handle); | 			fclose ((FILE*)epa->handle); | ||||||
| @ -158,50 +161,59 @@ xp_printf (XP_TEXT("closing %s of type %d\n"),  epa->name, epa->type); | |||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_DATA: | 		case XP_AWK_IO_READ: | ||||||
| 		{ | 		{ | ||||||
| 			if (_fgetts (data, size, epa->handle) == XP_NULL)  | 			if (_fgetts (data, size, (FILE*)epa->handle) == XP_NULL)  | ||||||
| 				return 0; | 				return 0; | ||||||
| 			return xp_strlen(data); | 			return xp_strlen(data); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_NEXT: | 		case XP_AWK_IO_WRITE: | ||||||
| 		{ | 		{ | ||||||
|  | 			/* | ||||||
|  | 			if (_fputts (data, size, (FILE*)epa->handle) == XP_NULL)  | ||||||
|  | 				return 0; | ||||||
|  | 			return size; | ||||||
|  | 			*/ | ||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_OUTPUT_OPEN: | 		case XP_AWK_IO_NEXT: | ||||||
| 		case XP_AWK_OUTPUT_CLOSE: |  | ||||||
| 		case XP_AWK_OUTPUT_DATA: |  | ||||||
| 		case XP_AWK_OUTPUT_NEXT: |  | ||||||
| 		{ | 		{ | ||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 		default: |  | ||||||
| 		{ |  | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static xp_ssize_t process_extio_file ( | static xp_ssize_t process_extio_file ( | ||||||
| 	int cmd, void* arg, xp_char_t* data, xp_size_t size) | 	int cmd, int opt, void* arg, xp_char_t* data, xp_size_t size) | ||||||
| { | { | ||||||
| 	xp_awk_extio_t* epa = (xp_awk_extio_t*)arg; | 	xp_awk_extio_t* epa = (xp_awk_extio_t*)arg; | ||||||
|  |  | ||||||
| 	switch (cmd) | 	switch (cmd) | ||||||
| 	{ | 	{ | ||||||
| 		case XP_AWK_INPUT_OPEN: | 		case XP_AWK_IO_OPEN: | ||||||
| 		{ | 		{ | ||||||
| 			FILE* handle; | 			FILE* handle; | ||||||
| 			handle = _tfopen (epa->name, XP_T("r")); | 			const xp_char_t* mode; | ||||||
|  |  | ||||||
|  | 			if (opt == XP_AWK_IO_FILE_READ) | ||||||
|  | 				mode = XP_T("r"); | ||||||
|  | 			else if (opt == XP_AWK_IO_FILE_WRITE) | ||||||
|  | 				mode = XP_T("w"); | ||||||
|  | 			else if (opt == XP_AWK_IO_FILE_APPEND) | ||||||
|  | 				mode = XP_T("a"); | ||||||
|  | 			else return -1; /* TODO: any way to set the error number? */ | ||||||
|  |  | ||||||
|  | 			handle = _tfopen (epa->name, mode); | ||||||
| 			if (handle == NULL) return -1; | 			if (handle == NULL) return -1; | ||||||
| 			epa->handle = (void*)handle; | 			epa->handle = (void*)handle; | ||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_CLOSE: | 		case XP_AWK_IO_CLOSE: | ||||||
| 		{ | 		{ | ||||||
| xp_printf (XP_TEXT("closing %s of type %d\n"),  epa->name, epa->type); | xp_printf (XP_TEXT("closing %s of type %d\n"),  epa->name, epa->type); | ||||||
| 			fclose ((FILE*)epa->handle); | 			fclose ((FILE*)epa->handle); | ||||||
| @ -209,33 +221,32 @@ xp_printf (XP_TEXT("closing %s of type %d\n"),  epa->name, epa->type); | |||||||
| 			return 0; | 			return 0; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_DATA: | 		case XP_AWK_IO_READ: | ||||||
| 		{ | 		{ | ||||||
| 			if (_fgetts (data, size, epa->handle) == XP_NULL)  | 			if (_fgetts (data, size, (FILE*)epa->handle) == XP_NULL)  | ||||||
| 				return 0; | 				return 0; | ||||||
| 			return xp_strlen(data); | 			return xp_strlen(data); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_INPUT_NEXT: | 		case XP_AWK_IO_WRITE: | ||||||
|  | 		{ | ||||||
|  | 			/* | ||||||
|  | 			if (_fputts (data, size, (FILE*)epa->handle) == XP_NULL)  | ||||||
|  | 				return 0; | ||||||
|  | 			return size; | ||||||
|  | 			*/ | ||||||
|  | 			return -1; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		case XP_AWK_IO_NEXT: | ||||||
| 		{ | 		{ | ||||||
| 			return -1; | 			return -1; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		case XP_AWK_OUTPUT_OPEN: |  | ||||||
| 		case XP_AWK_OUTPUT_CLOSE: |  | ||||||
| 		case XP_AWK_OUTPUT_DATA: |  | ||||||
| 		case XP_AWK_OUTPUT_NEXT: |  | ||||||
| 		{ |  | ||||||
| 			return -1; |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 		default: |  | ||||||
| 		{ |  | ||||||
| 	return -1; | 	return -1; | ||||||
| } | } | ||||||
| 	} |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #if defined(__STAND_ALONE) && !defined(_WIN32) | #if defined(__STAND_ALONE) && !defined(_WIN32) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user