This code converts the built-in ToDo database into Lua format. The implementation is totally undocumented, I'm afraid.
<*>= [D->] #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <assert.h> #include "pi-todo.h" #include "pdbconv.h" #include "pdbrep.h" #include "pdbio.h"
<*>+= [<-D->]
static void unpacki(FILE *out, struct pdb *db, Text txt) {
int n;
struct ToDoAppInfo tai;
n = unpack_ToDoAppInfo(&tai, txt.p, txt.len);
fprintf(out, "\n {");
fprintf(out, "\n categories = ");
unpack_categories(out, (struct PDBCategoryAppInfo *)&tai.category, 1);
fprintf(out, ",\n sortByPriority = %s", bitstring(tai.sortByPriority));
fprintf(out, "\n }");
assert(n <= chars_remaining(&txt));
if (n < chars_remaining(&txt))
fprintf(stderr, "warning: %d unused chars reading app info for todo\n",
chars_remaining(&txt) - n);
}
Definesunpacki(links are to index).
<*>+= [<-D->]
static void unpackr(FILE *out, struct pdb *db, int recnum) {
Record *r = db->records + recnum;
struct ToDo t;
struct ToDoAppInfo tai;
unpack_ToDo(&t, r->data.p, r->data.len);
unpack_ToDoAppInfo(&tai, db->info.appInfo.p, db->info.appInfo.len);
fprintf(out, "\n {");
fprintf(out, "\n category = %s,", QUOTE(tai.category.name[r->category]));
fprintf(out, "\n priority = %d, completed = %s,", t.priority,
bitstring(t.complete));
fprintf(out, "\n due = ");
if(t.indefinite)
fprintf(out, "nil");
else
unpack_date(out, mktime(&t.due));
fprintf(out, ",\n description = %s,", quote(t.description, 1));
fprintf(out, "\n note = %s", quote(t.note, 1));
fprintf(out, "\n }");
}
Definesunpackr(links are to index).
<*>+= [<-D]
static char *trailers[] = {
0
};
struct PDBConv ToDo = {
"ToDo list",
"DATA", "todo",
{ 0, unpacki, 0 },
{ 0, generic_unpackInfo, generic_packInfo },
{ 0, unpackr, 0 },
trailers
};
Definestrailers(links are to index).