*** empty log message ***
This commit is contained in:
		
							
								
								
									
										100
									
								
								ase/awk/run.c
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								ase/awk/run.c
									
									
									
									
									
								
							@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * $Id: run.c,v 1.126 2006-07-07 09:48:23 bacon Exp $
 | 
					 * $Id: run.c,v 1.127 2006-07-09 16:06:04 bacon Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xp/awk/awk_i.h>
 | 
					#include <xp/awk/awk_i.h>
 | 
				
			||||||
@ -160,7 +160,7 @@ static void __raw_pop_times (xp_awk_run_t* run, xp_size_t times);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static int __read_record (xp_awk_run_t* run);
 | 
					static int __read_record (xp_awk_run_t* run);
 | 
				
			||||||
static int __split_record (xp_awk_run_t* run);
 | 
					static int __split_record (xp_awk_run_t* run);
 | 
				
			||||||
static void __clear_record (xp_awk_run_t* run);
 | 
					static void __clear_record (xp_awk_run_t* run, xp_bool_t noline);
 | 
				
			||||||
static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r);
 | 
					static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r);
 | 
				
			||||||
static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde);
 | 
					static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -306,7 +306,7 @@ static void __close_run (xp_awk_run_t* run)
 | 
				
			|||||||
	xp_awk_map_close (&run->named);
 | 
						xp_awk_map_close (&run->named);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* destroy input record */
 | 
						/* destroy input record */
 | 
				
			||||||
	__clear_record (run);
 | 
						__clear_record (run, xp_false);
 | 
				
			||||||
	if (run->inrec.flds != XP_NULL) 
 | 
						if (run->inrec.flds != XP_NULL) 
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		xp_free (run->inrec.flds);
 | 
							xp_free (run->inrec.flds);
 | 
				
			||||||
@ -1751,6 +1751,7 @@ static xp_awk_val_t* __do_assignment_pos (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (n == -1) PANIC (run, XP_AWK_EPOSIDX);
 | 
						if (n == -1) PANIC (run, XP_AWK_EPOSIDX);
 | 
				
			||||||
	if (n == 1) lv = (xp_long_t)rv;
 | 
						if (n == 1) lv = (xp_long_t)rv;
 | 
				
			||||||
 | 
						if (lv < 0) PANIC (run, XP_AWK_EPOSIDX);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* convert the value to the string */
 | 
						/* convert the value to the string */
 | 
				
			||||||
	str = xp_awk_valtostr (val, &errnum, XP_NULL);
 | 
						str = xp_awk_valtostr (val, &errnum, XP_NULL);
 | 
				
			||||||
@ -1758,7 +1759,7 @@ static xp_awk_val_t* __do_assignment_pos (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (lv == 0)
 | 
						if (lv == 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		__clear_record (run);
 | 
							__clear_record (run, xp_false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (xp_str_cpy (&run->inrec.line, str) == (xp_size_t)-1)
 | 
							if (xp_str_cpy (&run->inrec.line, str) == (xp_size_t)-1)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
@ -1770,50 +1771,80 @@ static xp_awk_val_t* __do_assignment_pos (
 | 
				
			|||||||
		xp_awk_refdownval (run, run->inrec.d0);
 | 
							xp_awk_refdownval (run, run->inrec.d0);
 | 
				
			||||||
		run->inrec.d0 = val;
 | 
							run->inrec.d0 = val;
 | 
				
			||||||
		xp_awk_refupval (val);
 | 
							xp_awk_refupval (val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (__split_record (run) == -1) 
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								__clear_record (run, xp_false);
 | 
				
			||||||
 | 
								return XP_NULL;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		/*__clear_record (run, without_destroying_line);*/
 | 
							xp_char_t* ptr;
 | 
				
			||||||
 | 
							xp_size_t len;
 | 
				
			||||||
 | 
							xp_long_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* TODO: handle out of bound index... */
 | 
							xp_str_clear (&run->inrec.line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* TODO: reimplement this entire function ........... */
 | 
							for (i = 0; i < lv - 1; i++)
 | 
				
			||||||
/* what schecm should i use to support $n = value where n is not zero ? */
 | 
							{
 | 
				
			||||||
/* should i use run->inrec.line to recompose $0 and adjust other fileds? */
 | 
								ptr = XP_T(""); len = 0;
 | 
				
			||||||
/* or should $0 be composed of fidls separated by FS? if so, what should i
 | 
								if (i < run->inrec.nflds)
 | 
				
			||||||
 * do when FS is a regular expression??? */
 | 
								{
 | 
				
			||||||
 | 
									ptr = run->inrec.flds[i].ptr;
 | 
				
			||||||
 | 
									len = run->inrec.flds[i].len;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if 0
 | 
								/* TODO: use OFS for record recomputation */
 | 
				
			||||||
		if (xp_str_rpl (&run->inrec.line, 
 | 
								if ((i > 0 && xp_str_ccat (&run->inrec.line, XP_T(' ')) == (xp_size_t)-1) ||
 | 
				
			||||||
			run->inrec.flds[lv].ptr, 
 | 
								    xp_str_ncat (&run->inrec.line, ptr, len) == (xp_size_t)-1)
 | 
				
			||||||
			run->inrec.flds[lv].len, str) == (xp_size_t)-1)
 | 
								{
 | 
				
			||||||
 | 
									xp_free (str);
 | 
				
			||||||
 | 
									__clear_record (run, xp_false);
 | 
				
			||||||
 | 
									PANIC (run, XP_AWK_ENOMEM);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (xp_str_cat (&run->inrec.line, str) == (xp_size_t)-1)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			xp_free (str);
 | 
								xp_free (str);
 | 
				
			||||||
			/* TODO: clear $0 .. $NF */
 | 
								__clear_record (run, xp_false);
 | 
				
			||||||
			PANIC (run, XP_AWK_ENOMEM);
 | 
								PANIC (run, XP_AWK_ENOMEM);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		xp_free (str);
 | 
							xp_free (str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		v = xp_awk_makestrval (
 | 
							for (i = lv; i < run->inrec.nflds; i++)
 | 
				
			||||||
			XP_STR_BUF(&run->inrec.line),
 | 
							{
 | 
				
			||||||
			XP_STR_LEN(&run->inrec.line));
 | 
								ptr = XP_T(""); len = 0;
 | 
				
			||||||
 | 
								if (i < run->inrec.nflds)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									ptr = run->inrec.flds[i].ptr;
 | 
				
			||||||
 | 
									len = run->inrec.flds[i].len;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* TODO: use OFS for record recomputation */
 | 
				
			||||||
 | 
								if (xp_str_ccat (&run->inrec.line, XP_T(' ')) == (xp_size_t)-1 ||
 | 
				
			||||||
 | 
								    xp_str_ncat (&run->inrec.line, ptr, len) == (xp_size_t)-1)
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									__clear_record (run, xp_false);
 | 
				
			||||||
 | 
									PANIC (run, XP_AWK_ENOMEM);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							v = xp_awk_makestrval (XP_STR_BUF(&run->inrec.line), XP_STR_LEN(&run->inrec.line));
 | 
				
			||||||
		if (v == XP_NULL)
 | 
							if (v == XP_NULL)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			/* TODO: clear $0 .. $NF */
 | 
								__clear_record (run, xp_false);
 | 
				
			||||||
			PANIC (run, XP_AWK_ENOMEM);
 | 
								PANIC (run, XP_AWK_ENOMEM);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		xp_awk_refdownval (run, run->inrec.d0);
 | 
							xp_awk_refdownval (run, run->inrec.d0);
 | 
				
			||||||
		run->inrec.d0 = v;
 | 
							run->inrec.d0 = val;
 | 
				
			||||||
		xp_awk_refupval (v);
 | 
							xp_awk_refupval (val);
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (__split_record (run) == -1) 
 | 
							/* TODO: adjust fields */
 | 
				
			||||||
	{
 | 
					 | 
				
			||||||
		__clear_record (run);
 | 
					 | 
				
			||||||
		return XP_NULL;
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return val;
 | 
						return val;
 | 
				
			||||||
@ -3460,6 +3491,7 @@ static xp_awk_val_t* __eval_pos (xp_awk_run_t* run, xp_awk_nde_t* nde)
 | 
				
			|||||||
	if (n == -1) PANIC (run, XP_AWK_EPOSIDX);
 | 
						if (n == -1) PANIC (run, XP_AWK_EPOSIDX);
 | 
				
			||||||
	if (n == 1) lv = (xp_long_t)rv;
 | 
						if (n == 1) lv = (xp_long_t)rv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (lv < 0) PANIC (run, XP_AWK_EPOSIDX);
 | 
				
			||||||
	if (lv == 0) v = run->inrec.d0;
 | 
						if (lv == 0) v = run->inrec.d0;
 | 
				
			||||||
	else if (lv > 0 && lv <= run->inrec.nflds) 
 | 
						else if (lv > 0 && lv <= run->inrec.nflds) 
 | 
				
			||||||
		v = run->inrec.flds[lv-1].val;
 | 
							v = run->inrec.flds[lv-1].val;
 | 
				
			||||||
@ -3592,7 +3624,7 @@ static int __read_record (xp_awk_run_t* run)
 | 
				
			|||||||
	xp_char_t c;
 | 
						xp_char_t c;
 | 
				
			||||||
	xp_awk_val_t* v;
 | 
						xp_awk_val_t* v;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	__clear_record (run);
 | 
						__clear_record (run, xp_false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (1)
 | 
						while (1)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
@ -3636,7 +3668,7 @@ static int __read_record (xp_awk_run_t* run)
 | 
				
			|||||||
		XP_STR_LEN(&run->inrec.line));
 | 
							XP_STR_LEN(&run->inrec.line));
 | 
				
			||||||
	if (v == XP_NULL)
 | 
						if (v == XP_NULL)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		__clear_record (run);
 | 
							__clear_record (run, xp_false);
 | 
				
			||||||
		PANIC_I (run, XP_AWK_ENOMEM);
 | 
							PANIC_I (run, XP_AWK_ENOMEM);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3648,7 +3680,7 @@ static int __read_record (xp_awk_run_t* run)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (__split_record (run) == -1) 
 | 
						if (__split_record (run) == -1) 
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		__clear_record (run);
 | 
							__clear_record (run, xp_false);
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3715,7 +3747,7 @@ static int __split_record (xp_awk_run_t* run)
 | 
				
			|||||||
			xp_awk_makestrval (tok, tok_len);
 | 
								xp_awk_makestrval (tok, tok_len);
 | 
				
			||||||
		if (run->inrec.flds[run->inrec.nflds].val == XP_NULL)
 | 
							if (run->inrec.flds[run->inrec.nflds].val == XP_NULL)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			__clear_record (run);
 | 
								__clear_record (run, xp_false);
 | 
				
			||||||
			PANIC_I (run, XP_AWK_ENOMEM);
 | 
								PANIC_I (run, XP_AWK_ENOMEM);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3730,7 +3762,7 @@ static int __split_record (xp_awk_run_t* run)
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __clear_record (xp_awk_run_t* run)
 | 
					static void __clear_record (xp_awk_run_t* run, xp_bool_t noline)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	xp_size_t i;
 | 
						xp_size_t i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -3750,7 +3782,7 @@ static void __clear_record (xp_awk_run_t* run)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	xp_assert (run->inrec.nflds == 0);
 | 
						xp_assert (run->inrec.nflds == 0);
 | 
				
			||||||
	xp_str_clear (&run->inrec.line);
 | 
						if (!noline) xp_str_clear (&run->inrec.line);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r)
 | 
					static int __val_to_num (xp_awk_val_t* v, xp_long_t* l, xp_real_t* r)
 | 
				
			||||||
 | 
				
			|||||||
@ -21,10 +21,11 @@ END
 | 
				
			|||||||
	//$3 = "10";
 | 
						//$3 = "10";
 | 
				
			||||||
	//print $0, $2, $5;
 | 
						//print $0, $2, $5;
 | 
				
			||||||
	//print $0 = "wow this is just a test";
 | 
						//print $0 = "wow this is just a test";
 | 
				
			||||||
	print $0 = "";
 | 
						//print $0 = "";
 | 
				
			||||||
	//print $0;
 | 
						//print $0;
 | 
				
			||||||
 | 
						$1="abcdefghi";
 | 
				
			||||||
	print a = $6;
 | 
						print a = $6;
 | 
				
			||||||
	print a;
 | 
						print "[" $0 "],[" a "]";
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	print $6;
 | 
						print $6;
 | 
				
			||||||
	*/
 | 
						*/
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user