chiark / gitweb /
generate: support K/N
[version-charset-test.git] / generate.c
1
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <assert.h>
6
7 static const char charset[]=
8   "0123456789"
9   "abcdefghijklmnopqrstuvwxyz"
10   "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
11   ".-+:~";
12
13 #define ML 8
14
15 static char sofar[ML+1];
16
17 static int denomix, denom=1;
18
19 static void gen(char *inbuf, int len) {
20   if (!len) {
21     *inbuf = 0;
22     if (!denomix) {
23       puts(sofar);
24     }
25     denomix += (denom-1);
26     denomix %= denom;
27     return;
28   }
29   const char *cp;
30   for (cp=charset; *cp; cp++) {
31     *inbuf = *cp;
32     gen(inbuf+1, len-1);
33   }
34 }    
35
36 int main(int argc, char **argv) {
37   int len;
38   int minlen=0, maxlen=ML;
39   char *slash;
40
41   if (argc>=2 && (slash = strchr(argv[1], '/'))) {
42       denomix = atoi(argv[1]);
43       denom = atoi(slash+1);
44       argv++; argc--;
45   }
46
47   if (argc==3) {
48     minlen = atoi(argv[1]);
49     maxlen = atoi(argv[2]);
50   } else if (argc==2) {
51     maxlen = atoi(argv[1]);
52   } else if (argc==1) {
53   } else {
54     abort();
55   }
56
57   assert(maxlen <= ML);
58
59   for (len=minlen; len<=maxlen; len++) {
60     fprintf(stderr,"********** generating len=%d **********\n",len);
61     gen(sofar, len);
62   }
63   if (ferror(stdout) ||
64       fflush(stdout)) { perror("stdout"); abort(); }
65   fputs("generate done\n",stderr);
66   return 0;
67 }