#include "transcode_data.h" <% map_normalize = {} map_normalize["{00-ff}"] = :func_so transcode_generate_node(ActionMap.parse(map_normalize), "universal_newline") map_crlf = {} map_crlf["{00-09,0b-ff}"] = :nomap map_crlf["0a"] = "0d0a" transcode_generate_node(ActionMap.parse(map_crlf), "crlf_newline") map_cr = {} map_cr["{00-09,0b-ff}"] = :nomap map_cr["0a"] = "0d" transcode_generate_node(ActionMap.parse(map_cr), "cr_newline") %> <%= transcode_generated_code %> #define NORMAL 0 #define JUST_AFTER_CR 1 static int universal_newline_init(void *statep) { unsigned char *sp = statep; *sp = NORMAL; return 0; } static int fun_so_universal_newline(void *statep, const unsigned char* s, size_t l, unsigned char* o) { unsigned char *sp = statep; int len; if (s[0] == '\n') { if (*sp == NORMAL) { o[0] = '\n'; len = 1; } else { /* JUST_AFTER_CR */ len = 0; } *sp = NORMAL; } else if (s[0] == '\r') { o[0] = '\n'; len = 1; *sp = JUST_AFTER_CR; } else { o[0] = s[0]; len = 1; *sp = NORMAL; } return len; } static const rb_transcoder rb_universal_newline = { "universal_newline", "", universal_newline, TRANSCODE_TABLE_INFO, 1, /* input_unit_length */ 1, /* max_input */ 1, /* max_output */ stateful_decoder, /* stateful_type */ 1, universal_newline_init, universal_newline_init, /* state_size, state_init, state_fini */ NULL, NULL, NULL, fun_so_universal_newline }; static const rb_transcoder rb_crlf_newline = { "", "crlf_newline", crlf_newline, TRANSCODE_TABLE_INFO, 1, /* input_unit_length */ 1, /* max_input */ 2, /* max_output */ stateless_converter, /* stateful_type */ 0, NULL, NULL, /* state_size, state_init, state_fini */ NULL, NULL, NULL, NULL }; static const rb_transcoder rb_cr_newline = { "", "cr_newline", cr_newline, TRANSCODE_TABLE_INFO, 1, /* input_unit_length */ 1, /* max_input */ 1, /* max_output */ stateless_converter, /* stateful_type */ 0, NULL, NULL, /* state_size, state_init, state_fini */ NULL, NULL, NULL, NULL }; void Init_newline(void) { rb_register_transcoder(&rb_universal_newline); rb_register_transcoder(&rb_crlf_newline); rb_register_transcoder(&rb_cr_newline); }