MinGWを利用しWindows上で行う
OpenCOBOLでのWebプログラミング

2002/08/30


ビットウォークさんがMinGW版OpenCOBOLを開発されました。
これによりWindows上で手軽にOpenCOBOLプログラミングが出来るようになりました。
そこで今回MinGWとOpenCOBOLを使用してWeb対応のプログラムを作成いたしました。


最新版のOpen COBOLはコンパイルオプションが違いますのでご注意下さい。
こちらを参考にして下さい
 2004/04/06
http://www12.ocn.ne.jp/~peg/Compiler-Options.html

1.MinGWとは
  MinGW(Minimalist GNU for Windows)は、GCC(GNUコンパイラコレクション)およびネイティブな32bit Windowsプログラムを生成するためのヘッダーファイルとインポートライブラリを揃えた環境です。
2.OpenCOBOLとは
  OpenCOBOLとは日本で開発されているLinux上で動くCOBOLのフリーコンパイラです。


利用環境
OS Windows98 SE
HTTPサーバー AN HTTPDを使用させて頂きました。
MinGW ビットウォークさん開発分を使用させて頂きました。
MinGW版OpenCOBOL ビットウォークさん開発分を使用させて頂きました。


ディレクトリ構成
ドキュメントルート C:\ホームページ\自宅サーバー\cobol
ここにindex.htmlをおいております。
CGIパス C:\ホームページ\自宅サーバー\cobol\cgi-bin
ここにCOBOLのexeと各種dllをおいております。
MinGW C:\mingw
ここにMinGW・MinGW版OpenCOBOLをインストール致しました


作成したプログラムは以下です。
ホスト計算機で使用するブロッキングファクターと最適レコード長を算出する為の計算プログラムです。

この画面でDASDのトラックサイズ(左の例は3380ディスクパックのハーフトラックの数字です)とレコード長を入力し計算ボタンを押します。













するとトラックサイズの数字とレコードレングスがCOBOLプログラムに渡され、計算され以下の画面を表示します。





HTMLのソースです。

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<TITLE>DASD</TITLE>
</HEAD>
<BODY><FORM method="POST" action="/cgi-bin/test01.exe" ENCTYPE="text/plain">
<FONT color="#cc0000" size="4">DASD容量</FONT><BR><BR>
<INPUT size="9" type="text" name="trk" >トラックサイズ<BR>
<INPUT size="9" type="text" name="rec" >レコードレングス<BR>
<BR>
<INPUT type="submit" value="計算"></FORM>
</BODY>
</HTML>


以下メインのCOBOLソースです。
今回は直接HTMLからデータを受け取っております。FORMのmethod="POST"としCOBOL側で標準入力からデータを受ける方法(ACCEPT命令)です。エンコードは今回ENCTYPE="text/plain"です。
       IDENTIFICATION      DIVISION.
       PROGRAM-ID.         TEST01.
       ENVIRONMENT         DIVISION.
       DATA                DIVISION.
       WORKING-STORAGE     SECTION.
       01  WK-BLKSIZE.
         03  FILLER            PIC X(004).
         03  WK-BLKX           PIC X(009).
       01  WK-RECLEN.
         03  FILLER            PIC X(004).
         03  WK-RECX           PIC X(009).
       01  WK-RECLEN9          PIC 9(015).
       01  WK-BLKSIZE9         PIC 9(015).
       01  WK-BFK              PIC 9(015) VALUE ZERO.
       01  WK-SBSIZE           PIC 9(015) VALUE ZERO.
       01  WK-BFKX             PIC Z,ZZZ,ZZZ,ZZZ,ZZZ,ZZ9.
       01  WK-SBSIZEX          PIC Z,ZZZ,ZZZ,ZZZ,ZZZ,ZZ9.
       01  A                   PIC X(015). 
       01  C                   PIC S9(12)V9(03).
       01  JSW                 PIC 9.
       PROCEDURE DIVISION.
       A000-SHORI.
           ACCEPT  WK-BLKSIZE.
           ACCEPT  WK-RECLEN.
           MOVE    WK-BLKX             TO  A.
           MOVE    ZERO                TO  C.
           CALL   "SUBX"            USING  A  C  JSW.
           MOVE    C                   TO  WK-BLKSIZE9.
           MOVE    WK-RECX             TO  A.
           MOVE    ZERO                TO  C.
           CALL   "SUBX"            USING  A  C  JSW.
           MOVE    C                   TO  WK-RECLEN9.
           COMPUTE WK-BFK              =   WK-BLKSIZE9 / WK-RECLEN9.
           COMPUTE WK-SBSIZE           =   WK-BFK      * WK-RECLEN9.
           MOVE    WK-BFK              TO  WK-BFKX.
           MOVE    WK-SBSIZE           TO  WK-SBSIZEX.
       A000-300.              
           DISPLAY "Content-type: text/html".
           DISPLAY.
           DISPLAY "<HTML>".
           DISPLAY "<HEAD>".
           DISPLAY "<TITLE>最適ブロックサイズ計算結果</TITLE>".
           DISPLAY "</HEAD>".
           DISPLAY "<BODY><CENTER><H1>".
           DISPLAY "最適ブロックサイズ計算結果".
           DISPLAY "</H1><br>ブロックサイズ".
           DISPLAY WK-BLKX.
           DISPLAY "バイト".
           DISPLAY "<br>レコード長".
           DISPLAY WK-RECX.
           DISPLAY "バイト".
           DISPLAY "<BR><BR><FONT COLOR=RED>ブロッキングファクター".
           DISPLAY "</FONT>".
           DISPLAY WK-BFKX.
           DISPLAY "<br><FONT COLOR=BLUE>最適ブロックサイズ</FONT>".
           DISPLAY WK-SBSIZEX.
           DISPLAY "バイト".
           DISPLAY "<br>".
           DISPLAY "<A HREF=../INDEX.HTML>戻る</A></CENTER>".
           DISPLAY "</BODY>".
           DISPLAY "</HTML>".
           STOP RUN.


以下 数字項目変換サブプログラムです。

        IDENTIFICATION DIVISION.
        PROGRAM-ID. SUBX.
        ENVIRONMENT DIVISION.
        DATA DIVISION.
        WORKING-STORAGE SECTION.
  
        01 CD-BTAB               PIC X  VALUE "*".
        01 SUB-AREA.
           02 A                 PIC X(15).
           02 BBU               REDEFINES A.
              03 B-ITEM         PIC X  OCCURS 15.
           02 ITEM-B            PIC X.
           02 NU                PIC 9(02).
           02 IU                PIC 9(02).
           02 Z-C-AREA.
              03 C-SUU          PIC 9(15).
              03 DDU            REDEFINES C-SUU.
                 04 D-ITEM      PIC X OCCURS 15.
              03 TPU1           PIC X.
              03 TPU2           PIC X.
              03 DEPO           PIC 9(2).
              03 KK             PIC 9(2).
        LINKAGE SECTION.
        01 AA                PIC X(15).
        01 C                 PIC S9(12)V9(3).
        01 JSW               PIC 9.
        PROCEDURE DIVISION  USING AA C JSW.
        HAJIME.
          display "start subxa"
          MOVE   AA             TO   A.
          IF B-ITEM (1)         =   CD-BTAB 
             MOVE     1         TO  JSW 
                                     GO  TO  SUBXE.
          MOVE    16            TO  NU IU.
          MOVE    ZERO          TO  Z-C-AREA JSW.
        UU1.
          SUBTRACT 1             FROM IU.
          IF  IU                =   ZERO
                                      GO  TO  UU2.
          MOVE    B-ITEM (IU)   TO  ITEM-B.
          IF  ITEM-B            =   " " OR "+" OR "," OR LOW-VALUE
                                      GO  TO  UU1.
          IF  ITEM-B            =   "-" 
              MOVE   "*"        TO  TPU1 
                                      GO  TO  UU1.
          IF  ITEM-B            =   "."
              MOVE   "*"        TO  TPU2 
                                      GO  TO  UU1.
          IF  ITEM-B            NOT NUMERIC  
              MOVE    2         TO  JSW  
                                      GO  TO  SUBXE.
          IF  TPU2          NOT =   "*" 
              ADD    1          TO  DEPO.
          SUBTRACT  1           FROM NU.
          MOVE    ITEM-B        TO  D-ITEM (NU).
                                      GO  TO  UU1.
        UU2.
         MOVE    C-SUU          TO  C.
         IF  TPU1               =   "*" 
             COMPUTE C          =   ZERO - C.
         IF  TPU2               =    "*" 
             NEXT SENTENCE
         ELSE  
                                        GO  TO  SUBXE.
        UU3.
         ADD   1                TO   KK.
             COMPUTE C          =   C * 0.1000.
         IF  KK             NOT =   DEPO
                                        GO  TO  UU3.
        SUBXE.
       EXIT-PROGRAM.


以下 コンパイルの手順です。
1.SET PATH=c:\mingw\bin
   (mingwのパス設定)
2.cobc -c -static -main test01.cob
   (メインプログラムのコンパイル)
3.cobc -c -static subx.cob
   (サブプログラムのコンパイル)
4.cobc -o test01 test01.o subx.o
   (メインプログラムをサブプログラムをリンクさせtest01のexe作成)

※ OpenCOBOLのコンパイル・リンク方法に関してはOpenCOBOLのサイトに詳細が紹介されております。


私の場合C:\ホームページ\自宅サーバー\cobolにプログラムソースを作成し、このディレクトリでコンパイルリンクし、exeを作成。その後exeをC:\ホームページ\自宅サーバー\cobol\cgi-binに移す方法で開発しました。


C:\ホームページ\自宅サーバー\cobol\cgi-binをCGIのディレクトリにHTTPDで設定しましたのでここにexeをおきます。またMinGWの一部のdellをc:\Mingw\binよりこのディレクトリにコピーしてきました。


<HOME>