diff options
author | Guy Harris <guy@alum.mit.edu> | 2013-12-20 20:29:27 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2013-12-20 20:29:27 +0000 |
commit | 0f86a86f476e6c3c00ce73144c65bdb58fa716ea (patch) | |
tree | cb8300025ce5636be47b94c1c33eb3661f6286c1 /epan/wslua | |
parent | 7838eada544f7e657b4ec81f7b1885de73746d6b (diff) |
Add new string_enc and stringz_enc methods that take an encoding value
as an argument, just as the add_packet_field method for a tree does.
Use tvb_get_string_enc() and tvb_get_stringz_enc() rather than
tvb_get_string(), tvb_get_stringz(), tvb_get_unicode_string(), and
tvb_get_unicode_stringz(). Treat "ustring" as meaning "UTF-16-encoded
Unicode string" rather than "UCS-2-encoded subset-of-Unicode string".
svn path=/trunk/; revision=54310
Diffstat (limited to 'epan/wslua')
-rw-r--r-- | epan/wslua/wslua_tvb.c | 68 |
1 files changed, 64 insertions, 4 deletions
diff --git a/epan/wslua/wslua_tvb.c b/epan/wslua/wslua_tvb.c index 4b42493f04..aa1d7b5bc1 100644 --- a/epan/wslua/wslua_tvb.c +++ b/epan/wslua/wslua_tvb.c @@ -1120,6 +1120,22 @@ WSLUA_METHOD TvbRange_le_nstime(lua_State* L) { WSLUA_RETURN(1); /* The NSTime */ } +WSLUA_METHOD TvbRange_string_enc(lua_State* L) { + /* Obtain a string from a TvbRange, using a specified encoding */ + TvbRange tvbr = checkTvbRange(L,1); + guint encoding = (guint)luaL_checknumber(L,2); + + if ( !(tvbr && tvbr->tvb)) return 0; + if (tvbr->tvb->expired) { + luaL_error(L,"expired tvb"); + return 0; + } + + lua_pushlstring(L, (gchar*)tvb_get_string_enc(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len,encoding), tvbr->len); + + WSLUA_RETURN(1); /* The string */ +} + WSLUA_METHOD TvbRange_string(lua_State* L) { /* Obtain a string from a TvbRange */ TvbRange tvbr = checkTvbRange(L,1); @@ -1130,7 +1146,7 @@ WSLUA_METHOD TvbRange_string(lua_State* L) { return 0; } - lua_pushlstring(L, (gchar*)tvb_get_string(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len), tvbr->len ); + lua_pushlstring(L, (gchar*)tvb_get_string_enc(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len,ENC_ASCII|ENC_NA), tvbr->len); WSLUA_RETURN(1); /* The string */ } @@ -1146,7 +1162,7 @@ static int TvbRange_ustring_any(lua_State* L, gboolean little_endian) { return 0; } - str = (gchar*)tvb_get_unicode_string(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len,(little_endian ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN)); + str = (gchar*)tvb_get_string_enc(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,tvbr->len,(little_endian ? ENC_UTF_16|ENC_LITTLE_ENDIAN : ENC_UTF_16|ENC_BIG_ENDIAN)); lua_pushlstring(L, str, strlen(str)); return 1; /* The string */ @@ -1162,6 +1178,48 @@ WSLUA_METHOD TvbRange_le_ustring(lua_State* L) { WSLUA_RETURN(TvbRange_ustring_any(L, TRUE)); /* The string */ } +WSLUA_METHOD TvbRange_stringz_enc(lua_State* L) { + /* Obtain a zero terminated string from a TvbRange, using a specified encoding */ + TvbRange tvbr = checkTvbRange(L,1); + guint encoding = (guint)luaL_checknumber(L,2); + gint offset; + gunichar2 uchar; + + if ( !(tvbr && tvbr->tvb)) return 0; + if (tvbr->tvb->expired) { + luaL_error(L,"expired tvb"); + return 0; + } + + switch (encoding & ENC_CHARENCODING_MASK) { + + case ENC_UTF_16: + case ENC_UCS_2: + offset = tvbr->offset; + do { + if (!tvb_bytes_exist (tvbr->tvb->ws_tvb, offset, 2)) { + luaL_error(L,"out of bounds"); + return 0; + } + /* Endianness doesn't matter when looking for null */ + uchar = tvb_get_ntohs (tvbr->tvb->ws_tvb, offset); + offset += 2; + } while(uchar != 0); + break; + + default: + if (tvb_find_guint8 (tvbr->tvb->ws_tvb, tvbr->offset, -1, 0) == -1) { + luaL_error(L,"out of bounds"); + return 0; + } + break; + } + + lua_pushstring(L, (gchar*)tvb_get_stringz_enc(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,NULL,encoding)); + + WSLUA_RETURN(1); /* The zero terminated string */ +} + WSLUA_METHOD TvbRange_stringz(lua_State* L) { /* Obtain a zero terminated string from a TvbRange */ TvbRange tvbr = checkTvbRange(L,1); @@ -1177,7 +1235,7 @@ WSLUA_METHOD TvbRange_stringz(lua_State* L) { return 0; } - lua_pushstring(L, (gchar*)tvb_get_stringz(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,NULL) ); + lua_pushstring(L, (gchar*)tvb_get_stringz_enc(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,NULL,ENC_ASCII|ENC_NA)); WSLUA_RETURN(1); /* The zero terminated string */ } @@ -1219,7 +1277,7 @@ static int TvbRange_ustringz_any(lua_State* L, gboolean little_endian) { return 0; } - lua_pushstring(L, (gchar*)tvb_get_unicode_stringz(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,&count,(little_endian ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN)) ); + lua_pushstring(L, (gchar*)tvb_get_stringz_enc(wmem_packet_scope(),tvbr->tvb->ws_tvb,tvbr->offset,&count,(little_endian ? ENC_UTF_16|ENC_LITTLE_ENDIAN : ENC_UTF_16|ENC_BIG_ENDIAN)) ); lua_pushinteger(L,count); return 2; /* The zero terminated string, the length found in tvbr */ @@ -1422,7 +1480,9 @@ static const luaL_Reg TvbRange_methods[] = { {"le_ipv4", TvbRange_le_ipv4}, {"nstime", TvbRange_nstime}, {"le_nstime", TvbRange_le_nstime}, + {"string_enc", TvbRange_string_enc}, {"string", TvbRange_string}, + {"stringz_enc", TvbRange_stringz_enc}, {"stringz", TvbRange_stringz}, {"strsize", TvbRange_strsize}, {"bytes", TvbRange_bytes}, |