つづき(構造体、レコード型サポート関連)
!構造体、レコード型サポート関連
EXTERNAL FUNCTION CVI(s$,p,m) !文字列に埋め込まれたm*8ビット符号付き整数を取り出す OPTION CHARACTER byte LET n=0 FOR i=1 TO m LET n=n+256^(i-1)*ORD(s$(p+i:p+i)) NEXT i IF n<2^(m*8-1) THEN LET CVI=n ELSE LET CVI=n-2^(m*8) END FUNCTION EXTERNAL FUNCTION CVI2(s$,p,m) !文字列に埋め込まれたm*8ビット符号なし整数を取り出す OPTION CHARACTER byte LET n=0 FOR i=1 TO m LET n=n+256^(i-1)*ORD(s$(p+i:p+i)) NEXT i LET CVI2=n END FUNCTION
EXTERNAL FUNCTION MKI$(n,m) !m*8ビット整数nを文字列変数に埋め込む OPTION CHARACTER byte LET r=MOD(n,256) !2^8 LET s$=CHR$(r) FOR i=1 TO m-1 LET n=(n-r)/256 LET r=MOD(n,256) LET s$=s$ & CHR$(r) NEXT i LET MKI$=s$ END FUNCTION
EXTERNAL FUNCTION StructDim$(strct$) !文字列を構造体として定義する LET StructDim$=REPEAT$(CHR$(0),SizeOf(strct$,"")) END FUNCTION
EXTERNAL FUNCTION SizeOf(strct$,mem$) !メンバ変数の大きさを得る SELECT CASE UCASE$(strct$) CASE "BYTE" !数値型 LET SizeOf=1 !バイト数 CASE "INTEGER","WORD" LET SizeOf=2 CASE "LONG","DWORD" LET SizeOf=4 CASE ELSE IF UCASE$(strct$(1:7))="STRING*" THEN !文字型 String*? LET SizeOf=VAL(strct$(8:LEN(strct$))) ELSE !構造体、レコード型 CALL StructDef(strct$,mem$, ofst,sz) IF mem$="" THEN LET SizeOf=ofst ELSE LET SizeOf=sz !メンバ変数名がなければ構造体の大きさ END IF END SELECT END FUNCTION
EXTERNAL FUNCTION OffsetOf(strct$,mem$) !メンバ変数の位置を得る OPTION CHARACTER byte CALL StructDef(strct$,mem$, ofst,sz) LET OffsetOf=ofst END FUNCTION
EXTERNAL FUNCTION GetValOf(s$,strct$,mem$) !メンバ変数の値を得る OPTION CHARACTER byte CALL StructDef(strct$,mem$, ofst,sz) LET GetValOf=CVI(s$,ofst,sz) END FUNCTION EXTERNAL FUNCTION GetValOf2(s$,strct$,mem$) OPTION CHARACTER byte CALL StructDef(strct$,mem$, ofst,sz) LET GetValOf2=CVI2(s$,ofst,sz) END FUNCTION
EXTERNAL FUNCTION GetValOf$(s$,strct$,mem$) !メンバ変数の値を得る(文字型) OPTION CHARACTER byte CALL StructDef(strct$,mem$, ofst,sz) LET GetValOf$=s$(ofst+1:ofst+sz) END FUNCTION
EXTERNAL SUB SetValOf(s$,strct$,mem$, v) !メンバ変数の値を設定する OPTION CHARACTER byte CALL StructDef(strct$,mem$, ofst,sz) LET s$(ofst+1:ofst+sz)=MKI$(v,sz) END SUB
EXTERNAL SUB StructAdd(strct$,mem$, ofst) !親の構造体の位置を得る CALL StructDef(strct$,mem$, ofst1,sz) LET ofst=ofst+ofst1 END SUB
|