mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2024-12-25 23:21:26 +03:00
103 lines
3.0 KiB
C
103 lines
3.0 KiB
C
/**
|
|
*** QADRT/QADRTMAIN2 substitution program.
|
|
*** This is needed because the IBM-provided QADRTMAIN2 does not
|
|
*** properly translate arguments by default or if no locale is provided.
|
|
***
|
|
*** See Copyright for the status of this software.
|
|
***
|
|
*** Author: Patrick Monnerat <pm@datasphere.ch>, DATASPHERE S.A.
|
|
**/
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <iconv.h>
|
|
#include <errno.h>
|
|
#include <locale.h>
|
|
|
|
/* Do not use qadrt.h since it defines unneeded static procedures. */
|
|
extern void QadrtInit(void);
|
|
extern int QadrtFreeConversionTable(void);
|
|
extern int QadrtFreeEnviron(void);
|
|
extern char * setlocale_a(int, const char *);
|
|
|
|
|
|
/* The ASCII main program. */
|
|
extern int main_a(int argc, char * * argv);
|
|
|
|
/* Global values of original EBCDIC arguments. */
|
|
int ebcdic_argc;
|
|
char * * ebcdic_argv;
|
|
|
|
|
|
int
|
|
main(int argc, char * * argv)
|
|
|
|
{
|
|
int i;
|
|
int j;
|
|
iconv_t cd;
|
|
size_t bytecount = 0;
|
|
char * inbuf;
|
|
char * outbuf;
|
|
size_t inbytesleft;
|
|
size_t outbytesleft;
|
|
char dummybuf[128];
|
|
char tocode[32];
|
|
char fromcode[32];
|
|
|
|
ebcdic_argc = argc;
|
|
ebcdic_argv = argv;
|
|
|
|
/* Build the encoding converter. */
|
|
strncpy(tocode, "IBMCCSID01208", sizeof tocode);
|
|
strncpy(fromcode, "IBMCCSID000000000010", sizeof fromcode);
|
|
cd = iconv_open(tocode, fromcode);
|
|
|
|
/* Measure the arguments. */
|
|
for (i = 0; i < argc; i++) {
|
|
inbuf = argv[i];
|
|
do {
|
|
inbytesleft = 0;
|
|
outbuf = dummybuf;
|
|
outbytesleft = sizeof dummybuf;
|
|
j = iconv(cd,
|
|
&inbuf, &inbytesleft, &outbuf, &outbytesleft);
|
|
bytecount += outbuf - dummybuf;
|
|
} while (j == -1 && errno == E2BIG);
|
|
/* Reset the shift state. */
|
|
iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
|
|
}
|
|
|
|
/* Allocate memory for the ASCII arguments and vector. */
|
|
argv = (char * *) malloc((argc + 1) * sizeof *argv + bytecount);
|
|
|
|
/* Build the vector and convert argument encoding. */
|
|
outbuf = (char *) (argv + argc + 1);
|
|
outbytesleft = bytecount;
|
|
|
|
for (i = 0; i < argc; i++) {
|
|
argv[i] = outbuf;
|
|
inbuf = ebcdic_argv[i];
|
|
inbytesleft = 0;
|
|
iconv(cd, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
|
|
iconv(cd, NULL, &inbytesleft, &outbuf, &outbytesleft);
|
|
}
|
|
|
|
iconv_close(cd);
|
|
argv[argc] = NULL;
|
|
|
|
/* Try setting the locale regardless of QADRT_ENV_LOCALE. */
|
|
setlocale_a(LC_ALL, "");
|
|
|
|
/* Call the program. */
|
|
i = main_a(argc, argv);
|
|
|
|
/* Clean-up allocated items. */
|
|
free((char *) argv);
|
|
QadrtFreeConversionTable();
|
|
QadrtFreeEnviron();
|
|
|
|
/* Terminate. */
|
|
return i;
|
|
}
|