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).