Permalink
af3f494 Jan 21, 2017
233 lines (200 sloc) 8.42 KB
Attribute VB_Name = "libRed"
'=== LibRed imports ===
Private callBlkWord As Long
Private blkWord As Long
Public Enum RedTypes
red_value
red_datatype
red_unset
red_none
red_logic
red_block
red_paren
red_string
red_file
red_url
red_char
red_integer
red_float
red_symbol
red_context
red_word
red_set_word
red_lit_word
red_get_word
red_refinement
red_issue
red_native
red_action
red_op
red_function
red_path
red_lit_path
red_set_path
red_get_path
red_routine
red_bitset
red_point
red_object
red_typeset
red_error
red_vector
red_hash
red_pair
red_percent
red_tuple
red_map
red_binary
red_series
red_time
red_tag
red_email
red_image
red_event
End Enum
Public Enum RedEncodings
reUTF8 = 1
reUTF16
reVARIANT
End Enum
'--- Setup and terminate ---
Public Declare Sub redOpenReal Lib "libRed.dll" Alias "redOpen" ()
'--- Run Red code ---
Public Declare Function redDo Lib "libRed.dll" (ByRef source As Variant) As Long
Public Declare Function redDoFile Lib "libRed.dll" (ByRef file As Variant) As Long
Public Declare Function redDoBlock Lib "libRed.dll" (ByVal code As Long) As Long
'--- Expose a VB callback in Red ---
Public Declare Function redRoutine Lib "libRed.dll" (ByVal name As Long, ByRef desc As Variant, ByVal ptr As Long) As Long
'--- VB -> Red ---
Public Declare Function redSymbol Lib "libRed.dll" (ByRef word As Variant) As Long
Public Declare Function redUnset Lib "libRed.dll" () As Long
Public Declare Function redNone Lib "libRed.dll" () As Long
Public Declare Function redLogicReal Lib "libRed.dll" Alias "redLogic" (ByVal bool As Long) As Long
Public Declare Function redDatatype Lib "libRed.dll" (ByVal dtype As Long) As Long
Public Declare Function redInteger Lib "libRed.dll" (ByVal number As Long) As Long
Public Declare Function redFloat Lib "libRed.dll" (ByVal number As Double) As Long
Public Declare Function redPair Lib "libRed.dll" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Function redTuple Lib "libRed.dll" (ByVal r As Long, ByVal g As Long, ByVal b As Long) As Long
Public Declare Function redTuple4 Lib "libRed.dll" (ByVal r As Long, ByVal g As Long, ByVal b As Long, ByVal a As Long) As Long
Public Declare Function redString Lib "libRed.dll" (ByRef str As Variant) As Long
Public Declare Function redWord Lib "libRed.dll" (ByRef word As Variant) As Long
Public Declare Function redMakeSeries Lib "libRed.dll" (ByVal t As Long, ByVal size As Long) As Long
'--- Red -> VB ---
Public Declare Function redCInt32 Lib "libRed.dll" (ByVal value As Long) As Long
Public Declare Function redCDouble Lib "libRed.dll" (ByVal value As Long) As Double
Public Declare Function redTypeOf Lib "libRed.dll" (ByVal value As Long) As Long
Public Declare Sub redVString Lib "libRed.dll" (ByVal str As Long, ByRef varg As Variant)
'--- Red actions ---
Public Declare Function redAppend Lib "libRed.dll" (ByVal series As Long, ByVal value As Long) As Long
Public Declare Function redClear Lib "libRed.dll" (ByVal series As Long) As Long
Public Declare Function redCopy Lib "libRed.dll" (ByVal value As Long) As Long
Public Declare Function redFind Lib "libRed.dll" (ByVal series As Long, ByVal value As Long) As Long
Public Declare Function redIndex Lib "libRed.dll" (ByVal series As Long) As Long
Public Declare Function redLength Lib "libRed.dll" (ByVal series As Long) As Long
Public Declare Function redMake Lib "libRed.dll" (ByVal proto As Long, ByVal spec As Long) As Long
Public Declare Function redMold Lib "libRed.dll" (ByVal value As Long) As Long
Public Declare Function redPick Lib "libRed.dll" (ByVal series As Long, ByVal index As Long) As Long
Public Declare Function redPoke Lib "libRed.dll" (ByVal series As Long, ByVal index As Long, ByVal value As Long) As Long
Public Declare Function redPut Lib "libRed.dll" (ByVal series As Long, ByVal index As Long, ByVal value As Long) As Long
Public Declare Function redRemove Lib "libRed.dll" (ByVal series As Long) As Long
Public Declare Function redSelect Lib "libRed.dll" (ByVal series As Long, ByVal value As Long) As Long
Public Declare Function redSkip Lib "libRed.dll" (ByVal series As Long, ByVal offset As Long) As Long
Public Declare Function redTo Lib "libRed.dll" (ByVal proto As Long, ByVal spec As Long) As Long
'--- Access to a Red global word ---
Public Declare Function redSet Lib "libRed.dll" (ByVal id As Long, ByVal value As Long) As Long
Public Declare Function redGet Lib "libRed.dll" (ByVal id As Long) As Long
'--- Access to a Red path ---
Public Declare Function redSetPath Lib "libRed.dll" (ByVal path As Long, ByVal value As Long) As Long
Public Declare Function redGetPath Lib "libRed.dll" (ByVal path As Long) As Long
'--- libRed settings ---
Public Declare Sub redSetEncoding Lib "libRed.dll" (ByVal encIn As Long, ByVal encOut As Long)
'--- Debugging purpose ---
Public Declare Function redPrint Lib "libRed.dll" (ByVal value As Long)
Public Declare Function redProbe Lib "libRed.dll" (ByVal value As Long) As Long
Public Declare Function redHasError Lib "libRed.dll" () As Long
Public Declare Function redOpenLogWindow Lib "libRed.dll" () As Long
Public Declare Function redCloseLogWindow Lib "libRed.dll" () As Long
Public Declare Sub redOpenLogFile Lib "libRed.dll" (ByVal name As String)
Public Declare Sub redCloseLogFile Lib "libRed.dll" ()
'--- libRed VB-specific wrappers ---
Public Sub redOpen()
redOpenReal
redSetEncoding reVARIANT, reVARIANT
callBlkWord = redSymbol("VBCallBlk")
redSet callBlkWord, redMakeSeries(red_block, 10)
blkWord = redSymbol("blk")
End Sub
Public Function redCString(str As Long)
Dim var
var = ""
redVString str, var
redCString = var
End Function
Public Sub redClose()
'Do nothing for now
End Sub
Public Function redLogic(bool As Boolean) As Long
redLogic = redLogicReal(IIf(bool, 1, 0))
End Function
Private Sub redAppendBlockValue(blk As Long, value As Variant, asWord As Boolean)
Select Case VarType(value)
Case vbInteger, vbLong: redAppend redGet(blk), redInteger(CLng(value))
Case vbSingle, vbDouble: redAppend redGet(blk), redFloat(CDbl(value))
Case vbString: redAppend redGet(blk), IIf(asWord, redWord(CVar(value)), redString(CVar(value)))
Case Else: MsgBox "redAppendBlockValue: Unsupported type"
End Select
End Sub
Public Function redBlock(ParamArray args() As Variant) As Long
Dim i As Long
Dim blk As Long
blk = blkWord
redSet blk, redMakeSeries(red_block, UBound(args) - LBound(args) + 1)
For i = LBound(args) To UBound(args): redAppend redGet(blk), args(i): Next i
redBlock = redGet(blk)
End Function
Public Function redPath(ParamArray args() As Variant) As Long
Dim i As Long
Dim blk As Long
blk = blkWord
redSet blk, redMakeSeries(red_path, UBound(args) - LBound(args) + 1)
For i = LBound(args) To UBound(args): redAppend redGet(blk), args(i), True: Next i
redPath = redGet(blk)
End Function
Public Function redCall(ParamArray args() As Variant) As Long
Dim i As Long
Dim blk As Long
blk = callBlkWord
redClear redGet(blk)
redAppend redGet(blk), args(0)
For i = LBound(args) + 1 To UBound(args): redAppend redGet(blk), args(i), False: Next i
redCall = redDoBlock(redGet(blk))
End Function
Public Function redBlockVB(ParamArray args() As Variant) As Long
Dim i As Long
Dim blk As Long
blk = blkWord
redSet blk, redMakeSeries(red_block, UBound(args) - LBound(args) + 1)
For i = LBound(args) To UBound(args): redAppendBlockValue blk, args(i), False: Next i
redBlockVB = redGet(blk)
End Function
Public Function redPathVB(ParamArray args() As Variant) As Long
Dim i As Long
Dim blk As Long
blk = blkWord
redSet blk, redMakeSeries(red_path, UBound(args) - LBound(args) + 1)
For i = LBound(args) To UBound(args): redAppendBlockValue blk, args(i), True: Next i
redPathVB = redGet(blk)
End Function
Public Function redCallVB(ParamArray args() As Variant) As Long
Dim i As Long
Dim blk As Long
If VarType(args(0)) <> vbString Then
MsgBox "Error in redCallVB(), first argument must be a string"
redCallVB = redUnset
End If
blk = callBlkWord
redClear redGet(blk)
redAppend redGet(blk), redWord(CVar(args(0)))
For i = LBound(args) + 1 To UBound(args): redAppendBlockValue blk, args(i), False: Next i
redCallVB = redDoBlock(redGet(blk))
End Function