6#line 1 "../../include/volksdata/codec/parser_common.h"
12#ifndef VOLK_PARSER_COMMON_H
13#define VOLK_PARSER_COMMON_H
25#define YYCTYPE uint8_t
26#define YYCURSOR it->cur
27#define YYMARKER it->mar
28#define YYLIMIT it->lim
29#define YYFILL fill(it) == 0
32typedef struct parse_it_t {
50#line 41 "../../include/volksdata/codec/parser_common.h"
74static void parse_init (
ParseIterator *it, FILE *fh,
const char *sh)
82 if (!it->
buf) log_error (
"Error allocating lexer buffer.");
101#line 102 "parser_nt.c"
103#line 90 "../../include/volksdata/codec/parser_common.h"
112 if (it->
eof)
return 1;
114 size_t shift = it->
tok - it->
buf;
115 size_t used = it->
lim - it->
tok;
123 cur_off = it->
cur - it->
buf,
124 tok_off = it->
tok - it->
buf,
125 lim_off = it->
lim - it->
buf,
126 mar_off = it->
mar - it->
buf;
131 log_error (
"Memory allocation error.");
136 it->
cur = it->
buf + cur_off;
137 it->
tok = it->
buf + tok_off;
138 it->
lim = it->
buf + lim_off;
139 it->
mar = it->
buf + mar_off;
141 log_debug (
"Shifting bytes: %zu", shift);
142 memmove (it->
buf, it->
tok, used);
143 log_trace (
"Limit offset before reading data: %zu", it->
lim - it->
tok);
151#line 152 "parser_nt.c"
153#line 136 "../../include/volksdata/codec/parser_common.h"
172#ifdef VOLK_CODEC_DEBUG
180 const YYCTYPE *lit_data_e, *dtype_s, *lang_s;
192#line 193 "parser_nt.c"
195 unsigned int yyaccept = 0;
210 if (
YYFILL)
goto yyFillLabel0;
218#line 162 "lexer_nt.re"
221 "Invalid token @ %p: %s (\\x%x)",
226#line 227 "parser_nt.c"
236 if (
YYFILL)
goto yyFillLabel1;
241#line 145 "lexer_nt.re"
247#line 248 "parser_nt.c"
258 if (
YYFILL)
goto yyFillLabel2;
263#line 61 "lexer_nt.re"
270#line 271 "parser_nt.c"
279 if (
YYFILL)
goto yyFillLabel3;
286 case 0xC2 ... 0xF4:
goto yy14;
299 if (
YYFILL)
goto yyFillLabel4;
303 case 0xC2 ... 0xDF:
goto yy25;
304 case 0xE0:
goto yy26;
305 case 0xE1 ... 0xEF:
goto yy27;
306 case 0xF0:
goto yy28;
307 case 0xF1 ... 0xF3:
goto yy29;
308 case 0xF4:
goto yy30;
312#line 151 "lexer_nt.re"
316 memcpy (data, it->
tok, size);
317 data [size - 1] =
'\0';
323#line 324 "parser_nt.c"
326#line 138 "lexer_nt.re"
333#line 334 "parser_nt.c"
346 case 0xC2 ... 0xF4:
goto yy32;
349 if (
YYFILL)
goto yyFillLabel5;
362 if (
YYFILL)
goto yyFillLabel6;
379 if (
YYFILL)
goto yyFillLabel7;
384 case '\\':
goto yy18;
385 case 0xC2 ... 0xDF:
goto yy19;
386 case 0xE0:
goto yy20;
387 case 0xE1 ... 0xEF:
goto yy21;
388 case 0xF0:
goto yy22;
389 case 0xF1 ... 0xF3:
goto yy23;
390 case 0xF4:
goto yy24;
431 if (
YYFILL)
goto yyFillLabel8;
439 lit_data_e = it->
yyt1;
442#line 85 "lexer_nt.re"
445 size_t size = lit_data_e - it->
tok - 2;
449 char *metadata = NULL;
460 }
else md_marker = NULL;
463 metadata = malloc (size);
464 memcpy (metadata, md_marker + 1, size);
465 metadata [size - 1] =
'\0';
483#line 484 "parser_nt.c"
501 if (
YYFILL)
goto yyFillLabel9;
510 case 0x80 ... 0xBF:
goto yy13;
513 if (
YYFILL)
goto yyFillLabel10;
522 case 0xA0 ... 0xBF:
goto yy19;
525 if (
YYFILL)
goto yyFillLabel11;
534 case 0x80 ... 0xBF:
goto yy19;
537 if (
YYFILL)
goto yyFillLabel12;
546 case 0x90 ... 0xBF:
goto yy21;
549 if (
YYFILL)
goto yyFillLabel13;
558 case 0x80 ... 0xBF:
goto yy21;
561 if (
YYFILL)
goto yyFillLabel14;
570 case 0x80 ... 0x8F:
goto yy21;
573 if (
YYFILL)
goto yyFillLabel15;
582 case 0x80 ... 0xBF:
goto yy8;
585 if (
YYFILL)
goto yyFillLabel16;
594 case 0xA0 ... 0xBF:
goto yy25;
597 if (
YYFILL)
goto yyFillLabel17;
606 case 0x80 ... 0xBF:
goto yy25;
609 if (
YYFILL)
goto yyFillLabel18;
618 case 0x90 ... 0xBF:
goto yy27;
621 if (
YYFILL)
goto yyFillLabel19;
630 case 0x80 ... 0xBF:
goto yy27;
633 if (
YYFILL)
goto yyFillLabel20;
642 case 0x80 ... 0x8F:
goto yy27;
645 if (
YYFILL)
goto yyFillLabel21;
662 case '~' ... 0x7F:
goto yy31;
664 case '\\':
goto yy34;
665 case 0xC2 ... 0xDF:
goto yy35;
666 case 0xE0:
goto yy36;
667 case 0xE1 ... 0xEF:
goto yy37;
668 case 0xF0:
goto yy38;
669 case 0xF1 ... 0xF3:
goto yy39;
670 case 0xF4:
goto yy40;
673 if (
YYFILL)
goto yyFillLabel22;
679#line 73 "lexer_nt.re"
691#line 692 "parser_nt.c"
701 if (
YYFILL)
goto yyFillLabel23;
710 case 0x80 ... 0xBF:
goto yy31;
713 if (
YYFILL)
goto yyFillLabel24;
722 case 0xA0 ... 0xBF:
goto yy35;
725 if (
YYFILL)
goto yyFillLabel25;
734 case 0x80 ... 0xBF:
goto yy35;
737 if (
YYFILL)
goto yyFillLabel26;
746 case 0x90 ... 0xBF:
goto yy37;
749 if (
YYFILL)
goto yyFillLabel27;
758 case 0x80 ... 0xBF:
goto yy37;
761 if (
YYFILL)
goto yyFillLabel28;
770 case 0x80 ... 0x8F:
goto yy37;
773 if (
YYFILL)
goto yyFillLabel29;
789 case 0xEF ... 0xF3:
goto yy50;
790 case 0xCD:
goto yy54;
791 case 0xE2:
goto yy57;
794 if (
YYFILL)
goto yyFillLabel30;
812 if (
YYFILL)
goto yyFillLabel31;
824 case 'a' ...
'z':
goto yy64;
827 if (
YYFILL)
goto yyFillLabel32;
839 if (
YYFILL)
goto yyFillLabel33;
850 case 'a' ...
'f':
goto yy66;
853 if (
YYFILL)
goto yyFillLabel34;
864 case 'a' ...
'f':
goto yy67;
867 if (
YYFILL)
goto yyFillLabel35;
878 case 'a' ...
'f':
goto yy68;
881 if (
YYFILL)
goto yyFillLabel36;
892 case 'a' ...
'f':
goto yy69;
895 if (
YYFILL)
goto yyFillLabel37;
910 case 'a' ...
'z':
goto yy49;
912 case 0xC2:
goto yy71;
913 case 0xC3:
goto yy52;
915 case 0xCE ... 0xDF:
goto yy53;
916 case 0xCD:
goto yy72;
917 case 0xE0:
goto yy55;
919 case 0xE4 ... 0xEC:
goto yy56;
920 case 0xE2:
goto yy73;
921 case 0xE3:
goto yy58;
922 case 0xED:
goto yy59;
923 case 0xEF:
goto yy60;
924 case 0xF0:
goto yy61;
925 case 0xF1 ... 0xF2:
goto yy62;
926 case 0xF3:
goto yy63;
929 if (
YYFILL)
goto yyFillLabel38;
934#line 126 "lexer_nt.re"
946#line 947 "parser_nt.c"
954 case 0xB8 ... 0xBF:
goto yy49;
957 if (
YYFILL)
goto yyFillLabel39;
966 case 0x80 ... 0xBF:
goto yy49;
969 if (
YYFILL)
goto yyFillLabel40;
979 case 0xBF:
goto yy49;
982 if (
YYFILL)
goto yyFillLabel41;
991 case 0xA0 ... 0xBF:
goto yy53;
994 if (
YYFILL)
goto yyFillLabel42;
1003 case 0x80 ... 0xBF:
goto yy53;
1006 if (
YYFILL)
goto yyFillLabel43;
1015 case 0x80:
goto yy74;
1016 case 0x81:
goto yy75;
1018 case 0xB0 ... 0xBE:
goto yy53;
1019 case 0x86:
goto yy76;
1020 case 0xBF:
goto yy77;
1023 if (
YYFILL)
goto yyFillLabel44;
1032 case 0x80:
goto yy78;
1033 case 0x81 ... 0xBF:
goto yy53;
1036 if (
YYFILL)
goto yyFillLabel45;
1045 case 0x80 ... 0x9F:
goto yy53;
1048 if (
YYFILL)
goto yyFillLabel46;
1058 case 0xB8 ... 0xBE:
goto yy53;
1059 case 0xB7:
goto yy79;
1060 case 0xBF:
goto yy80;
1063 if (
YYFILL)
goto yyFillLabel47;
1072 case 0x90 ... 0xBF:
goto yy56;
1075 if (
YYFILL)
goto yyFillLabel48;
1084 case 0x80 ... 0xBF:
goto yy56;
1087 if (
YYFILL)
goto yyFillLabel49;
1096 case 0x80 ... 0xAF:
goto yy56;
1099 if (
YYFILL)
goto yyFillLabel50;
1109 case '-':
goto yy81;
1111 case 'a' ...
'z':
goto yy64;
1114 if (
YYFILL)
goto yyFillLabel51;
1125 case ' ':
goto yy65;
1131 if (
YYFILL)
goto yyFillLabel52;
1142 case 'a' ...
'f':
goto yy83;
1145 if (
YYFILL)
goto yyFillLabel53;
1156 case 'a' ...
'f':
goto yy84;
1159 if (
YYFILL)
goto yyFillLabel54;
1170 case 'a' ...
'f':
goto yy85;
1173 if (
YYFILL)
goto yyFillLabel55;
1184 case 'a' ...
'f':
goto yy86;
1187 if (
YYFILL)
goto yyFillLabel56;
1200 case 'a' ...
'z':
goto yy49;
1201 case '.':
goto yy70;
1202 case 0xC2:
goto yy71;
1203 case 0xC3:
goto yy52;
1205 case 0xCE ... 0xDF:
goto yy53;
1206 case 0xCD:
goto yy72;
1207 case 0xE0:
goto yy55;
1209 case 0xE4 ... 0xEC:
goto yy56;
1210 case 0xE2:
goto yy73;
1211 case 0xE3:
goto yy58;
1212 case 0xED:
goto yy59;
1213 case 0xEF:
goto yy60;
1214 case 0xF0:
goto yy61;
1215 case 0xF1 ... 0xF2:
goto yy62;
1216 case 0xF3:
goto yy63;
1219 if (
YYFILL)
goto yyFillLabel57;
1228 case 0xB7:
goto yy49;
1231 if (
YYFILL)
goto yyFillLabel58;
1241 case 0xBF:
goto yy49;
1244 if (
YYFILL)
goto yyFillLabel59;
1253 case 0x80:
goto yy87;
1254 case 0x81:
goto yy88;
1256 case 0xB0 ... 0xBE:
goto yy53;
1257 case 0x86:
goto yy76;
1258 case 0xBF:
goto yy77;
1261 if (
YYFILL)
goto yyFillLabel60;
1270 case 0x8C ... 0x8D:
goto yy49;
1273 if (
YYFILL)
goto yyFillLabel61;
1282 case 0xB0 ... 0xBF:
goto yy49;
1285 if (
YYFILL)
goto yyFillLabel62;
1294 case 0x80 ... 0x8F:
goto yy49;
1297 if (
YYFILL)
goto yyFillLabel63;
1306 case 0x80 ... 0xAF:
goto yy49;
1309 if (
YYFILL)
goto yyFillLabel64;
1318 case 0x81 ... 0xBF:
goto yy49;
1321 if (
YYFILL)
goto yyFillLabel65;
1331 case 0xB0 ... 0xBF:
goto yy49;
1334 if (
YYFILL)
goto yyFillLabel66;
1343 case 0x80 ... 0xBD:
goto yy49;
1346 if (
YYFILL)
goto yyFillLabel67;
1357 case 'a' ...
'z':
goto yy89;
1360 if (
YYFILL)
goto yyFillLabel68;
1376 case '~' ... 0x7F:
goto yy82;
1377 case '>':
goto yy90;
1378 case '\\':
goto yy91;
1379 case 0xC2 ... 0xDF:
goto yy92;
1380 case 0xE0:
goto yy93;
1381 case 0xE1 ... 0xEF:
goto yy94;
1382 case 0xF0:
goto yy95;
1383 case 0xF1 ... 0xF3:
goto yy96;
1384 case 0xF4:
goto yy97;
1387 if (
YYFILL)
goto yyFillLabel69;
1398 case 'a' ...
'f':
goto yy98;
1401 if (
YYFILL)
goto yyFillLabel70;
1412 case 'a' ...
'f':
goto yy99;
1415 if (
YYFILL)
goto yyFillLabel71;
1426 case 'a' ...
'f':
goto yy100;
1429 if (
YYFILL)
goto yyFillLabel72;
1440 case 'a' ...
'f':
goto yy101;
1443 if (
YYFILL)
goto yyFillLabel73;
1453 case 0xBF:
goto yy49;
1456 if (
YYFILL)
goto yyFillLabel74;
1466 case 0xB0 ... 0xBF:
goto yy49;
1469 if (
YYFILL)
goto yyFillLabel75;
1479 case '-':
goto yy81;
1482 case 'a' ...
'z':
goto yy89;
1485 if (
YYFILL)
goto yyFillLabel76;
1499 case 'U':
goto yy102;
1500 case 'u':
goto yy103;
1503 if (
YYFILL)
goto yyFillLabel77;
1512 case 0x80 ... 0xBF:
goto yy82;
1515 if (
YYFILL)
goto yyFillLabel78;
1524 case 0xA0 ... 0xBF:
goto yy92;
1527 if (
YYFILL)
goto yyFillLabel79;
1536 case 0x80 ... 0xBF:
goto yy92;
1539 if (
YYFILL)
goto yyFillLabel80;
1548 case 0x90 ... 0xBF:
goto yy94;
1551 if (
YYFILL)
goto yyFillLabel81;
1560 case 0x80 ... 0xBF:
goto yy94;
1563 if (
YYFILL)
goto yyFillLabel82;
1572 case 0x80 ... 0x8F:
goto yy94;
1575 if (
YYFILL)
goto yyFillLabel83;
1586 case 'a' ...
'f':
goto yy46;
1589 if (
YYFILL)
goto yyFillLabel84;
1600 case 'a' ...
'f':
goto yy13;
1603 if (
YYFILL)
goto yyFillLabel85;
1614 case 'a' ...
'f':
goto yy48;
1617 if (
YYFILL)
goto yyFillLabel86;
1628 case 'a' ...
'f':
goto yy31;
1631 if (
YYFILL)
goto yyFillLabel87;
1642 case 'a' ...
'f':
goto yy104;
1645 if (
YYFILL)
goto yyFillLabel88;
1656 case 'a' ...
'f':
goto yy105;
1659 if (
YYFILL)
goto yyFillLabel89;
1670 case 'a' ...
'f':
goto yy106;
1673 if (
YYFILL)
goto yyFillLabel90;
1684 case 'a' ...
'f':
goto yy107;
1687 if (
YYFILL)
goto yyFillLabel91;
1698 case 'a' ...
'f':
goto yy108;
1701 if (
YYFILL)
goto yyFillLabel92;
1712 case 'a' ...
'f':
goto yy109;
1715 if (
YYFILL)
goto yyFillLabel93;
1726 case 'a' ...
'f':
goto yy103;
1729 if (
YYFILL)
goto yyFillLabel94;
1740 case 'a' ...
'f':
goto yy82;
1743 if (
YYFILL)
goto yyFillLabel95;
1748#line 68 "lexer_nt.re"
1753#line 1754 "parser_nt.c"
1755#line 170 "lexer_nt.re"
1764 parse_init (&it, NULL, rep);
1766 int ttype = lex (&it, term);
1782 FILE *fh,
const char *sh, VOLK_Graph *gr,
size_t *ct,
char **err_p)
1787 log_error (
"Neither file handle nor string input provided.");
1792 parse_init (&parse_it, fh, sh);
1794#ifdef VOLK_CODEC_DEBUG
1811 int ttype = lex (&parse_it, &term);
1814 char token[16] = {};
1815 strncpy (token, (
const char *)parse_it.
tok, 15);
1817 char *err_start =
"Parse error near token `";
1821 err_info,
"[...]' at line %u, character %ld.\n",
1824 size_t err_size = strlen (err_start) + 16 + strlen(err_info);
1825 char *err_str = malloc (err_size);
1826 sprintf (err_str,
"%s%s%s", err_start, token, err_info);
1830 log_error (err_str);
1835 NTParse (parser, ttype, term, it);
1837 if (ttype ==
T_EOF)
break;
1840 if (ct) *ct = parse_it.
ct;
1842 log_info (
"Parsed %u triples.", parse_it.
ct);
1848 NTParse (parser, 0, NULL, it);
1851 free (parse_it.
buf);
Codec interface definition and basic elements common to all codecs.
#define T_EOF
Lemon parser grammar for N-Triples.
void NTParseTrace(FILE *TraceFILE, char *zTracePrompt)
uint8_t * unescape_unicode(const uint8_t *esc_str, size_t size)
Replace \uxxxx and \Uxxxxxxxx with Unicode bytes.
#define VOLK_graph_add_init(...)
Non-transactional version of VOLK_graph_add_init_txn().
void VOLK_graph_free(VOLK_Graph *gr)
Free a graph.
#define VOLK_graph_size(...)
Non-transactional version of VOLK_graph_size_txn().
void VOLK_graph_iter_free(VOLK_GraphIterator *it)
Free a graph iterator.
#define VOLK_VALUE_ERR
An invalid input value was provided.
#define VOLK_MEM_ERR
Memory allocation error.
#define VOLK_NORESULT
No result yielded.
#define VOLK_OK
Generic success return code.
#define VOLK_PARSE_ERR
Codec parser error.
VOLK_Term * VOLK_lt_literal_new(const char *data, char *lang)
Shortcut to create a language-tagged literal term.
VOLK_Term * VOLK_iriref_new(const char *data)
Create an IRI reference.
VOLK_Term * VOLK_literal_new(const char *data, VOLK_Term *datatype)
Shortcut to create a literal term.
void VOLK_term_free(VOLK_Term *term)
VOLK_Term * VOLK_term_new(VOLK_TermType type, const char *data, void *metadata)
Create a new term.
@ VOLK_TERM_LT_LITERAL
Language-tagged string literal.
@ VOLK_TERM_LITERAL
Literal without language tag.
@ VOLK_TERM_BNODE
Blank node.
#define YYCTYPE
TTL is UTF-8 encoded.
VOLK_rc nt_parse_doc(FILE *fh, const char *sh, VOLK_Graph *gr, size_t *ct, char **err_p)
Parse an RDF document in N-Triples format.
#define YYCTYPE
TTL is UTF-8 encoded.
VOLK_rc nt_parse_term(const char *rep, VOLK_Term **term)
Parse a single term.
FILE * fh
Input file handle.
size_t buf_size
Initial allocation for buffer.
unsigned line
Current line no. (for debugging).
YYCTYPE * cur
Next input character to be read (YYCURSOR).
const char * sh
Input string. Exclusive with fh.
bool eof
if we have reached EOF.
YYCTYPE * buf
Start of buffer.
unsigned ct
Number of statements parsed.
YYCTYPE * mar
Most recent match (YYMARKER).
YYCTYPE * tok
Start of current token.