XINCLUDE rexxstorage.bb2 ;=include/rexx/storage.h

DEFTYPE.MsgPort *replyport
DEFTYPE.RexxMsg *rexxmsg
DEFTYPE.l

Statement sendrexx{rexx$}

  ;make complex pointers global or Blitz 1.80 will be confused sometimes
  SHARED *replyport.MsgPort,*rexxmsg.RexxMsg   
  name$="BLITZBLANK"
  *rexxmsg=CreateRexxMsg_(*replyport,0,&name$) 
  If *rexxmsg                                  
    *arg=CreateArgstring_(&rexx$,Len(rexx$))
    If *arg
      *rexxmsg\rm_Args=*arg

      ;set #RXFF_RESULT to request a resultstring
      *rexxmsg\rm_Action=#RXCOMM|#RXFF_NOIO|#RXFF_RESULT
      Forbid_
      *arexxport=FindPort_(&name$)
      If *arexxport
        PutMsg_ *arexxport,*rexxmsg
        Permit_
        WaitPort_ *replyport
        *rexxmsg=GetMsg_(*replyport)
        If *rexxmsg\rm_Result1=0 AND *rexxmsg\rm_Result2<>0

          ;print resultstring
          NPrint Peek$(*rexxmsg\rm_Result2)
          DeleteArgstring_ *rexxmsg\rm_Result2
        EndIf
      Else
        Permit_
      EndIf
      DeleteArgstring_ *rexxmsg\rm_Args
    EndIf
    DeleteRexxMsg_ *rexxmsg
  EndIf
End Statement

;simple test-routine:
;we want to send many ARexx-messages, so create the port outside only once
*replyport=CreateMsgPort_()
If *replyport
  sendrexx{"BLANK"}
  DeleteMsgPort_ *replyport
EndIf
