ruby/enc/trans/newline.trans

92 строки
1.9 KiB
Plaintext

#include "transcode_data.h"
<%
map_normalize = {}
map_normalize["{00-ff}"] = :func_so
%>
<%= transcode_generate_node(ActionMap.parse(map_normalize), "universal_newline") %>
static int
fun_so_universal_newline(rb_transcoding* t, const unsigned char* s, size_t l, unsigned char* o)
{
int len;
/*
t->stateful[0] == 0 : normal
t->stateful[0] == 1 : just after '\r'
*/
if (s[0] == '\n') {
if (t->stateful[0] == 0) {
o[0] = '\n';
len = 1;
}
else {
len = 0;
}
t->stateful[0] = 0;
}
else if (s[0] == '\r') {
o[0] = '\n';
len = 1;
t->stateful[0] = 1;
}
else {
o[0] = s[0];
len = 1;
t->stateful[0] = 0;
}
return len;
}
static const rb_transcoder
rb_universal_newline = {
"universal_newline", "", &universal_newline,
1, /* input_unit_length */
1, /* max_input */
1, /* max_output */
NULL, NULL, NULL, fun_so_universal_newline
};
<%
map_crlf = {}
map_crlf["{00-09,0b-ff}"] = :nomap
map_crlf["0a"] = "0d0a"
%>
<%= transcode_generate_node(ActionMap.parse(map_crlf), "crlf_newline") %>
static const rb_transcoder
rb_crlf_newline = {
"", "crlf_newline", &crlf_newline,
1, /* input_unit_length */
1, /* max_input */
2, /* max_output */
NULL, NULL, NULL, NULL
};
<%
map_cr = {}
map_cr["{00-09,0b-ff}"] = :nomap
map_cr["0a"] = "0d"
%>
<%= transcode_generate_node(ActionMap.parse(map_cr), "cr_newline") %>
static const rb_transcoder
rb_cr_newline = {
"", "cr_newline", &cr_newline,
1, /* input_unit_length */
1, /* max_input */
1, /* max_output */
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);
}