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を使用する。