static foreign_t turtle_write_uri(term_t Stream, term_t Value) { size_t len; char *s; pl_wchar_t *w; IOSTREAM *out; if ( !PL_get_stream_handle(Stream, &out) ) return FALSE; if ( PL_get_nchars(Value, &len, &s, CVT_ATOM|CVT_STRING) ) { const char *e = &s[len]; Sputcode('<', out); for(; s<e; s++) { if ( ttl_put_ucharacter(out, s[0]&0xff) < 0 ) break; } Sputcode('>', out); return PL_release_stream(out); } else if ( PL_get_wchars(Value, &len, &w, CVT_ATOM|CVT_EXCEPTION) ) { const pl_wchar_t *e = &w[len]; Sputcode('<', out); for(; w<e; w++) { if ( ttl_put_ucharacter(out, w[0]) < 0 ) break; } Sputcode('>', out); return PL_release_stream(out); } else { PL_release_stream(out); return FALSE; } }
static int ttl_put_ucharacter(IOSTREAM *s, int c) { switch(c) { case '>': case '\\': Sputcode('\\', s); return Sputcode(c, s); default: return ttl_put_character(s, c); } }
static int ttl_put_scharacter(IOSTREAM *s, int c) { switch(c) { case '"': Sputcode('\\', s); return Sputcode('"', s); case '\\': Sputcode('\\', s); return Sputcode('\\', s); default: return ttl_put_echaracter(s, c); } }
static int ttl_put_echaracter(IOSTREAM *s, int c) { int c2; switch(c) { case '\t': c2 = 't'; break; case '\n': c2 = 'n'; break; case '\r': c2 = 'r'; break; default: return ttl_put_character(s, c); } Sputcode('\\', s); return Sputcode(c2, s); }
static int ttl_put_character(IOSTREAM *s, int c) { if ( c >= 32 && c <= 126 ) return Sputcode(c, s); if ( c <= 31 ) return ttl_put_uesc(s, c); if ( c >= 127 && c < 0x10ffff ) { if ( s->encoding == ENC_ASCII ) return ttl_put_uesc(s, c); if ( s->encoding == ENC_ISO_LATIN_1 && c > 255 ) return ttl_put_uesc(s, c); return Sputcode(c, s); } representation_error("turtle_character"); return -1; }
/// @memberof nl/1 word pl_nl1(term_t stream) { GET_LD IOSTREAM *s; if ( getTextOutputStream(stream, &s) ) { Sputcode('\n', s); return streamStatus(s); } fail; }
static bool Putc(int c, IOSTREAM *s) { return Sputcode(c, s) == EOF ? FALSE : TRUE; }