enhanced hawk_makemapvalwithdata() to handle integers of various size
enhanced sys::stat()
This commit is contained in:
		| @ -526,6 +526,16 @@ Directory traversal is easy. | ||||
| 		}  | ||||
| 	} | ||||
|  | ||||
|  | ||||
| You can get information of a network interface. | ||||
|  | ||||
| 	BEGIN {  | ||||
| 		if (sys::getnwifcfg("lo", sys::NWIFCFG_IN6, x) <= -1) | ||||
| 			print sys::errmsg(); | ||||
| 		else | ||||
| 			for (i in x) print i, x[i];  | ||||
| 	} | ||||
|  | ||||
| Socket functions are available. | ||||
|  | ||||
| 	BEGIN | ||||
|  | ||||
							
								
								
									
										2
									
								
								hawk/configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								hawk/configure
									
									
									
									
										vendored
									
									
								
							| @ -1490,7 +1490,7 @@ Optional Features: | ||||
|                           no:4 (default. yes) | ||||
|   --enable-debug          compile the code in the debug mode (default. no) | ||||
|   --enable-intmax         use hawk_intmax_t for integers (default. no) | ||||
|   --enable-awk-fltmax     use hawk_fltmax_t for floating-point numbers | ||||
|   --enable-fltmax         use hawk_fltmax_t for floating-point numbers | ||||
|                           (default. no) | ||||
|   --enable-cxx            build the library for C++ if a C++ compiler is | ||||
|                           available (default. yes) | ||||
|  | ||||
| @ -863,7 +863,7 @@ fi | ||||
|  | ||||
| dnl ===== enable-fltmax ====== | ||||
| AC_ARG_ENABLE([fltmax], | ||||
| 	[AS_HELP_STRING([--enable-awk-fltmax],[use hawk_fltmax_t for floating-point numbers (default. no)])], | ||||
| 	[AS_HELP_STRING([--enable-fltmax],[use hawk_fltmax_t for floating-point numbers (default. no)])], | ||||
| 	enable_fltmax_is=$enableval, | ||||
| 	enable_fltmax_is=no | ||||
| ) | ||||
|  | ||||
| @ -322,7 +322,9 @@ typedef enum hawk_val_map_data_type_t hawk_val_map_data_type_t; | ||||
| struct hawk_val_map_data_t | ||||
| { | ||||
| 	hawk_oocs_t               key; | ||||
| 	hawk_val_map_data_type_t  type; | ||||
| 	hawk_val_map_data_type_t  type: 8; | ||||
| 	unsigned int              type_size: 16; /* size information that supplements the type */ | ||||
| 	/* maybe there are some unused bits here as this struct is not packed */ | ||||
| 	void*                     vptr; | ||||
| }; | ||||
|  | ||||
|  | ||||
| @ -1998,7 +1998,7 @@ static int fnc_gettime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 	hawk_val_t* retv; | ||||
| 	hawk_ntime_t now; | ||||
|  | ||||
| 	if (hawk_get_time (&now) <= -1) now.sec = 0; | ||||
| 	if (hawk_get_time(&now) <= -1) now.sec = 0; | ||||
|  | ||||
| 	retv = hawk_rtx_makeintval(rtx, now.sec); | ||||
| 	if (!retv) return -1; | ||||
| @ -2016,7 +2016,7 @@ static int fnc_settime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
|  | ||||
| 	now.nsec = 0; | ||||
|  | ||||
| 	if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg (rtx, 0), &tmp) <= -1) rx = -1; | ||||
| 	if (hawk_rtx_valtoint(rtx, hawk_rtx_getarg(rtx, 0), &tmp) <= -1) rx = -1; | ||||
| 	else | ||||
| 	{ | ||||
| 		now.sec = tmp; | ||||
| @ -2460,14 +2460,14 @@ static int fnc_getifcfg (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		md[0].key.ptr = HAWK_T("index"); | ||||
| 		md[0].key.len = 5; | ||||
| 		md[0].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		index = cfg.index; | ||||
| 		md[0].vptr = &index; | ||||
| 		md[0].type_size = HAWK_SIZEOF(cfg.index); | ||||
| 		md[0].vptr = &cfg.index; | ||||
|  | ||||
| 		md[1].key.ptr = HAWK_T("mtu"); | ||||
| 		md[1].key.len = 3; | ||||
| 		md[1].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		mtu = cfg.mtu; | ||||
| 		md[1].vptr = &mtu; | ||||
| 		md[1].type_size = HAWK_SIZEOF(cfg.mtu); | ||||
| 		md[1].vptr = &cfg.mtu; | ||||
|  | ||||
| 		md[2].key.ptr = HAWK_T("addr"); | ||||
| 		md[2].key.len = 4; | ||||
| @ -2981,8 +2981,8 @@ 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[10]; | ||||
| 		hawk_int_t dev, ino, size; | ||||
| 		hawk_val_map_data_t md[14]; | ||||
| 		hawk_flt_t atime_f, mtime_f, ctime_f; | ||||
| 		int x; | ||||
|  | ||||
| 		str1 = hawk_rtx_getvalbcstr(rtx, a0, &len1); | ||||
| @ -3012,20 +3012,98 @@ static int fnc_stat (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) | ||||
| 		md[0].key.ptr = HAWK_T("dev"); | ||||
| 		md[0].key.len = 3; | ||||
| 		md[0].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		dev = stbuf.st_dev; | ||||
| 		md[0].vptr = &dev; | ||||
| 		md[0].type_size = HAWK_SIZEOF(stbuf.st_dev); | ||||
| 		md[0].vptr = &stbuf.st_dev; | ||||
|  | ||||
| 		md[1].key.ptr = HAWK_T("ino"); | ||||
| 		md[1].key.len = 3; | ||||
| 		md[1].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		ino = stbuf.st_ino; | ||||
| 		md[1].vptr = &ino; | ||||
| 		md[1].type_size = HAWK_SIZEOF(stbuf.st_ino); | ||||
| 		md[1].vptr = &stbuf.st_ino; | ||||
|  | ||||
| 		md[2].key.ptr = HAWK_T("size"); | ||||
| 		md[2].key.len = 4; | ||||
| 		md[2].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[2].type_size = HAWK_SIZEOF(stbuf.st_size); | ||||
| 		md[2].vptr = &stbuf.st_size; | ||||
|  | ||||
| 		md[3].key.ptr = HAWK_T("mode"); | ||||
| 		md[3].key.len = 4; | ||||
| 		md[3].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		size = stbuf.st_size; | ||||
| 		md[2].vptr = &size; | ||||
| 		md[3].type_size = HAWK_SIZEOF(stbuf.st_mode); | ||||
| 		md[3].vptr = &stbuf.st_mode; | ||||
|  | ||||
| 		md[4].key.ptr = HAWK_T("nlink"); | ||||
| 		md[4].key.len = 5; | ||||
| 		md[4].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[4].type_size = HAWK_SIZEOF(stbuf.st_nlink); | ||||
| 		md[4].vptr = &stbuf.st_nlink; | ||||
|  | ||||
| 		md[5].key.ptr = HAWK_T("uid"); | ||||
| 		md[5].key.len = 3; | ||||
| 		md[5].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[5].type_size = HAWK_SIZEOF(stbuf.st_uid); | ||||
| 		md[5].vptr = &stbuf.st_uid; | ||||
|  | ||||
| 		md[6].key.ptr = HAWK_T("gid"); | ||||
| 		md[6].key.len = 3; | ||||
| 		md[6].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[6].type_size = HAWK_SIZEOF(stbuf.st_gid); | ||||
| 		md[6].vptr = &stbuf.st_gid; | ||||
|  | ||||
| 		md[7].key.ptr = HAWK_T("rdev"); | ||||
| 		md[7].key.len = 4; | ||||
| 		md[7].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[7].type_size = HAWK_SIZEOF(stbuf.st_rdev); | ||||
| 		md[7].vptr = &stbuf.st_rdev; | ||||
|  | ||||
| 		md[8].key.ptr = HAWK_T("blksize"); | ||||
| 		md[8].key.len = 7; | ||||
| 		md[8].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[8].type_size = HAWK_SIZEOF(stbuf.st_blksize); | ||||
| 		md[8].vptr = &stbuf.st_blksize; | ||||
|  | ||||
| 		md[9].key.ptr = HAWK_T("blocks"); | ||||
| 		md[9].key.len = 6; | ||||
| 		md[9].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[9].type_size = HAWK_SIZEOF(stbuf.st_blocks); | ||||
| 		md[9].vptr = &stbuf.st_blocks; | ||||
|  | ||||
| 		md[10].key.ptr = HAWK_T("atime"); | ||||
| 		md[10].key.len = 5; | ||||
| 	#if defined(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) | ||||
| 		md[10].type = HAWK_VAL_MAP_DATA_FLT; | ||||
| 		atime_f = (hawk_flt_t)stbuf.st_atim.tv_sec + ((hawk_flt_t)stbuf.st_atim.tv_nsec / HAWK_NSECS_PER_SEC); | ||||
| 		md[10].vptr = &atime_f; | ||||
| 	#else | ||||
| 		md[10].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[10].type_size = HAWK_SIZEOF(stbuf.st_atime); | ||||
| 		md[10].vptr = &stbuf.st_atime; | ||||
| 	#endif | ||||
|  | ||||
| 		md[11].key.ptr = HAWK_T("mtime"); | ||||
| 		md[11].key.len = 5; | ||||
| 	#if defined(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) | ||||
| 		md[11].type = HAWK_VAL_MAP_DATA_FLT; | ||||
| 		mtime_f = (hawk_flt_t)stbuf.st_mtim.tv_sec + ((hawk_flt_t)stbuf.st_mtim.tv_nsec / HAWK_NSECS_PER_SEC); | ||||
| 		md[11].vptr = &mtime_f; | ||||
| 	#else | ||||
| 		md[11].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[11].type_size = HAWK_SIZEOF(stbuf.st_mtime); | ||||
| 		md[11].vptr = &stbuf.st_mtime; | ||||
| 	#endif | ||||
|  | ||||
| 		md[12].key.ptr = HAWK_T("ctime"); | ||||
| 		md[12].key.len = 5; | ||||
| 	#if defined(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) | ||||
| 		md[12].type = HAWK_VAL_MAP_DATA_FLT; | ||||
| 		ctime_f = (hawk_flt_t)stbuf.st_ctim.tv_sec + ((hawk_flt_t)stbuf.st_ctim.tv_nsec / HAWK_NSECS_PER_SEC); | ||||
| 		md[12].vptr = &ctime_f; | ||||
| 	#else | ||||
| 		md[12].type = HAWK_VAL_MAP_DATA_INT; | ||||
| 		md[12].type_size = HAWK_SIZEOF(stbuf.st_ctime); | ||||
| 		md[12].vptr = &stbuf.st_ctime; | ||||
| 	#endif | ||||
|  | ||||
| 		tmp = hawk_rtx_makemapvalwithdata(rtx, md); | ||||
| 		if (!tmp) goto fail; | ||||
|  | ||||
| @ -588,8 +588,24 @@ hawk_val_t* hawk_rtx_makemapvalwithdata (hawk_rtx_t* rtx, hawk_val_map_data_t da | ||||
| 		switch (p->type) | ||||
| 		{ | ||||
| 			case HAWK_VAL_MAP_DATA_INT: | ||||
| 				tmp = hawk_rtx_makeintval(rtx, *(hawk_int_t*)p->vptr); | ||||
| 			{ | ||||
| 				hawk_int_t iv = 0; | ||||
|  | ||||
| 				if (p->type_size > 0 && p->type_size <= HAWK_SIZEOF(iv)) | ||||
| 				{ | ||||
| 				#if defined(HAWK_ENDIAN_LITTLE) | ||||
| 					HAWK_MEMCPY (&iv, p->vptr, p->type_size); | ||||
| 				#else | ||||
| 					HAWK_MEMCPY ((hawk_uint8_t*)&iv + (HAWK_SIZEOF(iv) - p->type_size), p->vptr, p->type_size); | ||||
| 				#endif | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					iv = *(hawk_int_t*)p->vptr; | ||||
| 				} | ||||
| 				tmp = hawk_rtx_makeintval(rtx, iv); | ||||
| 				break; | ||||
| 			} | ||||
|  | ||||
| 			case HAWK_VAL_MAP_DATA_FLT: | ||||
| 				tmp = hawk_rtx_makefltval(rtx, *(hawk_flt_t*)p->vptr); | ||||
|  | ||||
		Reference in New Issue
	
	Block a user