Creating Codepage 1200 stream file and Writing Unicode data to the IFS stream file in RPGLE

Creating Codepage 1200 stream file and Writing Unicode data to the IFS stream file in RPGLE.
Creating Codepage 1200 stream file and Writing Unicode data to the IFS stream file in RPGLE , open(), write(), read(), close(), read() procedure in rpgle,  open(), open() api, file descriptor, ifs stream file, reading data from ifs stream file using rpg as400 in ibmi, c apis, as400, ibmi, as400 and sql tricks, as400 tutorial, ibmi tutorial,UCS2, unicode, %UCS2 in as400, %ucs2 in inmi, unicode on ibmi, unicode on as400, unicdoe in ifs as400, unicode in ifs ibmi
Creating Codepage 1200 stream file and Writing Unicode data to the IFS stream file in RPGLE 

In this article we would be creating the unicode enabled stream file and writing unicode data onto the stream file. Earlier we did writter character data and used write() api to write the character data. We will use the same api to write the unicode data as well.

RPGLE Program for Writing Unicode data to the IFS stream file in RPGLE

RPG Code in Fixed format for writing unicode data in ifs stream file in RPGLE.
     HDFTACTGRP(*NO)                                                                                  
                                                                                                      
     D close           PR            10i 0 extproc('close')                     *                     
     D fileds                        10i 0 value                                *file descriptor      
                                                                                                      
     D write           PR            10i 0 extproc('write')                     * 32 bit, no. of byt  
     D fileds                        10i 0 value                                *file descriptor      
     D buffer                          *   value                                * pointer to byte     
     D noofbytes                     10U 0 value                                * 32 bits             
                                                                                                      
     D open            PR            10I 0 extproc('open')                                            
     D ifspath                         *   value options(*string)               *ifs path             
     D oflag                         10I 0 value                                *string of 32 bits    
     D mode                          10U 0 value options(*nopass)               * 9 bits              
     D codepage                      10U 0 value options(*nopass)               *                     
                                                                                                      
      * <-----oflag---->                                                                              
     D O_readonly      C                   1                                                          
     D O_writeonly     C                   2                                                          
     D O_readwrite     C                   4                     
     D O_createfileifnotexist...                                 
     D                 C                   8                     
     D O_exclusivecreate...                                      
     D                 C                   16                    
     D O_truncateto0bytes...                                     
     D                 C                   64                    
     D O_appendtofile  C                   256                   
     D O_converttextbycodepage...                                
     D                 C                   8388608               
     D O_openintextmode...                                       
     D                 C                   16777216              
      *                                                          
      * <-----mode---->                                          
      * owner,group,other (RWX)                                  
      *                                         owner authority  
     D M_readowner     C                   256                   
     D M_writeowner    C                   128                   
     D M_executeowner  C                   64                    
      *                                         group authority  
     D M_readgroup     C                   32                              
     D M_writegroup    C                   16                              
     D M_executegroup  C                   8                               
      *                                         other people               
     D M_readother     C                   4                               
     D M_writeother    C                   2                               
     D M_executeother  C                   1                               
      *                                                                    
     Difspath          s            512a                                   
     Doflag            s             10I 0                                 
     Dmode             s             10U 0                                 
     Dcodepage         s             10U 0                                 
     Dfiledescriptor   s             10i 0                                 
     Difsdata          s             11c   inz ccsid(1200)                 
     Dreturn_write     s             10i 0 inz                             
     Dreturn_close     s             10i 0 inz                             
     C                   EVAL      ifspath = '/home/easyclass/UCSfile'     
     C                   EVAL      oflag =  O_writeonly +                  
     C                                      O_createfileifnotexist +       
     C                                      O_converttextbycodepage        
     C                   EVAL      mode =  M_readowner +                  
     C                                     M_writeowner +                 
     C                                     M_executeowner                 
     C                   EVAL      filedescriptor = open(%trim(ifspath):  
     C                                                   oflag:           
     C                                                   mode:            
     C                                                   1200)            
     C                   IF        filedescriptor < 0                     
     C                   RETURN                                           
     C                   ENDIF                                            
                                                                          
     C                   EVAL      ifsdata = %UCS2('HELLO WORLD':1200)    
     C                   EVAL      return_write = write(filedescriptor:   
     C                             %addr(ifsdata):%size(ifsdata))         
     C                   IF        return_write < %size(ifsdata)          
     C                   RETURN                                           
     C                   ENDIF                                            
                                                                          
     C                   EVAL      return_close = close(filedescriptor)   
     C                   IF        return_close = -1                      
     C                   RETURN                  
     C                   ENDIF                   
                                                 
     C                   EVAL      *INLR = *ON   
     C                   RETURN                                                                
RPG Code in /Free and /End-Free format for writing unicode data in ifs stream file in RPGLE.
     HDFTACTGRP(*NO)                                                                                 
                                                                                                     
     D close           PR            10i 0 extproc('close')                     *                    
     D fileds                        10i 0 value                                *file descriptor     
                                                                                                     
     D write           PR            10i 0 extproc('write')                     * 32 bit, no. of byt 
     D fileds                        10i 0 value                                *file descriptor     
     D buffer                          *   value                                * pointer to byte    
     D noofbytes                     10U 0 value                                * 32 bits            
                                                                                                     
     D open            PR            10I 0 extproc('open')                                           
     D ifspath                         *   value options(*string)               *ifs path            
     D oflag                         10I 0 value                                *string of 32 bits   
     D mode                          10U 0 value options(*nopass)               * 9 bits             
     D codepage                      10U 0 value options(*nopass)               *                    
                                                                                                     
      * <-----oflag---->                                                                             
     D O_readonly      C                   1                                                         
     D O_writeonly     C                   2                                                         
     D O_readwrite     C                   4                      
     D O_createfileifnotexist...                                  
     D                 C                   8                      
     D O_exclusivecreate...                                       
     D                 C                   16                     
     D O_truncateto0bytes...                                      
     D                 C                   64                     
     D O_appendtofile  C                   256                    
     D O_converttextbycodepage...                                 
     D                 C                   8388608                
     D O_openintextmode...                                        
     D                 C                   16777216               
      *                                                           
      * <-----mode---->                                           
      * owner,group,other (RWX)                                   
      *                                         owner authority   
     D M_readowner     C                   256                    
     D M_writeowner    C                   128                    
     D M_executeowner  C                   64                     
      *                                         group authority   
     D M_readgroup     C                   32                
     D M_writegroup    C                   16                
     D M_executegroup  C                   8                 
      *                                         other people 
     D M_readother     C                   4                 
     D M_writeother    C                   2                 
     D M_executeother  C                   1                 
      *                                                      
     Difspath          s            512a                     
     Doflag            s             10I 0                   
     Dmode             s             10U 0                   
     Dcodepage         s             10U 0                   
     Dfiledescriptor   s             10i 0                   
     Difsdata          s             11c   inz ccsid(1200)   
     Dreturn_write     s             10i 0 inz               
     Dreturn_close     s             10i 0 inz               
      /free                                                  
       ifspath = '/home/easyclass/UCSfile';                  
       oflag = O_writeonly +                                 
               O_createfileifnotexist  +                     
               O_converttextbycodepage ;                                   
       mode =                                                              
              M_readowner +                                                
              M_writeowner +                                               
              M_executeowner;                                              
                                                                           
       filedescriptor = open(%trim(ifspath):                               
                             oflag:                                        
                             mode:                                         
                             1200);                                        
       if filedescriptor < 0;                                              
         return;                                                           
       endif;                                                              
                                                                           
       ifsdata = %UCS2('HELLO WORLD':1200);                                
       return_write = write(filedescriptor:%addr(ifsdata):%size(ifsdata)); 
       if return_write < %size(ifsdata);                                   
         return;                                                           
       endif;                                                              
                                                                           
       return_close = close(filedescriptor);      
       if return_close = -1;                      
         return;                                  
       endif;                                     
                                                  
       *inlr = *on;                               
       return;                                    
      /end-free                                                                                                                  
RPG Code in Fully Free format for writing unicode data in ifs stream file in RPGLE.
**FREE                                       
CTL-OPT DFTACTGRP(*NO);                      
DCL-PR write int(10) EXTPROC('write');       
  fileds  int(10) VALUE;                     
  buffer  pointer VALUE;                     
  noofbytes uns(10) VALUE;                   
END-PR;                                      
                                             
DCL-PR open int(10) EXTPROC('open');         
  ifspath pointer VALUE options(*string);    
  oflag   int(10) VALUE;                     
  mode uns(10) VALUE options(*nopass);       
  codepage uns(10) VALUE options(*nopass);   
END-PR;                                      
DCL-PR close int(10) EXTPROC('close');       
  fileds int(10) VALUE;                      
END-PR;                                      
// * <-----oflag---->                        
DCL-C O_readonly 1;                          
DCL-C O_writeonly 2;                                              
DCL-C O_readwrite 4;                                              
DCL-C O_createfileifnotexist 8;                                   
DCL-C O_exclusivecreate 16;                                       
DCL-C O_truncateto0bytes 64;                                      
DCL-C O_appendtofile  256;                                        
DCL-C O_converttextbycodepage 8388608;                            
DCL-C O_openintextmode 16777216;                                  
//    * <-----mode---->                                          
//    * owner,group,other (RWX)                                   
//    *                                         owner authority   
DCL-C M_readowner 256;                                            
DCL-C M_writeowner 128;                                           
DCL-C M_executeowner 64;                                          
//    *                                         group authority   
DCL-C M_readgroup 32;                                             
DCL-C M_writegroup 16;                                            
DCL-C M_executegroup 8;                                           
//    *                                         other people      
DCL-C M_readother 4;                                              
DCL-C M_writeother 2;                           
DCL-C M_executeother 1;                         
DCL-S ifspath CHAR(512);                        
DCL-S oflag int(10);                            
DCL-S mode  uns(10);                            
DCL-S codepage uns(10);                         
DCL-S filedescriptor int(10);                   
DCL-S ifsdata UCS2(11) CCSID(1200) inz;         
DCL-S return_write int(10) inz;                 
DCL-S return_close int(10) inz;                 
                                                
       ifspath = '/home/easyclass/UCSfile';     
       oflag = O_writeonly +                    
               O_createfileifnotexist  +        
               O_converttextbycodepage ;        
       mode =                                   
              M_readowner +                     
              M_writeowner +                    
              M_executeowner;                   
                                                
       filedescriptor = open(%trim(ifspath):                               
                             oflag:                                        
                             mode:                                         
                             1200);                                        
       if filedescriptor < 0;                                              
         return;                                                           
       endif;                                                              
                                                                           
       ifsdata = %UCS2('HELLO WORLD':1200);                                
       return_write = write(filedescriptor:%addr(ifsdata):%size(ifsdata)); 
       if return_write < %size(ifsdata);                                   
         return;                                                           
       endif;                                                              
                                                                           
       return_close = close(filedescriptor);                               
       if return_close = -1;                                               
         return;                                                           
       endif;                                                              
                                                                           
       *inlr = *on;                                                        
       return;                                  

Explanation of the above code

       ifspath = '/home/easyclass/UCSfile';     
       oflag = O_writeonly +                    
               O_createfileifnotexist  +        
               O_converttextbycodepage ;        
       mode =                                   
              M_readowner +                     
              M_writeowner +                    
              M_executeowner;                   
                                                
       filedescriptor = open(%trim(ifspath):                               
                             oflag:                                        
                             mode:                                         
                             1200);                                        
       if filedescriptor < 0;                                              
         return;                                                           
       endif;                              

First step is to create the ifs stream file that is unicode enabled using UCS-2 CCSID 1200. Here, we call open() api to create unicode enabled file named UCSfile on the user home directory. Pass the parameter ifspath, oflag and mode at the time of file creation. In oflag we will pass write only, create file if not exist and convert text by codepage flags and in mode we have passed authority flags for ownwer (read, write and execute) and at last codepage 1200 as the 4th optional parameter. So, the file created with ccsid 1200 will be unicode enabled and when the data written to it will be converted to ccsid 1200. Here, we checked if the return value by the open() api i.e. filedescriptor is less than zero then return from the program.

       ifsdata = %UCS2('HELLO WORLD':1200);                                
       return_write = write(filedescriptor:%addr(ifsdata):%size(ifsdata)); 
       if return_write < %size(ifsdata);                                   
         return;                                                           
       endif;       

Here, we convert the data to the unicode by using %UCS2 function with ccsid 1200. We call the write() api to write the unicode data by passing the filedescriptor being returned by the open() api and address of UCS2 defined variabled named ifsdata and size of the ifsdata variable (size would be double from the character variable of same length). If the reurn value is less than the size of the ifsdata then return from the program since some issue occurred in writing all the bytes.

       return_close = close(filedescriptor);                               
       if return_close = -1;                                               
         return;                                                           
       endif;                                                              
                                                                           
       *inlr = *on;                                                        
       return;                 

Finally, close the file using close() api and passing filedescriptor returned from the open() api. If the return value from close() api is less than zero then error in closing ifs stream file and and return abnormally from the program otherwise return normally from the program.

Post a Comment

© AS400 and SQL Tricks. All rights reserved. Developed by Jago Desain