[← Home](../README.md) · [Libraries](README.md) # rexxsyslib.library — ARexx Scripting Interface ## Overview ARexx is the Amiga's built-in macro/scripting language (based on IBM's REXX). Any application can host an **ARexx port** to receive commands from scripts and other applications — this is the Amiga's primary inter-application communication mechanism for user-facing scripting. ```mermaid flowchart LR SCRIPT["ARexx Script
(text file)"] -->|"Sends command
to named port"| PORT["Application
ARexx Port
(e.g., 'MYAPP')"] PORT -->|"Parses command
returns result"| SCRIPT APP2["Other Application"] -->|"FindPort + PutMsg"| PORT style PORT fill:#e8f4fd,stroke:#2196f3,color:#333 ``` --- ## Adding an ARexx Port to Your Application ```c #include #include struct MsgPort *arexxPort = CreateMsgPort(); arexxPort->mp_Node.ln_Name = "MYAPP"; /* public port name */ arexxPort->mp_Node.ln_Pri = 0; AddPort(arexxPort); /* make it publicly findable */ /* In your main event loop, combine with IDCMP: */ ULONG arexxSig = 1 << arexxPort->mp_SigBit; ULONG idcmpSig = 1 << window->UserPort->mp_SigBit; ULONG sigs = Wait(arexxSig | idcmpSig); if (sigs & arexxSig) { struct RexxMsg *rmsg; while ((rmsg = (struct RexxMsg *)GetMsg(arexxPort))) { STRPTR cmd = ARG0(rmsg); /* the command string */ /* Parse and execute: */ if (stricmp(cmd, "QUIT") == 0) { rmsg->rm_Result1 = 0; /* RC = 0 (success) */ rmsg->rm_Result2 = 0; running = FALSE; } else if (strnicmp(cmd, "OPEN ", 5) == 0) { char *filename = cmd + 5; LONG rc = OpenFile(filename); rmsg->rm_Result1 = rc ? 0 : 10; /* 0=ok, 10=error */ rmsg->rm_Result2 = 0; } else if (stricmp(cmd, "VERSION") == 0) { rmsg->rm_Result1 = 0; /* Return a string result: */ if (rmsg->rm_Action & RXFF_RESULT) rmsg->rm_Result2 = (LONG)CreateArgstring("1.0", 3); } else { rmsg->rm_Result1 = 5; /* RC_WARN — unknown command */ rmsg->rm_Result2 = 0; } ReplyMsg((struct Message *)rmsg); } } /* Cleanup: */ RemPort(arexxPort); /* Drain remaining messages: */ struct RexxMsg *rmsg; while ((rmsg = (struct RexxMsg *)GetMsg(arexxPort))) { rmsg->rm_Result1 = 20; /* RC_FATAL */ ReplyMsg((struct Message *)rmsg); } DeleteMsgPort(arexxPort); ``` --- ## Sending ARexx Commands ```c struct Library *RexxSysBase = OpenLibrary("rexxsyslib.library", 0); struct MsgPort *replyPort = CreateMsgPort(); struct RexxMsg *rmsg = CreateRexxMsg(replyPort, NULL, "MYAPP"); rmsg->rm_Args[0] = (STRPTR)CreateArgstring("OPEN test.txt", 13); rmsg->rm_Action = RXCOMM | RXFF_RESULT; /* Find the target application's port: */ Forbid(); struct MsgPort *target = FindPort("TARGETAPP"); if (target) { PutMsg(target, &rmsg->rm_Node); Permit(); WaitPort(replyPort); GetMsg(replyPort); Printf("Return code: %ld\n", rmsg->rm_Result1); if (rmsg->rm_Result1 == 0 && rmsg->rm_Result2) { Printf("Result: %s\n", (char *)rmsg->rm_Result2); DeleteArgstring((STRPTR)rmsg->rm_Result2); } } else { Permit(); Printf("Target port not found\n"); } DeleteArgstring(rmsg->rm_Args[0]); DeleteRexxMsg(rmsg); DeleteMsgPort(replyPort); ``` --- ## ARexx Script Example ```rexx /* MyScript.rexx — control MYAPP from ARexx */ ADDRESS 'MYAPP' OPEN 'work:data/image.iff' IF RC > 0 THEN DO SAY 'Failed to open file, RC=' RC EXIT 10 END VERSION SAY 'App version:' RESULT QUIT ``` --- ## Return Codes | Value | Constant | Meaning | |---|---|---| | 0 | `RC_OK` | Success | | 5 | `RC_WARN` | Warning (command not understood, etc.) | | 10 | `RC_ERROR` | Error (command failed) | | 20 | `RC_FATAL` | Fatal error (port shutting down) | --- ## Common ARexx-Aware Applications | Application | Port Name | Example Commands | |---|---|---| | Workbench | `WORKBENCH` | `OPEN`, `CLOSE`, `WINDOW` | | MultiView | `MULTIVIEW.n` | `OPEN`, `PRINT`, `QUIT` | | IBrowse | `IBROWSE` | `GOTOURL`, `RELOAD` | | CygnusEd | `rexx_ced` | `OPEN`, `SAVE`, `MARK`, `CUT` | | TextPad | `TEXTPAD` | `LOAD`, `SAVE`, `FIND` | --- ## References - NDK39: `rexx/storage.h`, `rexx/rxslib.h` - ADCD 2.1: rexxsyslib.library autodocs - [arexx_integration.md](arexx_integration.md) — Complete ARexx integration guide: dispatch tables, antipatterns, use-case cookbook - See also: [process_management.md](../07_dos/process_management.md) — process/task message ports