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