/* generate lfsr output */ #include #include #include #define MAX 1025 typedef unsigned char uchar; uchar R[MAX]; int T[MAX]; int n = 10000; /* number of bits to output */ int l = -1; int taps = 0; int verbose; char *init; char *myname; void printreg(int r) { register int i; for (i = 0; i < l; ++i) putchar(R[(r+i) % l] + '0'); putchar('\n'); } int main(int ac, char **av) { register long i, tap, r; myname = av[0]; --ac; ++av; while (ac > 0 && av[0][0] == '-') { if (ac > 0 && strcmp(av[0], "-v") == 0) { ++verbose; --ac, ++av; } else if (ac > 1 && strcmp(av[0], "-n") == 0) { n = strtol(av[1], (char **)NULL, 0); if (n <= 0) { fprintf(stderr, "%s: Can't have negative count: %d\n", myname, n); goto usage; } ac -= 2; av += 2; } else if (ac > 1 && strcmp(av[0], "-i") == 0) { init = av[1]; /* further checking done later */ ac -= 2; av += 2; } else goto usage; } if (ac < 2) { badtaps: fprintf(stderr, "%s: Must specify (odd, >= 3, 0 implied) taps overall\n", myname); usage: fprintf(stderr, "usage: %s [-v] [-n bitsout] [-i initial] t1 t2 ...\n", myname); fprintf(stderr, "Register shifts left, taps count from 1 at left.\n"); return 1; } tap = 0; for (i = 0; i < ac; ++i) { tap = strtol(av[i], (char **)NULL, 0); if (tap < 0 || MAX <= tap) { fprintf(stderr, "%s: invalid tap %ld\n", myname, tap); goto usage; } if (tap == 0) continue; T[taps++] = tap; if (tap > l) l = tap; } if (taps < 2 || (taps & 1) == 1) goto badtaps; if (init) { if (strlen(init) != l || strspn(init, "01") != l) { fprintf(stderr, "%s: init string must be binary of right length\n", myname); goto usage; } for (i = 0; i < l; ++i) R[i] = *init++ - '0'; } else { /* initialise to give impulse sequence */ R[l-1] = 1; } /* reverse taps to fit polynomial */ for (i = 0; i < taps; ++i) if (T[i] != l) T[i] = l - T[i]; /* wow -- ready to generate bits finally. */ r = 0; while (--n >= 0) { tap = R[r]; if (verbose) printreg(r); else putchar(tap+'0'); for (tap = i = 0; i < taps; ++i) tap ^= R[(r+T[i]) % l]; R[r] = tap; if (++r == l) r = 0; } fflush(stdout); return 0; }