forked from osmocom/wireshark
wsutil: Split ws_regex_matches() into two functions
Split ws_regex_matches() into two functions with better semantics and remove the WS_REGEX_ZERO_TERMINATED symbol. ws_regex_matches() matches zero terminated strings. ws_regex_matches_length() matches a string length in code units.
This commit is contained in:
parent
392745c56f
commit
36d5aad962
|
@ -424,6 +424,7 @@ libwsutil.so.0 libwsutil0 #MINVER#
|
||||||
ws_regex_compile@Base 3.7.0
|
ws_regex_compile@Base 3.7.0
|
||||||
ws_regex_free@Base 3.7.0
|
ws_regex_free@Base 3.7.0
|
||||||
ws_regex_matches@Base 3.7.0
|
ws_regex_matches@Base 3.7.0
|
||||||
|
ws_regex_matches_length@Base 3.7.0
|
||||||
ws_regex_pattern@Base 3.7.0
|
ws_regex_pattern@Base 3.7.0
|
||||||
ws_socket_ptoa@Base 3.1.1
|
ws_socket_ptoa@Base 3.1.1
|
||||||
ws_strcasestr@Base 3.7.0
|
ws_strcasestr@Base 3.7.0
|
||||||
|
|
|
@ -558,7 +558,7 @@ cmp_matches(const fvalue_t *fv, const ws_regex_t *regex)
|
||||||
{
|
{
|
||||||
GByteArray *a = fv->value.bytes;
|
GByteArray *a = fv->value.bytes;
|
||||||
|
|
||||||
return ws_regex_matches(regex, a->data, a->len);
|
return ws_regex_matches_length(regex, a->data, a->len);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -291,9 +291,9 @@ cmp_matches(const fvalue_t *fv, const ws_regex_t *regex)
|
||||||
if (a->tvb != NULL) {
|
if (a->tvb != NULL) {
|
||||||
tvb_len = tvb_captured_length(a->tvb);
|
tvb_len = tvb_captured_length(a->tvb);
|
||||||
data = (const char *)tvb_get_ptr(a->tvb, 0, tvb_len);
|
data = (const char *)tvb_get_ptr(a->tvb, 0, tvb_len);
|
||||||
rc = ws_regex_matches(regex, data, tvb_len);
|
rc = ws_regex_matches_length(regex, data, tvb_len);
|
||||||
} else {
|
} else {
|
||||||
rc = ws_regex_matches(regex, a->proto_string, WS_REGEX_ZERO_TERMINATED);
|
rc = ws_regex_matches(regex, a->proto_string);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
CATCH_ALL {
|
CATCH_ALL {
|
||||||
|
|
|
@ -152,7 +152,7 @@ cmp_matches(const fvalue_t *fv, const ws_regex_t *regex)
|
||||||
if (! regex) {
|
if (! regex) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return ws_regex_matches(regex, str, WS_REGEX_ZERO_TERMINATED);
|
return ws_regex_matches(regex, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -83,20 +83,17 @@ ws_regex_compile(const char *patt, char **errmsg)
|
||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
match_pcre2(pcre2_code *code, const char *subj, size_t subj_size)
|
match_pcre2(pcre2_code *code, PCRE2_SPTR subject, PCRE2_SIZE length)
|
||||||
{
|
{
|
||||||
PCRE2_SIZE length;
|
|
||||||
pcre2_match_data *match_data;
|
pcre2_match_data *match_data;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
length = subj_size == WS_REGEX_ZERO_TERMINATED ? PCRE2_ZERO_TERMINATED : (PCRE2_SIZE)subj_size;
|
|
||||||
|
|
||||||
/* We don't use the matched substring but pcre2_match requires
|
/* We don't use the matched substring but pcre2_match requires
|
||||||
* at least one pair of offsets. */
|
* at least one pair of offsets. */
|
||||||
match_data = pcre2_match_data_create(1, NULL);
|
match_data = pcre2_match_data_create(1, NULL);
|
||||||
|
|
||||||
rc = pcre2_match(code,
|
rc = pcre2_match(code,
|
||||||
subj,
|
subject,
|
||||||
length,
|
length,
|
||||||
0, /* start at offset zero of the subject */
|
0, /* start at offset zero of the subject */
|
||||||
0, /* default options */
|
0, /* default options */
|
||||||
|
@ -123,12 +120,23 @@ match_pcre2(pcre2_code *code, const char *subj, size_t subj_size)
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ws_regex_matches(const ws_regex_t *re, const char *subj, size_t subj_size)
|
ws_regex_matches(const ws_regex_t *re, const char *subj)
|
||||||
{
|
{
|
||||||
ws_return_val_if_null(re, FALSE);
|
ws_return_val_if_null(re, FALSE);
|
||||||
ws_return_val_if_null(subj, FALSE);
|
ws_return_val_if_null(subj, FALSE);
|
||||||
|
|
||||||
return match_pcre2(re->code, subj, subj_size);
|
return match_pcre2(re->code, (PCRE2_SPTR)subj, PCRE2_ZERO_TERMINATED);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
ws_regex_matches_length(const ws_regex_t *re,
|
||||||
|
const char *subj, size_t subj_length)
|
||||||
|
{
|
||||||
|
ws_return_val_if_null(re, FALSE);
|
||||||
|
ws_return_val_if_null(subj, FALSE);
|
||||||
|
|
||||||
|
return match_pcre2(re->code, (PCRE2_SPTR)subj, (PCRE2_SIZE)subj_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,6 @@
|
||||||
|
|
||||||
#include <wireshark.h>
|
#include <wireshark.h>
|
||||||
|
|
||||||
#define WS_REGEX_ZERO_TERMINATED SIZE_MAX
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -24,8 +22,14 @@ typedef struct _ws_regex ws_regex_t;
|
||||||
WS_DLL_PUBLIC ws_regex_t *
|
WS_DLL_PUBLIC ws_regex_t *
|
||||||
ws_regex_compile(const char *patt, char **errmsg);
|
ws_regex_compile(const char *patt, char **errmsg);
|
||||||
|
|
||||||
|
/** Matches a null-terminated subject string. */
|
||||||
WS_DLL_PUBLIC bool
|
WS_DLL_PUBLIC bool
|
||||||
ws_regex_matches(const ws_regex_t *re, const char *subj, size_t subj_size);
|
ws_regex_matches(const ws_regex_t *re, const char *subj);
|
||||||
|
|
||||||
|
/** Matches a subject string length in 8 bit code units. */
|
||||||
|
WS_DLL_PUBLIC bool
|
||||||
|
ws_regex_matches_length(const ws_regex_t *re,
|
||||||
|
const char *subj, size_t subj_length);
|
||||||
|
|
||||||
WS_DLL_PUBLIC void
|
WS_DLL_PUBLIC void
|
||||||
ws_regex_free(ws_regex_t *re);
|
ws_regex_free(ws_regex_t *re);
|
||||||
|
|
Loading…
Reference in New Issue