21 #include "ws_symbol_export.h" 73 typedef void (*uat_post_update_cb_t)(void);
87 typedef void* (*uat_copy_cb_t)(
void *dest,
const void *source,
size_t len);
97 typedef void (*uat_free_cb_t)(
void *record);
105 typedef void (*uat_reset_cb_t)(void);
119 typedef gboolean (*uat_update_cb_t)(
void *record,
char **error);
139 typedef gboolean (*uat_fld_chk_cb_t)(
void *record,
const char *ptr,
unsigned len,
const void *chk_data,
const void *fld_data,
char **error);
148 typedef void (*uat_fld_set_cb_t)(
void *record,
const char *ptr,
unsigned len,
const void *set_data,
const void *fld_data);
157 typedef void (*uat_fld_tostr_cb_t)(
void *record,
char **out_ptr,
unsigned *out_len,
const void *tostr_data,
const void *fld_data);
167 typedef enum _uat_text_mode_t {
211 PT_TXTMOD_DIRECTORYNAME,
213 PT_TXTMOD_DISPLAY_FILTER,
215 PT_TXTMOD_PROTO_FIELD,
229 uat_text_mode_t mode;
232 uat_fld_chk_cb_t chk;
233 uat_fld_set_cb_t
set;
234 uat_fld_tostr_cb_t tostr;
243 const void* fld_data;
250 #define UAT_END_FIELDS {NULL,NULL,PT_TXTMOD_NONE,{0,0,0},{0,0,0},0,0,FLDFILL} 257 #define UAT_AFFECTS_DISSECTION 0x00000001 258 #define UAT_AFFECTS_FIELDS 0x00000002 280 uat_t* uat_new(
const char* name,
282 const char* filename,
283 gboolean from_profile,
285 guint* num_items_ptr,
288 uat_copy_cb_t copy_cb,
289 uat_update_cb_t update_cb,
290 uat_free_cb_t free_cb,
291 uat_post_update_cb_t post_update_cb,
292 uat_reset_cb_t reset_cb,
298 void uat_cleanup(
void);
308 gboolean uat_load(
uat_t* uat_in,
char** err);
319 gboolean uat_load_str(
uat_t* uat_in,
char* entry,
char** err);
327 uat_t *uat_find(gchar *name);
330 uat_t* uat_get_table_by_name(
const char* name);
336 gboolean uat_fld_chk_str(
void*,
const char*,
unsigned,
const void*,
const void*,
char** err);
337 gboolean uat_fld_chk_oid(
void*,
const char*,
unsigned,
const void*,
const void*,
char** err);
339 gboolean uat_fld_chk_proto(
void*,
const char*,
unsigned,
const void*,
const void*,
char** err);
341 gboolean uat_fld_chk_num_dec(
void*,
const char*,
unsigned,
const void*,
const void*,
char** err);
343 gboolean uat_fld_chk_num_hex(
void*,
const char*,
unsigned,
const void*,
const void*,
char** err);
345 gboolean uat_fld_chk_bool(
void*,
const char*,
unsigned,
const void*,
const void*,
char** err);
347 gboolean uat_fld_chk_enum(
void*,
const char*,
unsigned,
const void*,
const void*,
char**);
349 gboolean uat_fld_chk_range(
void*,
const char*,
unsigned,
const void*,
const void*,
char**);
351 gboolean uat_fld_chk_color(
void*,
const char*,
unsigned,
const void*,
const void*,
char**);
353 typedef void (*uat_cb_t)(
void* uat,
void* user_data);
355 void uat_foreach_table(uat_cb_t cb,
void* user_data);
356 void uat_unload_all(
void);
358 char* uat_undquote(
const char* si, guint in_len, guint* len_p);
359 char* uat_unbinstring(
const char* si, guint in_len, guint* len_p);
360 char* uat_unesc(
const char* si, guint in_len, guint* len_p);
361 char* uat_esc(
const char* buf, guint len);
366 gboolean uat_fld_chk_str_isprint(
void*,
const char*,
unsigned,
const void*,
const void*,
char**);
369 gboolean uat_fld_chk_str_isalpha(
void*,
const char*,
unsigned,
const void*,
const void*,
char**);
372 gboolean uat_fld_chk_str_isalnum(
void*,
const char*,
unsigned,
const void*,
const void*,
char**);
375 gboolean uat_fld_chk_str_isdigit(
void*,
const char*,
unsigned,
const void*,
const void*,
char**);
378 gboolean uat_fld_chk_str_isxdigit(
void*,
const char*,
unsigned,
const void*,
const void*,
char**);
388 #define UNUSED_PARAMETER(n) 390 #define UNUSED_PARAMETER(n) n _U_ 397 #define UAT_CSTRING_CB_DEF(basename,field_name,rec_t) \ 398 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 399 char* new_buf = g_strndup(buf,len); \ 400 g_free((((rec_t*)rec)->field_name)); \ 401 (((rec_t*)rec)->field_name) = new_buf; } \ 402 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 403 if (((rec_t*)rec)->field_name ) { \ 404 *out_ptr = g_strdup((((rec_t*)rec)->field_name)); \ 405 *out_len = (unsigned)strlen((((rec_t*)rec)->field_name)); \ 407 *out_ptr = g_strdup(""); *out_len = 0; } } 409 #define UAT_FLD_CSTRING(basename,field_name,title,desc) \ 410 {#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} 412 #define UAT_FLD_CSTRING_ISPRINT(basename,field_name,title,desc) \ 413 {#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} 415 #define UAT_FLD_CSTRING_OTHER(basename,field_name,title,chk,desc) \ 416 {#field_name, title, PT_TXTMOD_STRING,{ chk ,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL} 422 #define UAT_FILENAME_CB_DEF(basename,field_name,rec_t) UAT_CSTRING_CB_DEF(basename,field_name,rec_t) 425 #define UAT_FLD_FILENAME(basename,field_name,title,desc) \ 426 {#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} 434 #define UAT_FLD_FILENAME_OTHER(basename,field_name,title,chk,desc) \ 435 {#field_name, title, PT_TXTMOD_FILENAME,{chk,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL} 437 #define UAT_DIRECTORYNAME_CB_DEF(basename,field_name,rec_t) UAT_CSTRING_CB_DEF(basename,field_name,rec_t) 439 #define UAT_FLD_DIRECTORYNAME(basename,field_name,title,desc) \ 440 {#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} 446 #define UAT_DISPLAY_FILTER_CB_DEF(basename,field_name,rec_t) UAT_CSTRING_CB_DEF(basename,field_name,rec_t) 448 #define UAT_FLD_DISPLAY_FILTER(basename,field_name,title,desc) \ 449 {#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} 455 #define UAT_PROTO_FIELD_CB_DEF(basename,field_name,rec_t) UAT_CSTRING_CB_DEF(basename,field_name,rec_t) 457 #define UAT_FLD_PROTO_FIELD(basename,field_name,title,desc) \ 458 {#field_name, title, PT_TXTMOD_PROTO_FIELD, {uat_fld_chk_str,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL} 463 #define UAT_FLD_OID(basename,field_name,title,desc) \ 464 {#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} 470 #define UAT_LSTRING_CB_DEF(basename,field_name,rec_t,ptr_element,len_element) \ 471 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 472 char* new_val = uat_unesc(buf,len,&(((rec_t*)rec)->len_element)); \ 473 g_free((((rec_t*)rec)->ptr_element)); \ 474 (((rec_t*)rec)->ptr_element) = new_val; }\ 475 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 476 if (((rec_t*)rec)->ptr_element ) { \ 477 *out_ptr = uat_esc(((rec_t*)rec)->ptr_element, (((rec_t*)rec)->len_element)); \ 478 *out_len = (unsigned)strlen(*out_ptr); \ 480 *out_ptr = g_strdup(""); \ 485 #define UAT_FLD_LSTRING(basename,field_name,title, desc) \ 486 {#field_name, title, PT_TXTMOD_STRING,{0,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL} 494 #define UAT_BUFFER_CB_DEF(basename,field_name,rec_t,ptr_element,len_element) \ 495 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 496 char* new_buf = len ? (char *)g_memdup(buf,len) : NULL; \ 497 g_free((((rec_t*)rec)->ptr_element)); \ 498 (((rec_t*)rec)->ptr_element) = new_buf; \ 499 (((rec_t*)rec)->len_element) = len; } \ 500 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 501 *out_ptr = ((rec_t*)rec)->ptr_element ? (char*)g_memdup(((rec_t*)rec)->ptr_element,((rec_t*)rec)->len_element) : g_strdup(""); \ 502 *out_len = ((rec_t*)rec)->len_element; } 504 #define UAT_FLD_BUFFER(basename,field_name,title,desc) \ 505 {#field_name, title, PT_TXTMOD_HEXBYTES,{0,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL} 512 #define UAT_DEC_CB_DEF(basename,field_name,rec_t) \ 513 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 514 char* tmp_str = g_strndup(buf,len); \ 515 ((rec_t*)rec)->field_name = (guint)strtol(tmp_str,NULL,10); \ 517 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 518 *out_ptr = g_strdup_printf("%d",((rec_t*)rec)->field_name); \ 519 *out_len = (unsigned)strlen(*out_ptr); } 521 #define UAT_FLD_DEC(basename,field_name,title,desc) \ 522 {#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} 524 #define UAT_FLD_NONE(basename,field_name,title,desc) \ 525 {#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} 532 #define UAT_HEX_CB_DEF(basename,field_name,rec_t) \ 533 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 534 char* tmp_str = g_strndup(buf,len); \ 535 ((rec_t*)rec)->field_name = (guint)strtol(tmp_str,NULL,16); \ 537 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 538 *out_ptr = g_strdup_printf("%x",((rec_t*)rec)->field_name); \ 539 *out_len = (unsigned)strlen(*out_ptr); } 541 #define UAT_FLD_HEX(basename,field_name,title,desc) \ 542 {#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} 548 #define UAT_BOOL_CB_DEF(basename,field_name,rec_t) \ 549 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 550 char* tmp_str = g_strndup(buf,len); \ 551 if (g_strcmp0(tmp_str, "TRUE") == 0) \ 552 ((rec_t*)rec)->field_name = 1; \ 554 ((rec_t*)rec)->field_name = 0; \ 556 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 557 *out_ptr = g_strdup_printf("%s",((rec_t*)rec)->field_name ? "TRUE" : "FALSE"); \ 558 *out_len = (unsigned)strlen(*out_ptr); } 560 #define UAT_FLD_BOOL(basename,field_name,title,desc) \ 561 {#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} 570 #define UAT_VS_DEF(basename,field_name,rec_t,default_t,default_val,default_str) \ 571 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* vs, const void* UNUSED_PARAMETER(u2)) {\ 573 char* str = g_strndup(buf,len); \ 575 ((rec_t*)rec)->field_name = default_val; \ 576 for(i=0; ( cstr = ((const value_string*)vs)[i].strptr ) ;i++) { \ 577 if (g_str_equal(cstr,str)) { \ 578 ((rec_t*)rec)->field_name = (default_t)((const value_string*)vs)[i].value; \ 584 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* vs, const void* UNUSED_PARAMETER(u2)) {\ 586 for(i=0;((const value_string*)vs)[i].strptr;i++) { \ 587 if ( ((const value_string*)vs)[i].value == ((rec_t*)rec)->field_name ) { \ 588 *out_ptr = g_strdup(((const value_string*)vs)[i].strptr); \ 589 *out_len = (unsigned)strlen(*out_ptr); \ 593 *out_ptr = g_strdup(default_str); \ 594 *out_len = (unsigned)strlen(default_str); } 596 #define UAT_VS_CSTRING_DEF(basename,field_name,rec_t,default_val,default_str) \ 597 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* vs, const void* UNUSED_PARAMETER(u2)) {\ 599 char* str = g_strndup(buf,len); \ 601 ((rec_t*)rec)->field_name = default_val; \ 602 for(i=0; ( cstr = ((const value_string*)vs)[i].strptr ) ;i++) { \ 603 if (g_str_equal(cstr,str)) { \ 604 ((rec_t*)rec)->field_name = g_strdup(((const value_string*)vs)[i].strptr); \ 610 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(vs), const void* UNUSED_PARAMETER(u2)) {\ 611 if (((rec_t*)rec)->field_name ) { \ 612 *out_ptr = g_strdup((((rec_t*)rec)->field_name)); \ 613 *out_len = (unsigned)strlen((((rec_t*)rec)->field_name)); \ 615 *out_ptr = g_strdup(""); *out_len = 0; } } 617 #define UAT_FLD_VS(basename,field_name,title,enum,desc) \ 618 {#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} 625 #define UAT_COLOR_CB_DEF(basename,field_name,rec_t) \ 626 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 628 ((rec_t*)rec)->field_name = 0; \ 631 char* tmp_str = g_strndup(buf+1,len-1); \ 632 ((rec_t*)rec)->field_name = (guint)strtol(tmp_str,NULL,16); \ 634 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 635 *out_ptr = g_strdup_printf("#%06X",((rec_t*)rec)->field_name); \ 636 *out_len = (unsigned)strlen(*out_ptr); } 638 #define UAT_FLD_COLOR(basename,field_name,title,desc) \ 639 {#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} 646 #define UAT_PROTO_DEF(basename, field_name, dissector_field, name_field, rec_t) \ 647 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 649 gchar *tmp = g_strndup(buf,len); \ 650 ((rec_t*)rec)->name_field = g_ascii_strdown(tmp, -1); \ 652 g_strchug(((rec_t*)rec)->name_field); \ 653 ((rec_t*)rec)->dissector_field = find_dissector(((rec_t*)rec)->name_field); \ 655 ((rec_t*)rec)->dissector_field = find_dissector("data"); \ 656 ((rec_t*)rec)->name_field = NULL; \ 658 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 659 if ( ((rec_t*)rec)->name_field ) { \ 660 *out_ptr = g_strdup((((rec_t*)rec)->name_field)); \ 661 *out_len = (unsigned)strlen(*out_ptr); \ 663 *out_ptr = g_strdup(""); *out_len = 0; } } 666 #define UAT_FLD_PROTO(basename,field_name,title,desc) \ 667 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_proto,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},{0,0,0},0,desc,FLDFILL} 673 #define UAT_RANGE_CB_DEF(basename,field_name,rec_t) \ 674 static void basename ## _ ## field_name ## _set_cb(void* rec, const char* buf, guint len, const void* UNUSED_PARAMETER(u1), const void* u2) {\ 675 char* rng = g_strndup(buf,len);\ 676 range_convert_str(NULL, &(((rec_t*)rec)->field_name), rng,GPOINTER_TO_UINT(u2)); \ 679 static void basename ## _ ## field_name ## _tostr_cb(void* rec, char** out_ptr, unsigned* out_len, const void* UNUSED_PARAMETER(u1), const void* UNUSED_PARAMETER(u2)) {\ 680 if ( ((rec_t*)rec)->field_name ) { \ 681 *out_ptr = range_convert_range(NULL, ((rec_t*)rec)->field_name); \ 682 *out_len = (unsigned)strlen(*out_ptr); \ 684 *out_ptr = g_strdup(""); *out_len = 0; } } 687 #define UAT_FLD_RANGE(basename,field_name,title,max,desc) \ 688 {#field_name, title, PT_TXTMOD_STRING,{uat_fld_chk_range,basename ## _ ## field_name ## _set_cb,basename ## _ ## field_name ## _tostr_cb},\ 689 {0,0,0},GUINT_TO_POINTER(max),desc,FLDFILL}