From Sam Roberts:

Added TvbRange:range()

From me:
Added TvbRange:bitfield()
Fixed some indents.

svn path=/trunk/; revision=28656
This commit is contained in:
Stig Bjørlykke 2009-06-08 08:14:36 +00:00
parent b7207572ac
commit 08797664b3
1 changed files with 94 additions and 22 deletions

View File

@ -5,6 +5,7 @@
*
* (c) 2006, Luis E. Garcia Ontanon <luis@ontanon.org>
* (c) 2008, Balint Reczey <balint.reczey@ericsson.com>
* (c) 2009, Stig Bjorlykke <stig@bjorlykke.org>
*
* $Id$
*
@ -541,7 +542,7 @@ WSLUA_METHOD Tvb_range(lua_State* L) {
if ((tvbr = new_TvbRange(L,tvb->ws_tvb,offset,len))) {
PUSH_TVBRANGE(L,tvbr);
WSLUA_RETURN(1); /* The TvbRange */
WSLUA_RETURN(1); /* The TvbRange */
}
return 0;
@ -593,7 +594,7 @@ WSLUA_METHOD TvbRange_uint(lua_State* L) {
return 1;
case 4:
lua_pushnumber(L,tvb_get_ntohl(tvbr->tvb->ws_tvb,tvbr->offset));
WSLUA_RETURN(1); /* The unsigned integer value */
WSLUA_RETURN(1); /* The unsigned integer value */
/*
* XXX:
* lua uses double so we have 52 bits to play with
@ -632,7 +633,7 @@ WSLUA_METHOD TvbRange_le_uint(lua_State* L) {
return 1;
case 4:
lua_pushnumber(L,tvb_get_letohl(tvbr->tvb->ws_tvb,tvbr->offset));
WSLUA_RETURN(1); /* The unsigned integer value */
WSLUA_RETURN(1); /* The unsigned integer value */
default:
luaL_error(L,"TvbRange:get_le_uint() does not handle %d byte integers",tvbr->len);
return 0;
@ -660,9 +661,9 @@ WSLUA_METHOD TvbRange_uint64(lua_State* L) {
case 6:
case 7:
case 8: {
UInt64 num = g_malloc(sizeof(guint64));
*num = tvb_get_ntoh64(tvbr->tvb->ws_tvb,tvbr->offset);
pushUInt64(L,num);
UInt64 num = g_malloc(sizeof(guint64));
*num = tvb_get_ntoh64(tvbr->tvb->ws_tvb,tvbr->offset);
pushUInt64(L,num);
WSLUA_RETURN(1);
}
default:
@ -692,9 +693,9 @@ WSLUA_METHOD TvbRange_le_uint64(lua_State* L) {
case 6:
case 7:
case 8: {
UInt64 num = g_malloc(sizeof(guint64));
*num = tvb_get_ntoh64(tvbr->tvb->ws_tvb,tvbr->offset);
pushUInt64(L,num);
UInt64 num = g_malloc(sizeof(guint64));
*num = tvb_get_ntoh64(tvbr->tvb->ws_tvb,tvbr->offset);
pushUInt64(L,num);
WSLUA_RETURN(1);
}
default:
@ -721,7 +722,7 @@ WSLUA_METHOD TvbRange_float(lua_State* L) {
return 1;
case 8:
lua_pushnumber(L,tvb_get_ntohieee_double(tvbr->tvb->ws_tvb,tvbr->offset));
WSLUA_RETURN(1); /* The flaoting point value */
WSLUA_RETURN(1); /* The flaoting point value */
default:
luaL_error(L,"TvbRange:get_float() does not handle %d byte floating numbers",tvbr->len);
return 0;
@ -742,7 +743,7 @@ WSLUA_METHOD TvbRange_le_float(lua_State* L) {
return 1;
case 8:
lua_pushnumber(L,tvb_get_letohieee_double(tvbr->tvb->ws_tvb,tvbr->offset));
WSLUA_RETURN(1); /* The flaoting point value */
WSLUA_RETURN(1); /* The flaoting point value */
default:
luaL_error(L,"TvbRange:get_float() does not handle %d byte floating numbers",tvbr->len);
return 0;
@ -761,8 +762,8 @@ WSLUA_METHOD TvbRange_ipv4(lua_State* L) {
return 0;
}
if (tvbr->len != 4)
WSLUA_ERROR(TvbRange_ipv4,"The range must be 4 octets long");
if (tvbr->len != 4)
WSLUA_ERROR(TvbRange_ipv4,"The range must be 4 octets long");
addr = g_malloc(sizeof(address));
@ -772,7 +773,7 @@ WSLUA_METHOD TvbRange_ipv4(lua_State* L) {
SET_ADDRESS(addr, AT_IPv4, 4, ip_addr);
pushAddress(L,addr);
WSLUA_RETURN(1); /* The IPv4 Address */
WSLUA_RETURN(1); /* The IPv4 Address */
}
WSLUA_METHOD TvbRange_le_ipv4(lua_State* L) {
@ -787,8 +788,8 @@ WSLUA_METHOD TvbRange_le_ipv4(lua_State* L) {
return 0;
}
if (tvbr->len != 4)
WSLUA_ERROR(TvbRange_ipv4,"The range must be 4 octets long");
if (tvbr->len != 4)
WSLUA_ERROR(TvbRange_ipv4,"The range must be 4 octets long");
addr = g_malloc(sizeof(address));
@ -799,7 +800,7 @@ WSLUA_METHOD TvbRange_le_ipv4(lua_State* L) {
SET_ADDRESS(addr, AT_IPv4, 4, ip_addr);
pushAddress(L,addr);
WSLUA_RETURN(1); /* The IPv4 Address */
WSLUA_RETURN(1); /* The IPv4 Address */
}
WSLUA_METHOD TvbRange_ether(lua_State* L) {
@ -816,15 +817,15 @@ WSLUA_METHOD TvbRange_ether(lua_State* L) {
addr = g_malloc(sizeof(address));
if (tvbr->len != 6)
WSLUA_ERROR(TvbRange_ether,"The range must be 6 bytes long");
if (tvbr->len != 6)
WSLUA_ERROR(TvbRange_ether,"The range must be 6 bytes long");
buff = tvb_memdup(tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len);
SET_ADDRESS(addr, AT_ETHER, 6, buff);
pushAddress(L,addr);
WSLUA_RETURN(1); /* The Ethernet Address */
WSLUA_RETURN(1); /* The Ethernet Address */
}
@ -840,7 +841,7 @@ WSLUA_METHOD TvbRange_string(lua_State* L) {
lua_pushstring(L, (gchar*)tvb_get_ephemeral_string(tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len) );
WSLUA_RETURN(1); /* The string */
WSLUA_RETURN(1); /* The string */
}
WSLUA_METHOD TvbRange_bytes(lua_State* L) {
@ -859,7 +860,75 @@ WSLUA_METHOD TvbRange_bytes(lua_State* L) {
pushByteArray(L,ba);
WSLUA_RETURN(1); /* The ByteArray */
WSLUA_RETURN(1); /* The ByteArray */
}
WSLUA_METHOD TvbRange_bitfield(lua_State* L) {
/* Get a bitfield from a TvbRange. */
#define WSLUA_OPTARG_TvbRange_bitfield_POSITION 2 /* The bit offset from the begining of the TvbRange. Defaults to 0. */
#define WSLUA_OPTARG_TvbRange_bitfield_LENGTH 3 /* The length (in bits) of the field. Defaults to 1. */
TvbRange tvbr = checkTvbRange(L,1);
int pos = luaL_optint(L,WSLUA_OPTARG_TvbRange_bitfield_POSITION,0);
int len = luaL_optint(L,WSLUA_OPTARG_TvbRange_bitfield_LENGTH,1);
if (!(tvbr && tvbr->tvb)) return 0;
if (tvbr->tvb->expired) {
luaL_error(L,"expired tvb");
return 0;
}
if ((pos+len) > (tvbr->len<<3)) {
luaL_error(L, "Requested bitfield out of range");
return 0;
}
if (len <= 8) {
lua_pushnumber(L,(lua_Number)tvb_get_bits8(tvbr->tvb->ws_tvb,tvbr->offset*8 + pos, len));
return 1;
} else if (len <= 16) {
lua_pushnumber(L,tvb_get_bits16(tvbr->tvb->ws_tvb,tvbr->offset*8 + pos, len, FALSE));
return 1;
} else if (len <= 32) {
lua_pushnumber(L,tvb_get_bits32(tvbr->tvb->ws_tvb,tvbr->offset*8 + pos, len, FALSE));
return 1;
} else if (len <= 64) {
UInt64 num = g_malloc(sizeof(guint64));
*num = tvb_get_bits64(tvbr->tvb->ws_tvb,tvbr->offset*8 + pos, len, FALSE);
pushUInt64(L,num);
WSLUA_RETURN(1); /* The bitfield value */
} else {
luaL_error(L,"TvbRange:bitfield() does not handle %d bits",len);
return 0;
}
}
WSLUA_METHOD TvbRange_range(lua_State* L) {
/* Creates a sub-TvbRange from this TvbRange. This is used also as the TvbRange:__call() metamethod. */
#define WSLUA_OPTARG_TvbRange_range_OFFSET 2 /* The offset (in octets) from the begining of the TvbRange. Defaults to 0. */
#define WSLUA_OPTARG_TvbRange_range_LENGTH 3 /* The length (in octets) of the range. Defaults to until the end of the TvbRange. */
TvbRange tvbr = checkTvbRange(L,1);
int offset = luaL_optint(L,WSLUA_OPTARG_TvbRange_range_OFFSET,0);
int len = luaL_optint(L,WSLUA_OPTARG_TvbRange_range_LENGTH,tvbr->len-offset);
if (!(tvbr && tvbr->tvb)) return 0;
if (tvbr->tvb->expired) {
luaL_error(L,"expired tvb");
return 0;
}
if (offset >= tvbr->len || (len + offset) > tvbr->len) {
luaL_error(L,"Range is out of bounds");
return 0;
}
if ((tvbr = new_TvbRange(L,tvbr->tvb->ws_tvb,tvbr->offset+offset,len))) {
PUSH_TVBRANGE(L,tvbr);
WSLUA_RETURN(1); /* The TvbRange */
}
return 0;
}
WSLUA_METHOD TvbRange_len(lua_State* L) {
@ -917,6 +986,8 @@ static const luaL_reg TvbRange_methods[] = {
{"le_ipv4", TvbRange_le_ipv4},
{"string", TvbRange_string},
{"bytes", TvbRange_bytes},
{"bitfield", TvbRange_bitfield},
{"range", TvbRange_range},
{"len", TvbRange_len},
{"offset", TvbRange_offset},
{"tvb", Tvb_tvb},
@ -925,6 +996,7 @@ static const luaL_reg TvbRange_methods[] = {
static const luaL_reg TvbRange_meta[] = {
{"__tostring", TvbRange__tostring},
{"__call", TvbRange_range},
{ NULL, NULL }
};