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