#include "transcode_data.h" <% def str1(str) str.unpack("H*")[0] end transcode_tblgen("", "amp-escaped", [ ["{00-25,27-FF}", :nomap], ["26", str1("&")] ]) transcode_tblgen("", "xml-text-escaped", [ ["{00-25,27-3B,3D,3F-FF}", :nomap], ["26", str1("&")], ["3C", str1("<")], ["3E", str1(">")] ]) transcode_tblgen("", "xml-attr-content-escaped", [ ["{00-21,23-25,27-3B,3D,3F-FF}", :nomap], ["22", str1(""")], ["26", str1("&")], ["3C", str1("<")], ["3E", str1(">")] ]) 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 int fun_so_escape_xml_attr_quote(void *statep, const unsigned char *s, size_t l, unsigned char *o) { unsigned char *sp = statep; int n = 0; if (*sp == END) { *sp = NORMAL; o[n++] = '"'; } o[n++] = s[0]; return n; } static int escape_xml_attr_quote_finish(void *statep, unsigned char *o) { 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-quoted", escape_xml_attr_quote, TRANSCODE_TABLE_INFO, 1, /* input_unit_length */ 1, /* max_input */ 7, /* max_output */ stateful_encoder, /* stateful_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 }; void Init_escape(void) { <%= transcode_register_code %> rb_register_transcoder(&rb_escape_xml_attr_quote); }