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