You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
3.0 KiB
102 lines
3.0 KiB
/** |
|
*** 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; |
|
}
|
|
|