added support for source string
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: awk.c 469 2008-12-11 10:05:28Z baconevi $ | ||||
|  * $Id: awk.c 478 2008-12-12 09:42:32Z baconevi $ | ||||
|  */ | ||||
|  | ||||
| #include <ase/awk/awk.h> | ||||
| @ -304,9 +304,9 @@ static void out_of_memory (void) | ||||
|  | ||||
| struct argout_t | ||||
| { | ||||
| 	ase_char_t*  iss;  /* input source string */ | ||||
| 	ase_char_t** isf;  /* input source files */ | ||||
| 	ase_size_t   isfl; /* the number of input source filse */ | ||||
| 	void*        isp;   /* input source files or string */ | ||||
| 	int          ist;  /* input source type */ | ||||
| 	ase_size_t   isfl; /* the number of input source files */ | ||||
| 	ase_char_t*  osf;  /* output source file */ | ||||
| 	ase_char_t** icf;  /* input console files */ | ||||
| 	ase_size_t   icfl; /* the number of input console files */ | ||||
| @ -396,10 +396,10 @@ static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao) | ||||
|  | ||||
| 			case ASE_T('f'): | ||||
| 			{ | ||||
| 				if (isfl >= isfc) | ||||
| 				if (isfl >= isfc-1) /* -1 for last ASE_NULL */ | ||||
| 				{ | ||||
| 					ase_char_t** tmp; | ||||
| 					tmp = (ase_char_t**)realloc (isf, ASE_SIZEOF(*isf)*(isfc+16)); | ||||
| 					tmp = (ase_char_t**) realloc (isf, ASE_SIZEOF(*isf)*(isfc+16)); | ||||
| 					if (tmp == ASE_NULL) | ||||
| 					{ | ||||
| 						out_of_memory (); | ||||
| @ -478,6 +478,7 @@ static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	isf[isfl] = ASE_NULL; | ||||
|  | ||||
| 	if (isfl <= 0) | ||||
| 	{ | ||||
| @ -488,15 +489,13 @@ static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao) | ||||
| 		} | ||||
|  | ||||
| 		/* the source code is the string, not from the file */ | ||||
| 		ao->iss = argv[opt.ind++]; /* source string */ | ||||
| 		ao->isf = ASE_NULL; /* no source file */ | ||||
| 		ao->isfl = 0; | ||||
| 		ao->ist = ASE_AWK_PARSE_STRING; | ||||
| 		ao->isp = argv[opt.ind++]; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		ao->iss = ASE_NULL; | ||||
| 		ao->isf = isf; | ||||
| 		ao->isfl = isfl; | ||||
| 		ao->ist = ASE_AWK_PARSE_FILES; | ||||
| 		ao->isp = isf; | ||||
| 	} | ||||
|  | ||||
| 	/* the remaining arguments are input console file names */ | ||||
| @ -552,6 +551,7 @@ static void init_awk_extension (ase_awk_t* awk) | ||||
| 	ext->prmfns.pow         = custom_awk_pow; | ||||
| 	ext->prmfns.sprintf     = custom_awk_sprintf; | ||||
| 	ext->prmfns.data = ASE_NULL; | ||||
|  | ||||
| 	ase_awk_setprmfns (awk, &ext->prmfns); | ||||
| } | ||||
|  | ||||
| @ -667,8 +667,7 @@ static int awk_main (int argc, ase_char_t* argv[]) | ||||
|  | ||||
| 	app_awk = awk; | ||||
|  | ||||
| 	if (ase_awk_parsesimple ( | ||||
| 		awk, ao.isf, ao.isfl, ao.osf, ASE_AWK_PARSE_FILES) == -1) | ||||
| 	if (ase_awk_parsesimple (awk, ao.isp, ao.ist, ao.osf) == -1) | ||||
| 	{ | ||||
| 		ase_printf ( | ||||
| 			ASE_T("PARSE ERROR: CODE [%d] LINE [%u] %s\n"),  | ||||
| @ -703,8 +702,7 @@ static int awk_main (int argc, ase_char_t* argv[]) | ||||
|  | ||||
| 	close_awk (awk); | ||||
|  | ||||
| 	if (ao.iss != ASE_NULL) free (ao.iss); | ||||
| 	if (ao.isf != ASE_NULL) free (ao.isf); | ||||
| 	if (ao.ist == ASE_AWK_PARSE_FILES && ao.isp != ASE_NULL) free (ao.isp); | ||||
| 	if (ao.osf != ASE_NULL) free (ao.osf); | ||||
| 	if (ao.icf != ASE_NULL) free (ao.icf); | ||||
| 	if (ao.vm != ASE_NULL) ase_map_close (ao.vm); | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: awk.h 470 2008-12-11 13:43:05Z baconevi $ | ||||
|  * $Id: awk.h 478 2008-12-12 09:42:32Z baconevi $ | ||||
|  * | ||||
|  * {License} | ||||
|  */ | ||||
| @ -474,7 +474,7 @@ enum ase_awk_valtostr_opt_t | ||||
| 	ASE_AWK_VALTOSTR_PRINT = (1 << 2) | ||||
| }; | ||||
|  | ||||
| enum ase_awk_parse_opt_t | ||||
| enum ase_awk_parse_ist_t | ||||
| { | ||||
| 	ASE_AWK_PARSE_FILES = 0, | ||||
| 	ASE_AWK_PARSE_STRING = 1 | ||||
| @ -843,10 +843,9 @@ ase_awk_t* ase_awk_opensimple (void); | ||||
|  */ | ||||
| int ase_awk_parsesimple ( | ||||
| 	ase_awk_t*        awk, | ||||
| 	const void*       is  /* source file names or source string */, | ||||
| 	ase_size_t        isl /* source file count or source string length */, | ||||
| 	const ase_char_t* osf /* an output source file name */, | ||||
| 	int               opt /* ASE_AWK_PARSE_FILES, ASE_AWK_PARSE_STRING */ | ||||
| 	const void*       isp /* source file names or source string */, | ||||
| 	int               ist /* ASE_AWK_PARSE_FILES, ASE_AWK_PARSE_STRING */, | ||||
| 	const ase_char_t* osf /* an output source file name */ | ||||
| ); | ||||
| /******/ | ||||
|  | ||||
|  | ||||
| @ -64,8 +64,12 @@ struct sf_t | ||||
| { | ||||
| 	struct  | ||||
| 	{ | ||||
| 		const ase_char_t*const* files;  | ||||
| 		ase_size_t              count;  /* the number of files */ | ||||
| 		int                     type; | ||||
| 		union | ||||
| 		{ | ||||
| 			const ase_char_t*const* files;  | ||||
| 			const ase_char_t* str; | ||||
| 		} p; | ||||
| 		ase_size_t              index;  /* current file index */ | ||||
| 		ase_sio_t*              handle; /* the handle to an open file */ | ||||
| 	} in; | ||||
| @ -86,29 +90,29 @@ static ase_ssize_t sf_in (int cmd, void* arg, ase_char_t* data, ase_size_t size) | ||||
|  | ||||
| 	if (cmd == ASE_AWK_IO_OPEN) | ||||
| 	{ | ||||
| 		if (sf->in.index >= sf->in.count) return 0; | ||||
| 		/* | ||||
| 		if (sf->in.files[sf->in.index] == ASE_NULL) return 0; | ||||
| 		*/ | ||||
|  | ||||
| 		if (sf->in.files[sf->in.index][0] == ASE_T('\0')) | ||||
| 		if (sf->in.type == ASE_AWK_PARSE_FILES) | ||||
| 		{ | ||||
| 			sf->in.handle = ase_sio_in; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			sf->in.handle = ase_sio_open ( | ||||
| 				ase_awk_getmmgr(sf->awk), | ||||
| 				0, | ||||
| 				sf->in.files[sf->in.index], | ||||
| 				ASE_SIO_READ | ||||
| 			); | ||||
| 			if (sf->in.handle == ASE_NULL) return -1; | ||||
| 		} | ||||
| 			if (sf->in.p.files[sf->in.index] == ASE_NULL) return 0; | ||||
|  | ||||
| 		/* | ||||
| 		ase_awk_setsinname (); | ||||
| 		*/ | ||||
| 			if (sf->in.p.files[sf->in.index][0] == ASE_T('\0')) | ||||
| 			{ | ||||
| 				sf->in.handle = ase_sio_in; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				sf->in.handle = ase_sio_open ( | ||||
| 					ase_awk_getmmgr(sf->awk), | ||||
| 					0, | ||||
| 					sf->in.p.files[sf->in.index], | ||||
| 					ASE_SIO_READ | ||||
| 				); | ||||
| 				if (sf->in.handle == ASE_NULL) return -1; | ||||
| 			} | ||||
|  | ||||
| 			/* | ||||
| 			ase_awk_setsinname (); | ||||
| 			*/ | ||||
| 		} | ||||
|  | ||||
| 		return 1; | ||||
| 	} | ||||
| @ -127,36 +131,47 @@ static ase_ssize_t sf_in (int cmd, void* arg, ase_char_t* data, ase_size_t size) | ||||
| 	else if (cmd == ASE_AWK_IO_READ) | ||||
| 	{ | ||||
| 		ase_ssize_t n = 0; | ||||
| 		ase_sio_t* fp; | ||||
|  | ||||
| 	retry: | ||||
| 		fp = sf->in.handle; | ||||
|  | ||||
| 		n = ase_sio_getsx (fp, data, size); | ||||
| 		if (n == 0 && ++sf->in.index < sf->in.count) | ||||
| 		if (sf->in.type == ASE_AWK_PARSE_FILES) | ||||
| 		{ | ||||
| 			if (fp != ase_sio_in) ase_sio_close (fp); | ||||
| 			if (sf->in.files[sf->in.index][0] == ASE_T('\0')) | ||||
| 			{ | ||||
| 				sf->in.handle = ase_sio_in; | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				sf->in.handle = ase_sio_open ( | ||||
| 					ase_awk_getmmgr(sf->awk), | ||||
| 					0, | ||||
| 					sf->in.files[sf->in.index], | ||||
| 					ASE_SIO_READ | ||||
| 				); | ||||
| 				if (sf->in.handle == ASE_NULL) return -1; | ||||
| 			} | ||||
| 			ase_sio_t* sio; | ||||
|  | ||||
| 			/* TODO: reset internal line counters... | ||||
| 				set new source name.... | ||||
| 				ase_awk_setsinname (); | ||||
| 			*/ | ||||
| 		retry: | ||||
| 			sio = sf->in.handle; | ||||
|  | ||||
| 			goto retry; | ||||
| 			n = ase_sio_getsx (sio, data, size); | ||||
| 			if (n == 0 && sf->in.p.files[++sf->in.index] != ASE_NULL) | ||||
| 			{ | ||||
| 				if (sio != ase_sio_in) ase_sio_close (sio); | ||||
| 				if (sf->in.p.files[sf->in.index][0] == ASE_T('\0')) | ||||
| 				{ | ||||
| 					sf->in.handle = ase_sio_in; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					sf->in.handle = ase_sio_open ( | ||||
| 						ase_awk_getmmgr(sf->awk), | ||||
| 						0, | ||||
| 						sf->in.p.files[sf->in.index], | ||||
| 						ASE_SIO_READ | ||||
| 					); | ||||
| 					if (sf->in.handle == ASE_NULL) return -1; | ||||
| 				} | ||||
|  | ||||
| 				/* TODO: reset internal line counters... | ||||
| 					set new source name.... | ||||
| 					ase_awk_setsinname (); | ||||
| 				*/ | ||||
|  | ||||
| 				goto retry; | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			while (n < size && sf->in.p.str[sf->in.index] != ASE_T('\0')) | ||||
| 			{ | ||||
| 				data[n++] = sf->in.p.str[sf->in.index++]; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return n; | ||||
| @ -233,35 +248,29 @@ static ase_ssize_t sf_out (int cmd, void* arg, ase_char_t* data, ase_size_t size | ||||
| } | ||||
|  | ||||
| int ase_awk_parsesimple ( | ||||
| 	ase_awk_t* awk, const void* is, ase_size_t isl,  | ||||
| 	const ase_char_t* osf, int opt) | ||||
| 	ase_awk_t* awk, const void* isp, int ist, const ase_char_t* osf) | ||||
| { | ||||
| 	sf_t sf; | ||||
| 	ase_awk_srcios_t sio; | ||||
|  | ||||
| 	if (is == ASE_NULL || isl == 0)  | ||||
| 	if (isp == ASE_NULL) | ||||
| 	{ | ||||
| 		ase_awk_seterrnum (awk, ASE_AWK_EINVAL); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	if (opt == ASE_AWK_PARSE_FILES) | ||||
| 	{ | ||||
| 		sf.in.files = is; | ||||
| 		sf.in.count = isl; | ||||
| 		sf.in.index = 0; | ||||
| 		sf.in.handle = ASE_NULL; | ||||
| 	} | ||||
| 	else if (opt == ASE_AWK_PARSE_STRING) | ||||
| 	{ | ||||
| 		/* TODO */ | ||||
| 	} | ||||
| 	if (ist == ASE_AWK_PARSE_FILES) sf.in.p.files = isp; | ||||
| 	else if (ist == ASE_AWK_PARSE_STRING) sf.in.p.str = isp; | ||||
| 	else | ||||
| 	{ | ||||
| 		ase_awk_seterrnum (awk, ASE_AWK_EINVAL); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	sf.in.type = ist; | ||||
| 	sf.in.index = 0; | ||||
| 	sf.in.handle = ASE_NULL; | ||||
|  | ||||
| 	sf.out.file = osf; | ||||
| 	sf.out.handle = ASE_NULL; | ||||
| 	sf.awk = awk; | ||||
| @ -277,8 +286,11 @@ int ase_awk_parsesimple ( | ||||
|  | ||||
| typedef struct runio_data_t | ||||
| { | ||||
| 	ase_char_t** icf; /* input console files */ | ||||
| 	ase_size_t icf_cur; | ||||
| 	struct | ||||
| 	{ | ||||
| 		ase_char_t** files; | ||||
| 		ase_size_t   index; | ||||
| 	} ic; /* input console */ | ||||
| } runio_data_t; | ||||
|  | ||||
| static ase_ssize_t awk_extio_pipe ( | ||||
| @ -456,14 +468,14 @@ static int open_extio_console (ase_awk_extio_t* epa) | ||||
|  | ||||
| 	if (epa->mode == ASE_AWK_EXTIO_CONSOLE_READ) | ||||
| 	{ | ||||
| 		if (rd->icf[rd->icf_cur] == ASE_NULL) | ||||
| 		if (rd->ic.files[rd->ic.index] == ASE_NULL) | ||||
| 		{ | ||||
| 			/* no more input file */ | ||||
| 			//dprint (ASE_T("console - no more file\n"));; | ||||
| 			return 0; | ||||
| 		} | ||||
|  | ||||
| 		if (rd->icf[rd->icf_cur][0] == ASE_T('\0')) | ||||
| 		if (rd->ic.files[rd->ic.index][0] == ASE_T('\0')) | ||||
| 		{ | ||||
| 			//dprint (ASE_T("    console(r) - <standard input>\n")); | ||||
| 			epa->handle = ase_sio_in; | ||||
| @ -477,24 +489,24 @@ static int open_extio_console (ase_awk_extio_t* epa) | ||||
| 			fp = ase_sio_open ( | ||||
| 				ase_awk_getrunmmgr(epa->run), | ||||
| 				0, | ||||
| 				rd->icf[rd->icf_cur], | ||||
| 				rd->ic.files[rd->ic.index], | ||||
| 				ASE_SIO_READ | ||||
| 			); | ||||
| 			if (fp == ASE_NULL) | ||||
| 			{ | ||||
| 				ase_cstr_t errarg; | ||||
|  | ||||
| 				errarg.ptr = rd->icf[rd->icf_cur]; | ||||
| 				errarg.len = ase_strlen(rd->icf[rd->icf_cur]); | ||||
| 				errarg.ptr = rd->ic.files[rd->ic.index]; | ||||
| 				errarg.len = ase_strlen(rd->ic.files[rd->ic.index]); | ||||
|  | ||||
| 				ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1); | ||||
| 				return -1; | ||||
| 			} | ||||
|  | ||||
| 			//dprint (ASE_T("    console(r) - %s\n"), rd->icf[rd->icf_cur]); | ||||
| 			//dprint (ASE_T("    console(r) - %s\n"), rd->ic.files[rd->ic.index]); | ||||
| 			if (ase_awk_setfilename ( | ||||
| 				epa->run, rd->icf[rd->icf_cur],  | ||||
| 				ase_strlen(rd->icf[rd->icf_cur])) == -1) | ||||
| 				epa->run, rd->ic.files[rd->ic.index],  | ||||
| 				ase_strlen(rd->ic.files[rd->ic.index])) == -1) | ||||
| 			{ | ||||
| 				ase_sio_close (fp); | ||||
| 				return -1; | ||||
| @ -503,7 +515,7 @@ static int open_extio_console (ase_awk_extio_t* epa) | ||||
| 			epa->handle = fp; | ||||
| 		} | ||||
|  | ||||
| 		rd->icf_cur++; | ||||
| 		rd->ic.index++; | ||||
| 		return 1; | ||||
| 	} | ||||
| 	else if (epa->mode == ASE_AWK_EXTIO_CONSOLE_WRITE) | ||||
| @ -554,13 +566,13 @@ static ase_ssize_t awk_extio_console ( | ||||
| 		{ | ||||
| 			/* it has reached the end of the current file. | ||||
| 			 * open the next file if available */ | ||||
| 			if (rd->icf[rd->icf_cur] == ASE_NULL)  | ||||
| 			if (rd->ic.files[rd->ic.index] == ASE_NULL)  | ||||
| 			{ | ||||
| 				/* no more input console */ | ||||
| 				return 0; | ||||
| 			} | ||||
|  | ||||
| 			if (rd->icf[rd->icf_cur][0] == ASE_T('\0')) | ||||
| 			if (rd->ic.files[rd->ic.index][0] == ASE_T('\0')) | ||||
| 			{ | ||||
| 				if (epa->handle != ASE_NULL && | ||||
| 				    epa->handle != ase_sio_in && | ||||
| @ -579,7 +591,7 @@ static ase_ssize_t awk_extio_console ( | ||||
| 				fp = ase_sio_open ( | ||||
| 					ase_awk_getrunmmgr(epa->run), | ||||
| 					0, | ||||
| 					rd->icf[rd->icf_cur], | ||||
| 					rd->ic.files[rd->ic.index], | ||||
| 					ASE_SIO_READ | ||||
| 				); | ||||
|  | ||||
| @ -587,16 +599,16 @@ static ase_ssize_t awk_extio_console ( | ||||
| 				{ | ||||
| 					ase_cstr_t errarg; | ||||
|  | ||||
| 					errarg.ptr = rd->icf[rd->icf_cur]; | ||||
| 					errarg.len = ase_strlen(rd->icf[rd->icf_cur]); | ||||
| 					errarg.ptr = rd->ic.files[rd->ic.index]; | ||||
| 					errarg.len = ase_strlen(rd->ic.files[rd->ic.index]); | ||||
|  | ||||
| 					ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1); | ||||
| 					return -1; | ||||
| 				} | ||||
|  | ||||
| 				if (ase_awk_setfilename ( | ||||
| 					epa->run, rd->icf[rd->icf_cur],  | ||||
| 					ase_strlen(rd->icf[rd->icf_cur])) == -1) | ||||
| 					epa->run, rd->ic.files[rd->ic.index],  | ||||
| 					ase_strlen(rd->ic.files[rd->ic.index])) == -1) | ||||
| 				{ | ||||
| 					ase_sio_close (fp); | ||||
| 					return -1; | ||||
| @ -618,11 +630,11 @@ static ase_ssize_t awk_extio_console ( | ||||
| 					ase_sio_close ((ase_sio_t*)epa->handle); | ||||
| 				} | ||||
|  | ||||
| 				//dprint (ASE_T("open the next console [%s]\n"), rd->icf[rd->icf_cur]); | ||||
| 				//dprint (ASE_T("open the next console [%s]\n"), rd->ic.files[rd->ic.index]); | ||||
| 				epa->handle = fp; | ||||
| 			} | ||||
|  | ||||
| 			rd->icf_cur++;	 | ||||
| 			rd->ic.index++;	 | ||||
| 		} | ||||
|  | ||||
| 		return n; | ||||
| @ -675,8 +687,8 @@ int ase_awk_runsimple (ase_awk_t* awk, ase_char_t** icf) | ||||
| 	ase_awk_runios_t runios; | ||||
| 	runio_data_t rd; | ||||
|  | ||||
| 	rd.icf = icf; | ||||
| 	rd.icf_cur = 0; | ||||
| 	rd.ic.files = icf; | ||||
| 	rd.ic.index = 0; | ||||
|  | ||||
| 	runios.pipe = awk_extio_pipe; | ||||
| 	runios.file = awk_extio_file; | ||||
|  | ||||
		Reference in New Issue
	
	Block a user