PDB conversion for Todo

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);
}

Defines unpacki (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        }");
}

Defines unpackr (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
};
Defines trailers (links are to index).