utils/naf.c: Wrap up the state machine correctly.
authorMark Wooding <mdw@distorted.org.uk>
Tue, 6 Aug 2013 18:37:34 +0000 (19:37 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Tue, 6 Aug 2013 21:46:52 +0000 (22:46 +0100)
The old code just assumed a particular resulution (in particular, the
`X' case), which is far from universally applicable.  Now we simulate up
to two more steps, feeding in zero bits.

utils/naf.c

index 550a271..f6c5771 100644 (file)
@@ -18,13 +18,16 @@ int main(int argc, char *argv[])
 
   for (i = 0, mp_scan(&sc, x); mp_step(&sc); i++) {
     switch (st | mp_bit(&sc)) {
-      case  Z | 1: st = Z1; break;
-      case Z1 | 0: st =         Z; printf("+ %lu\n", i - 1); break;
-      case Z1 | 1: st =         X; printf("- %lu\n", i - 1); break;
-      case  X | 0: st = X0; break;
-      case X0 | 1: st =         X; printf("- %lu\n", i - 1); break;
-      case X0 | 0: st =         Z; printf("+ %lu\n", i - 1); break;
+      case  Z | 1: st = Z1; printf("\t-> Z1\n"); break;
+      case Z1 | 0: st =         Z; printf("+ %lu\t-> Z\n", i - 1); break;
+      case Z1 | 1: st =         X; printf("- %lu\t-> X\n", i - 1); break;
+      case  X | 0: st = X0; printf("\t-> X0\n"); break;
+      case X0 | 1: st =         X; printf("- %lu\t-> X\n", i - 1); break;
+      case X0 | 0: st =         Z; printf("+ %lu\t-> Z\n", i - 1); break;
     }
   }
-  if (st >= X) printf("+ %lu\n", i - 1);
+  switch (st) {
+    case Z1: case X0: printf("+ %lu\n", i - 1); break;
+    case X: printf("+ %lu\n", i); break;
+  }
 }