static guint get_hex_uint(tvbuff_t *tvb, gint offset, gint *next_offset) { int c; guint u = 0; while (g_ascii_isxdigit(c = tvb_get_guint8(tvb, offset))) { u = 16*u + ws_xton(c); offset++; } *next_offset = offset; return u; }
static int get_form_key_value(tvbuff_t *tvb, char **ptr, int offset, char stop) { const int orig_offset = offset; char *tmp; int len; len = 0; while (tvb_reported_length_remaining(tvb, offset) > 0) { guint8 ch; ch = tvb_get_guint8(tvb, offset); if (!ch) return -1; if (ch == stop) break; if (ch == '%') { offset++; ch = tvb_get_guint8(tvb, offset); if (ws_xton(ch) == -1) return -1; offset++; ch = tvb_get_guint8(tvb, offset); if (ws_xton(ch) == -1) return -1; } len++; offset++; } *ptr = tmp = (char*)wmem_alloc(wmem_packet_scope(), len + 1); tmp[len] = '\0'; len = 0; offset = orig_offset; while (tvb_reported_length_remaining(tvb, offset) > 0) { guint8 ch; ch = tvb_get_guint8(tvb, offset); if (!ch) return -1; if (ch == stop) break; if (ch == '%') { guint8 ch1, ch2; offset++; ch1 = tvb_get_guint8(tvb, offset); offset++; ch2 = tvb_get_guint8(tvb, offset); tmp[len] = ws_xton(ch1) << 4 | ws_xton(ch2); } else if (ch == '+') tmp[len] = ' '; else tmp[len] = ch; len++; offset++; } return offset; }