1#ifdef HAVE_CONFIG_H 2#include "config.h" 3#endif /* HAVE_CONFIG_H */ 4 5#include <unistd.h> 6#include <stdlib.h> 7#include <stdio.h> 8#include <string.h> 9#include <stdint.h> 10 11#include <atalk/unicode.h> 12 13#define MACCHARSET "MAC_ROMAN" 14 15#define flag(x) {x, #x} 16 17struct flag_map { 18 int flag; 19 const char *flagname; 20}; 21 22struct flag_map flag_map[] = { 23 flag(CONV_ESCAPEHEX), 24 flag(CONV_UNESCAPEHEX), 25 flag(CONV_ESCAPEDOTS), 26 flag(CONV_IGNORE), 27 flag(CONV_FORCE), 28 flag(CONV__EILSEQ), 29 flag(CONV_TOUPPER), 30 flag(CONV_TOLOWER), 31 flag(CONV_PRECOMPOSE), 32 flag(CONV_DECOMPOSE) 33}; 34 35char buffer[MAXPATHLEN +2]; 36 37int main(int argc, char **argv) 38{ 39 int opt; 40 uint16_t flags = 0; 41 char *string, *macName = MACCHARSET; 42 char *f = NULL, *t = NULL; 43 charset_t from, to, mac; 44 45 while ((opt = getopt(argc, argv, "m:o:f:t:")) != -1) { 46 switch(opt) { 47 case 'm': 48 macName = strdup(optarg); 49 break; 50 case 'o': 51 for (int i = 0; i < sizeof(flag_map)/sizeof(struct flag_map) - 1; i++) 52 if ((strcmp(flag_map[i].flagname, optarg)) == 0) 53 flags |= flag_map[i].flag; 54 break; 55 case 'f': 56 f = strdup(optarg); 57 break; 58 case 't': 59 t = strdup(optarg); 60 break; 61 } 62 } 63 64 if ((optind + 1) != argc) { 65 printf("Usage: test [-o <conversion option> [...]] [-f <from charset>] [-t <to charset>] [-m legacy Mac charset] <string>\n"); 66 printf("Defaults: -f: UTF8-MAC, -t: UTF8, -m MAC_ROMAN\n"); 67 printf("Available conversion options:\n"); 68 for (int i = 0; i < (sizeof(flag_map)/sizeof(struct flag_map) - 1); i++) { 69 printf("%s\n", flag_map[i].flagname); 70 } 71 return 1; 72 } 73 string = argv[optind]; 74 75 set_charset_name(CH_UNIX, "UTF8"); 76 set_charset_name(CH_MAC, macName); 77 78 if ( (charset_t) -1 == (from = add_charset(f ? f : "UTF8-MAC")) ) { 79 fprintf( stderr, "Setting codepage %s as from codepage failed\n", f ? f : "UTF8-MAC"); 80 return (-1); 81 } 82 83 if ( (charset_t) -1 == (to = add_charset(t ? t : "UTF8")) ) { 84 fprintf( stderr, "Setting codepage %s as to codepage failed\n", t ? t : "UTF8"); 85 return (-1); 86 } 87 88 if ( (charset_t) -1 == (mac = add_charset(macName)) ) { 89 fprintf( stderr, "Setting codepage %s as Mac codepage failed\n", MACCHARSET); 90 return (-1); 91 } 92 93 94 if ((size_t)-1 == (convert_charset(from, to, mac, 95 string, strlen(string), 96 buffer, MAXPATHLEN, 97 &flags)) ) { 98 perror("Conversion error"); 99 return 1; 100 } 101 102 printf("from: %s\nto: %s\n", string, buffer); 103 104 return 0; 105} 106