COBOL プログラムでは Java から渡された文字列を変更することはできませんが、StringBuffer の内容は変更できます。文字列操作を容易にするため、javatypes.cpy で MF-JSTRING 型が定義されています。定義の内容は次のとおりです。
01 mf-jstring is typedef.
03 len jint.
03 capacity jint.
03 ptr2string pointer.
len フィールドは文字列の長さを指定します。capacity フィールドはバッファーのサイズを指定します。String の場合には、capacity フィールドの値は常に 0 です。ptr2tring フィールドは、実際の文字列の先頭アドレスへのポインターです。StringBuffer の場合は、既存のバッファーを変更できるほか、新しいバッファーを割り当てて、その先頭アドレスを指すように ptr2string を指定できます。
次の COBOL プログラムは、Java から渡された String と StringBuffer を連結し、結果を StringBuffer に格納して返します。
program-id. StringAdd.
thread-local-storage section.
copy "javatypes.cpy".
01 lsNewPtr pointer.
01 lsSize jint. *> type defined in javatypes.cpy
01 i jint.
01 lsStatus jint.
01 lsBigBuffer pic x(1024).
linkage section.
01 lnkJString mf-jstring.
01 lnkJStringBuffer mf-jstring.
01 lnkString pic x(256).
01 lnkStringbuffer pic x(256).
procedure division using lnkJString lnkJStringBuffer.
set address of lnkStringBuffer to
ptr2string of lnkJStringBuffer
set address of lnkString to ptr2string of lnkJString
*> Check that lnkJStringBuffer is a Java StringBuffer
if capacity of lnkJStringBuffer > 0
add len of lnkJString to len of lnkJStringBuffer
giving lsSize
*> Check we don't overflow concatenation buffer
if lsSize < 1024
move len of lnkJString to i
move lnkString(1:i) to lsBigBuffer
add 1 to i
move lnkStringBuffer to lsBigBuffer(i:lsSize)
set ptr2string of lnkJStringBuffer
to address of lsBigBuffer
move lsSize to len of lnkJStringBuffer
end-if
end-if
次の Java クラス StringsToCobol は、文字列 "fred" および "ginger" を StringAdd に渡し、結果を表示します。
import mfcobol.*;
public class StringsToCobol {
public static void main(String[] args) throws Exception
{
StringBuffer sb1 = new StringBuffer("ginger") ;
Object theParams[] = {"fred" ,
sb1} ;
RuntimeSystem.cobcall_int("stringadd", theParams) ;
System.out.println(sb1) ;
}
}