changed hawk_rtx_makemapvalwithdata() to accept data count.
enhanced sys::tcgetattr() and sys::tcsetattr() to store and fetch the value for c_cc field to and from the "cc" slot
This commit is contained in:
		| @ -329,15 +329,12 @@ enum hawk_val_map_data_type_t | ||||
| { | ||||
| 	HAWK_VAL_MAP_DATA_INT  = 0, | ||||
| 	HAWK_VAL_MAP_DATA_FLT, | ||||
| 	HAWK_VAL_MAP_DATA_STR, | ||||
| 	HAWK_VAL_MAP_DATA_MBS, | ||||
| 	HAWK_VAL_MAP_DATA_WCS, | ||||
| 	HAWK_VAL_MAP_DATA_CSTR, | ||||
| 	HAWK_VAL_MAP_DATA_XSTR, | ||||
| 	HAWK_VAL_MAP_DATA_MCSTR, | ||||
| 	HAWK_VAL_MAP_DATA_MXSTR, | ||||
| 	HAWK_VAL_MAP_DATA_WCSTR, | ||||
| 	HAWK_VAL_MAP_DATA_WXSTR | ||||
| 	HAWK_VAL_MAP_DATA_OOCSTR, | ||||
| 	HAWK_VAL_MAP_DATA_BCSTR, | ||||
| 	HAWK_VAL_MAP_DATA_UCSTR, | ||||
| 	HAWK_VAL_MAP_DATA_OOCS, | ||||
| 	HAWK_VAL_MAP_DATA_BCS, | ||||
| 	HAWK_VAL_MAP_DATA_UCS | ||||
| }; | ||||
| typedef enum hawk_val_map_data_type_t hawk_val_map_data_type_t; | ||||
|  | ||||
| @ -2891,7 +2888,8 @@ HAWK_EXPORT hawk_val_t* hawk_rtx_makemapval ( | ||||
|  */ | ||||
| HAWK_EXPORT hawk_val_t* hawk_rtx_makemapvalwithdata ( | ||||
| 	hawk_rtx_t*         rtx, | ||||
| 	hawk_val_map_data_t data[] | ||||
| 	hawk_val_map_data_t data[], | ||||
| 	hawk_oow_t          count | ||||
| ); | ||||
|  | ||||
| /** | ||||
| @ -2900,11 +2898,11 @@ HAWK_EXPORT hawk_val_t* hawk_rtx_makemapvalwithdata ( | ||||
|  * \return value \a v on success, #HAWK_NULL on failure. | ||||
|  */ | ||||
| HAWK_EXPORT hawk_val_t* hawk_rtx_setmapvalfld ( | ||||
| 	hawk_rtx_t*    rtx, | ||||
| 	hawk_val_t*    map, | ||||
| 	hawk_rtx_t*        rtx, | ||||
| 	hawk_val_t*        map, | ||||
| 	const hawk_ooch_t* kptr, | ||||
| 	hawk_oow_t        klen, | ||||
| 	hawk_val_t*    v | ||||
| 	hawk_oow_t         klen, | ||||
| 	hawk_val_t*        v | ||||
| ); | ||||
|  | ||||
| /** | ||||
| @ -2915,10 +2913,10 @@ HAWK_EXPORT hawk_val_t* hawk_rtx_setmapvalfld ( | ||||
|  * \return field value on success, #HAWK_NULL on failure. | ||||
|  */ | ||||
| HAWK_EXPORT hawk_val_t* hawk_rtx_getmapvalfld ( | ||||
| 	hawk_rtx_t*     rtx, | ||||
| 	hawk_val_t*     map, | ||||
| 	hawk_rtx_t*         rtx, | ||||
| 	hawk_val_t*         map, | ||||
| 	const hawk_ooch_t*  kptr, | ||||
| 	hawk_oow_t         klen | ||||
| 	hawk_oow_t          klen | ||||
| ); | ||||
|  | ||||
| /** | ||||
|  | ||||
| @ -1080,8 +1080,12 @@ done: | ||||
| } | ||||
|  | ||||
|  | ||||
| /* sys::tcgetattr(sys::openfd(1), a); | ||||
|  * for (i in a) print i, a[i]; */ | ||||
| /*  | ||||
|  BEGIN { | ||||
|      if (sys::tcgetattr(sys::openfd(1), a) <= -1) print sys::errmsg(); | ||||
|      for (i in a) print i, a[i];  | ||||
|  }  | ||||
| */ | ||||
| static int fnc_tcgetattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* this is actually lseek */ | ||||
| { | ||||
| 	sys_list_t* sys_list; | ||||
| @ -1095,6 +1099,7 @@ static int fnc_tcgetattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* this is | ||||
| 	{ | ||||
| 		struct termios t; | ||||
| 		hawk_val_map_data_t md[5]; | ||||
| 		hawk_bcs_t c_cc; | ||||
| 		hawk_val_t* tmp; | ||||
| 		int x; | ||||
|  | ||||
| @ -1132,9 +1137,14 @@ static int fnc_tcgetattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* this is | ||||
| 		md[3].type_size = HAWK_SIZEOF(t.c_lflag); | ||||
| 		md[3].vptr = &t.c_lflag; | ||||
|  | ||||
| /* TODO: t.c_cc... */ | ||||
| 		md[4].key.ptr = HAWK_T("cc"); | ||||
| 		md[4].key.len = 2; | ||||
| 		md[4].type = HAWK_VAL_MAP_DATA_BCS; | ||||
| 		md[4].vptr = &c_cc; | ||||
| 		c_cc.ptr = t.c_cc; | ||||
| 		c_cc.len = HAWK_COUNTOF(t.c_cc); | ||||
|  | ||||
| 		tmp = hawk_rtx_makemapvalwithdata(rtx, md); | ||||
| 		tmp = hawk_rtx_makemapvalwithdata(rtx, md, HAWK_COUNTOF(md)); | ||||
| 		if (!tmp) goto fail; | ||||
|  | ||||
| 		hawk_rtx_refupval (rtx, tmp); | ||||
| @ -1200,7 +1210,7 @@ static int fnc_tcsetattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* this is | ||||
| 			goto done; | ||||
| 		} | ||||
|  | ||||
| /* I call this because tcgetattr doesn't fetch c_cc yet */ | ||||
| 		/* i call this to keep the old value for the fields not present in the given attribute map */ | ||||
| 		rx = tcgetattr(sys_node->ctx.u.file.fd, &t); | ||||
| 		if (rx <= -1) goto fail_with_errno; | ||||
|  | ||||
| @ -1208,30 +1218,49 @@ static int fnc_tcsetattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* this is | ||||
| 		pair = hawk_map_getfirstpair(((hawk_val_map_t*)a2)->map, &itr); | ||||
| 		while (pair) | ||||
| 		{ | ||||
| 			if (hawk_rtx_valtoint(rtx, HAWK_MAP_VPTR(pair), &flag) <= -1) | ||||
| 			if (hawk_comp_oochars_bcstr(HAWK_MAP_KPTR(pair), HAWK_MAP_KLEN(pair), "cc") == 0) | ||||
| 			{ | ||||
| 				rx = copy_error_to_sys_list(rtx, sys_list); | ||||
| 				goto done; | ||||
| 				hawk_bch_t* ptr; | ||||
| 				hawk_oow_t len; | ||||
|  | ||||
| 				ptr = hawk_rtx_getvalbcstr(rtx, HAWK_MAP_VPTR(pair), &len); | ||||
| 				if (!ptr) | ||||
| 				{ | ||||
| 					rx = copy_error_to_sys_list(rtx, sys_list); | ||||
| 					goto done; | ||||
| 				} | ||||
|  | ||||
| 				if (len >= HAWK_COUNTOF(t.c_cc)) len = HAWK_COUNTOF(t.c_cc); | ||||
| 				HAWK_MEMCPY (t.c_cc, ptr, len); | ||||
| 				hawk_rtx_freevalbcstr (rtx, HAWK_MAP_VPTR(pair), ptr); | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				if (hawk_rtx_valtoint(rtx, HAWK_MAP_VPTR(pair), &flag) <= -1) | ||||
| 				{ | ||||
| 					rx = copy_error_to_sys_list(rtx, sys_list); | ||||
| 					goto done; | ||||
| 				} | ||||
|  | ||||
| 				if (hawk_comp_oochars_bcstr(HAWK_MAP_KPTR(pair), HAWK_MAP_KLEN(pair), "iflag") == 0) | ||||
| 				{ | ||||
| 					t.c_iflag = flag; | ||||
| 				} | ||||
| 				else if (hawk_comp_oochars_bcstr(HAWK_MAP_KPTR(pair), HAWK_MAP_KLEN(pair), "oflag") == 0) | ||||
| 				{ | ||||
| 					t.c_oflag = flag; | ||||
| 				} | ||||
| 				else if (hawk_comp_oochars_bcstr(HAWK_MAP_KPTR(pair), HAWK_MAP_KLEN(pair), "cflag") == 0) | ||||
| 				{ | ||||
| 					t.c_cflag = flag; | ||||
| 				} | ||||
| 				else if (hawk_comp_oochars_bcstr(HAWK_MAP_KPTR(pair), HAWK_MAP_KLEN(pair), "lflag") == 0) | ||||
| 				{ | ||||
| 					t.c_lflag = flag; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			if (hawk_comp_oochars_bcstr(HAWK_MAP_KPTR(pair), HAWK_MAP_KLEN(pair), "iflag") == 0) | ||||
| 			{ | ||||
| 				t.c_iflag = flag; | ||||
| 			} | ||||
| 			else if (hawk_comp_oochars_bcstr(HAWK_MAP_KPTR(pair), HAWK_MAP_KLEN(pair), "oflag") == 0) | ||||
| 			{ | ||||
| 				t.c_oflag = flag; | ||||
| 			} | ||||
| 			else if (hawk_comp_oochars_bcstr(HAWK_MAP_KPTR(pair), HAWK_MAP_KLEN(pair), "cflag") == 0) | ||||
| 			{ | ||||
| 				t.c_cflag = flag; | ||||
| 			} | ||||
| 			else if (hawk_comp_oochars_bcstr(HAWK_MAP_KPTR(pair), HAWK_MAP_KLEN(pair), "lflag") == 0) | ||||
| 			{ | ||||
| 				t.c_lflag = flag; | ||||
| 			} | ||||
|  | ||||
| /* TODO: t.c_cc */ | ||||
| 			pair = hawk_map_getnextpair(((hawk_val_map_t*)a2)->map, &itr); | ||||
| 		} | ||||
|  | ||||
| @ -2705,7 +2734,8 @@ static int fnc_getifcfg (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		hawk_int_t type; | ||||
| 		hawk_int_t index, mtu; | ||||
| 		hawk_ooch_t ethw[32]; | ||||
| 		hawk_val_map_data_t md[7]; | ||||
| 		hawk_val_map_data_t md[6]; | ||||
| 		hawk_oow_t md_count; | ||||
| 		hawk_val_t* tmp; | ||||
| 		int x; | ||||
|  | ||||
| @ -2731,32 +2761,34 @@ static int fnc_getifcfg (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 		md[2].key.ptr = HAWK_T("addr"); | ||||
| 		md[2].key.len = 4; | ||||
| 		md[2].type = HAWK_VAL_MAP_DATA_STR; | ||||
| 		md[2].type = HAWK_VAL_MAP_DATA_OOCSTR; | ||||
| 		hawk_gem_skadtooocstr (hawk_rtx_getgem(rtx), &cfg.addr, sys_list->ctx.skadbuf[0], HAWK_COUNTOF(sys_list->ctx.skadbuf[0]), HAWK_SKAD_TO_OOCSTR_ADDR); | ||||
| 		md[2].vptr = sys_list->ctx.skadbuf[0]; | ||||
|  | ||||
| 		md[3].key.ptr = HAWK_T("mask"); | ||||
| 		md[3].key.len = 4; | ||||
| 		md[3].type = HAWK_VAL_MAP_DATA_STR; | ||||
| 		md[3].type = HAWK_VAL_MAP_DATA_OOCSTR; | ||||
| 		hawk_gem_skadtooocstr (hawk_rtx_getgem(rtx), &cfg.mask, sys_list->ctx.skadbuf[1], HAWK_COUNTOF(sys_list->ctx.skadbuf[1]), HAWK_SKAD_TO_OOCSTR_ADDR); | ||||
| 		md[3].vptr = sys_list->ctx.skadbuf[1]; | ||||
|  | ||||
| 		md[4].key.ptr = HAWK_T("ethw"); | ||||
| 		md[4].key.len = 4; | ||||
| 		md[4].type = HAWK_VAL_MAP_DATA_STR; | ||||
| 		md[4].type = HAWK_VAL_MAP_DATA_OOCSTR; | ||||
| 		hawk_rtx_fmttooocstr (rtx, ethw, HAWK_COUNTOF(ethw), HAWK_T("%02X:%02X:%02X:%02X:%02X:%02X"),  | ||||
| 			cfg.ethw[0], cfg.ethw[1], cfg.ethw[2], cfg.ethw[3], cfg.ethw[4], cfg.ethw[5]); | ||||
| 		md[4].vptr = ethw; | ||||
| 		md_count = 5; | ||||
|  | ||||
| 		if (cfg.flags & (HAWK_IFCFG_LINKUP | HAWK_IFCFG_LINKDOWN)) | ||||
| 		{ | ||||
| 			md[5].key.ptr = HAWK_T("link"); | ||||
| 			md[5].key.len = 4; | ||||
| 			md[5].type = HAWK_VAL_MAP_DATA_STR; | ||||
| 			md[5].type = HAWK_VAL_MAP_DATA_OOCSTR; | ||||
| 			md[5].vptr = (cfg.flags & HAWK_IFCFG_LINKUP)? HAWK_T("up"): HAWK_T("down"); | ||||
| 			md_count++; | ||||
| 		} | ||||
|  | ||||
| 		tmp = hawk_rtx_makemapvalwithdata(rtx, md); | ||||
| 		tmp = hawk_rtx_makemapvalwithdata(rtx, md, md_count); | ||||
| 		if (!tmp) goto fail; | ||||
|  | ||||
| 		hawk_rtx_refupval (rtx, tmp); | ||||
| @ -3241,7 +3273,7 @@ static int fnc_stat (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		hawk_oow_t len1; | ||||
| 		hawk_val_t* tmp; | ||||
| 		hawk_stat_t stbuf; | ||||
| 		hawk_val_map_data_t md[14]; | ||||
| 		hawk_val_map_data_t md[13]; | ||||
| 		hawk_flt_t atime_f, mtime_f, ctime_f; | ||||
| 		int x; | ||||
|  | ||||
| @ -3365,7 +3397,7 @@ static int fnc_stat (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		md[12].vptr = &stbuf.st_ctime; | ||||
| 	#endif | ||||
|  | ||||
| 		tmp = hawk_rtx_makemapvalwithdata(rtx, md); | ||||
| 		tmp = hawk_rtx_makemapvalwithdata(rtx, md, HAWK_COUNTOF(md)); | ||||
| 		if (!tmp) goto fail; | ||||
|  | ||||
| 		hawk_rtx_refupval (rtx, tmp); | ||||
| @ -4963,10 +4995,48 @@ static inttab_t inttab[] = | ||||
|  | ||||
| 	{ HAWK_T("STRFTIME_UTC"),    { STRFTIME_UTC } }, | ||||
|  | ||||
| 	/* TODO: more termio flag items */ | ||||
| 	{ HAWK_T("TC_CC_VDISCARD"),  { VDISCARD } }, | ||||
| 	{ HAWK_T("TC_CC_VEOF"),      { VEOF } }, | ||||
| 	{ HAWK_T("TC_CC_VEOL"),      { VEOL } }, | ||||
| 	{ HAWK_T("TC_CC_VEOL2"),     { VEOL2 } }, | ||||
| 	{ HAWK_T("TC_CC_VERASE"),    { VERASE } }, | ||||
| 	{ HAWK_T("TC_CC_VINTR"),     { VINTR } }, | ||||
| 	{ HAWK_T("TC_CC_VKILL"),     { VKILL } }, | ||||
| 	{ HAWK_T("TC_CC_VLNEXT"),    { VLNEXT } }, | ||||
| 	{ HAWK_T("TC_CC_VMIN"),      { VMIN } }, | ||||
| 	{ HAWK_T("TC_CC_VQUIT"),     { VQUIT } }, | ||||
| 	{ HAWK_T("TC_CC_VREPINT"),   { VREPRINT } }, | ||||
| 	{ HAWK_T("TC_CC_VSTART"),    { VSTART } }, | ||||
| 	{ HAWK_T("TC_CC_VSTOP"),     { VSTOP } }, | ||||
| 	{ HAWK_T("TC_CC_VSUSP"),     { VSUSP } }, | ||||
| 	{ HAWK_T("TC_CC_VSWTC"),     { VSWTC } }, | ||||
| 	{ HAWK_T("TC_CC_VTIME"),     { VTIME } }, | ||||
| 	{ HAWK_T("TC_CC_VWERASE"),   { VWERASE } }, | ||||
|  | ||||
| 	{ HAWK_T("TC_IFLAG_BRKINT"), { BRKINT } }, | ||||
| 	{ HAWK_T("TC_IFLAG_ICRNL"),  { ICRNL } }, | ||||
| 	{ HAWK_T("TC_IFLAG_IGNBRK"), { IGNBRK } }, | ||||
| 	{ HAWK_T("TC_IFLAG_IGNCR"),  { IGNCR } }, | ||||
| 	{ HAWK_T("TC_IFLAG_IGNPAR"), { IGNPAR } },  | ||||
| 	{ HAWK_T("TC_IFLAG_IMAXBEL"),{ IMAXBEL } }, | ||||
| 	{ HAWK_T("TC_IFLAG_INLCR"),  { INLCR } }, | ||||
| 	{ HAWK_T("TC_IFLAG_INPCK"),  { INPCK } }, | ||||
| 	{ HAWK_T("TC_IFLAG_ISTRIP"), { ISTRIP } }, | ||||
| 	{ HAWK_T("TC_IFLAG_IUCLC"),  { IUCLC } }, | ||||
| 	{ HAWK_T("TC_IFLAG_IUTF8"),  { IUTF8 } }, | ||||
| 	{ HAWK_T("TC_IFLAG_IXANY"),  { IXANY } }, | ||||
| 	{ HAWK_T("TC_IFLAG_IXOFF"),  { IXOFF } }, | ||||
| 	{ HAWK_T("TC_IFLAG_IXON"),   { IXON } }, | ||||
| 	{ HAWK_T("TC_IFLAG_PARMRK"), { PARMRK } }, | ||||
|  | ||||
| 	{ HAWK_T("TC_LFLAG_ECHO"),   { ECHO  } },   | ||||
| 	{ HAWK_T("TC_LFLAG_ECHOE"),  { ECHOE  } },   | ||||
| 	{ HAWK_T("TC_LFLAG_ECHOK"),  { ECHOK  } },   | ||||
| 	{ HAWK_T("TC_LFLAG_ECHONL"), { ECHONL  } },   | ||||
| 	{ HAWK_T("TC_LFLAG_ICANON"), { ICANON  } },   | ||||
| 	{ HAWK_T("TC_LFLAG_ISIG"),   { ISIG  } },   | ||||
| 	{ HAWK_T("TC_LFLAG_NOFLSH"), { NOFLSH  } },   | ||||
| 	{ HAWK_T("TC_LFLAG_TOSTOP"), { TOSTOP  } },   | ||||
|  | ||||
| 	{ HAWK_T("TC_OFLAG_OCRNL"),  { OCRNL  } }, | ||||
| 	{ HAWK_T("TC_OFLAG_ONLCR"),  { ONLCR  } }, | ||||
|  | ||||
| @ -1005,16 +1005,21 @@ retry: | ||||
| 	return (hawk_val_t*)val; | ||||
| } | ||||
|  | ||||
| hawk_val_t* hawk_rtx_makemapvalwithdata (hawk_rtx_t* rtx, hawk_val_map_data_t data[]) | ||||
| hawk_val_t* hawk_rtx_makemapvalwithdata (hawk_rtx_t* rtx, hawk_val_map_data_t data[], hawk_oow_t count) | ||||
| { | ||||
| 	hawk_val_t* map, * tmp; | ||||
| 	hawk_val_map_data_t* p; | ||||
|  | ||||
| 	hawk_oow_t i; | ||||
|  | ||||
| 	map = hawk_rtx_makemapval(rtx); | ||||
| 	if (HAWK_UNLIKELY(!map)) return HAWK_NULL; | ||||
|  | ||||
| 	for (p = data; p->key.ptr; p++) | ||||
| 	for (i = 0; i < count; i++) | ||||
| 	{ | ||||
| 		hawk_val_map_data_t* p; | ||||
|  | ||||
| 		p = &data[i]; | ||||
|  | ||||
| 		switch (p->type) | ||||
| 		{ | ||||
| 			case HAWK_VAL_MAP_DATA_INT: | ||||
| @ -1041,30 +1046,27 @@ hawk_val_t* hawk_rtx_makemapvalwithdata (hawk_rtx_t* rtx, hawk_val_map_data_t da | ||||
| 				tmp = hawk_rtx_makefltval(rtx, *(hawk_flt_t*)p->vptr); | ||||
| 				break; | ||||
|  | ||||
| 			case HAWK_VAL_MAP_DATA_STR: | ||||
| 			case HAWK_VAL_MAP_DATA_OOCSTR: | ||||
| 				tmp = hawk_rtx_makestrvalwithoocstr(rtx, (hawk_ooch_t*)p->vptr); | ||||
| 				break; | ||||
|  | ||||
| 			case HAWK_VAL_MAP_DATA_MBS: | ||||
| 			case HAWK_VAL_MAP_DATA_BCSTR: | ||||
| 				tmp = hawk_rtx_makestrvalwithbcstr(rtx, (hawk_bch_t*)p->vptr); | ||||
| 				break; | ||||
|  | ||||
| 			case HAWK_VAL_MAP_DATA_WCS: | ||||
| 			case HAWK_VAL_MAP_DATA_UCSTR: | ||||
| 				tmp = hawk_rtx_makestrvalwithucstr(rtx, (hawk_uch_t*)p->vptr); | ||||
| 				break; | ||||
| 					 | ||||
| 			case HAWK_VAL_MAP_DATA_XSTR: | ||||
| 			case HAWK_VAL_MAP_DATA_CSTR: | ||||
|  | ||||
| 			case HAWK_VAL_MAP_DATA_OOCS: | ||||
| 				tmp = hawk_rtx_makestrvalwithoocs(rtx, (hawk_oocs_t*)p->vptr); | ||||
| 				break; | ||||
|  | ||||
| 			case HAWK_VAL_MAP_DATA_MXSTR: | ||||
| 			case HAWK_VAL_MAP_DATA_MCSTR: | ||||
| 			case HAWK_VAL_MAP_DATA_BCS: | ||||
| 				tmp = hawk_rtx_makestrvalwithbcs(rtx, (hawk_bcs_t*)p->vptr); | ||||
| 				break; | ||||
|  | ||||
| 			case HAWK_VAL_MAP_DATA_WXSTR: | ||||
| 			case HAWK_VAL_MAP_DATA_WCSTR: | ||||
| 			case HAWK_VAL_MAP_DATA_UCS: | ||||
| 				tmp = hawk_rtx_makestrvalwithucs(rtx, (hawk_ucs_t*)p->vptr); | ||||
| 				break; | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user