syslog-ng source
kv-scanner.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2017 Balabit
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17  *
18  * As an additional exemption you are allowed to compile & link against the
19  * OpenSSL libraries as published by the OpenSSL project. See the file
20  * COPYING for details.
21  *
22  */
23 #ifndef KV_SCANNER_H_INCLUDED
24 #define KV_SCANNER_H_INCLUDED
25 
26 #include "syslog-ng.h"
27 #include "str-utils.h"
28 
29 
30 typedef struct _KVScanner KVScanner;
31 
32 typedef gboolean (*KVTransformValueFunc)(KVScanner *);
33 typedef void (*KVExtractAnnotationFunc)(KVScanner *);
34 typedef gboolean (*KVIsValidKeyCharFunc)(gchar c);
35 
36 struct _KVScanner
37 {
38  const gchar *input;
39  gsize input_pos;
40  GString *key;
41  GString *value;
42  GString *decoded_value;
43  GString *stray_words;
44  gboolean value_was_quoted;
46  const gchar *pair_separator;
48  gchar stop_char;
49 
53 };
54 
55 void kv_scanner_init(KVScanner *self, gchar value_separator, const gchar *pair_separator, gboolean extract_stray_words);
56 void kv_scanner_deinit(KVScanner *self);
57 
58 static inline void
59 kv_scanner_input(KVScanner *self, const gchar *input)
60 {
61  self->input = input;
62  self->input_pos = 0;
63  if (self->stray_words)
64  g_string_truncate(self->stray_words, 0);
65 }
66 
67 static inline const gchar *
68 kv_scanner_get_current_key(KVScanner *self)
69 {
70  return self->key->str;
71 }
72 
73 static inline gsize
74 kv_scanner_get_current_key_len(KVScanner *self)
75 {
76  return self->key->len;
77 }
78 
79 static inline const gchar *
80 kv_scanner_get_current_value(KVScanner *self)
81 {
82  return self->value->str;
83 }
84 
85 static inline gsize
86 kv_scanner_get_current_value_len(KVScanner *self)
87 {
88  return self->value->len;
89 }
90 
91 static inline const gchar *
92 kv_scanner_get_stray_words(KVScanner *self)
93 {
94  return self->stray_words ? self->stray_words->str : NULL;
95 }
96 
97 static inline gsize
98 kv_scanner_get_stray_words_len(KVScanner *self)
99 {
100  return self->stray_words ? self->stray_words->len : 0;
101 }
102 
103 static inline void
104 kv_scanner_set_transform_value(KVScanner *self, KVTransformValueFunc transform_value)
105 {
106  self->transform_value = transform_value;
107 }
108 
109 static inline void
110 kv_scanner_set_extract_annotation_func(KVScanner *self, KVExtractAnnotationFunc extract_annotation)
111 {
112  self->extract_annotation = extract_annotation;
113 }
114 
115 static inline void
116 kv_scanner_set_valid_key_character_func(KVScanner *self, KVIsValidKeyCharFunc is_valid_key_character)
117 {
118  self->is_valid_key_character = is_valid_key_character;
119 }
120 
121 static inline void
122 kv_scanner_set_stop_character(KVScanner *self, gchar stop_char)
123 {
124  self->stop_char = stop_char;
125 }
126 
127 gboolean kv_scanner_scan_next(KVScanner *self);
128 
129 #endif
gboolean(* KVTransformValueFunc)(KVScanner *)
Definition: kv-scanner.h:32
void(* KVExtractAnnotationFunc)(KVScanner *)
Definition: kv-scanner.h:33
gboolean(* KVIsValidKeyCharFunc)(gchar c)
Definition: kv-scanner.h:34
void kv_scanner_deinit(KVScanner *self)
Definition: kv-scanner.c:326
void kv_scanner_init(KVScanner *self, gchar value_separator, const gchar *pair_separator, gboolean extract_stray_words)
Definition: kv-scanner.c:331
gboolean kv_scanner_scan_next(KVScanner *self)
Definition: kv-scanner.c:307
#define self
Definition: rcptid.c:38
Definition: kv-scanner.h:37
KVTransformValueFunc transform_value
Definition: kv-scanner.h:50
gchar stop_char
Definition: kv-scanner.h:48
GString * decoded_value
Definition: kv-scanner.h:42
gsize pair_separator_len
Definition: kv-scanner.h:47
KVIsValidKeyCharFunc is_valid_key_character
Definition: kv-scanner.h:52
GString * stray_words
Definition: kv-scanner.h:43
gboolean value_was_quoted
Definition: kv-scanner.h:44
KVExtractAnnotationFunc extract_annotation
Definition: kv-scanner.h:51
const gchar * input
Definition: kv-scanner.h:38
GString * key
Definition: kv-scanner.h:40
GString * value
Definition: kv-scanner.h:41
gchar value_separator
Definition: kv-scanner.h:45
gsize input_pos
Definition: kv-scanner.h:39
const gchar * pair_separator
Definition: kv-scanner.h:46