C/400

9. EBCDIC/ASCII 変換で学ぶAPIの使用方法

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