17#include "ws_symbol_export.h"
71typedef void (*uat_post_update_cb_t)(void);
85typedef void* (*uat_copy_cb_t)(
void *dest,
const void *source,
size_t len);
143typedef bool (*uat_fld_chk_cb_t)(
void *record,
const char *ptr,
unsigned len,
const void *chk_data,
const void *fld_data,
char **error);
152typedef void (*uat_fld_set_cb_t)(
void *record,
const char *ptr,
unsigned len,
const void *set_data,
const void *fld_data);
161typedef void (*uat_fld_tostr_cb_t)(
void *record,
char **out_ptr,
unsigned *out_len,
const void *tostr_data,
const void *fld_data);
221 PT_TXTMOD_DIRECTORYNAME,
223 PT_TXTMOD_DISPLAY_FILTER,
225 PT_TXTMOD_PROTO_FIELD,
259#define UAT_END_FIELDS {NULL,NULL,PT_TXTMOD_NONE,{0,0,0},{0,0,0},0,0,FLDFILL}
270#define UAT_AFFECTS_DISSECTION 0x00000001
271#define UAT_AFFECTS_FIELDS 0x00000002
295 const char* filename,
298 unsigned* num_items_ptr,
304 uat_post_update_cb_t post_update_cb,
332bool uat_load(
uat_t* uat_in,
const char *filename,
const char* app_env_var_prefix,
char** err);
401 const void *chk_data,
const void *fld_data,
char **err);
419 const void *chk_data,
const void *fld_data,
char **err);
438 const void *chk_data,
const void *fld_data,
char **err);
452bool uat_fld_chk_field(
void* u1,
const char* strptr,
unsigned len,
const void* u2,
const void* u3,
char** err);
466bool uat_fld_chk_num_dec(
void* u1,
const char* strptr,
unsigned len,
const void* u2,
const void* u3,
char** err);
494bool uat_fld_chk_num_hex(
void* u1,
const char* strptr,
unsigned len,
const void* u2,
const void* u3,
char** err);
550bool uat_fld_chk_num_dbl(
void* u1,
const char* strptr,
unsigned len,
const void* u2,
const void* u3,
char** err);
564bool uat_fld_chk_bool(
void* u1,
const char* strptr,
unsigned len,
const void* u2,
const void* u3,
char** err);
578bool uat_fld_chk_enum(
void* u1,
const char* strptr,
unsigned len,
const void* v,
const void* u3,
char** err);
592bool uat_fld_chk_range(
void* u1,
const char* strptr,
unsigned len,
const void* u2,
const void* u3,
char** err);
606bool uat_fld_chk_color(
void* u1,
const char* strptr,
unsigned len,
const void* u2,
const void* u3,
char** err);
608typedef void (*uat_cb_t)(
void* uat,
void* user_data);
640uint8_t *
uat_unesc(
const char *si,
unsigned in_len,
unsigned *len_p);
660char *
uat_undquote(
const char *si,
unsigned in_len,
unsigned *len_p);
673char *
uat_esc(
const uint8_t *buf,
unsigned len);
689char *
uat_unbinstring(
const char *si,
unsigned in_len,
unsigned *len_p);
771#define UNUSED_PARAMETER(n)
773#define UNUSED_PARAMETER(n) n _U_
780#define UAT_CSTRING_CB_DEF(basename,field_name,rec_t) \
781static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
782 char* new_buf = g_strndup(buf,len); \
783 g_free((((rec_t*)rec)->field_name)); \
784 (((rec_t*)rec)->field_name) = new_buf; } \
785static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
786 if (((rec_t*)rec)->field_name ) { \
787 *out_ptr = g_strdup((((rec_t*)rec)->field_name)); \
788 *out_len = (unsigned)strlen((((rec_t*)rec)->field_name)); \
790 *out_ptr = g_strdup(""); *out_len = 0; \
793#define UAT_FLD_CSTRING(basename,field_name,title,desc) \
794 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_str,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
796#define UAT_FLD_CSTRING_ISPRINT(basename,field_name,title,desc) \
797 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_str_isprint,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
799#define UAT_FLD_CSTRING_OTHER(basename,field_name,title,chk,desc) \
800 {#field_name, title, PT_TXTMOD_STRING,{ chk ,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
806#define UAT_FILENAME_CB_DEF(basename,field_name,rec_t) UAT_CSTRING_CB_DEF(basename,field_name,rec_t)
809#define UAT_FLD_FILENAME(basename,field_name,title,desc) \
810 {#field_name, title, PT_TXTMOD_FILENAME,{uat_fld_chk_str,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
818#define UAT_FLD_FILENAME_OTHER(basename,field_name,title,chk,desc) \
819 {#field_name, title, PT_TXTMOD_FILENAME,{chk,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
821#define UAT_DIRECTORYNAME_CB_DEF(basename,field_name,rec_t) UAT_CSTRING_CB_DEF(basename,field_name,rec_t)
823#define UAT_FLD_DIRECTORYNAME(basename,field_name,title,desc) \
824 {#field_name, title, PT_TXTMOD_DIRECTORYNAME,{uat_fld_chk_str,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
830#define UAT_DISPLAY_FILTER_CB_DEF(basename,field_name,rec_t) UAT_CSTRING_CB_DEF(basename,field_name,rec_t)
832#define UAT_FLD_DISPLAY_FILTER(basename,field_name,title,desc) \
833 {#field_name, title, PT_TXTMOD_DISPLAY_FILTER, {uat_fld_chk_str,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
839#define UAT_PROTO_FIELD_CB_DEF(basename,field_name,rec_t) UAT_CSTRING_CB_DEF(basename,field_name,rec_t)
841#define UAT_FLD_PROTO_FIELD(basename,field_name,title,desc) \
842 {#field_name, title, PT_TXTMOD_PROTO_FIELD, {uat_fld_chk_field,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
847#define UAT_FLD_OID(basename,field_name,title,desc) \
848 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_oid,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
858#define UAT_LSTRING_CB_DEF(basename,field_name,rec_t,ptr_element,len_element) \
859static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
860 uint8_t* new_val = uat_unesc(buf,len,&(((rec_t*)rec)->len_element)); \
861 g_free((((rec_t*)rec)->ptr_element)); \
862 (((rec_t*)rec)->ptr_element) = new_val; } \
863static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
864 if (((rec_t*)rec)->ptr_element ) { \
865 *out_ptr = uat_esc(((rec_t*)rec)->ptr_element, (((rec_t*)rec)->len_element)); \
866 *out_len = (unsigned)strlen(*out_ptr); \
868 *out_ptr = g_strdup(""); \
872#define UAT_FLD_LSTRING(basename,field_name,title, desc) \
873{#field_name, title, PT_TXTMOD_STRING,{0,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
881#define UAT_BUFFER_CB_DEF(basename,field_name,rec_t,ptr_element,len_element) \
882static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
883 unsigned char* new_buf = len ? (unsigned char *)g_memdup2(buf,len) : NULL; \
884 g_free((((rec_t*)rec)->ptr_element)); \
885 (((rec_t*)rec)->ptr_element) = new_buf; \
886 (((rec_t*)rec)->len_element) = len; } \
887static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
888 *out_ptr = ((rec_t*)rec)->ptr_element ? (char*)g_memdup2(((rec_t*)rec)->ptr_element,((rec_t*)rec)->len_element) : g_strdup(""); \
889 *out_len = ((rec_t*)rec)->len_element; }
891#define UAT_FLD_BUFFER(basename,field_name,title,desc) \
892 {#field_name, title, PT_TXTMOD_HEXBYTES,{0,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
899#define UAT_DEC_CB_DEF(basename,field_name,rec_t) \
900static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
901 char* tmp_str = g_strndup(buf,len); \
902 ws_strtou32(tmp_str, NULL, &((rec_t*)rec)->field_name); \
904static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
905 *out_ptr = ws_strdup_printf("%u",((rec_t*)rec)->field_name); \
906 *out_len = (unsigned)strlen(*out_ptr); }
908#define UAT_FLD_DEC(basename,field_name,title,desc) \
909 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_num_dec,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
914#define UAT_DEC64_CB_DEF(basename,field_name,rec_t) \
915static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
916 char* tmp_str = g_strndup(buf,len); \
917 ws_strtou64(tmp_str, NULL, &((rec_t*)rec)->field_name); \
919static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
920 *out_ptr = ws_strdup_printf("%" PRIu64,((rec_t*)rec)->field_name); \
921 *out_len = (unsigned)strlen(*out_ptr); }
923#define UAT_FLD_DEC64(basename,field_name,title,desc) \
924 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_num_dec64,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
929#define UAT_SIGNED_DEC_CB_DEF(basename,field_name,rec_t) \
930static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
931 char* tmp_str = g_strndup(buf,len); \
932 ws_strtoi32(tmp_str, NULL, &((rec_t*)rec)->field_name); \
934static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
935 *out_ptr = ws_strdup_printf("%d",((rec_t*)rec)->field_name); \
936 *out_len = (unsigned)strlen(*out_ptr); }
938#define UAT_FLD_SIGNED_DEC(basename,field_name,title,desc) \
939 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_num_signed_dec,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
944#define UAT_SIGNED_DEC64_CB_DEF(basename,field_name,rec_t) \
945static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
946 char* tmp_str = g_strndup(buf,len); \
947 ws_strtoi64(tmp_str, NULL, &((rec_t*)rec)->field_name); \
949static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
950 *out_ptr = ws_strdup_printf("%" PRId64,((rec_t*)rec)->field_name); \
951 *out_len = (unsigned)strlen(*out_ptr); }
953#define UAT_FLD_SIGNED_DEC64(basename,field_name,title,desc) \
954 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_num_signed_dec64,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
956#define UAT_FLD_NONE(basename,field_name,title,desc) \
957 {#field_name, title, PT_TXTMOD_NONE,{uat_fld_chk_num_dec,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
964#define UAT_HEX_CB_DEF(basename,field_name,rec_t) \
965static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
966 char* tmp_str = g_strndup(buf,len); \
967 ws_hexstrtou32(tmp_str, NULL, &((rec_t*)rec)->field_name); \
969static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
970 *out_ptr = ws_strdup_printf("%x",((rec_t*)rec)->field_name); \
971 *out_len = (unsigned)strlen(*out_ptr); }
973#define UAT_FLD_HEX(basename,field_name,title,desc) \
974{#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_num_hex,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
980#define UAT_HEX64_CB_DEF(basename,field_name,rec_t) \
981static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
982 char* tmp_str = g_strndup(buf,len); \
983 ws_hexstrtou64(tmp_str, NULL, &((rec_t*)rec)->field_name); \
985static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
986 *out_ptr = ws_strdup_printf("%" PRIx64,((rec_t*)rec)->field_name); \
987 *out_len = (unsigned)strlen(*out_ptr); }
989#define UAT_FLD_HEX64(basename,field_name,title,desc) \
990{#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_num_hex64,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
1001#define UAT_DBL_CB_DEF(basename,field_name,rec_t) \
1002static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
1003 char* tmp_str = g_strndup(buf,len); \
1004 ((rec_t*)rec)->field_name = g_ascii_strtod(tmp_str, NULL); \
1005 g_free(tmp_str); } \
1006static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
1008 *out_ptr = ws_strdup(dtoa_g_fmt(buf, ((rec_t*)rec)->field_name)); \
1009 *out_len = (unsigned)strlen(*out_ptr); }
1011#define UAT_FLD_DBL(basename,field_name,title,desc) \
1012 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_num_dbl,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
1021#define UAT_BOOL_CB_DEF(basename,field_name,rec_t) \
1022static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
1023 char* tmp_str = g_strndup(buf,len); \
1024 if (tmp_str && g_ascii_strcasecmp(tmp_str, "true") == 0) \
1025 ((rec_t*)rec)->field_name = 1; \
1027 ((rec_t*)rec)->field_name = 0; \
1028 g_free(tmp_str); } \
1029static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
1030 *out_ptr = ws_strdup_printf("%s",((rec_t*)rec)->field_name ? "TRUE" : "FALSE"); \
1031 *out_len = (unsigned)strlen(*out_ptr); }
1033#define UAT_FLD_BOOL(basename,field_name,title,desc) \
1034{#field_name, title, PT_TXTMOD_BOOL,{uat_fld_chk_bool,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
1043#define UAT_VS_DEF(basename,field_name,rec_t,default_t,default_val,default_str) \
1044static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* vs, const void* UNUSED_PARAMETER(u2)) {\
1046 char* str = g_strndup(buf,len); \
1048 ((rec_t*)rec)->field_name = default_val; \
1049 for(i=0; ( cstr = ((const value_string*)vs)[i].strptr ) ;i++) { \
1050 if (g_str_equal(cstr,str)) { \
1051 ((rec_t*)rec)->field_name = (default_t)((const value_string*)vs)[i].value; \
1057static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* vs, const void* UNUSED_PARAMETER(u2)) {\
1059 for(i=0;((const value_string*)vs)[i].strptr;i++) { \
1060 if ( ((const value_string*)vs)[i].value == ((rec_t*)rec)->field_name ) { \
1061 *out_ptr = g_strdup(((const value_string*)vs)[i].strptr); \
1062 *out_len = (unsigned)strlen(*out_ptr); \
1066 *out_ptr = g_strdup(default_str); \
1067 *out_len = (unsigned)strlen(default_str); }
1069#define UAT_VS_CSTRING_DEF(basename,field_name,rec_t,default_val,default_str) \
1070static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* vs, const void* UNUSED_PARAMETER(u2)) {\
1072 char* str = g_strndup(buf,len); \
1074 ((rec_t*)rec)->field_name = default_val; \
1075 for(i=0; ( cstr = ((const value_string*)vs)[i].strptr ) ;i++) { \
1076 if (g_str_equal(cstr,str)) { \
1077 ((rec_t*)rec)->field_name = g_strdup(((const value_string*)vs)[i].strptr); \
1083static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(vs), const void* UNUSED_PARAMETER(u2)) {\
1084 if (((rec_t*)rec)->field_name ) { \
1085 *out_ptr = g_strdup((((rec_t*)rec)->field_name)); \
1086 *out_len = (unsigned)strlen((((rec_t*)rec)->field_name)); \
1088 *out_ptr = g_strdup(""); *out_len = 0; } }
1090#define UAT_FLD_VS(basename,field_name,title,enum,desc) \
1091 {#field_name, title, PT_TXTMOD_ENUM,{uat_fld_chk_enum,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{&(enum),&(enum),&(enum)},&(enum),desc,FLDFILL}
1098#define UAT_COLOR_CB_DEF(basename,field_name,rec_t) \
1099static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
1101 ((rec_t*)rec)->field_name = 0; \
1104 char* tmp_str = g_strndup(buf+1,len-1); \
1105 ((rec_t*)rec)->field_name = (unsigned)strtol(tmp_str,NULL,16); \
1106 g_free(tmp_str); } \
1107static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
1108 *out_ptr = ws_strdup_printf("#%06X",((rec_t*)rec)->field_name); \
1109 *out_len = (unsigned)strlen(*out_ptr); }
1111#define UAT_FLD_COLOR(basename,field_name,title,desc) \
1112{#field_name, title, PT_TXTMOD_COLOR,{uat_fld_chk_color,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
1119#define UAT_DISSECTOR_DEF(basename, field_name, dissector_field, name_field, rec_t) \
1120static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
1122 ((rec_t*)rec)->name_field = g_strndup(buf, len); \
1123 g_strstrip(((rec_t*)rec)->name_field); \
1124 ((rec_t*)rec)->dissector_field = find_dissector(((rec_t*)rec)->name_field); \
1126 ((rec_t*)rec)->dissector_field = find_dissector("data"); \
1127 ((rec_t*)rec)->name_field = NULL; \
1129static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
1130 if ( ((rec_t*)rec)->name_field ) { \
1131 *out_ptr = g_strdup((((rec_t*)rec)->name_field)); \
1132 *out_len = (unsigned)strlen(*out_ptr); \
1134 *out_ptr = g_strdup(""); *out_len = 0; \
1138#define UAT_FLD_DISSECTOR(basename,field_name,title,desc) \
1139 {#field_name, title, PT_TXTMOD_DISSECTOR,{uat_fld_chk_proto,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
1141#define UAT_FLD_DISSECTOR_OTHER(basename,field_name,title,chk,desc) \
1142 {#field_name, title, PT_TXTMOD_DISSECTOR,{chk,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL}
1148#define UAT_RANGE_CB_DEF(basename,field_name,rec_t) \
1149static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, unsigned len, const void* UNUSED_PARAMETER(u1), const void* u2) {\
1150 char* rng = g_strndup(buf,len);\
1151 range_convert_str(NULL, &(((rec_t*)rec)->field_name), rng,GPOINTER_TO_UINT(u2)); \
1154static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\
1155 if ( ((rec_t*)rec)->field_name ) { \
1156 *out_ptr = range_convert_range(NULL, ((rec_t*)rec)->field_name); \
1157 *out_len = (unsigned)strlen(*out_ptr); \
1159 *out_ptr = g_strdup(""); *out_len = 0; \
1163#define UAT_FLD_RANGE(basename,field_name,title,max,desc) \
1164 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_range,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},\
1165 {0,0,0},GUINT_TO_POINTER(max),desc,FLDFILL}
Holds per-field display and cleanup state for a single column in a UAT record's GUI representation.
Definition uat-int.h:35
Describes a single editable field within a UAT (User Accessible Table).
Definition uat.h:234
struct _uat_field_t::@506 cb
Callbacks for validating, applying, and serializing this field's value.
uat_fld_chk_cb_t chk
Definition uat.h:241
uat_text_mode_t mode
Definition uat.h:237
const char * desc
Definition uat.h:254
uat_fld_tostr_cb_t tostr
Definition uat.h:243
const char * title
Definition uat.h:236
const void * fld_data
Definition uat.h:253
const char * name
Definition uat.h:235
const void * chk
Definition uat.h:248
struct _fld_data_t * priv
Definition uat.h:255
const void * set
Definition uat.h:249
const void * tostr
Definition uat.h:250
uat_fld_set_cb_t set
Definition uat.h:242
struct _uat_field_t::@507 cbdata
Opaque context pointers passed as auxiliary data to each corresponding callback.
Represents a User Accessible Table (UAT), managing a set of user-editable records exposed to a dissec...
Definition uat-int.h:44
void *(* uat_copy_cb_t)(void *dest, const void *source, size_t len)
Definition uat.h:85
WS_DLL_PUBLIC void uat_set_default_values(uat_t *uat_in, const char *default_values[])
Definition uat.c:283
WS_DLL_PUBLIC bool uat_fld_chk_num_hex64(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Check if a field contains a valid hexadecimal number.
WS_DLL_PUBLIC bool uat_fld_chk_bool(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Check if a field value is a boolean.
WS_DLL_PUBLIC uat_t * uat_new(const char *name, size_t size, const char *filename, bool from_profile, void *data_ptr, unsigned *num_items_ptr, unsigned flags, const char *help, uat_copy_cb_t copy_cb, uat_update_cb_t update_cb, uat_free_cb_t free_cb, uat_post_update_cb_t post_update_cb, uat_reset_cb_t reset_cb, uat_field_t *flds_array)
Definition uat.c:43
WS_DLL_PUBLIC bool uat_fld_chk_num_signed_dec(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Check if a field contains a signed decimal number.
_uat_text_mode_t
Controls how a UAT (User Accessible Table) field is rendered and parsed in both the preferences file ...
Definition uat.h:175
WS_DLL_PUBLIC bool uat_fld_chk_str(void *record, const char *ptr, unsigned len, const void *chk_data, const void *fld_data, char **err)
UAT field validator for generic string values.
WS_DLL_PUBLIC bool uat_fld_chk_num_hex(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a field contains a valid hexadecimal number.
uint8_t * uat_unesc(const char *si, unsigned in_len, unsigned *len_p)
Converts an ASCII string using C-style escapes (e.g., for unprintable.
Definition uat.c:961
struct _uat_field_t uat_field_t
Describes a single editable field within a UAT (User Accessible Table).
WS_DLL_PUBLIC bool uat_fld_chk_num_dbl(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Check if a field value is a numeric double.
WS_DLL_PUBLIC uat_t * uat_get_table_by_name(const char *name)
Retrieve a UAT table by its name.
Definition uat.c:270
WS_DLL_PUBLIC void uat_foreach_table(uat_cb_t cb, void *user_data)
Iterates over all UAT tables and calls a callback function for each.
Definition uat.c:607
WS_DLL_PUBLIC bool uat_fld_chk_oid(void *record, const char *ptr, unsigned len, const void *chk_data, const void *fld_data, char **err)
UAT field validator for ASN.1 Object Identifier strings.
char * uat_undquote(const char *si, unsigned in_len, unsigned *len_p)
Decode a quoted, C-style escaped ASCII string into a raw byte array.
Definition uat.c:1043
WS_DLL_PUBLIC bool uat_fld_chk_proto(void *record, const char *ptr, unsigned len, const void *chk_data, const void *fld_data, char **err)
UAT field validator for Wireshark protocol name strings.
WS_DLL_PUBLIC bool uat_fld_chk_str_isprint(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a string contains only printable characters.
void(* uat_free_cb_t)(void *record)
Definition uat.h:95
void uat_cleanup(void)
Cleanup all UATs.
Definition uat.c:589
WS_DLL_PUBLIC bool uat_fld_chk_enum(void *u1, const char *strptr, unsigned len, const void *v, const void *u3, char **err)
Checks if a field value is a valid enum.
WS_DLL_PUBLIC bool uat_fld_chk_color(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a color field is valid.
WS_DLL_PUBLIC bool uat_fld_chk_str_isxdigit(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a string contains only hexadecimal digits.
WS_DLL_PUBLIC bool uat_load_str(uat_t *uat_in, const char *entry, char **err)
Create or update a single UAT entry using a string.
bool(* uat_update_cb_t)(void *record, char **error)
Definition uat.h:123
WS_DLL_PUBLIC bool uat_fld_chk_str_isalnum(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a string is alphanumeric.
WS_DLL_PUBLIC bool uat_fld_chk_field(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a field name is valid.
WS_DLL_PUBLIC bool uat_fld_chk_num_dec(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a field value is a valid decimal number.
enum _uat_text_mode_t uat_text_mode_t
Controls how a UAT (User Accessible Table) field is rendered and parsed in both the preferences file ...
WS_DLL_PUBLIC bool uat_fld_chk_num_signed_dec64(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Check if a field value is a signed decimal 64-bit number.
void uat_unload_all(void)
Unloads all UATs that are not loaded from a profile.
Definition uat.c:560
WS_DLL_PUBLIC bool uat_fld_chk_range(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a field value is a range object.
char * uat_unbinstring(const char *si, unsigned in_len, unsigned *len_p)
Decode an ASCII hex-digit string into a raw byte array.
Definition uat.c:936
void(* uat_reset_cb_t)(void)
Definition uat.h:103
WS_DLL_PUBLIC bool uat_fld_chk_str_isdigit(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a string contains only digits.
WS_DLL_PUBLIC bool uat_fld_chk_num_dec64(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a field value is a valid decimal 64-bit number.
char * uat_esc(const uint8_t *buf, unsigned len)
Encode a raw byte array as a NUL-terminated C-style escaped ASCII string.
Definition uat.c:1048
uat_t * uat_find(char *name)
Given a UAT name or filename, find its pointer.
Definition uat.c:520
WS_DLL_PUBLIC void uat_destroy(uat_t *uat)
Free and deregister a single UAT.
Definition uat.c:601
WS_DLL_PUBLIC bool uat_fld_chk_str_isalpha(void *u1, const char *strptr, unsigned len, const void *u2, const void *u3, char **err)
Checks if a string contains only alphabetic characters.
WS_DLL_PUBLIC bool uat_load(uat_t *uat_in, const char *filename, const char *app_env_var_prefix, char **err)
Populate a UAT using its file.