1 /**
2 *** QADRT/QADRTMAIN2 substitution program.
3 *** This is needed because the IBM-provided QADRTMAIN2 does not
4 *** properly translate arguments by default or if no locale is provided.
5 ***
6 *** See Copyright for the status of this software.
7 ***
8 *** Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
9 **/
10
11 #include <stdlib.h>
12 #include <string.h>
13 #include <iconv.h>
14 #include <errno.h>
15 #include <locale.h>
16
17 /* Do not use qadrt.h since it defines unneeded static procedures. */
18 extern void QadrtInit(void);
19 extern int QadrtFreeConversionTable(void);
20 extern int QadrtFreeEnviron(void);
21 extern char * setlocale_a(int, const char *);
22
23
24 /* The ASCII main program. */
25 extern int main_a(int argc, char * * argv);
26
27 /* Global values of original EBCDIC arguments. */
28 int ebcdic_argc;
29 char * * ebcdic_argv;
30
31
32 int
main(int argc,char ** argv)33 main(int argc, char * * argv)
34
35 {
36 int i;
37 int j;
38 iconv_t cd;
39 size_t bytecount = 0;
40 char * inbuf;
41 char * outbuf;
42 size_t inbytesleft;
43 size_t outbytesleft;
44 char dummybuf[128];
45 char tocode[32];
46 char fromcode[32];
47
48 ebcdic_argc = argc;
49 ebcdic_argv = argv;
50
51 /* Build the encoding converter. */
52 strncpy(tocode, "IBMCCSID01208", sizeof tocode);
53 strncpy(fromcode, "IBMCCSID000000000010", sizeof fromcode);
54 cd = iconv_open(tocode, fromcode);
55
56 /* Measure the arguments. */
57 for (i = 0; i < argc; i++) {
58 inbuf = argv[i];
59 do {
60 inbytesleft = 0;
61 outbuf = dummybuf;
62 outbytesleft = sizeof dummybuf;
63 j = iconv(cd,
64 &inbuf, &inbytesleft, &outbuf, &outbytesleft);
65 bytecount += outbuf - dummybuf;
66 } while (j == -1 && errno == E2BIG);
67 /* Reset the shift state. */
68 iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
69 }
70
71 /* Allocate memory for the ASCII arguments and vector. */
72 argv = (char * *) malloc((argc + 1) * sizeof *argv + bytecount);
73
74 /* Build the vector and convert argument encoding. */
75 outbuf = (char *) (argv + argc + 1);
76 outbytesleft = bytecount;
77
78 for (i = 0; i < argc; i++) {
79 argv[i] = outbuf;
80 inbuf = ebcdic_argv[i];
81 inbytesleft = 0;
82 iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
83 iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
84 }
85
86 iconv_close(cd);
87 argv[argc] = NULL;
88
89 /* Try setting the locale regardless of QADRT_ENV_LOCALE. */
90 setlocale_a(LC_ALL, "");
91
92 /* Call the program. */
93 i = main_a(argc, argv);
94
95 /* Clean-up allocated items. */
96 free((char *) argv);
97 QadrtFreeConversionTable();
98 QadrtFreeEnviron();
99
100 /* Terminate. */
101 return i;
102 }
103