Wireshark-bugs: [Wireshark-bugs] [Bug 4700] WSLUA improvement (ProtoField.bool extension)
Date: Wed, 21 Apr 2010 03:36:24 -0700 (PDT)
https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=4700 --- Comment #15 from Tamas Regos <tamas.regos@xxxxxxxxxxxx> 2010-04-21 03:36:16 PDT --- (From update of attachment 4555) >--- wslua_proto_whitespaces.c 2010-04-21 11:53:58.278915800 +1000 >+++ wslua_proto_mod.c 2010-04-21 10:00:44.411756500 +1000 >@@ -465,6 +465,11 @@ > {"BASE_OCT", BASE_OCT}, > {"BASE_DEC_HEX", BASE_DEC_HEX}, > {"BASE_HEX_DEC", BASE_HEX_DEC}, >+ /* for FT_BOOLEAN, how wide the parent bitfield is */ >+ {"8",8}, >+ {"16",16}, >+ {"24",24}, >+ {"32",32}, > {NULL,0} > }; > >@@ -530,17 +535,66 @@ > return ret; > } > >+static true_false_string* true_false_string_from_table(lua_State* L, int idx) { >+ GArray* tfs = g_array_new(TRUE,TRUE,sizeof(true_false_string)); >+ true_false_string* ret; >+ true_false_string tf = { "True", "False" }; >+ >+ if (lua_isnil(L,idx)) { >+ return NULL; >+ } else if (!lua_istable(L,idx)) { >+ luaL_argerror(L,idx,"must be a table"); >+ g_array_free(tfs,TRUE); >+ return NULL; >+ } >+ >+ lua_pushnil(L); >+ >+ while (lua_next(L, idx)) { >+ >+ if (! lua_isnumber(L,-2)) { >+ luaL_argerror(L,idx,"All keys of a table used as true_false_string must be integers"); >+ g_array_free(tfs,TRUE); >+ return NULL; >+ } >+ >+ if (! lua_isstring(L,-1)) { >+ luaL_argerror(L,idx,"All values of a table used as true_false_string must be strings"); >+ g_array_free(tfs,TRUE); >+ return NULL; >+ } >+ >+ /* arrays in LUA start with index number 1 */ >+ if ((guint32)lua_tonumber(L,-2) == 1) >+ tf.true_string = strdup(lua_tostring(L,-1)); >+ >+ if ((guint32)lua_tonumber(L,-2) == 2) >+ tf.false_string = strdup(lua_tostring(L,-1)); >+ >+ lua_pop(L, 1); >+ } >+ >+ g_array_append_val(tfs,tf); >+ >+ ret = (true_false_string*)tfs->data; >+ >+ g_array_free(tfs,FALSE); >+ >+ return ret; >+} >+ > WSLUA_CONSTRUCTOR ProtoField_new(lua_State* L) { /* Creates a new field to be used in a protocol. */ > #define WSLUA_ARG_ProtoField_new_NAME 1 /* Actual name of the field (the string that appears in the tree). */ > #define WSLUA_ARG_ProtoField_new_ABBR 2 /* Filter name of the field (the string that is used in filters). */ > #define WSLUA_ARG_ProtoField_new_TYPE 3 /* Field Type (FT_*). */ >-#define WSLUA_OPTARG_ProtoField_new_VALUESTRING 4 /* A ValueString object. */ >+#define WSLUA_OPTARG_ProtoField_new_VOIDSTRING 4 /* A VoidString object. */ > #define WSLUA_OPTARG_ProtoField_new_BASE 5 /* The representation BASE_*. */ > #define WSLUA_OPTARG_ProtoField_new_MASK 6 /* The bitmask to be used. */ > #define WSLUA_OPTARG_ProtoField_new_DESCR 7 /* The description of the field. */ > > ProtoField f = g_malloc(sizeof(wslua_field_t)); >- value_string* vs; >+ value_string* vs = NULL; >+ true_false_string* tfs = NULL; > const gchar *blob; > > /* will be using -2 as far as the field has not been added to an array then it will turn -1 */ >@@ -556,11 +610,18 @@ > return 0; > } > >- if (! lua_isnil(L,WSLUA_OPTARG_ProtoField_new_VALUESTRING) ) { >- vs = value_string_from_table(L,WSLUA_OPTARG_ProtoField_new_VALUESTRING); >+ if (! lua_isnil(L,WSLUA_OPTARG_ProtoField_new_VOIDSTRING) ) { >+ if (f->type == FT_BOOLEAN) { >+ tfs = true_false_string_from_table(L,WSLUA_OPTARG_ProtoField_new_VOIDSTRING); >+ } >+ else { >+ vs = value_string_from_table(L,WSLUA_OPTARG_ProtoField_new_VOIDSTRING); >+ } > > if (vs) { >- f->vs = vs; >+ f->vs = VALS(vs); >+ } else if (tfs) { >+ f->vs = TFS(tfs); > } else { > g_free(f); > return 0; >@@ -605,7 +666,7 @@ > f->name = g_strdup(name); > f->abbr = g_strdup(abbr); > f->type = type; >- f->vs = vs; >+ f->vs = VALS(vs); > f->base = base; > f->mask = mask; > if (blob && strcmp(blob, f->name) != 0) { >@@ -731,6 +792,59 @@ > PROTOFIELD_INTEGER(int64,FT_INT64) > PROTOFIELD_INTEGER(framenum,FT_FRAMENUM) > >+static int ProtoField_boolean(lua_State* L, enum ftenum type) { >+ ProtoField f = g_malloc(sizeof(wslua_field_t)); >+ const gchar* abbr = luaL_checkstring(L,1); >+ const gchar* name = luaL_optstring(L,2,abbr); >+ base_display_e base = luaL_optint(L, 3, BASE_NONE); >+ true_false_string* tfs = (lua_gettop(L) > 3) ? true_false_string_from_table(L,4) : NULL; >+ int mask = luaL_optint(L, 5, 0x0); >+ const gchar* blob = luaL_optstring(L,6,NULL); >+ >+ if ((mask == 0x0 || mask == 0) && base != BASE_NONE) { >+ luaL_argerror(L,2,"Fieldbase (fielddisplay) must be BASE_NONE" >+ " if bitmask is 0x0 or 0."); >+ return 0; >+ } >+ >+ if ((mask != 0x0 || mask != 0) && (base < 1 || base > 64)) { >+ luaL_argerror(L,2,"Fieldbase (fielddisplay) must be between 1 and 64" >+ " if bitmask is non-zero (neither 0x0 nor 0)."); >+ return 0; >+ } >+ >+ f->hfid = -2; >+ f->ett = -1; >+ f->name = g_strdup(name); >+ f->abbr = g_strdup(abbr); >+ f->type = type; >+ f->vs = TFS(tfs); >+ f->base = base; >+ f->mask = mask; >+ if (blob && strcmp(blob, f->name) != 0) { >+ f->blob = g_strdup(blob); >+ } else { >+ f->blob = NULL; >+ } >+ >+ pushProtoField(L,f); >+ >+ return 1; >+} >+ >+#define PROTOFIELD_BOOL(lower,FT) static int ProtoField_##lower(lua_State* L) { return ProtoField_boolean(L,FT); } >+/* _WSLUA_CONSTRUCTOR_ ProtoField_bool */ >+/* WSLUA_ARG_Protofield_bool_ABBR Abbreviated name of the field (the string used in filters) */ >+/* WSLUA_OPTARG_Protofield_bool_NAME Actual name of the field (the string that appears in the tree) */ >+/* WSLUA_OPTARG_Protofield_bool_DISPLAY how wide the parent bitfield is (BASE_NONE is used for NULL-value) */ >+/* WSLUA_OPTARG_Protofield_bool_TRUE_FALSE_STRING A table containing the text that corresponds to the values */ >+/* WSLUA_OPTARG_Protofield_bool_MASK Integer mask of this field */ >+/* WSLUA_OPTARG_Protofield_bool_DESC Description of the field */ >+/* _WSLUA_RETURNS_ A protofield item to be added to a ProtoFieldArray */ >+ >+/* XXX: T/F strings */ >+PROTOFIELD_BOOL(bool,FT_BOOLEAN) >+ > static int ProtoField_other(lua_State* L,enum ftenum type) { > ProtoField f = g_malloc(sizeof(wslua_field_t)); > const gchar* abbr = luaL_checkstring(L,1); >@@ -842,13 +956,10 @@ > PROTOFIELD_OTHER(guid,FT_GUID) > PROTOFIELD_OTHER(oid,FT_OID) > >-/* XXX: T/F strings */ >-PROTOFIELD_OTHER(bool,FT_BOOLEAN) >- > WSLUA_METAMETHOD ProtoField_tostring(lua_State* L) { > /* Returns a string w/ info about a protofiled (for debugging purposes) */ > ProtoField f = checkProtoField(L,1); >- gchar* s = ep_strdup_printf("ProtoField(%i): %s %s %s %s %p %.8x %s",f->hfid,f->name,f->abbr,ftenum_to_string(f->type),base_to_string(f->base),(void *)f->vs,f->mask,f->blob); >+ gchar* s = ep_strdup_printf("ProtoField(%i): %s %s %s %s %p %.8x %s",f->hfid,f->name,f->abbr,ftenum_to_string(f->type),base_to_string(f->base),f->vs,f->mask,f->blob); > lua_pushstring(L,s); > return 1; > } -- Configure bugmail: https://bugs.wireshark.org/bugzilla/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the assignee for the bug.
- References:
- [Wireshark-bugs] [Bug 4700] New: WSLUA improvement (ProtoField.bool extension)
- From: bugzilla-daemon
- [Wireshark-bugs] [Bug 4700] New: WSLUA improvement (ProtoField.bool extension)
- Prev by Date: [Wireshark-bugs] [Bug 4702] Main window does not redraw when the "Save file as" dialog is open
- Next by Date: [Wireshark-bugs] [Bug 4700] WSLUA improvement (ProtoField.bool extension)
- Previous by thread: [Wireshark-bugs] [Bug 4700] WSLUA improvement (ProtoField.bool extension)
- Next by thread: [Wireshark-bugs] [Bug 4700] WSLUA improvement (ProtoField.bool extension)
- Index(es):