fixed wrong field names in cmn/fs.c
fixed a memory leak bug in run_printf of awk/run.c
This commit is contained in:
		@ -2839,8 +2839,8 @@ static int run_reset (qse_awk_rtx_t* rtx, qse_awk_nde_reset_t* nde)
 | 
			
		||||
static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
{
 | 
			
		||||
	qse_char_t* out = QSE_NULL;
 | 
			
		||||
	qse_awk_val_t* out_v = QSE_NULL;
 | 
			
		||||
	const qse_char_t* dst;
 | 
			
		||||
	qse_awk_val_t* v;
 | 
			
		||||
	int n, xret = 0;
 | 
			
		||||
 | 
			
		||||
	QSE_ASSERT (
 | 
			
		||||
@ -2851,35 +2851,24 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
		(nde->out_type == QSE_AWK_OUT_CONSOLE && nde->out == QSE_NULL));
 | 
			
		||||
 | 
			
		||||
	/* check if destination has been specified. */
 | 
			
		||||
	if (nde->out != QSE_NULL)
 | 
			
		||||
	if (nde->out)
 | 
			
		||||
	{
 | 
			
		||||
		qse_awk_rtx_valtostr_out_t vsout;
 | 
			
		||||
		qse_size_t len;
 | 
			
		||||
 | 
			
		||||
		/* if so, resolve the destination name */
 | 
			
		||||
		v = eval_expression (rtx, nde->out);
 | 
			
		||||
		if (v == QSE_NULL) return -1;
 | 
			
		||||
		out_v = eval_expression (rtx, nde->out);
 | 
			
		||||
		if (!out_v) return -1;
 | 
			
		||||
 | 
			
		||||
		qse_awk_rtx_refupval (rtx, v);
 | 
			
		||||
		qse_awk_rtx_refupval (rtx, out_v);
 | 
			
		||||
 | 
			
		||||
		vsout.type = QSE_AWK_RTX_VALTOSTR_CPLDUP;
 | 
			
		||||
		if (qse_awk_rtx_valtostr (rtx, v, &vsout) <= -1)
 | 
			
		||||
		{
 | 
			
		||||
			qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
			ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
		out = vsout.u.cpldup.ptr;
 | 
			
		||||
		len = vsout.u.cpldup.len;
 | 
			
		||||
 | 
			
		||||
		qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
		out = qse_awk_rtx_getvalstr (rtx, out_v, &len);
 | 
			
		||||
		if (!out) goto oops;
 | 
			
		||||
 | 
			
		||||
		if (len <= 0) 
 | 
			
		||||
		{
 | 
			
		||||
			/* the destination name is empty */
 | 
			
		||||
			QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
			SETERR_LOC (rtx, QSE_AWK_EIONMEM, &nde->loc);
 | 
			
		||||
			return -1;
 | 
			
		||||
			goto oops;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* it needs to check if the destination name contains
 | 
			
		||||
@ -2896,8 +2885,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
					out, qse_strlen(out), &nde->loc);
 | 
			
		||||
 | 
			
		||||
				/* if so, it skips writing */
 | 
			
		||||
				QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
				return -1;
 | 
			
		||||
				goto oops_1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -2906,7 +2894,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
	dst = (out == QSE_NULL)? QSE_T(""): out;
 | 
			
		||||
 | 
			
		||||
	/* check if print is followed by any arguments */
 | 
			
		||||
	if (nde->args == QSE_NULL)
 | 
			
		||||
	if (!nde->args)
 | 
			
		||||
	{
 | 
			
		||||
		/* if it doesn't have any arguments, print the entire 
 | 
			
		||||
		 * input record */
 | 
			
		||||
@ -2922,9 +2910,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				if (out) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
				ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
				return -1;
 | 
			
		||||
				goto oops;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -2933,6 +2919,7 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
		/* if it has any arguments, print the arguments separated by
 | 
			
		||||
		 * the value OFS */
 | 
			
		||||
		qse_awk_nde_t* head, * np;
 | 
			
		||||
		qse_awk_val_t* v;
 | 
			
		||||
 | 
			
		||||
		if (nde->args->type == QSE_AWK_NDE_GRP)
 | 
			
		||||
		{
 | 
			
		||||
@ -2958,23 +2945,18 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
					{
 | 
			
		||||
						if (out) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
						ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
						return -1;
 | 
			
		||||
						goto oops;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			v = eval_expression (rtx, np);
 | 
			
		||||
			if (v == QSE_NULL) 
 | 
			
		||||
			{
 | 
			
		||||
				if (out) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
				return -1;
 | 
			
		||||
			}
 | 
			
		||||
			qse_awk_rtx_refupval (rtx, v);
 | 
			
		||||
			if (v == QSE_NULL) goto oops_1;
 | 
			
		||||
 | 
			
		||||
			qse_awk_rtx_refupval (rtx, v);
 | 
			
		||||
			n = qse_awk_rtx_writeio_val (rtx, nde->out_type, dst, v);
 | 
			
		||||
			qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
 | 
			
		||||
			n = qse_awk_rtx_writeio_val (
 | 
			
		||||
				rtx, nde->out_type, dst, v);
 | 
			
		||||
			if (n <= -1 /*&& rtx->errinf.num != QSE_AWK_EIOIMPL*/) 
 | 
			
		||||
			{
 | 
			
		||||
				if (rtx->awk->opt.trait & QSE_AWK_TOLERANT)
 | 
			
		||||
@ -2983,14 +2965,9 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
				{
 | 
			
		||||
					if (out) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
					qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
					ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
					return -1;
 | 
			
		||||
					goto oops;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@ -3006,26 +2983,39 @@ static int run_print (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			if (out) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
			ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
			return -1;
 | 
			
		||||
			goto oops;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* unlike printf, flushio() is not needed here as print 
 | 
			
		||||
	 * inserts <NL> that triggers auto-flush */
 | 
			
		||||
	if (out_v)
 | 
			
		||||
	{
 | 
			
		||||
		if (out) qse_awk_rtx_freevalstr (rtx, out_v, out);
 | 
			
		||||
		qse_awk_rtx_refdownval (rtx, out_v);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (out) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
 | 
			
		||||
/*skip_write:*/
 | 
			
		||||
	return xret;
 | 
			
		||||
 | 
			
		||||
oops:
 | 
			
		||||
	ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
 | 
			
		||||
oops_1:
 | 
			
		||||
	if (out_v)
 | 
			
		||||
	{
 | 
			
		||||
		if (out) qse_awk_rtx_freevalstr (rtx, out_v, out);
 | 
			
		||||
		qse_awk_rtx_refdownval (rtx, out_v);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
{
 | 
			
		||||
	qse_char_t* out = QSE_NULL;
 | 
			
		||||
	const qse_char_t* dst;
 | 
			
		||||
	qse_awk_val_t* out_v = QSE_NULL;
 | 
			
		||||
	qse_awk_val_t* v;
 | 
			
		||||
	const qse_char_t* dst;
 | 
			
		||||
	qse_awk_nde_t* head;
 | 
			
		||||
	int n, xret = 0;
 | 
			
		||||
 | 
			
		||||
@ -3036,34 +3026,23 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
		(nde->out_type == QSE_AWK_OUT_APFILE && nde->out != QSE_NULL) ||
 | 
			
		||||
		(nde->out_type == QSE_AWK_OUT_CONSOLE && nde->out == QSE_NULL));
 | 
			
		||||
 | 
			
		||||
	if (nde->out != QSE_NULL)
 | 
			
		||||
	if (nde->out)
 | 
			
		||||
	{
 | 
			
		||||
		qse_size_t len;
 | 
			
		||||
		qse_awk_rtx_valtostr_out_t vsout;
 | 
			
		||||
 | 
			
		||||
		v = eval_expression (rtx, nde->out);
 | 
			
		||||
		if (v == QSE_NULL) return -1;
 | 
			
		||||
		out_v = eval_expression (rtx, nde->out);
 | 
			
		||||
		if (!out_v) return -1;
 | 
			
		||||
 | 
			
		||||
		qse_awk_rtx_refupval (rtx, v);
 | 
			
		||||
		qse_awk_rtx_refupval (rtx, out_v);
 | 
			
		||||
 | 
			
		||||
		vsout.type = QSE_AWK_RTX_VALTOSTR_CPLDUP;
 | 
			
		||||
		if (qse_awk_rtx_valtostr (rtx, v, &vsout) <= -1)
 | 
			
		||||
		{
 | 
			
		||||
			qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
			ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
		out = vsout.u.cpldup.ptr;
 | 
			
		||||
		len = vsout.u.cpldup.len;
 | 
			
		||||
 | 
			
		||||
		qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
		out = qse_awk_rtx_getvalstr (rtx, out_v, &len);
 | 
			
		||||
		if (!out) goto oops;
 | 
			
		||||
 | 
			
		||||
		if (len <= 0) 
 | 
			
		||||
		{
 | 
			
		||||
			/* the output destination name is empty. */
 | 
			
		||||
			QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
			SETERR_LOC (rtx, QSE_AWK_EIONMEM, &nde->loc);
 | 
			
		||||
			return -1;
 | 
			
		||||
			goto oops_1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		while (len > 0)
 | 
			
		||||
@ -3079,8 +3058,7 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
 | 
			
		||||
				/* the output destination name contains a null 
 | 
			
		||||
				 * character. */
 | 
			
		||||
				QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
				return -1;
 | 
			
		||||
				goto oops_1;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@ -3102,31 +3080,20 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
		"valid printf statement should have at least one argument. the parser must ensure this.");
 | 
			
		||||
 | 
			
		||||
	v = eval_expression (rtx, head);
 | 
			
		||||
	if (v == QSE_NULL) 
 | 
			
		||||
	{
 | 
			
		||||
		if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (v == QSE_NULL) goto oops_1;
 | 
			
		||||
	
 | 
			
		||||
	qse_awk_rtx_refupval (rtx, v);
 | 
			
		||||
	if (QSE_AWK_RTX_GETVALTYPE (rtx, v) != QSE_AWK_VAL_STR)
 | 
			
		||||
	{
 | 
			
		||||
		/* the remaining arguments are ignored as the format cannot 
 | 
			
		||||
		 * contain any % characters */
 | 
			
		||||
		 * contain any % characters. e.g. printf (1, "xxxx") */
 | 
			
		||||
		n = qse_awk_rtx_writeio_val (rtx, nde->out_type, dst, v);
 | 
			
		||||
		qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
 | 
			
		||||
		if (n <= -1 /*&& rtx->errinf.num != QSE_AWK_EIOIMPL*/)
 | 
			
		||||
		{
 | 
			
		||||
			if (rtx->awk->opt.trait & QSE_AWK_TOLERANT)
 | 
			
		||||
			{
 | 
			
		||||
				xret = PRINT_IOERR;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
				qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
				ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
				return -1;
 | 
			
		||||
			}
 | 
			
		||||
			if (rtx->awk->opt.trait & QSE_AWK_TOLERANT) xret = PRINT_IOERR;
 | 
			
		||||
			else goto oops;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
@ -3137,37 +3104,41 @@ static int run_printf (qse_awk_rtx_t* rtx, qse_awk_nde_print_t* nde)
 | 
			
		||||
			((qse_awk_val_str_t*)v)->val.ptr,
 | 
			
		||||
			((qse_awk_val_str_t*)v)->val.len,
 | 
			
		||||
			head->next);
 | 
			
		||||
 | 
			
		||||
		qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
 | 
			
		||||
		if (n <= -1)
 | 
			
		||||
		{
 | 
			
		||||
			if (n == PRINT_IOERR) xret = n;
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
				if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
				qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
				ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
				return -1;
 | 
			
		||||
			}
 | 
			
		||||
			else goto oops;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	qse_awk_rtx_refdownval (rtx, v);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*skip_write:*/
 | 
			
		||||
	if (qse_awk_rtx_flushio (rtx, nde->out_type, dst) <= -1)
 | 
			
		||||
	{
 | 
			
		||||
		if (rtx->awk->opt.trait & QSE_AWK_TOLERANT)
 | 
			
		||||
		{
 | 
			
		||||
			xret = PRINT_IOERR;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
		if (rtx->awk->opt.trait & QSE_AWK_TOLERANT) xret = PRINT_IOERR;
 | 
			
		||||
		else goto oops_1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (out_v)
 | 
			
		||||
	{
 | 
			
		||||
		if (out) qse_awk_rtx_freevalstr (rtx, out_v, out);
 | 
			
		||||
		qse_awk_rtx_refdownval (rtx, out_v);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (out != QSE_NULL) QSE_AWK_FREE (rtx->awk, out);
 | 
			
		||||
	return xret;
 | 
			
		||||
 | 
			
		||||
oops:
 | 
			
		||||
	ADJERR_LOC (rtx, &nde->loc);
 | 
			
		||||
 | 
			
		||||
oops_1:
 | 
			
		||||
	if (out_v)
 | 
			
		||||
	{
 | 
			
		||||
		if (out) qse_awk_rtx_freevalstr (rtx, out_v, out);
 | 
			
		||||
		qse_awk_rtx_refdownval (rtx, out_v);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int output_formatted (
 | 
			
		||||
 | 
			
		||||
@ -658,8 +658,8 @@ qse_fs_ent_t* qse_fs_read (qse_fs_t* fs, int flags)
 | 
			
		||||
	{
 | 
			
		||||
	#if defined(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
 | 
			
		||||
		#if defined(HAVE_STRUCT_STAT_ST_BIRTHTIM_TV_NSEC)
 | 
			
		||||
		fs->ent.time.create.secs = st.st_birthtim.tv_sec;
 | 
			
		||||
		fs->ent.time.create.nsecs = st.st_birthtim.tv_nsec;
 | 
			
		||||
		fs->ent.time.create.sec = st.st_birthtim.tv_sec;
 | 
			
		||||
		fs->ent.time.create.nsec = st.st_birthtim.tv_nsec;
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
		fs->ent.time.access.sec = st.st_atim.tv_sec;
 | 
			
		||||
 | 
			
		||||
@ -1963,7 +1963,18 @@ int qse_httpd_resolvename (qse_httpd_t* httpd, const qse_mchar_t* name, qse_http
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	HTTPD_DBGOUT1 ("Sending DNS request [%hs]\n", name);
 | 
			
		||||
#if defined(QSE_HTTPD_DEBUG)
 | 
			
		||||
	{
 | 
			
		||||
		qse_mchar_t tmp[128];
 | 
			
		||||
		if (dns_server)
 | 
			
		||||
			qse_nwadtombs (&dns_server->nwad, tmp, QSE_COUNTOF(tmp), QSE_NWADTOMBS_ALL);
 | 
			
		||||
		else
 | 
			
		||||
			qse_mbscpy (tmp, QSE_MT("default server"));
 | 
			
		||||
 | 
			
		||||
		HTTPD_DBGOUT2 ("Sending DNS request [%hs] to [%hs]\n", name, tmp);
 | 
			
		||||
	}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	return httpd->opt.scb.dns.send (httpd, &httpd->dns, name, resol, dns_server, ctx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user