diff --git a/bedstead.c b/bedstead.c
index afdc75f..c045cea 100644
--- a/bedstead.c
+++ b/bedstead.c
@@ -210,6 +210,7 @@ static struct glyph {
/* Top row (and left column) don't appear in ROM. */
char data[YSIZE - 1];
char const *alias_of;
+ int subr_idx;
};
int_least32_t unicode;
char const *name;
@@ -220,6 +221,7 @@ static struct glyph {
#define SEP6 (SEP | MOS6)
#define SEP4 (SEP | MOS4)
#define IS_ALIAS 0x08
+#define IS_SUBR 0x10
} glyphs[] = {
/*
* The first batch of glyphs comes from the code tables at the end of
@@ -2727,10 +2729,10 @@ compare_glyph_to_name(const void *vn, const void *vg)
return strcmp(name, g->name);
}
-static struct glyph const *
+static struct glyph *
get_glyph_by_name(char const *name)
{
- struct glyph const * const *gp;
+ struct glyph * const *gp;
gp = bsearch(name, glyphs_by_name, nglyphs,
sizeof(glyphs_by_name[0]), &compare_glyph_to_name);
@@ -2759,6 +2761,8 @@ compare_glyphs_by_ffid(const void *va, const void *vb)
return strcmp(a->name, b->name);
}
+static int nsubrs;
+
int
main(int argc, char **argv)
{
@@ -3084,6 +3088,23 @@ main(int argc, char **argv)
glyphs_by_name[i] = glyphs + i;
qsort(glyphs_by_name, nglyphs, sizeof(glyphs_by_name[0]),
&compare_glyphs_by_name);
+ /* Scan for aliased glyphs to turn into subroutines. */
+ printf(" \n");
+ nsubrs = 0;
+ for (i = 0; i < nglyphs; i++) {
+ struct glyph *g = &glyphs[i];
+ if (g->flags & IS_ALIAS) {
+ while (g->flags & IS_ALIAS)
+ g = get_glyph_by_name(g->alias_of);
+ if (g->flags & IS_SUBR) continue;
+ printf(" \n", g->name);
+ doglyph(g);
+ g->flags = IS_SUBR;
+ g->subr_idx = nsubrs++;
+ printf(" \n");
+ }
+ }
+ printf(" \n");
printf(" \n");
printf(" \n");
for (i = 0; i < nglyphs; i++) {
@@ -3286,7 +3307,10 @@ doglyph(struct glyph const *g)
while (g->flags & IS_ALIAS)
g = get_glyph_by_name(g->alias_of);
- if (g->flags & MOS6)
+ if (g->flags & IS_SUBR)
+ printf(" %d callsubr\n", g->subr_idx -
+ (nsubrs < 1240 ? 107 : 1131));
+ else if (g->flags & MOS6)
domosaic(g->data[0], (g->flags & SEP) != 0);
else if (g->flags & MOS4)
domosaic4(g->data[0], (g->flags & SEP) != 0);