Skip to content

Commit c651a66

Browse files
committed
Make it compile with the C++ API.
1 parent da02222 commit c651a66

2 files changed

Lines changed: 52 additions & 36 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
# except according to those terms.
99

1010
CPPFLAGS = -Wall -Wextra -Werror -O3 -std=c++14 -I../encoding-rs/target/include/ -I../encoding-rs/include/ -I../GSL/include/
11-
LDFLAGS = -Wl,--gc-sections -ldl -lpthread -lgcc_s -lrt -lc -lm
11+
LDFLAGS = -Wl,--gc-sections -ldl -lpthread -lgcc_s -lrt -lc -lm -lstdc++
1212

1313
recode_cpp: recode_cpp.o ../encoding-rs/target/release/libencoding_rs.a
1414
$(CC) -o $@ $^ $(LDFLAGS)

recode_cpp.cpp

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const Encoding*
1919
get_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

5555
void
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

126137
void
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

186206
void
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

Comments
 (0)