added -v var=val to cmd/awk/awk.c
This commit is contained in:
		| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: err.c 199 2009-06-14 08:40:52Z hyunghwan.chung $ | ||||
|  * $Id: err.c 205 2009-06-20 12:47:34Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -88,6 +88,7 @@ const qse_char_t* qse_awk_dflerrstr (qse_awk_t* awk, qse_awk_errnum_t errnum) | ||||
| 		QSE_T("END not followed by a left bracket on the same line"), | ||||
| 		QSE_T("duplicate BEGIN"), | ||||
| 		QSE_T("duplicate END"), | ||||
| 		QSE_T("keyword '${0}' redefined"), | ||||
| 		QSE_T("intrinsic function '${0}' redefined"), | ||||
| 		QSE_T("function '${0}' redefined"), | ||||
| 		QSE_T("global variable '${0}' redefined"), | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: parse.c 204 2009-06-18 12:08:06Z hyunghwan.chung $ | ||||
|  * $Id: parse.c 205 2009-06-20 12:47:34Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -1403,12 +1403,10 @@ static void adjust_static_globals (qse_awk_t* awk) | ||||
| 		if (gtab[id].valid != 0 &&  | ||||
| 		    (awk->option & gtab[id].valid) != gtab[id].valid) | ||||
| 		{ | ||||
| 			/*awk->parse.gbls.buf[id].name.len = 0;*/ | ||||
| 			QSE_LDA_DLEN(awk->parse.gbls,id) = 0; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/*awk->parse.gbls.buf[id].name.len = gtab[id].name_len;*/ | ||||
| 			QSE_LDA_DLEN(awk->parse.gbls,id) = gtab[id].name_len; | ||||
| 		} | ||||
| 	} | ||||
| @ -1487,6 +1485,15 @@ static int add_global ( | ||||
| { | ||||
| 	qse_size_t ngbls; | ||||
|  | ||||
| 	/* check if it is a keyword */ | ||||
| 	if (classify_ident (awk, name, len) != TOKEN_IDENT) | ||||
| 	{ | ||||
| 		SETERRARG ( | ||||
| 			awk, QSE_AWK_EKWRED, awk->token.line, | ||||
| 			name, len); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	/* check if it conflict with a builtin function name */ | ||||
| 	if (qse_awk_getfnc (awk, name, len) != QSE_NULL) | ||||
| 	{ | ||||
| @ -1563,14 +1570,14 @@ int qse_awk_addgbl ( | ||||
|  | ||||
| 	if (awk->tree.ngbls > awk->tree.ngbls_base)  | ||||
| 	{ | ||||
| 		/* this function is not allow after qse_awk_parse is called */ | ||||
| 		/* this function is not allowed after qse_awk_parse is called */ | ||||
| 		SETERR (awk, QSE_AWK_ENOPER); | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	n = add_global (awk, name, len, 0, 0); | ||||
|  | ||||
| 	/* update the count of the static gbls.  | ||||
| 	/* update the count of the static globals.  | ||||
| 	 * the total global count has been updated inside add_global. */ | ||||
| 	if (n >= 0) awk->tree.ngbls_base++;  | ||||
|  | ||||
| @ -4662,7 +4669,7 @@ static int get_token (qse_awk_t* awk) | ||||
| 		} | ||||
| 		*/ | ||||
| 	} | ||||
| 	else if (QSE_AWK_ISALPHA (awk, c) || c == QSE_T('_'))  | ||||
| 	else if (c == QSE_T('_') || QSE_AWK_ISALPHA (awk, c)) | ||||
| 	{ | ||||
| 		int type; | ||||
|  | ||||
| @ -4672,8 +4679,9 @@ static int get_token (qse_awk_t* awk) | ||||
| 			ADD_TOKEN_CHAR (awk, c); | ||||
| 			GET_CHAR_TO (awk, c); | ||||
| 		}  | ||||
| 		while (QSE_AWK_ISALPHA (awk, c) ||  | ||||
| 		       c == QSE_T('_') || QSE_AWK_ISDIGIT(awk,c)); | ||||
| 		while (c == QSE_T('_') ||  | ||||
| 		       QSE_AWK_ISALPHA (awk, c) ||  | ||||
| 		       QSE_AWK_ISDIGIT (awk, c)); | ||||
|  | ||||
| 		type = classify_ident (awk,  | ||||
| 			QSE_STR_PTR(awk->token.name),  | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: rec.c 200 2009-06-14 13:22:00Z hyunghwan.chung $ | ||||
|  * $Id: rec.c 205 2009-06-20 12:47:34Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -31,10 +31,6 @@ int qse_awk_rtx_setrec ( | ||||
|  | ||||
| 	if (idx == 0) | ||||
| 	{ | ||||
| 		qse_long_t l; | ||||
| 		qse_real_t r; | ||||
| 		int x; | ||||
|  | ||||
| 		if (str == QSE_STR_PTR(&run->inrec.line) && | ||||
| 		    len == QSE_STR_LEN(&run->inrec.line)) | ||||
| 		{ | ||||
| @ -53,8 +49,7 @@ int qse_awk_rtx_setrec ( | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		x = qse_awk_rtx_strtonum (run, 1, str, len, &l, &r); | ||||
| 		v = qse_awk_rtx_makestrval (run, str, len); | ||||
| 		v = qse_awk_rtx_makenstrval (run, str, len); | ||||
|  | ||||
| 		if (v == QSE_NULL) | ||||
| 		{ | ||||
| @ -62,14 +57,6 @@ int qse_awk_rtx_setrec ( | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		if (x >= 0)  | ||||
| 		{ | ||||
| 			/* set the numeric string flag if a string | ||||
| 			 * can be converted to a number */ | ||||
| 			QSE_ASSERT (x == 0 || x == 1); | ||||
| 			v->nstr = x + 1; /* long -> 1, real -> 2 */ | ||||
| 		} | ||||
|  | ||||
| 		QSE_ASSERT (run->inrec.d0->type == QSE_AWK_VAL_NIL); | ||||
| 		/* d0 should be cleared before the next line is reached | ||||
| 		 * as it doesn't call qse_awk_rtx_refdownval on run->inrec.d0 */ | ||||
| @ -215,10 +202,6 @@ static int split_record (qse_awk_rtx_t* run) | ||||
|  | ||||
| 	while (p != QSE_NULL) | ||||
| 	{ | ||||
| 		qse_long_t l; | ||||
| 		qse_real_t r; | ||||
| 		int x; | ||||
|  | ||||
| 		if (fs_len <= 1) | ||||
| 		{ | ||||
| 			p = qse_awk_rtx_strxntok ( | ||||
| @ -247,25 +230,18 @@ static int split_record (qse_awk_rtx_t* run) | ||||
| 		run->inrec.flds[run->inrec.nflds].ptr = tok; | ||||
| 		run->inrec.flds[run->inrec.nflds].len = tok_len; | ||||
|  | ||||
| 		x = qse_awk_rtx_strtonum (run, 1, tok, tok_len, &l, &r); | ||||
| 		run->inrec.flds[run->inrec.nflds].val = | ||||
| 			qse_awk_rtx_makestrval (run, tok, tok_len); | ||||
| 			qse_awk_rtx_makenstrval (run, tok, tok_len); | ||||
|  | ||||
| 		if (run->inrec.flds[run->inrec.nflds].val == QSE_NULL) | ||||
| 		{ | ||||
| 			if (fs_free != QSE_NULL) QSE_AWK_FREE (run->awk, fs_free); | ||||
| 			if (fs_free != QSE_NULL)  | ||||
| 				QSE_AWK_FREE (run->awk, fs_free); | ||||
| 			return -1; | ||||
| 		} | ||||
|  | ||||
| 		if (x >= 0) | ||||
| 		{ | ||||
| 			/* set the numeric string flags if a string | ||||
| 			 * can be converted to a number */ | ||||
| 			QSE_ASSERT (x == 0 || x == 1); | ||||
| 			run->inrec.flds[run->inrec.nflds].val->nstr = x + 1; | ||||
| 		} | ||||
|  | ||||
| 		qse_awk_rtx_refupval (run, run->inrec.flds[run->inrec.nflds].val); | ||||
| 		qse_awk_rtx_refupval ( | ||||
| 			run, run->inrec.flds[run->inrec.nflds].val); | ||||
| 		run->inrec.nflds++; | ||||
|  | ||||
| 		len = QSE_STR_LEN(&run->inrec.line) -  | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: std.c 204 2009-06-18 12:08:06Z hyunghwan.chung $ | ||||
|  * $Id: std.c 205 2009-06-20 12:47:34Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -599,6 +599,7 @@ static int open_rio_console (qse_awk_rtx_t* rtx, qse_awk_rio_arg_t* riod) | ||||
| 			qse_sio_t* sio; | ||||
| 			const qse_char_t* file; | ||||
|  | ||||
| 		retry: | ||||
| 			file = rxtn->c.in.files[rxtn->c.in.index]; | ||||
|  | ||||
| 			if (file == QSE_NULL) | ||||
| @ -726,6 +727,7 @@ static qse_ssize_t awk_rio_console ( | ||||
| 			qse_sio_t* sio; | ||||
| 			const qse_char_t* file; | ||||
|  | ||||
| 		retry: | ||||
| 			/* it has reached the end of the current file. | ||||
| 			 * open the next file if available */ | ||||
| 			if (rxtn->c.in.files == QSE_NULL || | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /* | ||||
|  * $Id: val.c 200 2009-06-14 13:22:00Z hyunghwan.chung $ | ||||
|  * $Id: val.c 205 2009-06-20 12:47:34Z hyunghwan.chung $ | ||||
|  * | ||||
|    Copyright 2006-2009 Chung, Hyung-Hwan. | ||||
|  | ||||
| @ -348,6 +348,30 @@ init: | ||||
| 	return (qse_awk_val_t*)val; | ||||
| } | ||||
|  | ||||
| qse_awk_val_t* qse_awk_rtx_makenstrval ( | ||||
| 	qse_awk_rtx_t* run, const qse_char_t* str, qse_size_t len) | ||||
| { | ||||
| 	int x; | ||||
| 	qse_awk_val_t* v; | ||||
| 	qse_long_t l; | ||||
| 	qse_real_t r; | ||||
|  | ||||
| 	x = qse_awk_rtx_strtonum (run, 1, str, len, &l, &r); | ||||
| 	v = qse_awk_rtx_makestrval (run, str, len); | ||||
|  | ||||
| 	if (v == QSE_NULL) return QSE_NULL; | ||||
|  | ||||
| 	if (x >= 0)  | ||||
| 	{ | ||||
| 		/* set the numeric string flag if a string | ||||
| 		 * can be converted to a number */ | ||||
| 		QSE_ASSERT (x == 0 || x == 1); | ||||
| 		v->nstr = x + 1; /* long -> 1, real -> 2 */ | ||||
| 	} | ||||
|  | ||||
| 	return v; | ||||
| } | ||||
|  | ||||
| qse_awk_val_t* qse_awk_rtx_makerexval ( | ||||
| 	qse_awk_rtx_t* run, const qse_char_t* buf, qse_size_t len, void* code) | ||||
| { | ||||
|  | ||||
		Reference in New Issue
	
	Block a user