jconv.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /* $Id$ */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <locale.h>
  5. #include <errno.h>
  6. #include "jconv.h"
  7. void
  8. usage (const char *argv0)
  9. {
  10. fprintf(stderr,
  11. "Usage: %s [-v] [-c config_file] "
  12. "[to_codeset [from_codeset ...]]\n",
  13. argv0);
  14. exit(1);
  15. }
  16. int
  17. main (int argc, char **argv)
  18. {
  19. int i, num_src_codesets = 0, verbose = 0, actual_codeset;
  20. char *conffile = NULL;
  21. char **src_codesets = NULL;
  22. char *dest_codeset = NULL;
  23. int error_code;
  24. char *src, *dest;
  25. size_t len, dlen;
  26. setlocale(LC_ALL, "");
  27. for (i = 1; i < argc; i++) {
  28. if (strcmp(argv[i], "-c") == 0) {
  29. i++;
  30. if (i >= argc)
  31. usage(argv[0]);
  32. conffile = argv[2];
  33. } else if (strcmp(argv[i], "-v") == 0) {
  34. verbose = 1;
  35. } else if (argv[i][0] == '-') {
  36. usage(argv[0]);
  37. } else if (dest_codeset == NULL) {
  38. dest_codeset = argv[i];
  39. } else {
  40. src_codesets = realloc(src_codesets,
  41. (num_src_codesets + 1) *
  42. sizeof (*src_codesets));
  43. src_codesets[num_src_codesets++] = argv[i];
  44. }
  45. }
  46. if (conffile)
  47. jconv_info_init(conffile);
  48. for (len = 0, src = NULL; !feof(stdin); ) {
  49. src = realloc(src, len + 4096);
  50. len += fread(src + len, 1, 4096, stdin);
  51. }
  52. if (ferror(stdin)) {
  53. perror("jconv(stdin)");
  54. exit(1);
  55. }
  56. src[len] = 0;
  57. error_code = jconv_alloc_conv_autodetect(src, len, &dest, &dlen,
  58. (const char **)src_codesets,
  59. num_src_codesets,
  60. &actual_codeset,
  61. dest_codeset);
  62. if (verbose) {
  63. if (num_src_codesets == 0)
  64. src_codesets = (void *)jconv_info_get_pref_codesets (
  65. &num_src_codesets);
  66. fprintf(stderr, "jconv: actual codeset: %s\n",
  67. src_codesets[actual_codeset]);
  68. }
  69. if (error_code) {
  70. errno = error_code;
  71. perror("jconv(jconv_alloc_conv_autodetect)");
  72. exit(1);
  73. }
  74. fwrite(dest, dlen, 1, stdout);
  75. fflush(stdout);
  76. if (ferror(stdout)) {
  77. perror("jconv(stdout)");
  78. exit(1);
  79. }
  80. return 0;
  81. }