| REBOL 3 Docs | Guide | Concepts | Functions | Datatypes | Errors |
| TOC < Back Next > | Updated: 10-Aug-2009 Edit History |
The examples below use this standard plugin source code format:
#include "reb-c.h"
#include "reb-plugin.h"
const char *init_block =
<REBOL code goes here>
;
RPIEXT const char *RPI_Init(int opts, RPILIB *lib) {
RPI = lib;
if (lib->version == RPI_VERSION) return init_block;
return 0;
}
RPIEXT int RPI_Call(int cmd, RPIFRM *frm) {
<C command code goes here>
}
Notes:
For example, if the REBOL code is:
REBOL [
Title: "Add two integers"
Type: plugin
Export: [addi]
]
addi: command [i1 [integer!] i2 [integer!]
and the C code is:
RPIEXT int RPI_Call(int cmd, RPIFRM *frm) {
RPA_INT64(frm,1) = RPA_INT64(frm, 1) + RPA_INT64(frm, 2);\
return RPR_VALUE;
}
The plugin source code would be:
#include "reb-plugin.h"
const char *init_block =
"REBOL [\n"
"Title: {Add two integers}\n"
"Type: plugin\n"
"Export: [addi]\n"
"]\n"
"addi: command [i1 [integer!] i2 [integer!]\n"
;
RPIEXT const char *RPI_Init(int opts, RPILIB *lib) {
RPI = lib;
if (lib->version == RPI_VERSION) return init_block;
return 0;
}
RPIEXT int RPI_Call(int cmd, RPIFRM *frm) {
RPA_INT64(frm,1) = RPA_INT64(frm, 1) + RPA_INT64(frm, 2);\
return RPR_VALUE;
}
Once you go beyond a simple init block, it gets tedious to maintain it as C strings. To make it easier to build the init_block text, we provide the make-plugin-data.r script.
Using this script will convert the plugin .r source file into a C data statement (as UTF-8). It will also create the exports block and will generate an enum constant for each command.
#include "reb-c.h"
#include "reb-plugin.h"
#include "plugin-data.h"
RPIEXT const char *RPI_Init(int opts, RPILIB *lib) {
RPI = lib;
if (lib->version == RPI_VERSION) return init_block;
return 0;
}
RPIEXT int RPI_Call(int cmd, RPIFRM *frm) {
switch (cmd) {
case CMD_MY_CMD1:
...
case CMD_MY_CMD2:
...
examples
examples
examples
examples
| TOC < Back Next > | REBOL WIP Wiki | Feedback Admin |