blob: 2131d4dfe957830a63675eb7a2dfb8e658f36ab5 [file] [log] [blame]
Benny Prijonoe7224612005-11-13 19:40:44 +00001/* $Id$
2 */
3/*
4 * PJLIB - PJ Foundation Library
5 * (C)2003-2005 Benny Prijono <bennylp@bulukucing.org>
6 *
7 * Author:
8 * Benny Prijono <bennylp@bulukucing.org>
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24#ifndef __PJPP_SCANNER_HPP__
25#define __PJPP_SCANNER_HPP__
26
27#include <pjlib-util/scanner.h>
28#include <pj++/string.hpp>
29
30class Pj_Char_Spec
31{
32public:
33 Pj_Char_Spec() { pj_cs_init(cs__); }
34
35 void set(int c) { pj_cs_set(cs__, c); }
36 void add_range(int begin, int end) { pj_cs_add_range(cs__, begin, end); }
37 void add_alpha() { pj_cs_add_alpha(cs__); }
38 void add_num() { pj_cs_add_num(cs__); }
39 void add_str(const char *str) { pj_cs_add_str(cs__, str); }
40 void del_range(int begin, int end) { pj_cs_del_range(cs__, begin, end); }
41 void del_str(const char *str) { pj_cs_del_str(cs__, str); }
42 void invert() { pj_cs_invert(cs__); }
43 int match(int c) { return pj_cs_match(cs__, c); }
44
45 pj_char_spec_element_t *cs_()
46 {
47 return cs__;
48 }
49
50 const pj_char_spec_element_t *cs_() const
51 {
52 return cs__;
53 }
54
55private:
56 pj_char_spec cs__;
57};
58
59class Pj_Scanner
60{
61public:
62 Pj_Scanner() {}
63
64 enum
65 {
66 SYNTAX_ERROR = 101
67 };
68 static void syntax_error_handler_throw_pj(pj_scanner *);
69
70 typedef pj_scan_state State;
71
72 void init(char *buf, int len, unsigned options=PJ_SCAN_AUTOSKIP_WS,
73 pj_syn_err_func_ptr callback = &syntax_error_handler_throw_pj)
74 {
75 pj_scan_init(&scanner_, buf, len, options, callback);
76 }
77
78 void fini()
79 {
80 pj_scan_fini(&scanner_);
81 }
82
83 int eof() const
84 {
85 return pj_scan_is_eof(&scanner_);
86 }
87
88 int peek_char() const
89 {
90 return *scanner_.curptr;
91 }
92
93 int peek(const Pj_Char_Spec *cs, Pj_String *out)
94 {
95 return pj_scan_peek(&scanner_, cs->cs_(), out);
96 }
97
98 int peek_n(pj_size_t len, Pj_String *out)
99 {
100 return pj_scan_peek_n(&scanner_, len, out);
101 }
102
103 int peek_until(const Pj_Char_Spec *cs, Pj_String *out)
104 {
105 return pj_scan_peek_until(&scanner_, cs->cs_(), out);
106 }
107
108 void get(const Pj_Char_Spec *cs, Pj_String *out)
109 {
110 pj_scan_get(&scanner_, cs->cs_(), out);
111 }
112
113 void get_n(unsigned N, Pj_String *out)
114 {
115 pj_scan_get_n(&scanner_, N, out);
116 }
117
118 int get_char()
119 {
120 return pj_scan_get_char(&scanner_);
121 }
122
123 void get_quote(int begin_quote, int end_quote, Pj_String *out)
124 {
125 pj_scan_get_quote(&scanner_, begin_quote, end_quote, out);
126 }
127
128 void get_newline()
129 {
130 pj_scan_get_newline(&scanner_);
131 }
132
133 void get_until(const Pj_Char_Spec *cs, Pj_String *out)
134 {
135 pj_scan_get_until(&scanner_, cs->cs_(), out);
136 }
137
138 void get_until_ch(int until_ch, Pj_String *out)
139 {
140 pj_scan_get_until_ch(&scanner_, until_ch, out);
141 }
142
143 void get_until_chr(const char *spec, Pj_String *out)
144 {
145 pj_scan_get_until_chr(&scanner_, spec, out);
146 }
147
148 void advance_n(unsigned N, bool skip_ws=true)
149 {
150 pj_scan_advance_n(&scanner_, N, skip_ws);
151 }
152
153 int strcmp(const char *s, int len)
154 {
155 return pj_scan_strcmp(&scanner_, s, len);
156 }
157
158 int stricmp(const char *s, int len)
159 {
160 return pj_scan_stricmp(&scanner_, s, len);
161 }
162
163 void skip_ws()
164 {
165 pj_scan_skip_whitespace(&scanner_);
166 }
167
168 void save_state(State *state)
169 {
170 pj_scan_save_state(&scanner_, state);
171 }
172
173 void restore_state(State *state)
174 {
175 pj_scan_restore_state(&scanner_, state);
176 }
177
178 int get_pos_line() const
179 {
180 return scanner_.line;
181 }
182
183 int get_pos_col() const
184 {
185 return scanner_.col;
186 }
187
188
189private:
190 pj_scanner scanner_;
191};
192
193#endif /* __PJPP_SCANNER_HPP__ */
194