10 #INCLUDE ONCE "Gir/GLib-2.0.bi"
12 #INCLUDE ONCE "datetime.bi"
32 FUNCTION isnum(
BYVAL N
AS DOUBLE)
AS INTEGER
33 SELECT CASE CAST(
ULONG PTR, @N)[1]
34 CASE &h7FF00000UL, &hFFF00000UL :
RETURN 0
35 CASE &h7FF80000UL, &hFFF80000UL :
RETURN 0
36 END SELECT :
RETURN -1
58 #MACRO _START_PARSER(_N_)
59 SUB start_##_N_
CDECL( _
60 BYVAL ctx
AS GMarkupParseContext
PTR, _
61 BYVAL element_name
AS CONST gchar
PTR, _
62 BYVAL AttNams
AS CONST gchar
PTR PTR, _
63 BYVAL AttVals
AS CONST gchar
PTR PTR, _
64 BYVAL UserData
AS gpointer, _
65 BYVAL error_
AS GError
PTR PTR)
66 WITH PEEK(GPX, UserData)
81 #MACRO _END_PARSER(_N_)
84 g_markup_parse_context_push(ctx, @Skip_parser, UserData)
88 SUB end_##_N_
CDECL( _
89 BYVAL ctx
AS GMarkupParseContext
PTR, _
90 BYVAL element_name
AS CONST gchar
PTR, _
91 BYVAL UserData
AS gpointer, _
92 BYVAL error_
AS GError
PTR PTR)
93 WITH PEEK(GPX, UserData)
110 #MACRO _NEW_PARSER(_N_,_T_)
112 g_markup_parse_context_pop(ctx)
116 STATIC SHARED AS GMarkupParser _N_##_parser =
TYPE(@start_##_N_, @end_##_N_, _T_, NULL, NULL)
122 STATIC SHARED AS GMarkupParser Skip_parser =
TYPE(NULL, NULL, NULL, NULL, NULL)
138 BYVAL Nam
AS CONST gchar
PTR, _
139 BYVAL AttNams
AS CONST gchar
PTR PTR, _
140 BYVAL AttVals
AS CONST gchar
PTR PTR)
AS CONST gchar
PTR
144 IF *AttNams[i] = *Nam
THEN RETURN AttVals[i]
163 BYVAL Ctx
AS GMarkupParseContext
PTR, _
164 BYVAL Text
AS CONST gchar
PTR, _
165 BYVAL Size
AS gsize, _
166 BYVAL UserData
AS gpointer, _
167 BYVAL Error_
AS GError
PTR PTR)
169 CAST(GPX
PTR, UserData)->Cont =
LEFT(*Text, Size)
178 SELECT CASE *element_name
183 SELECT CASE *element_name
186 .Ang = g_ascii_strtod(.Cont, NULL)
189 .Spd = g_ascii_strtod(.Cont, NULL) * 1.852
201 SELECT CASE *element_name
204 g_markup_parse_context_push(ctx, @
EXT_parser, UserData)
208 SELECT CASE *element_name
211 .Ele = g_ascii_strtod(.Cont, NULL)
216 VALINT(
MID(.Cont, 1, 4)) _
217 ,
VALINT(
MID(.Cont, 6, 2)) _
218 ,
VALINT(
MID(.Cont, 9, 2)) ) _
220 VALINT(
MID(.Cont, 12, 2)) _
221 ,
VALINT(
MID(.Cont, 15, 2)) _
222 ,
VALINT(
MID(.Cont, 18, 2)) )
224 g_markup_parse_context_pop(ctx)
237 SELECT CASE *element_name
241 p =
fetch(
"lat") :
if p
then .Lat = g_ascii_strtod(p, NULL) * Deg2Rad
242 p =
fetch(
"lon") :
if p
then .Lon = g_ascii_strtod(p, NULL) * Deg2Rad
243 g_markup_parse_context_push(ctx, @
PNT_parser, UserData)
247 SELECT CASE *element_name
249 g_markup_parse_context_pop(ctx)
250 VAR x =
NEW(.Dat)
TrP ( _
259 IF isnum(.Tim)
THEN .Tim = NaN
ELSE .TiX += 1
260 IF isnum(.Lon)
THEN .Lon = NaN
ELSE .LoX += 1
261 IF isnum(.Lat)
THEN .Lat = NaN
ELSE .LaX += 1
262 IF isnum(.Ele)
THEN .Ele = NaN
ELSE .ElX += 1
263 IF isnum(.Spd)
THEN .Spd = NaN
ELSE .SpX += 1
264 IF isnum(.Ang)
THEN .Ang = NaN
ELSE .AnX += 1
267 _NEW_PARSER(SEG,NULL)
277 SELECT CASE *element_name
282 g_markup_parse_context_push(ctx, @
SEG_parser, UserData)
286 SELECT CASE *element_name
289 g_markup_parse_context_pop(ctx)
301 SELECT CASE *element_name
311 g_markup_parse_context_push(ctx, @
TRK_parser, UserData)
315 SELECT CASE *element_name
318 g_markup_parse_context_pop(ctx)
321 _NEW_PARSER(GPX,NULL)
336 CONSTRUCTOR GPX(
BYVAL Parent
AS TrackLoader
PTR)
339 DIM AS GError
PTR er_r = NULL
340 VAR ctx = g_markup_parse_context_new(@
GPX_parser, 0, @
THIS, NULL)
341 IF g_markup_parse_context_parse(ctx, .Buff, .Byt, @er_r)
THEN _
342 IF 0 = g_markup_parse_context_end_parse(ctx, @er_r)
THEN _
343 Tix += 1 : .Errr = @
"cannot parse (invalid content)"
344 g_markup_parse_context_free(ctx)
345 .Siz = Dat -
CAST(
ANY PTR, .Buff)