• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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