mirror of
git://git.psyc.eu/libpsyc
synced 2024-08-15 03:19:02 +00:00
pike binding by fippo
This commit is contained in:
parent
9fe62b959c
commit
520cb9fbde
5 changed files with 248 additions and 0 deletions
14
pike/Makefile
Normal file
14
pike/Makefile
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
CC=gcc
|
||||||
|
CFLAGS := -O9 -shared -Wall -fPIC -I/usr/include/pike $(CFLAGS) $(shell $(PIKE) -x cflags)
|
||||||
|
LD=$(CC) -shared -lpsyc
|
||||||
|
|
||||||
|
all: module.so
|
||||||
|
|
||||||
|
module.so: module.o
|
||||||
|
$(LD) -o module.so module.o $(LDFLAGS)
|
||||||
|
|
||||||
|
module.o: module.c
|
||||||
|
$(CC) $(CFLAGS) -c module.c
|
||||||
|
|
||||||
|
module.c: psyc.cmod
|
||||||
|
$(PIKE) -x precompile $< > $@
|
6
pike/README
Normal file
6
pike/README
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
to compile the cmod:
|
||||||
|
pike -x module
|
||||||
|
|
||||||
|
to run the code:
|
||||||
|
pike -M. rendertest.pike
|
||||||
|
pike -M. parsetest.pike
|
11
pike/parsetest.pike
Normal file
11
pike/parsetest.pike
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
int main() {
|
||||||
|
.Parser p = Parser();
|
||||||
|
p->feed(":_source\tpsyc://test.psyc.eu/~foo\n"
|
||||||
|
":_target\tpsyc://test2.psyc.eu/~bar\n"
|
||||||
|
":_tag\tf00b4rb4z\n"
|
||||||
|
"\n"
|
||||||
|
":_foo\tbar\n"
|
||||||
|
"_message_private\n"
|
||||||
|
"OHAI\n"
|
||||||
|
"|\n");
|
||||||
|
}
|
209
pike/psyc.cmod
Normal file
209
pike/psyc.cmod
Normal file
|
@ -0,0 +1,209 @@
|
||||||
|
#include "global.h"
|
||||||
|
#include "interpret.h"
|
||||||
|
#include "stralloc.h"
|
||||||
|
#include "mapping.h"
|
||||||
|
#include "svalue.h"
|
||||||
|
#include "operators.h"
|
||||||
|
#include "array.h"
|
||||||
|
#include "builtin_functions.h"
|
||||||
|
#include "module.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#ifndef DEFAULT_CMOD_STORAGE
|
||||||
|
#define DEFAULT_CMOD_STORAGE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// libpsyc dependencies
|
||||||
|
# include <psyc.h>
|
||||||
|
# include <psyc/parse.h>
|
||||||
|
# include <psyc/render.h>
|
||||||
|
|
||||||
|
#define MODULE_NAME "PSYC"
|
||||||
|
#define MODULE_MAJOR 0
|
||||||
|
#define MODULE_MINOR 1
|
||||||
|
#define MODULE_PATCH 0
|
||||||
|
|
||||||
|
/*! @module PSYC
|
||||||
|
*!
|
||||||
|
*! Implements PSYC parsing and rendering based on libpsyc
|
||||||
|
*! FIXME: parser not implemented yet
|
||||||
|
*!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*! @decl string render(mapping rvars, mapping evars, string method, string|void body)
|
||||||
|
*! @param rvars
|
||||||
|
*! FIXME
|
||||||
|
*! @param evars
|
||||||
|
*! FIXME
|
||||||
|
*! @param method
|
||||||
|
*! FIXME
|
||||||
|
*! @param data
|
||||||
|
*! FIXME
|
||||||
|
*! @returns
|
||||||
|
*! serialized packet as a string
|
||||||
|
*/
|
||||||
|
PIKEFUN string render(mapping rvars, mapping evars, string method, string|void body) {
|
||||||
|
char buffer[1024*1024]; // static buffer, FIXME
|
||||||
|
psycPacket packet;
|
||||||
|
psycHeader rheaders, eheaders;
|
||||||
|
|
||||||
|
struct keypair *k; // for mappings
|
||||||
|
INT32 e;
|
||||||
|
|
||||||
|
char oper = C_GLYPH_OPERATOR_SET;
|
||||||
|
|
||||||
|
// fill headers
|
||||||
|
rheaders.lines = 0;
|
||||||
|
rheaders.modifiers = malloc(sizeof(psycModifier) * rvars->data->size);
|
||||||
|
NEW_MAPPING_LOOP(rvars->data) {
|
||||||
|
if (k->ind.type == PIKE_T_STRING) {
|
||||||
|
switch(k->val.type) {
|
||||||
|
case PIKE_T_INT:
|
||||||
|
printf("integer value %ld\n", k->val.u.integer);
|
||||||
|
break;
|
||||||
|
case PIKE_T_FLOAT:
|
||||||
|
printf("float value %f\n", k->val.u.float_number);
|
||||||
|
break;
|
||||||
|
case PIKE_T_STRING:
|
||||||
|
rheaders.modifiers[rheaders.lines++] = psyc_newModifier2(oper,
|
||||||
|
(char *)STR0(k->ind.u.string),
|
||||||
|
k->ind.u.string->len,
|
||||||
|
(char *)STR0(k->val.u.string),
|
||||||
|
k->val.u.string->len,
|
||||||
|
PSYC_MODIFIER_ROUTING);
|
||||||
|
break;
|
||||||
|
case PIKE_T_MAPPING:
|
||||||
|
printf("mapping value length %d\n", k->val.u.mapping->data->size);
|
||||||
|
// another walk_mapping?
|
||||||
|
break;
|
||||||
|
case PIKE_T_ARRAY:
|
||||||
|
printf("array value length %d\n", k->val.u.array->size);
|
||||||
|
/*
|
||||||
|
for(e = 0; e < data->u.array->size; e++) {
|
||||||
|
struct svalue item = data->u.array->item[e];
|
||||||
|
inner_serialize2(&item, sb);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Pike_error("psyc render: unsupported non-string key in rvars\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eheaders.lines = 0;
|
||||||
|
eheaders.modifiers = malloc(sizeof(psycModifier) * evars->data->size);
|
||||||
|
NEW_MAPPING_LOOP(evars->data) {
|
||||||
|
if (k->ind.type == PIKE_T_STRING) {
|
||||||
|
char *key;
|
||||||
|
size_t keylen;
|
||||||
|
char *val = NULL;
|
||||||
|
size_t vallen = 0;
|
||||||
|
|
||||||
|
key = (char *) STR0(k->ind.u.string);
|
||||||
|
keylen = k->ind.u.string->len;
|
||||||
|
|
||||||
|
switch(k->val.type) {
|
||||||
|
case PIKE_T_INT:
|
||||||
|
printf("integer value %ld\n", k->val.u.integer);
|
||||||
|
break;
|
||||||
|
case PIKE_T_STRING:
|
||||||
|
val = (char *) STR0(k->ind.u.string);
|
||||||
|
vallen = k->ind.u.string->len;
|
||||||
|
break;
|
||||||
|
case PIKE_T_FLOAT:
|
||||||
|
printf("float value %f\n", k->val.u.float_number);
|
||||||
|
break;
|
||||||
|
case PIKE_T_MAPPING:
|
||||||
|
printf("mapping value length %d\n", k->val.u.mapping->data->size);
|
||||||
|
// another walk_mapping?
|
||||||
|
break;
|
||||||
|
case PIKE_T_ARRAY:
|
||||||
|
printf("array value length %d\n", k->val.u.array->size);
|
||||||
|
/*
|
||||||
|
for(e = 0; e < data->u.array->size; e++) {
|
||||||
|
struct svalue item = data->u.array->item[e];
|
||||||
|
inner_serialize2(&item, sb);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
eheaders.modifiers[eheaders.lines++] = psyc_newModifier2(oper,
|
||||||
|
key, keylen,
|
||||||
|
val, vallen,
|
||||||
|
PSYC_MODIFIER_CHECK_LENGTH);
|
||||||
|
} else {
|
||||||
|
Pike_error("psyc render: unsupported non-string key in evars\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (body != NULL) {
|
||||||
|
packet = psyc_newPacket2(rheaders.modifiers,
|
||||||
|
rheaders.lines,
|
||||||
|
eheaders.modifiers,
|
||||||
|
eheaders.lines,
|
||||||
|
(const char *)STR0(method), method->len,
|
||||||
|
(const char *)STR0(body), body->len,
|
||||||
|
PSYC_PACKET_CHECK_LENGTH);
|
||||||
|
} else { // body arg was not given
|
||||||
|
packet = psyc_newPacket2(rheaders.modifiers,
|
||||||
|
rheaders.lines,
|
||||||
|
eheaders.modifiers,
|
||||||
|
eheaders.lines,
|
||||||
|
(const char *)STR0(method), method->len,
|
||||||
|
NULL, 0,
|
||||||
|
PSYC_PACKET_CHECK_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
FIXME: how to allocate space and pass it to libpsyc?
|
||||||
|
string builder probably
|
||||||
|
*/
|
||||||
|
psyc_render(&packet, buffer, packet.length);
|
||||||
|
// pop_n_elems(args);
|
||||||
|
RETURN make_shared_binary_string(buffer, packet.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
PIKECLASS Parser {
|
||||||
|
CVAR psycParseState parser;
|
||||||
|
|
||||||
|
INIT {
|
||||||
|
psyc_initParseState(&THIS->parser);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXIT {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
PIKEFUN void feed(string data) {
|
||||||
|
char oper;
|
||||||
|
psycString name, value;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
psyc_setParseBuffer2(&THIS->parser,
|
||||||
|
(char *) STR0(data), data->len);
|
||||||
|
for (;;) {
|
||||||
|
printf("looping...\n");
|
||||||
|
ret = psyc_parse(&THIS->parser, &oper, &name, &value);
|
||||||
|
if (ret == PSYC_PARSE_COMPLETE || ret < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("down here\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
INIT {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
EXTRA {
|
||||||
|
add_integer_constant("__version_major", MODULE_MAJOR, 0);
|
||||||
|
add_integer_constant("__version_minor", MODULE_MAJOR, 0);
|
||||||
|
add_integer_constant("__version_patch", MODULE_MAJOR, 0);
|
||||||
|
}
|
8
pike/rendertest.pike
Normal file
8
pike/rendertest.pike
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
int main() {
|
||||||
|
werror("render:\n%s\---\n",
|
||||||
|
render( ([ "_context" : "psyc://denmark.lit/~hamlet#_follow" ]),
|
||||||
|
([ "_type_content" : "text/plain", "_subject" : "to be or not to be ?",
|
||||||
|
"_bla" : 123 ]),
|
||||||
|
"_message",
|
||||||
|
"to be or not to be ?"));
|
||||||
|
}
|
Loading…
Reference in a new issue