Examples
This document is a set of representative examples demonstrating how to use tpl. If you’re looking for a more explanatory document, please read the User Guide.
An integer array
#include "tpl.h"
int main() {
tpl_node *tn;
int i;
tn = tpl_map( "A(i)", &i );
for( i=0; i<10; i++ ) {
tpl_pack( tn, 1 );
}
tpl_dump( tn, TPL_FILE, "demo.tpl" );
tpl_free( tn );
}
A program that unpacks this tpl data file is shown below.
#include <stdio.h>
#include "tpl.h"
int main() {
tpl_node *tn;
int i;
tn = tpl_map( "A(i)", &i );
tpl_load( tn, TPL_FILE, "demo.tpl" );
while (tpl_unpack( tn, 1 ) > 0) {
printf("%d ", i);
}
tpl_free( tn );
}
When run, this program prints:
0 1 2 3 4 5 6 7 8 9
A nested array
#include "tpl.h"
int main() {
char c;
tpl_node *tn;
tn = tpl_map("A(A(c))", &c);
for(c='a'; c<'c'; c++) tpl_pack(tn,2);
tpl_pack(tn, 1);
for(c='1'; c<'4'; c++) tpl_pack(tn,2);
tpl_pack(tn, 1);
tpl_dump(tn, TPL_FILE, "test40.tpl");
tpl_free(tn);
}
This creates a nested array in which the parent has two elements: the first element is the two-element nested array a, b; and the second element is the three-element nested array 1, 2, 3.
#include "tpl.h"
#include <stdio.h>
int main() {
char c;
tpl_node *tn;
tn = tpl_map("A(A(c))", &c);
tpl_load(tn, TPL_FILE, "test40.tpl");
while (tpl_unpack(tn,1) > 0) {
while (tpl_unpack(tn,2) > 0) printf("%c ",c);
printf("\n");
}
tpl_free(tn);
}
When run, this program prints:
a b
1 2 3
A string array
#include "tpl.h"
int main() {
tpl_node *tn;
char *s;
tn = tpl_map( "A(s)", &s );
s = "bob";
tpl_pack(tn, 1);
s = "betty";
tpl_pack(tn, 1);
tpl_dump(tn, TPL_FILE, "strings.tpl");
tpl_free(tn);
}
#include <stdio.h>
#include "tpl.h"
int main() {
tpl_node *tn;
char *s;
tn = tpl_map( "A(s)", &s );
tpl_load( tn, TPL_FILE, "strings.tpl" );
while (tpl_unpack( tn, 1 ) > 0) {
printf("%s\n", s);
free(s); /* important! */
}
tpl_free(tn);
}
When run, this program prints:
bob
betty
Integer/string pairs
#include "tpl.h"
int main(int argc, char *argv[]) {
tpl_node *tn;
int id;
char *name, *names[] = { "joe", "bob", "mary" };
tn = tpl_map("A(is)", &id, &name);
for(id=0,name=names[id]; id < 3; name=names[++id])
tpl_pack(tn,1);
tpl_dump(tn, TPL_FILE, "/tmp/test35.tpl");
tpl_free(tn);
}
#include <stdio.h>
#include "tpl.h"
int main(int argc, char *argv[]) {
tpl_node *tn;
int id;
char *name;
tn = tpl_map("A(is)", &id, &name);
tpl_load(tn, TPL_FILE, "/tmp/test35.tpl");
while ( tpl_unpack(tn,1) > 0 )
printf("id %d, user %s\n", id, name);
tpl_free(tn);
}
When run, this program prints:
id 0, user joe
id 1, user bob
id 2, user mary
A binary buffer
#include "tpl.h"
#include <sys/time.h>
int main() {
tpl_node *tn;
tpl_bin tb;
struct timeval tv; /* we'll pack this structure as raw binary */
gettimeofday(&tv,NULL); /* populate the structure with some data */
tn = tpl_map( "B", &tb );
tb.sz = sizeof(struct timeval);
tb.addr = &tv;
tpl_pack( tn, 0 );
tpl_dump(tn, TPL_FILE, "bin.tpl");
tpl_free(tn);
}
#include "tpl.h"
int main() {
tpl_node *tn;
tpl_bin tb;
tn = tpl_map( "B", &tb );
tpl_load( tn, TPL_FILE, "bin.tpl" );
tpl_unpack( tn, 0 );
printf("binary buffer of length %d at address %p\n", tb.sz, tb.addr);
free(tb.addr); /* important! */
tpl_free(tn);
}
Simple pipe IPC
This is a simple example of inter-process communication (IPC) over a pipe.
int main() {
tpl_node *tn;
unsigned i, sum=0;
int fd[2], pid;
pipe(fd);
if ( (pid = fork()) == 0) { /* child */
tn = tpl_map("A(u)",&i);
tpl_load(tn, TPL_FD, fd[0]);
while (tpl_unpack(tn,1) > 0) sum += i;
tpl_free(tn);
printf("sum is %d\n", sum);
} else if (pid > 0) { /* parent */
tn = tpl_map("A(u)",&i);
for(i=0;i<10000;i++) tpl_pack(tn,1);
tpl_dump(tn,TPL_FD, fd[1] );
tpl_free(tn);
waitpid(pid,NULL,0);
}
}
The child unpacks the integers in the message, and sums them, printing:
49995000
The example above (with #include
headers omitted here) is included in the
file tests/test28.c
.