changed awk to convert a map to the size of the map in a scalar context.
allowed @include inside a normal block
This commit is contained in:
		| @ -1461,23 +1461,46 @@ static qse_awk_nde_t* parse_block ( | ||||
| 			if (get_token(awk) <= -1) return QSE_NULL; | ||||
| 		} | ||||
|  | ||||
| 		if (!MATCH(awk,TOK_XLOCAL)) break; | ||||
|  | ||||
| 		if (get_token(awk) <= -1)  | ||||
| 		if (MATCH(awk,TOK_XINCLUDE)) | ||||
| 		{ | ||||
| 			qse_lda_delete ( | ||||
| 				awk->parse.lcls, nlcls,  | ||||
| 				QSE_LDA_SIZE(awk->parse.lcls)-nlcls); | ||||
| 			return QSE_NULL; | ||||
| 			/* @include ... */ | ||||
| 			if (awk->opt.depth.s.incl > 0 && | ||||
| 			    awk->parse.depth.incl >=  awk->opt.depth.s.incl) | ||||
| 			{ | ||||
| 				SETERR_LOC (awk, QSE_AWK_EINCLTD, &awk->ptok.loc); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
| 		 | ||||
| 			if (get_token(awk) <= -1) return QSE_NULL; | ||||
| 	 | ||||
| 			if (!MATCH(awk,TOK_STR)) | ||||
| 			{ | ||||
| 				SETERR_LOC (awk, QSE_AWK_EINCLSTR, &awk->ptok.loc); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
| 		 | ||||
| 			if (begin_include (awk) <= -1) return QSE_NULL; | ||||
| 		} | ||||
|  | ||||
| 		if (collect_locals (awk, nlcls, istop) == QSE_NULL) | ||||
| 		else if (MATCH(awk,TOK_XLOCAL)) | ||||
| 		{ | ||||
| 			qse_lda_delete ( | ||||
| 				awk->parse.lcls, nlcls,  | ||||
| 				QSE_LDA_SIZE(awk->parse.lcls)-nlcls); | ||||
| 			return QSE_NULL; | ||||
| 			/* @local ... */ | ||||
| 			if (get_token(awk) <= -1)  | ||||
| 			{ | ||||
| 				qse_lda_delete ( | ||||
| 					awk->parse.lcls, nlcls,  | ||||
| 					QSE_LDA_SIZE(awk->parse.lcls)-nlcls); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
| 	 | ||||
| 			if (collect_locals (awk, nlcls, istop) == QSE_NULL) | ||||
| 			{ | ||||
| 				qse_lda_delete ( | ||||
| 					awk->parse.lcls, nlcls,  | ||||
| 					QSE_LDA_SIZE(awk->parse.lcls)-nlcls); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
| 		} | ||||
| 		else break; | ||||
| 	} | ||||
|  | ||||
| 	/* block body */ | ||||
| @ -1517,38 +1540,60 @@ static qse_awk_nde_t* parse_block ( | ||||
| 			break; | ||||
| 		} | ||||
|  | ||||
| 		/* parse an actual statement in a block */ | ||||
| 		if (MATCH(awk,TOK_XINCLUDE)) | ||||
| 		{ | ||||
| 			qse_awk_loc_t sloc = awk->tok.loc; | ||||
| 			nde = parse_statement (awk, &sloc); | ||||
| 			if (awk->opt.depth.s.incl > 0 && | ||||
| 			    awk->parse.depth.incl >=  awk->opt.depth.s.incl) | ||||
| 			{ | ||||
| 				SETERR_LOC (awk, QSE_AWK_EINCLTD, &awk->ptok.loc); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
| 		 | ||||
| 			if (get_token(awk) <= -1) return QSE_NULL; | ||||
| 	 | ||||
| 			if (!MATCH(awk,TOK_STR)) | ||||
| 			{ | ||||
| 				SETERR_LOC (awk, QSE_AWK_EINCLSTR, &awk->ptok.loc); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
| 		 | ||||
| 			if (begin_include (awk) <= -1) return QSE_NULL; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			/* parse an actual statement in a block */ | ||||
| 			{ | ||||
| 				qse_awk_loc_t sloc = awk->tok.loc; | ||||
| 				nde = parse_statement (awk, &sloc); | ||||
| 			} | ||||
|  | ||||
| 		if (nde == QSE_NULL)  | ||||
| 		{ | ||||
| 			qse_lda_delete ( | ||||
| 				awk->parse.lcls, nlcls,  | ||||
| 				QSE_LDA_SIZE(awk->parse.lcls)-nlcls); | ||||
| 			if (head != QSE_NULL) qse_awk_clrpt (awk, head); | ||||
| 			return QSE_NULL; | ||||
| 		} | ||||
| 			if (nde == QSE_NULL)  | ||||
| 			{ | ||||
| 				qse_lda_delete ( | ||||
| 					awk->parse.lcls, nlcls,  | ||||
| 					QSE_LDA_SIZE(awk->parse.lcls)-nlcls); | ||||
| 				if (head != QSE_NULL) qse_awk_clrpt (awk, head); | ||||
| 				return QSE_NULL; | ||||
| 			} | ||||
|  | ||||
| 		/* remove unnecessary statements such as adjacent  | ||||
| 		 * null statements */ | ||||
| 		if (nde->type == QSE_AWK_NDE_NULL)  | ||||
| 		{ | ||||
| 			qse_awk_clrpt (awk, nde); | ||||
| 			continue; | ||||
| 		} | ||||
| 		if (nde->type == QSE_AWK_NDE_BLK &&  | ||||
| 		    ((qse_awk_nde_blk_t*)nde)->body == QSE_NULL)  | ||||
| 		{ | ||||
| 			qse_awk_clrpt (awk, nde); | ||||
| 			continue; | ||||
| 		} | ||||
| 			/* remove unnecessary statements such as adjacent  | ||||
| 			 * null statements */ | ||||
| 			if (nde->type == QSE_AWK_NDE_NULL)  | ||||
| 			{ | ||||
| 				qse_awk_clrpt (awk, nde); | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (nde->type == QSE_AWK_NDE_BLK &&  | ||||
| 			    ((qse_awk_nde_blk_t*)nde)->body == QSE_NULL)  | ||||
| 			{ | ||||
| 				qse_awk_clrpt (awk, nde); | ||||
| 				continue; | ||||
| 			} | ||||
| 			 | ||||
| 		if (curr == QSE_NULL) head = nde; | ||||
| 		else curr->next = nde;	 | ||||
| 		curr = nde; | ||||
| 			if (curr == QSE_NULL) head = nde; | ||||
| 			else curr->next = nde;	 | ||||
| 			curr = nde; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	block = (qse_awk_nde_blk_t*) qse_awk_callocmem (awk, QSE_SIZEOF(*block)); | ||||
|  | ||||
| @ -1605,6 +1605,15 @@ int qse_awk_rtx_valtonum ( | ||||
| 			); | ||||
| 		} | ||||
|  | ||||
| 		case QSE_AWK_VAL_MAP: | ||||
| 		{ | ||||
| 			if (rtx->awk->opt.trait & QSE_AWK_FLEXMAP) | ||||
| 			{ | ||||
| 				*l = QSE_HTB_SIZE(((qse_awk_val_map_t*)v)->map); | ||||
| 				return 0; /* long */ | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		case QSE_AWK_VAL_REF: | ||||
| 		{ | ||||
| 			return val_ref_to_num (rtx, (qse_awk_val_ref_t*)v, l, r); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user