aften/aften.c | 23 ++++++++++- aften/unicode_support.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++ aften/unicode_support.h | 21 ++++++++++ libaften/a52.h | 2 +- 4 files changed, 140 insertions(+), 4 deletions(-) diff --git a/aften/aften.c b/aften/aften.c index 143bb1c..a93da2f 100644 --- a/aften/aften.c +++ b/aften/aften.c @@ -38,6 +38,7 @@ #include "pcm.h" #include "helptext.h" #include "opts.h" +#include "unicode_support.h" static const int acmod_to_ch[8] = { 2, 1, 2, 3, 3, 4, 4, 5 }; @@ -82,7 +83,7 @@ print_simd_in_use(FILE *out, AftenSimdInstructions *simd_instructions) } int -main(int argc, char **argv) +aften_main(int argc, char **argv) { void (*aften_remap)(void *samples, int n, int ch, A52SampleFormat fmt, int acmod) = NULL; @@ -137,7 +138,7 @@ main(int argc, char **argv) #endif ifp[i] = stdin; } else { - ifp[i] = fopen(opts.infile[i], "rb"); + ifp[i] = fopen_utf8(opts.infile[i], "rb"); if (!ifp[i]) { fprintf(stderr, "error opening input file: %s\n", opts.infile[i]); goto error_end; @@ -235,7 +236,7 @@ main(int argc, char **argv) #endif ofp = stdout; } else { - ofp = fopen(opts.outfile, "wb"); + ofp = fopen_utf8(opts.outfile, "wb"); if (!ofp) { fprintf(stderr, "error opening output file: %s\n", opts.outfile); goto error_end; @@ -327,6 +328,7 @@ main(int argc, char **argv) "bw: %2.1f | bitrate: %4.1f kbps ", percent, (qual / (frame_cnt+1)), (bw / (frame_cnt+1)), kbps); + fflush(stderr); } t0 = t1; last_update_clock = current_clock; @@ -335,6 +337,7 @@ main(int argc, char **argv) fprintf(stderr, "frame: %7d | q: %4d | bw: %2d | bitrate: %3d kbps\n", frame_cnt, s.status.quality, s.status.bwcode, s.status.bit_rate); + fflush(stderr); } } fwrite(frame, 1, fs, ofp); @@ -352,11 +355,13 @@ main(int argc, char **argv) if (s.verbose == 1) { fprintf(stderr, "\rprogress: 100%% | q: %4.1f | bw: %2.1f | bitrate: %4.1f kbps\n\n", (qual / frame_cnt), (bw / frame_cnt), kbps); + fflush(stderr); } else if (s.verbose == 2) { fprintf(stderr, "\n"); fprintf(stderr, "average quality: %4.1f\n", (qual / frame_cnt)); fprintf(stderr, "average bandwidth: %2.1f\n", (bw / frame_cnt)); fprintf(stderr, "average bitrate: %4.1f kbps\n\n", kbps); + fflush(stderr); } } goto end; @@ -382,3 +387,15 @@ end: return ret_val; } + +int wmain(int argc, wchar_t **argv_utf16) +{ + int result = 0; + char **argv_utf8 = NULL; + + init_commandline_arguments_utf8(argc, &argv_utf8, argv_utf16); + result = aften_main(argc, argv_utf8); + free_commandline_arguments_utf8(argc, &argv_utf8); + + return result; +} diff --git a/aften/unicode_support.c b/aften/unicode_support.c new file mode 100644 index 0000000..21ecd5c --- /dev/null +++ b/aften/unicode_support.c @@ -0,0 +1,98 @@ +#include "unicode_support.h" + +#include +#include + +char *utf16_to_utf8(const wchar_t *input) +{ + char *Buffer; + int BuffSize, Result; + + BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); + Buffer = (char*) malloc(sizeof(char) * BuffSize); + + if(!Buffer) + { + fprintf(stderr, "Error in utf16_to_utf8: Memory allocation failed!\n"); + return NULL; + } + + Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL); + return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; +} + +wchar_t *utf8_to_utf16(const char *input) +{ + wchar_t *Buffer; + int BuffSize, Result; + + BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); + Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize); + + if(!Buffer) + { + fprintf(stderr, "Error in utf8_to_utf16: Memory allocation failed!\n"); + return NULL; + } + + Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize); + return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; +} + +void init_commandline_arguments_utf8(int argc, char ***argv_utf8, wchar_t **argv_utf16) +{ + int i = 0; + + *argv_utf8 = (char**) malloc(argc * sizeof(char*)); + if(!(*argv_utf8)) + { + fprintf(stderr, "Error in init_commandline_arguments_utf8: Memory allocation failed!\n"); + exit(-1); + } + + for(i = 0; i < argc; i++) + { + (*argv_utf8)[i] = utf16_to_utf8(argv_utf16[i]); + if(!(*argv_utf8)[i]) + { + fprintf(stderr, "Error in init_commandline_arguments_utf8: Memory allocation failed!\n"); + exit(-1); + } + } +} + +void free_commandline_arguments_utf8(int argc, char ***argv_utf8) +{ + int i = 0; + + if(*argv_utf8 != NULL) + { + for(i = 0; i < argc; i++) + { + if((*argv_utf8)[i] != NULL) + { + free((*argv_utf8)[i]); + (*argv_utf8)[i] = NULL; + } + } + free(*argv_utf8); + *argv_utf8 = NULL; + } +} + +FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8) +{ + FILE *ret = NULL; + wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8); + wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8); + + if(filename_utf16 && mode_utf16) + { + ret = _wfopen(filename_utf16, mode_utf16); + } + + if(filename_utf16) free(filename_utf16); + if(mode_utf16) free(mode_utf16); + + return ret; +} diff --git a/aften/unicode_support.h b/aften/unicode_support.h new file mode 100644 index 0000000..cc13fd9 --- /dev/null +++ b/aften/unicode_support.h @@ -0,0 +1,21 @@ +#ifndef UNICODE_SUPPORT_H_INCLUDED +#define UNICODE_SUPPORT_H_INCLUDED + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +char *utf16_to_utf8(const wchar_t *input); +wchar_t *utf8_to_utf16(const char *input); +void init_commandline_arguments_utf8(int argc, char ***argv_utf8, wchar_t **argv_utf16); +void free_commandline_arguments_utf8(int argc, char ***argv_utf8); +FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8); + +#ifdef __cplusplus +} +#endif +#endif \ No newline at end of file diff --git a/libaften/a52.h b/libaften/a52.h index 9a6812b..85c6fa5 100644 --- a/libaften/a52.h +++ b/libaften/a52.h @@ -32,7 +32,7 @@ #include "a52tab.h" #include "aften-types.h" -#define AFTEN_VERSION "git" +#define AFTEN_VERSION "0.0.8+" #define A52_MAX_CHANNELS 6