-
-
Notifications
You must be signed in to change notification settings - Fork 1k
/
Parser.cpp
127 lines (105 loc) · 2.48 KB
/
Parser.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Written (W) 2013 Evgeniy Andreev (gsomix)
*/
#include <shogun/io/Parser.h>
using namespace shogun;
CParser::CParser()
{
init();
}
CParser::CParser(SGVector<char> text, CTokenizer* tokenizer)
{
init();
set_text(text);
set_tokenizer(tokenizer);
}
CParser::~CParser()
{
m_text=SGVector<char>();
}
bool CParser::has_next()
{
if (m_tokenizer!=NULL)
return m_tokenizer->has_next();
return false;
}
void CParser::skip_token()
{
index_t start=0;
m_tokenizer->next_token_idx(start);
}
SGVector<char> CParser::read_string()
{
index_t start=0;
index_t end=0;
end=m_tokenizer->next_token_idx(start);
SGVector<char> result=SGVector<char>(end-start);
for (index_t i=start; i<end; i++)
{
result[i-start]=m_text[i];
}
return result;
}
bool CParser::read_bool()
{
SGVector<char> token=read_string();
if (token.vlen>0)
return (bool) strtol(token.vector, NULL, 10);
else
return (bool) 0L;
}
#define READ_INT_METHOD(fname, convf, sg_type) \
sg_type CParser::fname(int32_t base) \
{ \
SGVector<char> token=read_string(); \
\
if (token.vlen>0) \
return (sg_type) convf(token.vector, NULL, base); \
else \
return (sg_type) 0L; \
}
READ_INT_METHOD(read_char, strtol, char)
READ_INT_METHOD(read_byte, strtoul, uint8_t)
READ_INT_METHOD(read_short, strtol, int16_t)
READ_INT_METHOD(read_word, strtoul, uint16_t)
READ_INT_METHOD(read_int, strtol, int32_t)
READ_INT_METHOD(read_uint, strtoul, uint32_t)
READ_INT_METHOD(read_long, strtoll, int64_t)
READ_INT_METHOD(read_ulong, strtoull, uint64_t)
#undef READ_INT_METHOD
#define READ_REAL_METHOD(fname, convf, sg_type) \
sg_type CParser::fname() \
{ \
SGVector<char> token=read_string(); \
\
if (token.vlen>0) \
return (sg_type) convf(token.vector, NULL); \
else \
return (sg_type) 0L; \
}
READ_REAL_METHOD(read_short_real, strtod, float32_t)
READ_REAL_METHOD(read_real, strtod, float64_t)
READ_REAL_METHOD(read_long_real, strtold, floatmax_t)
#undef READ_REAL_METHOD
void CParser::set_text(SGVector<char> text)
{
m_text=text;
if (m_tokenizer!=NULL)
m_tokenizer->set_text(m_text);
}
void CParser::set_tokenizer(CTokenizer* tokenizer)
{
m_tokenizer=tokenizer;
if (m_tokenizer!=NULL)
m_tokenizer->set_text(m_text);
}
void CParser::init()
{
m_text=SGVector<char>();
m_tokenizer=NULL;
}