C言語では RPGでは使用できないAPIの呼び出しのために C/400を使用する場合が多くあるし、
IFSを C/400で扱う場合には ASCIIからEBCDICへのコード変換を行う機会が多い。
そこで コード変換API QDCXLATE を C/400で使用する例を紹介しよう。
0001.00 #include <stdio.h>
0002.00 #include <stdlib.h>
0003.00 #include <string.h>
0004.00 #include <QDCXLATE.h>
0005.00
0006.00 #define TRUE 0
0007.00 #define FALSE -1
0008.00
0009.00 void main(void){
0010.00 _Decimal(5,0) dclen, outlen = 0;
0011.00 _Decimal(5,0) maxotl = 256;
0012.00 char m_asc[256];
0013.00 char m_ebc[256];
0014.00
0015.00 /*[ ASCII -> EBCIDC へ変換 ]*/
0016.00 memset(m_asc, 0, sizeof(m_asc));
0017.00 #pragma convert(850)
0018.00 strcpy(m_asc, "ABC");
0019.00 #pragma convert(0)
0020.00 dclen = (_Decimal(5,0))3;
0021.00 memset(m_ebc,0, sizeof(m_ebc));
0022.00 QDCXLATE(&dclen, m_asc, "QTCPEBC ", "QUSRSYS ", m_ebc,
0023.00 &maxotl, &outlen, "*JPN ", "Y", "*AE ");
0024.00 printf("m_ebc = %s\n", m_ebc);
0025.00
0026.00 /*[ EBCDIC -> ASCII へ変換 ]*/
0027.00 memset(m_asc,0, sizeof(m_asc));
0028.00 QDCXLATE(&dclen, m_ebc, "QTCPASC ", "QUSRSYS ", m_asc,
0029.00 &maxotl, &outlen, "*JPN ", "Y", "*EA ");
0030.00 getchar();
0031.00 }
最初に
0004.00 #include <QDCXLATE.h>
とは APIの関数である QDCXLATE をインクルードするためのものである。
API関数のプロト・タイプは ライブラリーQSYSINC のファイル H に保管されているので
自分で APIのプロトタイプ関数を探すことができる。
0017.00 #pragma convert(850) 0018.00 strcpy(m_asc, "ABC"); 0019.00 #pragma convert(0)
とは一時的に ASCIIの文字列 ABC を定義するためのものである。
#pragma convert(850) によって以降に現れる固定の文字列はコンパイラーによって
ASCII であるとみなされる。
#pragma convert(0) によって ASCII 変換を解消している。
0022.00 QDCXLATE(&dclen, m_asc, "QTCPEBC ", "QUSRSYS ", m_ebc, 0023.00 &maxotl, &outlen, "*JPN ", "Y", "*AE ");
によって ASCII から EBCDIC に変換しているわけだが変換テーブルとして QSYS/QEBCDIC ではなく
QUSRSYS/QTCPEBC を使用している点にも注意。
QSYS/QEBCDIC は確かに ASCII から EBCDIC への変換を行うテーブルであり解説書にもそのように
解説されているが PC の ASCII との互換性という点では特殊文字の場合も含めると実は
QUSRSYS/QTCPEBC の使用のほうが正しいのである。
同じように QSYS/QASCII ではなく QUSRSYS/QTCPASCを使用する。