From fcbf63e62c627deae76c1b8cb8c0876c536ed811 Mon Sep 17 00:00:00 2001 From: Jari Vetoniemi Date: Mon, 16 Mar 2020 18:49:26 +0900 Subject: Fresh start --- jni/ruby/enc/trans/escape.trans | 93 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 jni/ruby/enc/trans/escape.trans (limited to 'jni/ruby/enc/trans/escape.trans') diff --git a/jni/ruby/enc/trans/escape.trans b/jni/ruby/enc/trans/escape.trans new file mode 100644 index 0000000..c76ffa0 --- /dev/null +++ b/jni/ruby/enc/trans/escape.trans @@ -0,0 +1,93 @@ +#include "transcode_data.h" + +<% + def hexstr(str) + str.unpack("H*")[0] + end + + transcode_tblgen("", "amp_escape", [ + ["{00-25,27-FF}", :nomap], + ["26", hexstr("&")] + ], nil) + + transcode_tblgen("", "xml_text_escape", [ + ["{00-25,27-3B,3D,3F-FF}", :nomap], + ["26", hexstr("&")], + ["3C", hexstr("<")], + ["3E", hexstr(">")] + ], nil) + + transcode_tblgen("", "xml_attr_content_escape", [ + ["{00-21,23-25,27-3B,3D,3F-FF}", :nomap], + ["22", hexstr(""")], + ["26", hexstr("&")], + ["3C", hexstr("<")], + ["3E", hexstr(">")] + ], nil) + + map_xml_attr_quote = {} + map_xml_attr_quote["{00-FF}"] = :func_so + transcode_generate_node(ActionMap.parse(map_xml_attr_quote), "escape_xml_attr_quote") +%> + +<%= transcode_generated_code %> + +#define END 0 +#define NORMAL 1 + +static int +escape_xml_attr_quote_init(void *statep) +{ + unsigned char *sp = statep; + *sp = END; + return 0; +} + +static ssize_t +fun_so_escape_xml_attr_quote(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) +{ + unsigned char *sp = statep; + int n = 0; + if (*sp == END) { + *sp = NORMAL; + o[n++] = '"'; + } + o[n++] = s[0]; + return n; +} + +static ssize_t +escape_xml_attr_quote_finish(void *statep, unsigned char *o, size_t osize) +{ + unsigned char *sp = statep; + int n = 0; + + if (*sp == END) { + o[n++] = '"'; + } + + o[n++] = '"'; + *sp = END; + + return n; +} + +static const rb_transcoder +rb_escape_xml_attr_quote = { + "", "xml_attr_quote", escape_xml_attr_quote, + TRANSCODE_TABLE_INFO, + 1, /* input_unit_length */ + 1, /* max_input */ + 7, /* max_output */ + asciicompat_encoder, /* asciicompat_type */ + 1, escape_xml_attr_quote_init, escape_xml_attr_quote_init, + NULL, NULL, NULL, fun_so_escape_xml_attr_quote, + escape_xml_attr_quote_finish +}; + +TRANS_INIT(escape) +{ +<%= transcode_register_code %> + rb_register_transcoder(&rb_escape_xml_attr_quote); +} + -- cgit v1.2.3