@@ -19,7 +19,7 @@ const Encoding*
1919get_encoding (const char * label)
2020{
2121 const Encoding* enc =
22- encoding_for_label (( const uint8_t *) label, strlen (label));
22+ Encoding::for_label (gsl::cstring_span<>( label, strlen (label) ));
2323 if (!enc) {
2424 fprintf (stderr, " %s is not a known encoding label; exiting." , label);
2525 exit (-2 );
@@ -53,7 +53,7 @@ print_usage(const char* program)
5353#define OUTPUT_BUFFER_SIZE 4096
5454
5555void
56- convert_via_utf8 (Decoder* decoder, Encoder* encoder, FILE* read, FILE* write,
56+ convert_via_utf8 (Decoder& decoder, Encoder& encoder, FILE* read, FILE* write,
5757 bool last)
5858{
5959 uint8_t input_buffer[INPUT_BUFFER_SIZE];
@@ -71,12 +71,17 @@ convert_via_utf8(Decoder* decoder, Encoder* encoder, FILE* read, FILE* write,
7171 bool input_ended = last && current_input_ended;
7272 size_t decoder_input_start = 0 ;
7373 for (;;) {
74- bool had_replacements;
75- size_t decoder_read = decoder_input_end - decoder_input_start;
76- size_t decoder_written = UTF8_INTERMEDIATE_BUFFER_SIZE;
77- uint32_t decoder_result = decoder_decode_to_utf8_with_replacement (
78- decoder, input_buffer + decoder_input_start, &decoder_read,
79- intermediate_buffer, &decoder_written, input_ended, &had_replacements);
74+ size_t decoder_read;
75+ size_t decoder_written;
76+ uint32_t decoder_result;
77+
78+ std::tie (decoder_result, decoder_read, decoder_written, std::ignore) =
79+ decoder.decode_to_utf8_with_replacement (
80+ gsl::span<const uint8_t >(input_buffer + decoder_input_start,
81+ decoder_input_end - decoder_input_start),
82+ gsl::span<uint8_t >(intermediate_buffer,
83+ UTF8_INTERMEDIATE_BUFFER_SIZE),
84+ input_ended);
8085 decoder_input_start += decoder_read;
8186
8287 bool last_output = (input_ended && (decoder_result == INPUT_EMPTY));
@@ -85,7 +90,7 @@ convert_via_utf8(Decoder* decoder, Encoder* encoder, FILE* read, FILE* write,
8590 // or the input buffer was exhausted, let's process what's
8691 // in the intermediate buffer.
8792
88- if (encoder_encoding ( encoder) == UTF_8_ENCODING) {
93+ if (encoder. encoding ( ) == UTF_8_ENCODING) {
8994 // If the target is UTF-8, optimize out the encoder.
9095 size_t file_written =
9196 fwrite (intermediate_buffer, 1 , decoder_written, write);
@@ -96,11 +101,17 @@ convert_via_utf8(Decoder* decoder, Encoder* encoder, FILE* read, FILE* write,
96101 } else {
97102 size_t encoder_input_start = 0 ;
98103 for (;;) {
99- size_t encoder_read = decoder_written - encoder_input_start;
100- size_t encoder_written = OUTPUT_BUFFER_SIZE;
101- uint32_t encoder_result = encoder_encode_from_utf8_with_replacement (
102- encoder, intermediate_buffer + encoder_input_start, &encoder_read,
103- output_buffer, &encoder_written, last_output, &had_replacements);
104+ size_t encoder_read;
105+ size_t encoder_written;
106+ uint32_t encoder_result;
107+
108+ std::tie (encoder_result, encoder_read, encoder_written, std::ignore) =
109+ encoder.encode_from_utf8_with_replacement (
110+ gsl::span<const uint8_t >(intermediate_buffer +
111+ encoder_input_start,
112+ decoder_written - encoder_input_start),
113+ gsl::span<uint8_t >(output_buffer, OUTPUT_BUFFER_SIZE),
114+ last_output);
104115 encoder_input_start += encoder_read;
105116 size_t file_written =
106117 fwrite (output_buffer, 1 , encoder_written, write);
@@ -124,7 +135,7 @@ convert_via_utf8(Decoder* decoder, Encoder* encoder, FILE* read, FILE* write,
124135}
125136
126137void
127- convert_via_utf16 (Decoder* decoder, Encoder* encoder, FILE* read, FILE* write,
138+ convert_via_utf16 (Decoder& decoder, Encoder& encoder, FILE* read, FILE* write,
128139 bool last)
129140{
130141 uint8_t input_buffer[INPUT_BUFFER_SIZE];
@@ -142,12 +153,17 @@ convert_via_utf16(Decoder* decoder, Encoder* encoder, FILE* read, FILE* write,
142153 bool input_ended = last && current_input_ended;
143154 size_t decoder_input_start = 0 ;
144155 for (;;) {
145- bool had_replacements;
146- size_t decoder_read = decoder_input_end - decoder_input_start;
147- size_t decoder_written = UTF16_INTERMEDIATE_BUFFER_SIZE;
148- uint32_t decoder_result = decoder_decode_to_utf16_with_replacement (
149- decoder, input_buffer + decoder_input_start, &decoder_read,
150- intermediate_buffer, &decoder_written, input_ended, &had_replacements);
156+ size_t decoder_read;
157+ size_t decoder_written;
158+ uint32_t decoder_result;
159+
160+ std::tie (decoder_result, decoder_read, decoder_written, std::ignore) =
161+ decoder.decode_to_utf16_with_replacement (
162+ gsl::span<const uint8_t >(input_buffer + decoder_input_start,
163+ decoder_input_end - decoder_input_start),
164+ gsl::span<char16_t >(intermediate_buffer,
165+ UTF16_INTERMEDIATE_BUFFER_SIZE),
166+ input_ended);
151167 decoder_input_start += decoder_read;
152168
153169 bool last_output = (input_ended && (decoder_result == INPUT_EMPTY));
@@ -158,11 +174,15 @@ convert_via_utf16(Decoder* decoder, Encoder* encoder, FILE* read, FILE* write,
158174
159175 size_t encoder_input_start = 0 ;
160176 for (;;) {
161- size_t encoder_read = decoder_written - encoder_input_start;
162- size_t encoder_written = OUTPUT_BUFFER_SIZE;
163- uint32_t encoder_result = encoder_encode_from_utf16_with_replacement (
164- encoder, intermediate_buffer + encoder_input_start, &encoder_read,
165- output_buffer, &encoder_written, last_output, &had_replacements);
177+ size_t encoder_read;
178+ size_t encoder_written;
179+ uint32_t encoder_result;
180+
181+ std::tie (encoder_result, encoder_read, encoder_written, std::ignore) =
182+ encoder.encode_from_utf16_with_replacement (
183+ gsl::span<const char16_t >(intermediate_buffer + encoder_input_start,
184+ decoder_written - encoder_input_start),
185+ gsl::span<uint8_t >(output_buffer, OUTPUT_BUFFER_SIZE), last_output);
166186 encoder_input_start += encoder_read;
167187 size_t file_written = fwrite (output_buffer, 1 , encoder_written, write);
168188 if (file_written != encoder_written) {
@@ -184,7 +204,7 @@ convert_via_utf16(Decoder* decoder, Encoder* encoder, FILE* read, FILE* write,
184204}
185205
186206void
187- convert (Decoder* decoder, Encoder* encoder, FILE* read, FILE* write, bool last,
207+ convert (Decoder& decoder, Encoder& encoder, FILE* read, FILE* write, bool last,
188208 bool use_utf16)
189209{
190210 if (use_utf16) {
@@ -249,11 +269,11 @@ main(int argc, char** argv)
249269 }
250270 }
251271
252- Decoder* decoder = encoding_new_decoder ( input_encoding);
253- Encoder* encoder = encoding_new_encoder ( output_encoding);
272+ std::unique_ptr< Decoder> decoder = input_encoding-> new_decoder ( );
273+ std::unique_ptr< Encoder> encoder = output_encoding-> new_encoder ( );
254274
255275 if (optind == argc) {
256- convert (decoder, encoder, stdin, output, true , use_utf16);
276+ convert (* decoder, * encoder, stdin, output, true , use_utf16);
257277 } else {
258278 while (optind < argc) {
259279 const char * path = argv[optind++];
@@ -262,13 +282,9 @@ main(int argc, char** argv)
262282 fprintf (stderr, " Cannot open %s for reading; exiting." , path);
263283 exit (-4 );
264284 }
265- convert (decoder, encoder, read, output, (optind == argc), use_utf16);
285+ convert (* decoder, * encoder, read, output, (optind == argc), use_utf16);
266286 }
267287 }
268288
269- // If we exit() early, we leak these, which isn't valgrind-clean, but doesn't
270- // matter.
271- decoder_free (decoder);
272- encoder_free (encoder);
273289 exit (0 );
274290}
0 commit comments