// to encode binary as ASCII armor as described in // http://www.cis.ohio-state.edu/htbin/rfc/rfc2440.html // page 44. // No terminating logic is provided here. We never quit. #include #include "pushy.h" typedef struct {dnode dn; char s; char bc; unode *b, *un;} aS; static char mc[] = "ABCDEFGNIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" "0123456789+/"; static void arm(char xc, dnode * n, unode* p){ aS* na = (aS*)n; unsigned char c = xc; switch (na->bc){ case 0: na->s = c & 3; na->bc=1; (n->nsn->code)(mc[c>>2], n->nsn, p); case 1: {char d = (na->s)<<4; na->s = c & 15; na->bc = 2; (n->nsn->code)(mc[d | c>>4], n->nsn, p);} case 2: {char d = (na->s)<<2; na->bc = 0; (n->nsn->code)(mc[d | c>>6], n->nsn, na->un);} // crash; }} static void extra(unode*un){ dnode* dx = un->dn; aS* ds = (aS*)dx; (dx->nsn->code)(mc[ds->s&63], dx->nsn, ds->b);} dnode* carm(dnode* dn){aS* n = (aS*)malloc(sizeof(aS)); unode* un = (unode*)malloc(sizeof(unode)); *n = (aS){(dnode){arm, dn}, 0, 0, 0, un}; *un = (unode){extra, &n->dn}; return &n->dn;}