enhanced record reading further
This commit is contained in:
		| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: awk.c 441 2011-04-22 14:28:43Z hyunghwan.chung $ |  * $Id: awk.c 447 2011-05-01 13:28:51Z hyunghwan.chung $ | ||||||
|  * |  * | ||||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. |     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||||
|     This file is part of QSE. |     This file is part of QSE. | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: awk.c 441 2011-04-22 14:28:43Z hyunghwan.chung $  |  * $Id: awk.c 447 2011-05-01 13:28:51Z hyunghwan.chung $  | ||||||
|  * |  * | ||||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. |     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||||
|     This file is part of QSE. |     This file is part of QSE. | ||||||
| @ -223,7 +223,7 @@ qse_awk_t* qse_awk_open (qse_mmgr_t* mmgr, qse_size_t xtn, qse_awk_prm_t* prm) | |||||||
| 	qse_lda_setcopier (awk->parse.params, QSE_LDA_COPIER_INLINE); | 	qse_lda_setcopier (awk->parse.params, QSE_LDA_COPIER_INLINE); | ||||||
|  |  | ||||||
| 	awk->option = QSE_AWK_CLASSIC; | 	awk->option = QSE_AWK_CLASSIC; | ||||||
| #if defined(_WIN32) || defined(__OS2__) | #if defined(__OS2__) || defined(_WIN32) || defined(__DOS__) | ||||||
| 	awk->option |= QSE_AWK_CRLF; | 	awk->option |= QSE_AWK_CRLF; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: rio.c 446 2011-04-30 15:24:38Z hyunghwan.chung $ |  * $Id: rio.c 447 2011-05-01 13:28:51Z hyunghwan.chung $ | ||||||
|  * |  * | ||||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. |     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||||
|     This file is part of QSE. |     This file is part of QSE. | ||||||
| @ -22,10 +22,10 @@ | |||||||
|  |  | ||||||
| enum io_mask_t | enum io_mask_t | ||||||
| { | { | ||||||
| 	MASK_READ  = 0x0100, | 	IO_MASK_READ  = 0x0100, | ||||||
| 	MASK_WRITE = 0x0200, | 	IO_MASK_WRITE = 0x0200, | ||||||
| 	MASK_RDWR  = 0x0400, | 	IO_MASK_RDWR  = 0x0400, | ||||||
| 	MASK_CLEAR = 0x00FF | 	IO_MASK_CLEAR = 0x00FF | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static int in_type_map[] = | static int in_type_map[] = | ||||||
| @ -50,10 +50,10 @@ static int in_mode_map[] = | |||||||
|  |  | ||||||
| static int in_mask_map[] = | static int in_mask_map[] = | ||||||
| { | { | ||||||
| 	MASK_READ, | 	IO_MASK_READ, | ||||||
| 	MASK_RDWR, | 	IO_MASK_RDWR, | ||||||
| 	MASK_READ, | 	IO_MASK_READ, | ||||||
| 	MASK_READ | 	IO_MASK_READ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static int out_type_map[] = | static int out_type_map[] = | ||||||
| @ -80,11 +80,11 @@ static int out_mode_map[] = | |||||||
|  |  | ||||||
| static int out_mask_map[] = | static int out_mask_map[] = | ||||||
| { | { | ||||||
| 	MASK_WRITE, | 	IO_MASK_WRITE, | ||||||
| 	MASK_RDWR, | 	IO_MASK_RDWR, | ||||||
| 	MASK_WRITE, | 	IO_MASK_WRITE, | ||||||
| 	MASK_WRITE, | 	IO_MASK_WRITE, | ||||||
| 	MASK_WRITE | 	IO_MASK_WRITE | ||||||
| }; | }; | ||||||
|  |  | ||||||
| static int find_rio_in ( | static int find_rio_in ( | ||||||
| @ -249,7 +249,8 @@ static QSE_INLINE int match_long_rs ( | |||||||
| 			 * A match in this case must end at the end of | 			 * A match in this case must end at the end of | ||||||
| 			 * the current record buffer */ | 			 * the current record buffer */ | ||||||
| 			QSE_ASSERT ( | 			QSE_ASSERT ( | ||||||
| 				QSE_STR_PTR(buf) + QSE_STR_LEN(buf) == match.ptr + match.len | 				QSE_STR_PTR(buf) + QSE_STR_LEN(buf) ==  | ||||||
|  | 				match.ptr + match.len | ||||||
| 			); | 			); | ||||||
|  |  | ||||||
| 			/* drop the RS part. no extra character after RS to drop | 			/* drop the RS part. no extra character after RS to drop | ||||||
| @ -462,12 +463,16 @@ int qse_awk_rtx_readio ( | |||||||
| 					if (pc == QSE_T('\r') && | 					if (pc == QSE_T('\r') && | ||||||
| 					    QSE_STR_LEN(buf) > 0) | 					    QSE_STR_LEN(buf) > 0) | ||||||
| 					{ | 					{ | ||||||
|  | 						/* shrink the line length and the record | ||||||
|  | 						 * by dropping of CR before NL */ | ||||||
|  | 						QSE_ASSERT (line_len > 0); | ||||||
|  | 						line_len--; | ||||||
| 						QSE_STR_LEN(buf) -= 1; | 						QSE_STR_LEN(buf) -= 1; | ||||||
| 					} | 					} | ||||||
| 				} |  | ||||||
|  |  | ||||||
| 				if (line_len == 0 && c == QSE_T('\n')) | 					if (line_len == 0) | ||||||
| 					{ | 					{ | ||||||
|  | 						/* we got a blank line */ | ||||||
| 						if (QSE_STR_LEN(buf) <= 0) | 						if (QSE_STR_LEN(buf) <= 0) | ||||||
| 						{ | 						{ | ||||||
| 							/* if the record is empty when a blank | 							/* if the record is empty when a blank | ||||||
| @ -485,6 +490,10 @@ int qse_awk_rtx_readio ( | |||||||
| 						break; | 						break; | ||||||
| 					} | 					} | ||||||
|  |  | ||||||
|  | 					line_len = 0; | ||||||
|  | 				} | ||||||
|  | 				else line_len++; | ||||||
|  |  | ||||||
| 				if (qse_str_ccat (buf, c) == (qse_size_t)-1) | 				if (qse_str_ccat (buf, c) == (qse_size_t)-1) | ||||||
| 				{ | 				{ | ||||||
| 					qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL); | 					qse_awk_rtx_seterrnum (run, QSE_AWK_ENOMEM, QSE_NULL); | ||||||
| @ -492,9 +501,6 @@ int qse_awk_rtx_readio ( | |||||||
| 					done = 1; | 					done = 1; | ||||||
| 					break; | 					break; | ||||||
| 				} | 				} | ||||||
| /* TODO: handle different line terminator */ |  | ||||||
| 				if (c == QSE_T('\n')) line_len = 0; |  | ||||||
| 				else line_len = line_len + 1; |  | ||||||
| 			} | 			} | ||||||
| 			while (p->in.pos < p->in.len); | 			while (p->in.pos < p->in.len); | ||||||
|  |  | ||||||
| @ -561,7 +567,6 @@ int qse_awk_rtx_readio ( | |||||||
| 			n = match_long_rs (run, buf, p); | 			n = match_long_rs (run, buf, p); | ||||||
| 			if (n != 0) | 			if (n != 0) | ||||||
| 			{ | 			{ | ||||||
| 				//p->in.pos--; /* unread the character in c */ |  | ||||||
| 				if (n <= -1) ret = -1; | 				if (n <= -1) ret = -1; | ||||||
| 				break; | 				break; | ||||||
| 			} | 			} | ||||||
| @ -983,7 +988,7 @@ int qse_awk_rtx_closio_read ( | |||||||
| 		{ | 		{ | ||||||
| 			qse_awk_rio_fun_t handler; | 			qse_awk_rio_fun_t handler; | ||||||
| 		        | 		        | ||||||
| 			handler = run->rio.handler[p->type & MASK_CLEAR]; | 			handler = run->rio.handler[p->type & IO_MASK_CLEAR]; | ||||||
| 			if (handler != QSE_NULL) | 			if (handler != QSE_NULL) | ||||||
| 			{ | 			{ | ||||||
| 				if (handler (run, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1) | 				if (handler (run, QSE_AWK_RIO_CLOSE, p, QSE_NULL, 0) <= -1) | ||||||
| @ -1042,7 +1047,7 @@ int qse_awk_rtx_closio_write ( | |||||||
| 		{ | 		{ | ||||||
| 			qse_awk_rio_fun_t handler; | 			qse_awk_rio_fun_t handler; | ||||||
| 		        | 		        | ||||||
| 			handler = run->rio.handler[p->type & MASK_CLEAR]; | 			handler = run->rio.handler[p->type & IO_MASK_CLEAR]; | ||||||
| 			if (handler != QSE_NULL) | 			if (handler != QSE_NULL) | ||||||
| 			{ | 			{ | ||||||
| 				qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR, QSE_NULL); | 				qse_awk_rtx_seterrnum (run, QSE_AWK_ENOERR, QSE_NULL); | ||||||
| @ -1088,7 +1093,7 @@ int qse_awk_rtx_closeio ( | |||||||
| 			{ | 			{ | ||||||
| 				if (opt[0] == QSE_T('r')) | 				if (opt[0] == QSE_T('r')) | ||||||
| 				{ | 				{ | ||||||
| 					if (p->type & MASK_RDWR)  | 					if (p->type & IO_MASK_RDWR)  | ||||||
| 					{ | 					{ | ||||||
| 						if (p->rwcstate != QSE_AWK_RIO_CLOSE_WRITE) | 						if (p->rwcstate != QSE_AWK_RIO_CLOSE_WRITE) | ||||||
| 						{ | 						{ | ||||||
| @ -1098,12 +1103,12 @@ int qse_awk_rtx_closeio ( | |||||||
| 							rwcmode = QSE_AWK_RIO_CLOSE_READ; | 							rwcmode = QSE_AWK_RIO_CLOSE_READ; | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 					else if (!(p->type & MASK_READ)) goto skip; | 					else if (!(p->type & IO_MASK_READ)) goto skip; | ||||||
| 				} | 				} | ||||||
| 				else | 				else | ||||||
| 				{ | 				{ | ||||||
| 					QSE_ASSERT (opt[0] == QSE_T('w')); | 					QSE_ASSERT (opt[0] == QSE_T('w')); | ||||||
| 					if (p->type & MASK_RDWR) | 					if (p->type & IO_MASK_RDWR) | ||||||
| 					{ | 					{ | ||||||
| 						if (p->rwcstate != QSE_AWK_RIO_CLOSE_READ) | 						if (p->rwcstate != QSE_AWK_RIO_CLOSE_READ) | ||||||
| 						{ | 						{ | ||||||
| @ -1113,11 +1118,11 @@ int qse_awk_rtx_closeio ( | |||||||
| 							rwcmode = QSE_AWK_RIO_CLOSE_WRITE; | 							rwcmode = QSE_AWK_RIO_CLOSE_WRITE; | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 					else if (!(p->type & MASK_WRITE)) goto skip; | 					else if (!(p->type & IO_MASK_WRITE)) goto skip; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			handler = rtx->rio.handler[p->type & MASK_CLEAR]; | 			handler = rtx->rio.handler[p->type & IO_MASK_CLEAR]; | ||||||
| 			if (handler != QSE_NULL) | 			if (handler != QSE_NULL) | ||||||
| 			{ | 			{ | ||||||
| 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL); | 				qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOERR, QSE_NULL); | ||||||
| @ -1131,7 +1136,7 @@ int qse_awk_rtx_closeio ( | |||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			if (p->type & MASK_RDWR)  | 			if (p->type & IO_MASK_RDWR)  | ||||||
| 			{ | 			{ | ||||||
| 				p->rwcmode = rwcmode; | 				p->rwcmode = rwcmode; | ||||||
| 				if (p->rwcstate == 0 && rwcmode != 0) | 				if (p->rwcstate == 0 && rwcmode != 0) | ||||||
| @ -1172,7 +1177,7 @@ void qse_awk_rtx_cleario (qse_awk_rtx_t* run) | |||||||
| 	while (run->rio.chain != QSE_NULL) | 	while (run->rio.chain != QSE_NULL) | ||||||
| 	{ | 	{ | ||||||
| 		handler = run->rio.handler[ | 		handler = run->rio.handler[ | ||||||
| 			run->rio.chain->type & MASK_CLEAR]; | 			run->rio.chain->type & IO_MASK_CLEAR]; | ||||||
| 		next = run->rio.chain->next; | 		next = run->rio.chain->next; | ||||||
|  |  | ||||||
| 		if (handler != QSE_NULL) | 		if (handler != QSE_NULL) | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: std.c 441 2011-04-22 14:28:43Z hyunghwan.chung $ |  * $Id: std.c 447 2011-05-01 13:28:51Z hyunghwan.chung $ | ||||||
|  * |  * | ||||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. |     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||||
|     This file is part of QSE. |     This file is part of QSE. | ||||||
| @ -37,7 +37,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #ifndef QSE_HAVE_CONFIG_H | #ifndef QSE_HAVE_CONFIG_H | ||||||
| #	if defined(__OS2__) || defined(_WIN32) | #	if defined(__OS2__) || defined(_WIN32) || defined(__DOS__) | ||||||
| #		define HAVE_POW | #		define HAVE_POW | ||||||
| #		define HAVE_SIN | #		define HAVE_SIN | ||||||
| #		define HAVE_COS | #		define HAVE_COS | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * $Id: tree.c 441 2011-04-22 14:28:43Z hyunghwan.chung $ |  * $Id: tree.c 447 2011-05-01 13:28:51Z hyunghwan.chung $ | ||||||
|  * |  * | ||||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. |     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||||
|     This file is part of QSE. |     This file is part of QSE. | ||||||
| @ -103,29 +103,34 @@ static const qse_char_t* print_outop_str[] = | |||||||
| 	QSE_T("") | 	QSE_T("") | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #define PUT_SRCSTR(awk,str) \ | #define PUT_SRCSTR(awk,str) QSE_BLOCK (\ | ||||||
| 	do { if (qse_awk_putsrcstr (awk, str) == -1) return -1; } while (0) | 	if (qse_awk_putsrcstr (awk, str) == -1) return -1; \ | ||||||
|  | ) | ||||||
|  |  | ||||||
| #define PUT_NL(awk) \ | #define PUT_NL(awk) QSE_BLOCK (\ | ||||||
| 	do { \ |  | ||||||
| 	if (awk->option & QSE_AWK_CRLF) PUT_SRCSTR (awk, QSE_T("\r")); \ | 	if (awk->option & QSE_AWK_CRLF) PUT_SRCSTR (awk, QSE_T("\r")); \ | ||||||
| 	PUT_SRCSTR (awk, QSE_T("\n")); \ | 	PUT_SRCSTR (awk, QSE_T("\n")); \ | ||||||
| 	} while (0) | ) | ||||||
|  |  | ||||||
| #define PUT_SRCSTRX(awk,str,len) \ | #define PUT_SRCSTRX(awk,str,len) QSE_BLOCK (\ | ||||||
| 	do { if (qse_awk_putsrcstrx (awk, str, len) == -1) return -1; } while (0) | 	if (qse_awk_putsrcstrx (awk, str, len) == -1) return -1; \ | ||||||
|  | ) | ||||||
|  |  | ||||||
| #define PRINT_TABS(awk,depth) \ | #define PRINT_TABS(awk,depth) QSE_BLOCK (\ | ||||||
| 	do { if (print_tabs(awk,depth) == -1) return -1; } while (0) | 	if (print_tabs(awk,depth) == -1) return -1; \ | ||||||
|  | ) | ||||||
|  |  | ||||||
| #define PRINT_EXPR(awk,nde) \ | #define PRINT_EXPR(awk,nde) QSE_BLOCK (\ | ||||||
| 	do { if (print_expr(awk,nde) == -1) return -1; } while (0) | 	if (print_expr(awk,nde) == -1) return -1; \ | ||||||
|  | ) | ||||||
|  |  | ||||||
| #define PRINT_EXPR_LIST(awk,nde) \ | #define PRINT_EXPR_LIST(awk,nde) QSE_BLOCK(\ | ||||||
| 	do { if (print_expr_list(awk,nde) == -1) return -1; } while (0) | 	if (print_expr_list(awk,nde) == -1) return -1; \ | ||||||
|  | ) | ||||||
|  |  | ||||||
| #define PRINT_STMTS(awk,nde,depth) \ | #define PRINT_STMTS(awk,nde,depth) QSE_BLOCK(\ | ||||||
| 	do { if (print_stmts(awk,nde,depth) == -1) return -1; } while (0) | 	if (print_stmts(awk,nde,depth) == -1) return -1; \ | ||||||
|  | ) | ||||||
|  |  | ||||||
| static int print_tabs (qse_awk_t* awk, int depth); | static int print_tabs (qse_awk_t* awk, int depth); | ||||||
| static int print_expr (qse_awk_t* awk, qse_awk_nde_t* nde); | static int print_expr (qse_awk_t* awk, qse_awk_nde_t* nde); | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								qse/regress/awk/lang-044.awk
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								qse/regress/awk/lang-044.awk
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | BEGIN { RS=""; } | ||||||
|  | { print "[" $0 "]"; } | ||||||
							
								
								
									
										11
									
								
								qse/regress/awk/lang-044.dat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								qse/regress/awk/lang-044.dat
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | abc | ||||||
|  | this is the second line | ||||||
|  |  | ||||||
|  | def | ||||||
|  | vwxyz | ||||||
|  | this is the second second line | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |    ttttt | ||||||
|  | killer | ||||||
| @ -166,6 +166,7 @@ PROGS=" | |||||||
| 	lang-041.awk!!!--newline=on -o- | 	lang-041.awk!!!--newline=on -o- | ||||||
| 	lang-042.awk!!!--newline=on -o- | 	lang-042.awk!!!--newline=on -o- | ||||||
| 	lang-043.awk!lang-043.dat!!--newline=on -o- | 	lang-043.awk!lang-043.dat!!--newline=on -o- | ||||||
|  | 	lang-044.awk!lang-044.dat!!--newline=on -o- | ||||||
|  |  | ||||||
| 	columnate.awk!./passwd.dat!!--newline=on -F: | 	columnate.awk!./passwd.dat!!--newline=on -F: | ||||||
| 	levenshtein-utests.awk!!!--newline=on --include=on | 	levenshtein-utests.awk!!!--newline=on --include=on | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user