Redland
view release on metacpan or search on metacpan
redland/raptor/src/ntriples_parse.c view on Meta::CPAN
/* Set RAPTOR_DEBUG to > 1 to get lots of buffer related debugging */
/*
#undef RAPTOR_DEBUG
#define RAPTOR_DEBUG 2
*/
/* Prototypes for local functions */
static void raptor_ntriples_generate_statement(raptor_parser* parser, const unsigned char *subject, const raptor_ntriples_term_type subject_type, const unsigned char *predicate, const raptor_ntriples_term_type predicate_type, const void *object, cons...
/*
* NTriples parser object
*/
struct raptor_ntriples_parser_context_s {
/* current line */
unsigned char *line;
/* current line length */
int line_length;
/* current char in line buffer */
int offset;
char last_char;
/* static statement for use in passing to user code */
raptor_statement statement;
};
typedef struct raptor_ntriples_parser_context_s raptor_ntriples_parser_context;
/**
* raptor_ntriples_parse_init:
*
* Initialise the Raptor NTriples parser.
*
* Return value: non 0 on failure
**/
static int
raptor_ntriples_parse_init(raptor_parser* rdf_parser, const char *name)
{
/*raptor_ntriples_parser_context *ntriples_parser=(raptor_ntriples_parser_context*)rdf_parser->context; */
return 0;
}
/* PUBLIC FUNCTIONS */
/*
* raptor_ntriples_parse_terminate - Free the Raptor NTriples parser
* @rdf_parser: parser object
*
**/
static void
raptor_ntriples_parse_terminate(raptor_parser* rdf_parser)
{
raptor_ntriples_parser_context *ntriples_parser=(raptor_ntriples_parser_context*)rdf_parser->context;
if(ntriples_parser->line_length)
RAPTOR_FREE(cdata, ntriples_parser->line);
}
static const char *term_type_strings[]={
"URIref",
"bnodeID",
"Literal"
};
/**
* raptor_ntriples_term_as_string:
* @term: N-Triples term.
*
* @Deprecated: an internal debug function, do not use.
*
* Get a label for a #raptor_ntriples_term_type.
*
* Return value: a pointer to a constant string.
**/
const char *
raptor_ntriples_term_as_string(raptor_ntriples_term_type term)
{
return term_type_strings[(int)term];
}
static void
raptor_ntriples_generate_statement(raptor_parser* parser,
const unsigned char *subject,
const raptor_ntriples_term_type subject_type,
const unsigned char *predicate,
const raptor_ntriples_term_type predicate_type,
const void *object,
const raptor_ntriples_term_type object_type,
const unsigned char *object_literal_language,
const unsigned char *object_literal_datatype)
{
/* raptor_ntriples_parser_context *ntriples_parser=(raptor_ntriples_parser_context*)parser->context; */
raptor_statement *statement=&parser->statement;
raptor_uri *subject_uri=NULL;
raptor_uri *predicate_uri=NULL;
raptor_uri *object_uri=NULL;
raptor_uri *datatype_uri=NULL;
/* Two choices for subject from N-Triples */
if(subject_type == RAPTOR_NTRIPLES_TERM_TYPE_BLANK_NODE) {
statement->subject=subject;
statement->subject_type=RAPTOR_IDENTIFIER_TYPE_ANONYMOUS;
} else {
subject_uri=raptor_new_uri(subject);
statement->subject=subject_uri;
statement->subject_type=RAPTOR_IDENTIFIER_TYPE_RESOURCE;
}
if(object_literal_datatype) {
datatype_uri=raptor_new_uri(object_literal_datatype);
object_literal_language=NULL;
}
redland/raptor/src/ntriples_parse.c view on Meta::CPAN
if(object_literal_language) {
unsigned char *q;
/* Normalize language to lowercase
* http://www.w3.org/TR/rdf-concepts/#dfn-language-identifier
*/
for(q=object_literal_language; *q; q++) {
if(IS_ASCII_UPPER(*q))
*q=TO_ASCII_LOWER(*q);
}
}
raptor_ntriples_generate_statement(rdf_parser,
terms[0], term_types[0],
terms[1], term_types[1],
terms[2], term_types[2],
object_literal_language,
object_literal_datatype);
rdf_parser->locator.byte += len;
cleanup:
for(i=0; i<3; i++)
if(terms_allocated[i])
RAPTOR_FREE(cstring, terms[i]);
return rc;
}
static int
raptor_ntriples_parse_chunk(raptor_parser* rdf_parser,
const unsigned char *s, size_t len,
int is_end)
{
unsigned char *buffer;
unsigned char *ptr;
unsigned char *start;
raptor_ntriples_parser_context *ntriples_parser=(raptor_ntriples_parser_context*)rdf_parser->context;
#if defined(RAPTOR_DEBUG) && RAPTOR_DEBUG > 1
RAPTOR_DEBUG2("adding %d bytes to buffer\n", (unsigned int)len);
#endif
/* No data? It's the end */
if(!len)
return 0;
buffer=(unsigned char*)RAPTOR_MALLOC(cstring, ntriples_parser->line_length + len + 1);
if(!buffer) {
raptor_parser_fatal_error(rdf_parser, "Out of memory");
return 1;
}
if(ntriples_parser->line_length) {
strncpy((char*)buffer, (const char*)ntriples_parser->line, ntriples_parser->line_length);
RAPTOR_FREE(cstring, ntriples_parser->line);
}
ntriples_parser->line=buffer;
/* move pointer to end of cdata buffer */
ptr=buffer+ntriples_parser->line_length;
/* adjust stored length */
ntriples_parser->line_length += len;
/* now write new stuff at end of cdata buffer */
strncpy((char*)ptr, (const char*)s, len);
ptr += len;
*ptr = '\0';
#if defined(RAPTOR_DEBUG) && RAPTOR_DEBUG > 1
RAPTOR_DEBUG2("buffer now %d bytes\n", ntriples_parser->line_length);
#endif
ptr=buffer+ntriples_parser->offset;
while(*(start=ptr)) {
unsigned char *line_start=ptr;
#if defined(RAPTOR_DEBUG) && RAPTOR_DEBUG > 1
RAPTOR_DEBUG3("line buffer now '%s' (offset %d)\n", ptr, ptr-(buffer+ntriples_parser->offset));
#endif
/* skip \n when just seen \r - i.e. \r\n or CR LF */
if(ntriples_parser->last_char == '\r' && *ptr == '\n') {
#if defined(RAPTOR_DEBUG) && RAPTOR_DEBUG > 1
RAPTOR_DEBUG1("skipping a \\n\n");
#endif
ptr++;
rdf_parser->locator.byte++;
rdf_parser->locator.column=0;
start=line_start=ptr;
}
while(*ptr && *ptr != '\n' && *ptr != '\r')
ptr++;
if(!*ptr)
break;
#if defined(RAPTOR_DEBUG) && RAPTOR_DEBUG > 1
RAPTOR_DEBUG3("found newline \\x%02x at offset %d\n", *ptr,
ptr-line_start);
#endif
ntriples_parser->last_char=*ptr;
len=ptr-line_start;
rdf_parser->locator.column=0;
*ptr='\0';
if(raptor_ntriples_parse_line(rdf_parser,line_start,len))
return 1;
rdf_parser->locator.line++;
/* go past newline */
ptr++;
rdf_parser->locator.byte++;
#if defined(RAPTOR_DEBUG) && RAPTOR_DEBUG > 1
/* Do not peek if too far */
if(ptr-buffer < ntriples_parser->line_length)
RAPTOR_DEBUG2("next char is \\x%02x\n", *ptr);
else
RAPTOR_DEBUG1("next char unknown - end of buffer\n");
#endif
}
( run in 1.105 second using v1.01-cache-2.11-cpan-39bf76dae61 )