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 <[email protected]>, 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
|
---|
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 | }
|
---|