VirtualBox

source: vbox/trunk/src/libs/libxml2-2.13.2/os400/libxmlmain.c@ 107377

Last change on this file since 107377 was 105420, checked in by vboxsync, 6 months ago

libxml2-2.12.6: Applied and adjusted our libxml2 changes to 2.12.6. bugref:10730

  • Property svn:eol-style set to native
File size: 3.0 KB
Line 
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. */
18extern void QadrtInit(void);
19extern int QadrtFreeConversionTable(void);
20extern int QadrtFreeEnviron(void);
21extern char * setlocale_a(int, const char *);
22
23
24/* The ASCII main program. */
25extern int main_a(int argc, char * * argv);
26
27/* Global values of original EBCDIC arguments. */
28int ebcdic_argc;
29char * * ebcdic_argv;
30
31
32int
33main(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}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette