System API プログラミングの基礎 (3) - ユーザースペース使用用の汎用プロシージャの作成 -

System API プログラミングの基礎 (1) - 2つの結果取得方法 -」で System API プログラミングのとっかかりとしてユーザースペースの使い方とそれを汎用化したユーティリティ・プロシージャを紹介しました。
自動拡張属性を持つユーザースペースを作成し、ポインタ型のフィールドにそのユーザースペースの開始アドレスをセットする、という二つのプロシージャでしたが、今回はそれをさらに簡略化して、名前だけ指定すれば全部お膳立てされたユーザースペースのポインタを返してくれるように処理を一つにまとめたプロシージャも作ってみました。

前回作成したものでは指定できるようにしてあった、テキストだったり、権限だったりは後から変更もできるものではあります。とりあえず適当な属性を指定しておいてまずは作ってしまい、必要なら後から変更しよう、という発想です。

これがテストプログラムです。
シンプルに名前だけを引数にして、戻り値としてポインタを返してくる、という動きをするプロシージャになっています。

     D pName           S             20a                                                            
      *                                                                                             
     D ptr             S               *                                                            
      *                                                                                             
     D CrtUsrspcP      PR              *                                                            
     D  Name                         20a                                                            
      *                                                                                             
      /Free                                                                                         
          pName =    'USOBJ     QTEMP     ' ;                                                       
                                                                                                    
          ptr = CrtUsrspcP  (pName ) ;                                                              
                                                                                                    
          *inLR = *on ;                                                                             
          Return ;                                                                                  
                                                                                                    
      /End-Free

CrtUsrSpcP というプロシージャにしてみました。

     H NOMAIN                                                                                       
      *                                                                                             
     D CrtUsrspcP      PR              *                                                            
     D  Name                         20a                                                            
      *                                                                                             
     P CrtUsrspcP      B                   export                                                   
      *                                                                                             
     D CrtUsrspcP      PI              *                                                            
     D  Name                         20a                                                            
      *                                                                                             
     D CrtUsrSpc       PR                  ExtPgm('QUSCRTUS')                                       
     D  usName                       20a   CONST                                                    
     D  usAtr                        10a   CONST                                                    
     D  usSize                       10I 0 CONST                                                    
     D  initVal                       1a   CONST                                                    
     D  usPubAut                     10a   CONST                                                    
     D  usText                       50a   CONST                                                    
     D  usReplace                    10a   CONST                                                    
     D  errorCode                          like(APIErr) Options(*NoPass)                            
     D  usDomain                     10a   CONST Options(*NoPass)                                   
      *                                                                                             
     D ChgUsrSpcA      PR                  ExtPgm('QUSCUSAT')                                       
     D  rtnLibName                   10a                                                            
     D  usaName                      20a   CONST                                                    
     D  usaAtr                       64a   Options(*VarSize)                                        
     D  errorCode                          like(APIErr)                                             
      *                                                                                             
     D SetUsPtr        PR                  ExtPgm('QUSPTRUS')                                       
     D  usName                       20a   CONST                                                    
     D  usPtr                          *                                                            
     D  errorCode                          like(APIErr) Options(*NoPass)                            
      *                                                                                             
     D APIErr          DS                  Qualified                                                
     D  ErrSize                      10i 0 inz(%size(APIErr))                                       
     D  ErrLen                       10i 0 inz(0)                                                   
     D  ErrID                         7a                                                            
     D  rsvd                          1a                                                            
     D  ErrData                   32767a                                                            
      *                                                                                             
     D usAttr          DS                  Align                                                    
     D  rcdCount                     10I 0 inz(1)                                                   
     D  atrKey                       10I 0 inz(3)                                                   
     D  atrLen                       10I 0 inz(%size(extendable))                                   
     D  extendable                    1a   inz('1')                                                 
      *                                                                                             
     D rtnPtr          S               *                                                            
      *                                                                                             
     D rtnLibName      S             10a                                                            
      *                                                                                             
     D*HandleErr       PR                                                                           
      *                                                                                             
      /Free                                                                                         
                                                                                                    
          CrtUsrSpc( Name :                                                                         
                    'extendable' :                                                                  
                     64 :                                                                           
                     x'00' :                                                                        
                     '*ALL     ' :                                                                  
                     '' :                                                                           
                     '*YES     ' :                                                                  
                     APIErr :                                                                       
                     '*USER     ') ;                                                                
                                                                                                    
          If APIErr.ErrLEN <> 0 ;                                                                   
                                                                                                    
        // HandleErr() ;                                                                            
                                                                                                    
          endif ;                                                                                   
                                                                                                    
          ChgUsrSpcA( rtnLibName :                                                                  
                      Name :                                                                        
                      usAttr :                                                                      
                      APIErr) ;                                                                     
                                                                                                    
            If APIErr.ErrLEN <> 0 ;                                                                 
                                                                                                    
         //  HandleErr() ;                                                                          
                                                                                                    
            endif ;                                                                                 
                                                                                                    
          SetUsPtr ( Name :                                                                         
                     rtnPtr :                                                                       
                     APIErr ) ;                                                                     
                                                                                                    
            If APIErr.ErrLEN <> 0 ;                                                                 
                                                                                                    
           // HandleErr() ;                                                                         
                                                                                                    
            endif ;                                                                                 
                                                                                                    
            return rtnPtr ;                                                                         
                                                                                                    
      /End-Free                                                                                     
      *                                                                                             
     P CrtUsrspcP      E

[Top Pageに戻る]

Ads by TOK2