| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2020-04-16 03:42:30 +00:00
										 |  |  |     Copyright (c) 2006-2020 Chung, Hyung-Hwan. All rights reserved. | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |     modification, are permitted provided that the following conditions | 
					
						
							|  |  |  |     are met: | 
					
						
							|  |  |  |     1. Redistributions of source code must retain the above copyright | 
					
						
							|  |  |  |        notice, this list of conditions and the following disclaimer. | 
					
						
							|  |  |  |     2. Redistributions in binary form must reproduce the above copyright | 
					
						
							|  |  |  |        notice, this list of conditions and the following disclaimer in the | 
					
						
							|  |  |  |        documentation and/or other materials provided with the distribution. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR | 
					
						
							|  |  |  |     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 
					
						
							|  |  |  |     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | 
					
						
							|  |  |  |     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | 
					
						
							|  |  |  |     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 
					
						
							|  |  |  |     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 
					
						
							|  |  |  |     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 
					
						
							|  |  |  |     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
					
						
							|  |  |  |     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 
					
						
							|  |  |  |     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "hawk-prv.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | static int split_record (hawk_rtx_t* run, int prefer_number); | 
					
						
							|  |  |  | static int recomp_record_fields (hawk_rtx_t* run, hawk_oow_t lv, const hawk_oocs_t* str, int prefer_number); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | int hawk_rtx_setrec (hawk_rtx_t* rtx, hawk_oow_t idx, const hawk_oocs_t* str, int prefer_number) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	hawk_val_t* v; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (idx == 0) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (str->ptr == HAWK_OOECS_PTR(&rtx->inrec.line) && | 
					
						
							|  |  |  | 		    str->len == HAWK_OOECS_LEN(&rtx->inrec.line)) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			if (hawk_rtx_clrrec(rtx, 1) <= -1) return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			if (hawk_rtx_clrrec(rtx, 0) <= -1) return -1; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			if (hawk_ooecs_ncpy(&rtx->inrec.line, str->ptr, str->len) == (hawk_oow_t)-1) goto oops; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		if (split_record(rtx, prefer_number) <= -1) goto oops; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-14 05:00:55 +00:00
										 |  |  | 		v = prefer_number? hawk_rtx_makenumorstrvalwithoochars(rtx, HAWK_OOECS_PTR(&rtx->inrec.line), HAWK_OOECS_LEN(&rtx->inrec.line)):  /* number or string */ | 
					
						
							|  |  |  | 		                   hawk_rtx_makenstrvalwithoochars(rtx, HAWK_OOECS_PTR(&rtx->inrec.line), HAWK_OOECS_LEN(&rtx->inrec.line));  /* str with nstr flag */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		if (HAWK_UNLIKELY(!v)) goto oops; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		if (recomp_record_fields(rtx, idx, str, prefer_number) <= -1) goto oops; | 
					
						
							| 
									
										
										
										
											2020-03-06 07:43:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		/* recompose $0 */ | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		v = hawk_rtx_makestrvalwithoochars(rtx, HAWK_OOECS_PTR(&rtx->inrec.line), HAWK_OOECS_LEN(&rtx->inrec.line)); | 
					
						
							|  |  |  | 		if (HAWK_UNLIKELY(!v)) goto oops; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (HAWK_RTX_GETVALTYPE(rtx, rtx->inrec.d0) != HAWK_VAL_NIL) hawk_rtx_refdownval (rtx, rtx->inrec.d0); | 
					
						
							|  |  |  | 	rtx->inrec.d0 = v; | 
					
						
							|  |  |  | 	hawk_rtx_refupval (rtx, v); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | oops: | 
					
						
							|  |  |  | 	hawk_rtx_clrrec (rtx, 0); | 
					
						
							|  |  |  | 	return -1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | static int merge_fields (hawk_rtx_t* rtx) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	hawk_oow_t i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hawk_ooecs_clear (&rtx->inrec.line); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (i = 0; i < rtx->inrec.nflds; i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		hawk_ooch_t* vp; | 
					
						
							|  |  |  | 		hawk_oow_t vl; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (HAWK_LIKELY(i > 0)) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			if (hawk_ooecs_ncat(&rtx->inrec.line, rtx->gbl.ofs.ptr, rtx->gbl.ofs.len) == (hawk_oow_t)-1) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		vp = hawk_rtx_getvaloocstr(rtx, rtx->inrec.flds[i].val, &vl); | 
					
						
							|  |  |  | 		if (HAWK_UNLIKELY(!vp)) return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		vl = hawk_ooecs_ncat(&rtx->inrec.line, vp, vl); | 
					
						
							|  |  |  | 		hawk_rtx_freevaloocstr (rtx, rtx->inrec.flds[i].val, vp); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (HAWK_UNLIKELY(vl == (hawk_oow_t)-1)) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	return 1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | static int split_record (hawk_rtx_t* rtx, int prefer_number) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	hawk_oocs_t tok; | 
					
						
							|  |  |  | 	hawk_ooch_t* p, * px; | 
					
						
							|  |  |  | 	hawk_oow_t len, nflds; | 
					
						
							|  |  |  | 	hawk_val_t* v, * fs; | 
					
						
							|  |  |  | 	hawk_val_type_t fsvtype; | 
					
						
							|  |  |  | 	hawk_ooch_t* fs_ptr, * fs_free; | 
					
						
							|  |  |  | 	hawk_oow_t fs_len; | 
					
						
							|  |  |  | 	int how; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* inrec should be cleared before split_record is called */ | 
					
						
							| 
									
										
										
										
											2025-10-01 23:48:42 +09:00
										 |  |  | 	HAWK_ASSERT(rtx->inrec.nflds == 0); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* get FS */ | 
					
						
							| 
									
										
										
										
											2020-03-06 07:43:53 +00:00
										 |  |  | 	fs = hawk_rtx_getgbl(rtx, HAWK_GBL_FS); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	fsvtype = HAWK_RTX_GETVALTYPE (rtx, fs); | 
					
						
							|  |  |  | 	if (fsvtype == HAWK_VAL_NIL) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		fs_ptr = HAWK_T(" "); | 
					
						
							|  |  |  | 		fs_len = 1; | 
					
						
							|  |  |  | 		fs_free = HAWK_NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else if (fsvtype == HAWK_VAL_STR) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		fs_ptr = ((hawk_val_str_t*)fs)->val.ptr; | 
					
						
							|  |  |  | 		fs_len = ((hawk_val_str_t*)fs)->val.len; | 
					
						
							|  |  |  | 		fs_free = HAWK_NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		fs_ptr = hawk_rtx_valtooocstrdup(rtx, fs, &fs_len); | 
					
						
							| 
									
										
										
										
											2020-03-06 07:43:53 +00:00
										 |  |  | 		if (HAWK_UNLIKELY(!fs_ptr)) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		fs_free = fs_ptr; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* scan the input record to count the fields */ | 
					
						
							|  |  |  | 	if (fs_len == 5 && fs_ptr[0] ==  HAWK_T('?')) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2019-12-31 15:52:28 +00:00
										 |  |  | 		if (hawk_ooecs_ncpy(&rtx->inrec.linew, HAWK_OOECS_PTR(&rtx->inrec.line), HAWK_OOECS_LEN(&rtx->inrec.line)) == (hawk_oow_t)-1) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2019-12-31 15:52:28 +00:00
										 |  |  | 			if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		px = HAWK_OOECS_PTR(&rtx->inrec.linew); | 
					
						
							|  |  |  | 		how = 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		px = HAWK_OOECS_PTR(&rtx->inrec.line); | 
					
						
							|  |  |  | 		how = (fs_len <= 1)? 0: 2; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 	p = px; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	len = HAWK_OOECS_LEN(&rtx->inrec.line); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | 	nflds = 0; | 
					
						
							|  |  |  | 	while (p != HAWK_NULL) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		switch (how) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			case 0: | 
					
						
							| 
									
										
										
										
											2020-11-13 02:50:20 +00:00
										 |  |  | 				p = hawk_rtx_tokoocharswithoochars (rtx, p, len, fs_ptr, fs_len, &tok); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 1: | 
					
						
							|  |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			default: | 
					
						
							| 
									
										
										
										
											2020-11-13 02:50:20 +00:00
										 |  |  | 				p = hawk_rtx_tokoocharsbyrex( | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 					rtx, | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 					HAWK_OOECS_PTR(&rtx->inrec.line), | 
					
						
							|  |  |  | 					HAWK_OOECS_LEN(&rtx->inrec.line), | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 					p, len, | 
					
						
							| 
									
										
										
										
											2019-12-19 09:11:40 +00:00
										 |  |  | 					rtx->gbl.fs[rtx->gbl.ignorecase], &tok | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2019-12-19 09:11:40 +00:00
										 |  |  | 				if (p == HAWK_NULL && hawk_rtx_geterrnum(rtx) != HAWK_ENOERR) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2019-12-19 09:11:40 +00:00
										 |  |  | 					if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (nflds == 0 && p == HAWK_NULL && tok.len == 0) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			/* there are no fields. it can just return here
 | 
					
						
							|  |  |  | 			 * as hawk_rtx_clrrec has been called before this */ | 
					
						
							|  |  |  | 			if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-01 23:48:42 +09:00
										 |  |  | 		HAWK_ASSERT((tok.ptr != HAWK_NULL && tok.len > 0) || tok.len == 0); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		nflds++; | 
					
						
							|  |  |  | 		len = HAWK_OOECS_LEN(&rtx->inrec.line) - (p - HAWK_OOECS_PTR(&rtx->inrec.line)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* allocate space */ | 
					
						
							|  |  |  | 	if (nflds > rtx->inrec.maxflds) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		void* tmp = hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*rtx->inrec.flds) * nflds); | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		if (HAWK_UNLIKELY(!tmp)) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (rtx->inrec.flds) hawk_rtx_freemem (rtx, rtx->inrec.flds); | 
					
						
							|  |  |  | 		rtx->inrec.flds = tmp; | 
					
						
							|  |  |  | 		rtx->inrec.maxflds = nflds; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* scan again and split it */ | 
					
						
							|  |  |  | 	if (how == 1) | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2019-12-31 15:52:28 +00:00
										 |  |  | 		if (hawk_ooecs_ncpy(&rtx->inrec.linew, HAWK_OOECS_PTR(&rtx->inrec.line), HAWK_OOECS_LEN(&rtx->inrec.line)) == (hawk_oow_t)-1) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		px = HAWK_OOECS_PTR(&rtx->inrec.linew): | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		px = HAWK_OOECS_PTR(&rtx->inrec.line); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 	p = px; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	len = HAWK_OOECS_LEN(&rtx->inrec.line); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-06 07:43:53 +00:00
										 |  |  | 	while (p) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		switch (how) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			case 0: | 
					
						
							|  |  |  | 				/* 1 character FS */ | 
					
						
							| 
									
										
										
										
											2020-11-13 02:50:20 +00:00
										 |  |  | 				p = hawk_rtx_tokoocharswithoochars(rtx, p, len, fs_ptr, fs_len, &tok); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			case 1: | 
					
						
							|  |  |  | 				/* 5 character FS beginning with ? */ | 
					
						
							| 
									
										
										
										
											2020-11-13 02:50:20 +00:00
										 |  |  | 				p = hawk_rtx_fldoochars(rtx, p, len, fs_ptr[1], fs_ptr[2], fs_ptr[3], fs_ptr[4], &tok); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				/* all other cases */ | 
					
						
							| 
									
										
										
										
											2020-11-13 02:50:20 +00:00
										 |  |  | 				p = hawk_rtx_tokoocharsbyrex( | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 					rtx, | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 					HAWK_OOECS_PTR(&rtx->inrec.line), | 
					
						
							|  |  |  | 					HAWK_OOECS_LEN(&rtx->inrec.line), | 
					
						
							|  |  |  | 					p, len, | 
					
						
							| 
									
										
										
										
											2019-12-19 09:11:40 +00:00
										 |  |  | 					rtx->gbl.fs[rtx->gbl.ignorecase], &tok | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 				); | 
					
						
							| 
									
										
										
										
											2019-12-19 09:11:40 +00:00
										 |  |  | 				if (p == HAWK_NULL && hawk_rtx_geterrnum(rtx) != HAWK_ENOERR) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 				{ | 
					
						
							| 
									
										
										
										
											2019-12-19 09:11:40 +00:00
										 |  |  | 					if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 					return -1; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | #if 1
 | 
					
						
							|  |  |  | 		if (rtx->inrec.nflds == 0 && p == HAWK_NULL && tok.len == 0) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			/* there are no fields. it can just return here
 | 
					
						
							|  |  |  | 			 * as hawk_rtx_clrrec has been called before this */ | 
					
						
							|  |  |  | 			if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							|  |  |  | 			return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-01 23:48:42 +09:00
										 |  |  | 		HAWK_ASSERT((tok.ptr != HAWK_NULL && tok.len > 0) || tok.len == 0); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if 1
 | 
					
						
							|  |  |  | 		if (rtx->inrec.nflds >= rtx->inrec.maxflds) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			void* tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (rtx->inrec.nflds < 16) nflds = 32; | 
					
						
							|  |  |  | 			else nflds = rtx->inrec.nflds * 2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			tmp = hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*rtx->inrec.flds) * nflds); | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 			if (tmp == HAWK_NULL) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 			{ | 
					
						
							|  |  |  | 				if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							|  |  |  | 				return -1; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 			if (rtx->inrec.flds != HAWK_NULL) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 			{ | 
					
						
							|  |  |  | 				HAWK_MEMCPY (tmp, rtx->inrec.flds, HAWK_SIZEOF(*rtx->inrec.flds) * rtx->inrec.nflds); | 
					
						
							|  |  |  | 				hawk_rtx_freemem (rtx, rtx->inrec.flds); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			rtx->inrec.flds = tmp; | 
					
						
							|  |  |  | 			rtx->inrec.maxflds = nflds; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		rtx->inrec.flds[rtx->inrec.nflds].ptr = tok.ptr; | 
					
						
							|  |  |  | 		rtx->inrec.flds[rtx->inrec.nflds].len = tok.len; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		/*rtx->inrec.flds[rtx->inrec.nflds].val = hawk_rtx_makenstrvalwithoocs(rtx, &tok);*/ | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 		rtx->inrec.flds[rtx->inrec.nflds].val = | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			prefer_number? hawk_rtx_makenumorstrvalwithoochars(rtx, tok.ptr, tok.len): | 
					
						
							|  |  |  | 			               hawk_rtx_makestrvalwithoochars(rtx, tok.ptr, tok.len); | 
					
						
							|  |  |  | 		if (HAWK_UNLIKELY(!rtx->inrec.flds[rtx->inrec.nflds].val)) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		hawk_rtx_refupval (rtx, rtx->inrec.flds[rtx->inrec.nflds].val); | 
					
						
							|  |  |  | 		rtx->inrec.nflds++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		len = HAWK_OOECS_LEN(&rtx->inrec.line) - (p - px); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (fs_free) hawk_rtx_freemem (rtx, fs_free); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* set the number of fields */ | 
					
						
							|  |  |  | 	v = hawk_rtx_makeintval(rtx, (hawk_int_t)rtx->inrec.nflds); | 
					
						
							|  |  |  | 	if (v == HAWK_NULL) return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hawk_rtx_refupval (rtx, v); | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 	if (hawk_rtx_setgbl(rtx, HAWK_GBL_NF, v) <= -1) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		hawk_rtx_refdownval (rtx, v); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	hawk_rtx_refdownval (rtx, v); | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | int hawk_rtx_clrrec (hawk_rtx_t* rtx, int skip_inrec_line) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	hawk_oow_t i; | 
					
						
							|  |  |  | 	int n = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	if (HAWK_RTX_GETVALTYPE(rtx, rtx->inrec.d0) != HAWK_VAL_NIL) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		hawk_rtx_refdownval (rtx, rtx->inrec.d0); | 
					
						
							|  |  |  | 		rtx->inrec.d0 = hawk_val_nil; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	if (rtx->inrec.nflds > 0) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2025-10-01 23:48:42 +09:00
										 |  |  | 		HAWK_ASSERT(rtx->inrec.flds != HAWK_NULL); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 		for (i = 0; i < rtx->inrec.nflds; i++) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2025-10-01 23:48:42 +09:00
										 |  |  | 			HAWK_ASSERT(rtx->inrec.flds[i].val != HAWK_NULL); | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			hawk_rtx_refdownval (rtx, rtx->inrec.flds[i].val); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		rtx->inrec.nflds = 0; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		if (hawk_rtx_setgbl(rtx, HAWK_GBL_NF, HAWK_VAL_ZERO) <= -1) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 			/* first of all, this should never happen.
 | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 			 * if it happened, it would return an error | 
					
						
							|  |  |  | 			 * after all the clearance tasks */ | 
					
						
							|  |  |  | 			n = -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-01 23:48:42 +09:00
										 |  |  | 	HAWK_ASSERT(rtx->inrec.nflds == 0); | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	if (!skip_inrec_line) hawk_ooecs_clear (&rtx->inrec.line); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return n; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | static int recomp_record_fields (hawk_rtx_t* rtx, hawk_oow_t lv, const hawk_oocs_t* str, int prefer_number) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	hawk_val_t* v; | 
					
						
							|  |  |  | 	hawk_oow_t max, i, nflds; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 	/* recomposes the record and the fields when $N has been assigned
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	 * a new value and recomputes NF accordingly. | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 	 * | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	 * BEGIN { OFS=":" } { $2 = "Q"; print $0; } | 
					
						
							|  |  |  | 	 * If input is abc def xxx, $0 becomes abc:Q:xxx. | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 	 * | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	 * We should store the value in rtx->inrec.line so that the caller | 
					
						
							|  |  |  | 	 * can use it to make a value for $0. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-01 23:48:42 +09:00
										 |  |  | 	HAWK_ASSERT(lv > 0); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	max = (lv > rtx->inrec.nflds)? lv: rtx->inrec.nflds; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	nflds = rtx->inrec.nflds; | 
					
						
							|  |  |  | 	if (max > rtx->inrec.maxflds) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		void* tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* if the given field number is greater than the maximum
 | 
					
						
							|  |  |  | 		 * number of fields that the current record can hold, | 
					
						
							|  |  |  | 		 * the field spaces are resized */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		tmp = hawk_rtx_reallocmem(rtx, rtx->inrec.flds, HAWK_SIZEOF(*rtx->inrec.flds) * max); | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		if (HAWK_UNLIKELY(!tmp)) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		rtx->inrec.flds = tmp; | 
					
						
							|  |  |  | 		rtx->inrec.maxflds = max; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	lv = lv - 1; /* adjust the value to 0-based index */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hawk_ooecs_clear (&rtx->inrec.line); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (i = 0; i < max; i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (i > 0) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2019-12-31 15:52:28 +00:00
										 |  |  | 			if (hawk_ooecs_ncat(&rtx->inrec.line, rtx->gbl.ofs.ptr, rtx->gbl.ofs.len) == (hawk_oow_t)-1) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (i == lv) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			hawk_val_t* tmp; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			rtx->inrec.flds[i].ptr = HAWK_OOECS_PTR(&rtx->inrec.line) + HAWK_OOECS_LEN(&rtx->inrec.line); | 
					
						
							|  |  |  | 			rtx->inrec.flds[i].len = str->len; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-31 15:52:28 +00:00
										 |  |  | 			if (hawk_ooecs_ncat(&rtx->inrec.line, str->ptr, str->len) == (hawk_oow_t)-1) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			tmp = prefer_number? hawk_rtx_makenumorstrvalwithoochars(rtx, str->ptr, str->len): | 
					
						
							|  |  |  | 			                     hawk_rtx_makestrvalwithoochars(rtx, str->ptr, str->len); | 
					
						
							|  |  |  | 			if (HAWK_UNLIKELY(!tmp)) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			if (i < nflds) hawk_rtx_refdownval (rtx, rtx->inrec.flds[i].val); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 			else rtx->inrec.nflds++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			rtx->inrec.flds[i].val = tmp; | 
					
						
							|  |  |  | 			hawk_rtx_refupval (rtx, tmp); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else if (i >= nflds) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			rtx->inrec.flds[i].ptr = HAWK_OOECS_PTR(&rtx->inrec.line) + HAWK_OOECS_LEN(&rtx->inrec.line); | 
					
						
							|  |  |  | 			rtx->inrec.flds[i].len = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-31 15:52:28 +00:00
										 |  |  | 			if (hawk_ooecs_cat(&rtx->inrec.line, HAWK_T("")) == (hawk_oow_t)-1) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 			/* hawk_rtx_refdownval should not be called over
 | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 			 * rtx->inrec.flds[i].val as it is not initialized | 
					
						
							|  |  |  | 			 * to any valid values */ | 
					
						
							|  |  |  | 			/*hawk_rtx_refdownval (rtx, rtx->inrec.flds[i].val);*/ | 
					
						
							|  |  |  | 			rtx->inrec.flds[i].val = hawk_val_zls; | 
					
						
							|  |  |  | 			hawk_rtx_refupval (rtx, hawk_val_zls); | 
					
						
							|  |  |  | 			rtx->inrec.nflds++; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			hawk_ooch_t* vp; | 
					
						
							|  |  |  | 			hawk_oow_t vl; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			vp = hawk_rtx_getvaloocstr(rtx, rtx->inrec.flds[i].val, &vl); | 
					
						
							|  |  |  | 			if (HAWK_UNLIKELY(!vp)) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			vl = hawk_ooecs_ncat(&rtx->inrec.line, vp, vl); | 
					
						
							|  |  |  | 			hawk_rtx_freevaloocstr (rtx, rtx->inrec.flds[i].val, vp); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 			if (HAWK_UNLIKELY(vl == (hawk_oow_t)-1)) return -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	v = hawk_rtx_getgbl(rtx, HAWK_GBL_NF); | 
					
						
							| 
									
										
										
										
											2025-10-01 23:48:42 +09:00
										 |  |  | 	HAWK_ASSERT(HAWK_RTX_GETVALTYPE(rtx, v) == HAWK_VAL_INT); | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	if (HAWK_RTX_GETINTFROMVAL(rtx, v) != max) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		v = hawk_rtx_makeintval (rtx, (hawk_int_t)max); | 
					
						
							|  |  |  | 		if (v == HAWK_NULL) return -1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		hawk_rtx_refupval (rtx, v); | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 		if (hawk_rtx_setgbl(rtx, HAWK_GBL_NF, v) <= -1) | 
					
						
							| 
									
										
										
										
											2019-12-13 04:29:58 +00:00
										 |  |  | 		{ | 
					
						
							|  |  |  | 			hawk_rtx_refdownval (rtx, v); | 
					
						
							|  |  |  | 			return -1; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		hawk_rtx_refdownval (rtx, v); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | int hawk_rtx_truncrec (hawk_rtx_t* rtx, hawk_oow_t nflds) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-12-07 16:22:39 +00:00
										 |  |  | 	hawk_val_t* v = HAWK_NULL, * w; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	hawk_ooch_t* ofs_free = HAWK_NULL, * ofs_ptr; | 
					
						
							|  |  |  | 	hawk_oow_t ofs_len, i; | 
					
						
							|  |  |  | 	hawk_val_type_t vtype; | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 	hawk_ooecs_t tmp; | 
					
						
							|  |  |  | 	int fini_tmp = 0; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-10-01 23:48:42 +09:00
										 |  |  | 	HAWK_ASSERT(nflds <= rtx->inrec.nflds); | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-07 16:22:39 +00:00
										 |  |  | 	if (hawk_ooecs_init(&tmp, hawk_rtx_getgem(rtx), HAWK_OOECS_LEN(&rtx->inrec.line)) <= -1) goto oops; | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 	fini_tmp = 1; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 	if (nflds > 0) | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 		if (nflds > 1) | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 			v = HAWK_RTX_STACK_GBL(rtx, HAWK_GBL_OFS); | 
					
						
							|  |  |  | 			hawk_rtx_refupval (rtx, v); | 
					
						
							|  |  |  | 			vtype = HAWK_RTX_GETVALTYPE(rtx, v); | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 			if (vtype == HAWK_VAL_NIL) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				/* OFS not set */ | 
					
						
							|  |  |  | 				ofs_ptr = HAWK_T(" "); | 
					
						
							|  |  |  | 				ofs_len = 1; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				ofs_ptr = hawk_rtx_getvaloocstr(rtx, v, &ofs_len); | 
					
						
							|  |  |  | 				if (HAWK_UNLIKELY(!ofs_ptr)) goto oops; | 
					
						
							|  |  |  | 				ofs_free = ofs_ptr; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2024-05-02 22:47:30 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 		if (hawk_ooecs_ncat(&tmp, rtx->inrec.flds[0].ptr, rtx->inrec.flds[0].len) == (hawk_oow_t)-1) goto oops; | 
					
						
							|  |  |  | 		for (i = 1; i < nflds; i++) | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 			if (i > 0 && hawk_ooecs_ncat(&tmp,ofs_ptr,ofs_len) == (hawk_oow_t)-1) goto oops; | 
					
						
							|  |  |  | 			if (hawk_ooecs_ncat(&tmp, rtx->inrec.flds[i].ptr, rtx->inrec.flds[i].len) == (hawk_oow_t)-1) goto oops; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 		if (v) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			if (ofs_free) hawk_rtx_freevaloocstr (rtx, v, ofs_free); | 
					
						
							|  |  |  | 			hawk_rtx_refdownval(rtx, v); | 
					
						
							|  |  |  | 			v = HAWK_NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-12-07 16:22:39 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-07 16:22:39 +00:00
										 |  |  | 	w = (hawk_val_t*)hawk_rtx_makestrvalwithoocs(rtx, HAWK_OOECS_OOCS(&tmp)); | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 	if (HAWK_UNLIKELY(!w)) goto oops; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 	hawk_rtx_refdownval (rtx, rtx->inrec.d0); | 
					
						
							| 
									
										
										
										
											2020-12-07 16:22:39 +00:00
										 |  |  | 	rtx->inrec.d0 = w; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 	hawk_rtx_refupval (rtx, rtx->inrec.d0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	hawk_ooecs_swap (&tmp, &rtx->inrec.line); | 
					
						
							|  |  |  | 	hawk_ooecs_fini (&tmp); | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 	fini_tmp = 0; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for (i = nflds; i < rtx->inrec.nflds; i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		hawk_rtx_refdownval (rtx, rtx->inrec.flds[i].val); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rtx->inrec.nflds = nflds; | 
					
						
							|  |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2020-12-07 16:22:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | oops: | 
					
						
							| 
									
										
										
										
											2020-12-07 16:48:29 +00:00
										 |  |  | 	if (fini_tmp) hawk_ooecs_fini (&tmp); | 
					
						
							| 
									
										
										
										
											2020-12-07 16:22:39 +00:00
										 |  |  | 	if (v) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (ofs_free) hawk_rtx_freevaloocstr (rtx, v, ofs_free); | 
					
						
							|  |  |  | 		hawk_rtx_refdownval(rtx, v); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return -1; | 
					
						
							| 
									
										
										
										
											2020-03-08 15:04:47 +00:00
										 |  |  | } |