enhanced record handling for CRLF
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: rio.c 447 2011-05-01 13:28:51Z hyunghwan.chung $ | ||||
|  * $Id: rio.c 449 2011-05-01 14:37:17Z hyunghwan.chung $ | ||||
|  * | ||||
|     Copyright 2006-2011 Chung, Hyung-Hwan. | ||||
|     This file is part of QSE. | ||||
| @ -361,11 +361,20 @@ int qse_awk_rtx_readio ( | ||||
| 				if (QSE_STR_LEN(buf) == 0) ret = 0; | ||||
| 				else if (rrs.ptr != QSE_NULL && rrs.len == 0) | ||||
| 				{ | ||||
| /* TODO: handle different line terminator */ | ||||
| 					/* TODO: handle different line terminator */ | ||||
| 					/* drop the line terminator from the record | ||||
| 					 * if RS is a blank line and EOF is reached. */ | ||||
| 					if (QSE_STR_LASTCHAR(buf) == QSE_T('\n')) | ||||
| 					{ | ||||
| 						QSE_STR_LEN(buf) -= 1; | ||||
| 						if (run->awk->option & QSE_AWK_CRLF) | ||||
| 						{ | ||||
| 							/* drop preceding CR */ | ||||
| 							if (QSE_STR_LEN(buf) > 0 && | ||||
| 							    QSE_STR_LASTCHAR(buf) == QSE_T('\r')) | ||||
| 								QSE_STR_LEN(buf) -= 1; | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				else if (rrs.len >= 2) | ||||
| 				{ | ||||
| @ -403,7 +412,7 @@ int qse_awk_rtx_readio ( | ||||
| 				c = p->in.buf[p->in.pos++]; | ||||
| 				end_pos = p->in.pos; | ||||
|  | ||||
| /* TODO: handle different line terminator */ | ||||
| 				/* TODO: handle different line terminator */ | ||||
| 				/* separate by a new line */ | ||||
| 				if (c == QSE_T('\n'))  | ||||
| 				{ | ||||
| @ -412,16 +421,16 @@ int qse_awk_rtx_readio ( | ||||
| 					{ | ||||
| 						if (end_pos > start_pos) | ||||
| 						{ | ||||
| 							/* '\r' is the part of the read buffer. | ||||
| 							/* CR is the part of the read buffer. | ||||
| 							 * decrementing the end_pos variable can | ||||
| 							 * simply drop it */ | ||||
| 							end_pos--; | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| 							/* '\r' must have come from the previous | ||||
| 							 * read. the record buffer must contain | ||||
| 							 * it at the end.  */ | ||||
| 							/* CR must have come from the previous | ||||
| 							 * read. drop CR that must be found  at  | ||||
| 							 * the end of the record buffer. */ | ||||
| 							QSE_ASSERT (end_pos == start_pos); | ||||
| 							QSE_ASSERT (QSE_STR_LEN(buf) > 0); | ||||
| 							QSE_ASSERT (QSE_STR_LASTCHAR(buf) == QSE_T('\r')); | ||||
| @ -456,7 +465,7 @@ int qse_awk_rtx_readio ( | ||||
| 				pc = c; | ||||
| 				c = p->in.buf[p->in.pos++]; | ||||
|  | ||||
| /* TODO: handle different line terminator */ | ||||
| 				/* TODO: handle different line terminator */ | ||||
| 				/* separate by a blank line */ | ||||
| 				if (c == QSE_T('\n')) | ||||
| 				{ | ||||
| @ -467,25 +476,58 @@ int qse_awk_rtx_readio ( | ||||
| 						 * by dropping of CR before NL */ | ||||
| 						QSE_ASSERT (line_len > 0); | ||||
| 						line_len--; | ||||
| 						QSE_STR_LEN(buf) -= 1; | ||||
|  | ||||
| 						/* we don't drop CR from the record buffer  | ||||
| 						 * if we're in CRLF mode. POINT-X */	 | ||||
| 						if (!(run->awk->option & QSE_AWK_CRLF)) | ||||
| 							QSE_STR_LEN(buf) -= 1; | ||||
| 					} | ||||
|  | ||||
| 					if (line_len == 0) | ||||
| 					{ | ||||
| 						/* we got a blank line */ | ||||
| 						if (QSE_STR_LEN(buf) <= 0) | ||||
|  | ||||
| 						if (run->awk->option & QSE_AWK_CRLF) | ||||
| 						{ | ||||
| 							/* if the record is empty when a blank | ||||
| 							 * line is encountered, the line | ||||
| 							 * terminator should not be added to | ||||
| 							 * the record */ | ||||
| 							continue; | ||||
| 							if (QSE_STR_LEN(buf) > 0 &&  | ||||
| 							    QSE_STR_LASTCHAR(buf) == QSE_T('\r')) | ||||
| 							{ | ||||
| 								/* drop CR not dropped in POINT-X above */ | ||||
| 								QSE_STR_LEN(buf) -= 1; | ||||
| 							} | ||||
|  | ||||
| 							if (QSE_STR_LEN(buf) <= 0) | ||||
| 							{ | ||||
| 								/* if the record is empty when a blank | ||||
| 								 * line is encountered, the line | ||||
| 								 * terminator should not be added to | ||||
| 								 * the record */ | ||||
| 								continue; | ||||
| 							} | ||||
|  | ||||
| 							/* drop NL */ | ||||
| 							QSE_STR_LEN(buf) -= 1; | ||||
|  | ||||
| 							/* drop preceding CR */ | ||||
| 							if (QSE_STR_LEN(buf) > 0 && | ||||
| 							    QSE_STR_LASTCHAR(buf) == QSE_T('\r'))  | ||||
| 								QSE_STR_LEN(buf) -= 1; | ||||
| 						} | ||||
| 						else | ||||
| 						{ | ||||
| 							if (QSE_STR_LEN(buf) <= 0) | ||||
| 							{ | ||||
| 								/* if the record is empty when a blank | ||||
| 								 * line is encountered, the line | ||||
| 								 * terminator should not be added to | ||||
| 								 * the record */ | ||||
| 								continue; | ||||
| 							} | ||||
|  | ||||
| 							/* drop NL of the previous line */ | ||||
| 							QSE_STR_LEN(buf) -= 1; /* simply drop NL */ | ||||
| 						} | ||||
|  | ||||
| 						/* when a blank line is encountered, | ||||
| 						 * it needs to snip off the line | ||||
| 						 * terminator of the previous line */ | ||||
| 						QSE_STR_LEN(buf) -= 1; | ||||
| 						done = 1; | ||||
| 						break; | ||||
| 					} | ||||
|  | ||||
| @ -84,14 +84,14 @@ WRect | ||||
| 1880 | ||||
| 5700 | ||||
| 4240 | ||||
| 0 | ||||
| 1 | ||||
| 0 | ||||
| 22 | ||||
| WFileName | ||||
| 30 | ||||
| release/os2/lib/cmn/qsecmn.tgt | ||||
| 28 | ||||
| 30 | ||||
| 29 | ||||
| 23 | ||||
| VComponent | ||||
| 24 | ||||
| @ -145,10 +145,10 @@ VComponent | ||||
| 33 | ||||
| WRect | ||||
| 380 | ||||
| -160 | ||||
| 0 | ||||
| 5700 | ||||
| 4240 | ||||
| 0 | ||||
| 1 | ||||
| 0 | ||||
| 34 | ||||
| WFileName | ||||
| @ -260,14 +260,14 @@ WRect | ||||
| 80 | ||||
| 5700 | ||||
| 4240 | ||||
| 1 | ||||
| 0 | ||||
| 0 | ||||
| 55 | ||||
| WFileName | ||||
| 28 | ||||
| debug/os2/lib/awk/qseawk.tgt | ||||
| 8 | ||||
| 10 | ||||
| 12 | ||||
| 56 | ||||
| VComponent | ||||
| 57 | ||||
| @ -289,7 +289,7 @@ VComponent | ||||
| 60 | ||||
| WRect | ||||
| 2920 | ||||
| 893 | ||||
| 880 | ||||
| 5700 | ||||
| 4240 | ||||
| 0 | ||||
| @ -300,4 +300,4 @@ WFileName | ||||
| debug/os2/cmd/awk/qseawk.tgt | ||||
| 0 | ||||
| 1 | ||||
| 32 | ||||
| 59 | ||||
|  | ||||
		Reference in New Issue
	
	Block a user