{"id":1724,"date":"2021-08-08T14:19:00","date_gmt":"2021-08-08T12:19:00","guid":{"rendered":"https:\/\/moijari.com\/?p=1724"},"modified":"2021-08-16T18:12:19","modified_gmt":"2021-08-16T16:12:19","slug":"ressu-3-3-little-rewrite-changes-to-sample-some-new-alphabets","status":"publish","type":"post","link":"https:\/\/moijari.com\/?p=1724","title":{"rendered":"Ressu 2.3 Little rewrite, changes to &#8211;sample, some new alphabets,  new INPUT definations, change in &#8211;space option, new &#8211;newline option, rewrite to output routine"},"content":{"rendered":"\n<p>Kaikki oikeudet pid\u00e4tet\u00e4\u00e4n. T\u00e4ss\u00e4 versiossa ressusta on uusi yksinkertaisempi keskiarvoon perustuva tapa luokitella ketjut laskettaviin ja ei laskettaviin. Lis\u00e4ksi &#8211;sample kytkimeen on lis\u00e4tty status rivi, joka kertoo t\u00e4ll\u00e4 hetkell\u00e4 kirjoitettavan 1MB blokin, generaattorin nopeuden, t\u00e4m\u00e4n hetkisen kellonajan, j\u00e4ljell\u00e4 olevan ajoajan ja valmistumisajan. Lis\u00e4ksi ohjelmaan on lis\u00e4tty &#8220;naapureiden&#8221; ja muiden kirjainmerkist\u00f6j\u00e4.<\/p>\n\n\n\n<p>Edit: lis\u00e4tty kappaleita postin loppuun, ennen kokonaista sorsaa. Endedit.<\/p>\n\n\n\n<p>Aloitetaan t\u00e4rkeimm\u00e4st\u00e4, eli varsinaisesta generaattorista: Ressu_clockbyte() antaa generaattorille kellojonon, josta satunnaisuus luodaan.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static unsigned char ressu_clockbyte() \/* JariK 2013 *\/\n{\n  struct timeval tv;\n  gettimeofday(&amp;tv, NULL);\n  return(tv.tv_usec &amp; 0xff);\n}<\/code><\/pre>\n\n\n\n<p>Seuraavana ressun ydin ressu_genbytes_single(), joka luo varsinnaisen satunnaisbittipuskurin: Rutiinin nimi on muuten vaihdettu _fast-loppuisesta _single-loppuiseen fast ja single toimintojen selvent\u00e4miseksi.<\/p>\n\n\n\n<p>Satunnaisbitit luodaan kahdessa vaiheessa, ensimm\u00e4isess\u00e4 xorataan koko puskuri kellobiteill\u00e4, ja toisessa vaihdetaan puskurin merkkej\u00e4 satunnaisesti. Satunnaisuus itseasiassa muodostuu siit\u00e4, miss\u00e4 puskurin paikassa merkki on kun sit\u00e4 xorataan kellojonolla.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void ressu_genbytes_single(int size, unsigned char *buffer)\n{\n  int c, d, e, byte;\n  static int f = 0, prevbyte = -1, count = 0;\n\n  for(c=0; c&lt;8; c++) {\n    for(d=0; d&lt;size; d++) {\n      e = buffer&#91;d];\n      e = ((e&amp;0x80)&gt;&gt;7) | ((e&amp;0x7f)&lt;&lt;1); \/\/ rotate left 1\n      \/\/e = ((e&amp;0xe0)&gt;&gt;5) | ((e&amp;0x1f)&lt;&lt;3); \/\/ rotate left 3\n      \/\/e = ((e&amp;0xfe)&gt;&gt;1) | ((e&amp;0x1)&lt;&lt;7);  \/\/ rotate right 1\n      byte = ressu_clockbyte();\n      if(prevbyte==-1)\n\tprevbyte=byte;\n      buffer&#91;d] = e^byte;\n      if(prevbyte!=byte) {\n\tperiods&#91;count]++;\n\tclockbytes+=count;\n\tcount=0;\n\tprevbyte=byte;\n      }\n      count++;\n    }\n    for(d=0; d&lt;size; d++) {\n      f = (f + buffer&#91;d]) % size;\n      e = buffer&#91;d];\n      buffer&#91;d] = buffer&#91;f];\n      buffer&#91;f] = e;\n    }\n  }\n}<\/code><\/pre>\n\n\n\n<p>Seuraava rutiini on varsinainen asiakkaan kutsuttava rutiini, ja se yritt\u00e4\u00e4 l\u00f6yt\u00e4\u00e4 tarvittavien bittien m\u00e4\u00e4r\u00e4n perusteella oikean m\u00e4\u00e4r\u00e4n edellisen _single rutiinin kutsukertoja. Olennaisia asioita ovat se, ett\u00e4 _single suorituksia on tarpeeksi ett\u00e4 tulee mahdottomaksi arvata kellojonoa, tai sen perusteella satunnaisbittijonoa. Toinen asia on se, ett\u00e4 t\u00e4m\u00e4 rutiini erottaa satunnaislukupuskurin asiakkaasta, ett\u00e4 asiakas ei saa puskurin rakennetta, eik\u00e4 n\u00e4in voi arvata kellojonoa tai puskuria.<\/p>\n\n\n\n<p>Ressun &#8211;stat riveill\u00e4 on nyt ketjut my\u00f6s lajitellussa (sorted) listassa, jolloin eri limitit on helpompi paikallistaa.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>void ressu_genbytes(int size, unsigned char *buffer) \/\/ 6.5.2021 JariK\n{\n  int c, d, e, f;\n  static int ressut_first=1,\n    ressut_pos = 0,\n    ressut_f = 0;\n  static unsigned char ressut&#91;RESSUT_BYTES];\n  unsigned long prevperiods&#91;1024];\n  \n  for(c=0; c&lt;size; c++) {\n    if(ressut_pos == 0) {\n      if(ressut_first) {\n\tmemset(ressut,0,ressut_bytes);\n\tressut_first=0;\n      }\n\n      clockbytes=0;\n      for(d=0;d&lt;1024;d++) {\n\tperiods&#91;d]=0;\n      }\n      \n      int rndbits=0;\n      int lim, lim1=0, lim2=0;\n      int lim1a, lim1b;\n      int high1, high2;\n      \n      for(d=0; rndbits&lt;ressu_bits_needed ||\n\t  d&lt;RESSU_MIN_ROUNDS ||\n\t  clockbytes &lt; RESSU_MIN_CLOCKBYTES; d++) {\n\n\t\/\/ save previous round\n\n        for(e=0;e&lt;1024;e++) {\n\t  prevperiods&#91;e]=periods&#91;e];\n\t}\n\n\tressu_genbytes_single(ressut_bytes,ressut);\n\n\t\/\/ find new lim1\n\t\n\tlim=lim1;\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(prevperiods&#91;e]&gt;0 &amp;&amp; prevperiods&#91;e]==lim) {\n\t    if(f==-1 || (periods&#91;e]&gt;0 &amp;&amp; f&lt;periods&#91;e])) {\n\t      f=periods&#91;e];\n\t    }\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim1a=lim;\n\t\n\t\/\/ find highest amount of chains\n\t\n\thigh1=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(high1==-1 || high1&lt;periods&#91;e]) {\n\t    high1=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and second highest\n\t\n\thigh2=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (high2==-1 &amp;&amp; periods&#91;e]&lt;high1) ||\n\t      (high2&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;high1) ) {\n\t    high2=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and average\n\n\tint psum=0;\n\tint pcnt=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0) {\n\t    psum+=periods&#91;e];\n\t    pcnt++;\n\t  }\n\t}\n\n\tlim1b=(int)((double)psum\/pcnt);\n\t\n\t\/\/ find next smaller than average\n\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (f==-1 &amp;&amp; periods&#91;e]&lt;lim1b) ||\n\t      (f&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;lim1b) ) {\n\t    f=periods&#91;e];\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim1b=f;\n\n\tif(lim==0 || lim&gt;lim1b)\n\t  lim=lim1b;\n\n\t\/\/ if lim greater that second highest,\n\t\/\/ set to second highest\n\n\tif(lim&gt;high2) {\n\t  lim=high2;\n\t}\n\t\t\n\tlim1=lim;\n\n\t\/\/ find next greater than lim\n\t\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;lim &amp;&amp;\n\t     (f==-1 || periods&#91;e]&lt;f))\n\t    f=periods&#91;e];\n\t}\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim2=lim;\n\n\t\/\/ calculate bits\n\t\t\n\trndbits=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0 &amp;&amp; periods&#91;e]&lt;lim) {\n\t    rndbits+=periods&#91;e];\n\t  }\n\t}\n      } \/\/ for(d=0;\n      if(stats) {\n\tfprintf(stdout,\"rounds: %d\",d);\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]&gt;0)\n\t    fprintf(stdout,\" %d:%lu\",e,periods&#91;e]);\n\t}\n\n#ifdef DEBUG_SORTED\n\t\n\tfprintf(stdout,\", sorted:\");\n\tint g=0;\n\tfor(;;) {\n\t  f=-1;\n\t  for(e=0;e&lt;1024;e++) {\n\t    if( (f==-1 &amp;&amp; periods&#91;e]&gt;g) ||\n\t\t(periods&#91;e]&gt;g &amp;&amp; f&gt;periods&#91;e]) )\n\t      f=periods&#91;e];\n\t  }\n\t  if(f==-1)\n\t    break;\n\n\t  g=f;\n\t  fprintf(stdout,\" %d\",g);\n\t}\n\n#endif\n\tfprintf(stdout,\", high1:%d\",high1);\n\tfprintf(stdout,\", high2:%d\",high2);\n\tfprintf(stdout,\", lim1a:%d\",lim1a);\n\tfprintf(stdout,\", lim1b:%d\",lim1b);\n\tfprintf(stdout,\", lim1:%d\",lim1);\n\tfprintf(stdout,\", lim2:%d\",lim2);\n\tfprintf(stdout,\", div:%f\",(double)lim2\/lim1);\n\tfprintf(stdout,\", clockbytes:%ld\",clockbytes);\n\tfprintf(stdout,\", rndbits:%d\",rndbits);\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n    } \/\/ if(ressut_pos == 0)\n    ressut_f = (ressut_f + ressut&#91;ressut_pos]) % ressut_bytes;\n    buffer&#91;c] ^= ressut&#91;ressut_f];\n    ressut_pos = (ressut_pos+1) % ressut_bytes;\n  } \/\/ for(c=0; c&lt;size; c++)\n\n  genbytes+=size;\n}<\/code><\/pre>\n\n\n\n<p>Seuraavassa apurutiinit &#8211;sample option tilarivin tulostukseen. stat_line_begin() aloittaa tilarivin tulostuksen, stat_line_printf() tulostaa tilarivin elementin, stat_line_readable() tulostaa luvun py\u00f6ristettyn\u00e4 merkkeihin, kiloihin, megoihin tai gigoihin stat_line_end() lopettaa rivin tulostuksen ja poistaa edellisen rivin j\u00e4\u00e4m\u00e4t rivin lopusta.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdarg.h&gt;\n\n#define aDEBUG31\n\nstatic int stat_line_chars=0;\nstatic int stat_line_edchars=0;\n\nstatic void stat_line_begin()\n{\n#ifdef DEBUG31\n  fprintf(stderr,\"\\n\");\n#else\n  fprintf(stderr,\"\\r\");\n#endif  \n  stat_line_edchars=stat_line_chars;\n  stat_line_chars=0;\n}\n\nstatic void stat_line_printf(const unsigned char *format, ...)\n{\n  int count;\n  va_list args;\n  static unsigned char *stat_line_buf;\n  static size_t stat_line_buf_length;\n\n  va_start(args, format);\n  count = vsnprintf(stat_line_buf, stat_line_buf_length, format, args) + 1;\n  va_end(args);\n  if(stat_line_buf_length &lt; count) {\n    stat_line_buf_length=count;\n    stat_line_buf=realloc(stat_line_buf, stat_line_buf_length);\n    va_start(args, format);\n    count = vsnprintf(stat_line_buf, stat_line_buf_length, format, args) + 1;\n    va_end(args);\n  }\n  fprintf(stderr,\"%s\",stat_line_buf);\n  stat_line_chars+=strlen(stat_line_buf);\n}\n\n#define READABLE_NUMBER_BIN 2\n\n#ifdef READABLE_NUMBER_BIN\n#define READABLE_NUMBER_HIGH 1023\n#define READABLE_NUMBER_DIVIDER 1024\n#else\n#define READABLE_NUMBER_HIGH 999\n#define READABLE_NUMBER_DIVIDER 1000\n#endif\n\n#define READABLE_NUMBER_WIDTH 32\n\nstatic void stat_line_readable(unsigned long length)\n{\n  int c, low;\n  double length2;\n  unsigned char buf10&#91;10];\n  \/\/ B = byte\n  \/\/ K = kilo   10^3   2^10\n  \/\/ M = mega   10^6   2^20\n  \/\/ G = giga   10^9   2^30\n  \/\/ T = tera   10^12  2^40\n  \/\/ P = peta   10^15  2^50\n  \/\/ E = exa    10^18  2^60\n  \/\/ Z = zetta  10^21  2^70\n  \/\/ Y = yotta  10^24  2^80\n  char units&#91;] = \"BKMGTPEZY\";\n\n  strcpy(buf10,\"***\");\n  low=0;\n\n  for(c=0; length&gt;=low &amp;&amp;\n      c&lt;sizeof(units)-1; c++) {\n    if(length&gt;=low &amp;&amp;\n       length&lt;=READABLE_NUMBER_HIGH) {\n      if(units&#91;c]=='B')\n        sprintf(buf10,\"%ld\", length);\n      else if(units&#91;c]=='K')\n\tsprintf(buf10,\"%ld%cB\", length, units&#91;c]);\n      else if(length==length2)\n\tsprintf(buf10,\"%ld%cB\", length, units&#91;c]);\n      else\n\tsprintf(buf10,\"%.1f%cB\", length2, units&#91;c]);\n\t\n      break;\n    }\n    length2=(double)length\/READABLE_NUMBER_DIVIDER;\n    length\/=READABLE_NUMBER_DIVIDER;\n    low=1;\n  }\n  stat_line_printf(\"%s\",buf10);\n}\n\nvoid stat_line_end()\n{\n  int c,d;\n\n  \/\/ previous line longer than this one,\n  \/\/ overwrite with spaces and backspace to\n  \/\/ end\n  \n  if(stat_line_edchars&gt;stat_line_chars) {\n    d=stat_line_edchars-stat_line_chars;\n    for(c=0;c&lt;d;c++) {\n#ifdef DEBUG31\n      fprintf(stderr,\"*\");\n#else\n      fprintf(stderr,\" \");\n#endif\n    }\n    for(c=0;c&lt;d;c++)\n      fprintf(stderr,\"\\b\");\n  }\n  fflush(stderr);\n}<\/code><\/pre>\n\n\n\n<p>Ensin esimerkki tilarivin tulostuksesta: (rullaa loppurivin n\u00e4hd\u00e4ksesi oikealle). Olen lis\u00e4nnyt v\u00e4leihin crlf:i\u00e4 saadakseni n\u00e4kyviin useampia rivej\u00e4. Rivien loppuihin on j\u00e4\u00e4nyt tuo animoitu kursori.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/newressu --fast --sample\nblk 0, written 0 |\/\nblk 1, written 1MB, 1MB\/sec, now Sat 20:50 UTC, left 2h 16m, ready at 23:06 UTC \/-\nblk 327, written 327MB, 860KB\/sec, now Sat 20:56 UTC, left 2h 35m, ready at 23:32 UTC \\|\/\nblk 667, written 667MB, 854KB\/sec, now Sat 21:03 UTC, left 2h 30m, ready at 23:33 UTC \\|\/\nblk 945, written 945MB, 856KB\/sec, now Sat 21:09 UTC, left 2h 24m, ready at 23:33 UTC \/-\nblk 1024, written 1GB, 855KB\/sec, now Sat 21:10 UTC, left 2h 22m, ready at 23:33 UTC    \\|\nblk 1025, written 1.0GB, 856KB\/sec, now Sat 21:10 UTC, left 2h 22m, ready at 23:33 UTC |\/\nblk 1685, written 1.6GB, 858KB\/sec, now Sat 21:23 UTC, left 2h 9m, ready at 23:33 UTC |\/\nblk 2048, written 2GB, 860KB\/sec, now Sat 21:30 UTC, left 2h 1m, ready at 23:32 UTC   \\|\nblk 2229, written 2.2GB, 862KB\/sec, now Sat 21:34 UTC, left 1h 58m, ready at 23:32 UTC -\\\nblk 2725, written 2.7GB, 866KB\/sec, now Sat 21:43 UTC, left 1h 47m, ready at 23:31 UTC \/-\nblk 3133, written 3.1GB, 869KB\/sec, now Sat 21:51 UTC, left 1h 39m, ready at 23:31 UTC \/-\nblk 3569, written 3.5GB, 871KB\/sec, now Sat 22:00 UTC, left 1h 30m, ready at 23:30 UTC \\|\nblk 4096, written 4GB, 869KB\/sec, now Sat 22:10 UTC, left 1h 20m, ready at 23:31 UTC   \\|\nblk 4226, written 4.1GB, 870KB\/sec, now Sat 22:13 UTC, left 1h 17m, ready at 23:30 UTC |\/\nblk 4864, written 4.8GB, 873KB\/sec, now Sat 22:25 UTC, left 1h 5m, ready at 23:30 UTC \/-\\\nblk 5380, written 5.3GB, 874KB\/sec, now Sat 22:35 UTC, left 54m, ready at 23:30 UTC -\\|\nblk 5482, written 5.4GB, 874KB\/sec, now Sat 22:37 UTC, left 52m, ready at 23:30 UTC \/-\nblk 5992, written 5.9GB, 875KB\/sec, now Sat 22:47 UTC, left 42m, ready at 23:30 UTC -\\\nblk 6110, written 6.0GB, 876KB\/sec, now Sat 22:49 UTC, left 40m, ready at 23:29 UTC \\|\nblk 6379, written 6.2GB, 876KB\/sec, now Sat 22:54 UTC, left 35m, ready at 23:29 UTC \/-\nblk 7117, written 7.0GB, 873KB\/sec, now Sat 23:09 UTC, left 20m, ready at 23:30 UTC \/-\nblk 7854, written 7.7GB, 870KB\/sec, now Sat 23:24 UTC, left 6m, ready at 23:30 UTC -\\\nblk 8144, written 8.0GB, 870KB\/sec, now Sat 23:30 UTC, left 56 seconds, ready at 23:30 UTC \/-\\\nblk 8171, written 8.0GB, 869KB\/sec, now Sat 23:30 UTC, left 24 seconds, ready at 23:31 UTC -\\\nblk 8187, written 8.0GB, 869KB\/sec, now Sat 23:30 UTC, left 5 seconds, ready at 23:31 UTC \/-\nblk 8188, written 8.0GB, 869KB\/sec, now Sat 23:30 UTC, left 4 seconds, ready at 23:31 UTC -\\\nblk 8189, written 8.0GB, 869KB\/sec, now Sat 23:30 UTC, left 3 seconds, ready at 23:31 UTC \\|\nblk 8190, written 8.0GB, 869KB\/sec, now Sat 23:30 UTC, left 2 seconds, ready at 23:31 UTC |\/-\nblk 8191, written 8.0GB, 869KB\/sec, now Sat 23:31 UTC, left 1 seconds, ready at 23:31 UTC -\\\nDone!<\/code><\/pre>\n\n\n\n<p>Seuraavassa tulostetaan &#8211;sample kytkimell\u00e4 satunnaislukutiedosto. Edellisest\u00e4 versiosta on lis\u00e4tty tilarivi animoituva kursori, kytkimet eri satunnaislukul\u00e4hteille (&#8211;ressu, &#8211;debug. &#8211;single, &#8211;fast, &#8211;urandom, &#8211;random). Lis\u00e4ksi sample rivill\u00e4 on kentt\u00e4, jossa on bittigeneraattorin nopeus (esim 700Kb\/sec).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.  if(sample) {\n\n\/\/sample file size = CLIM*DLIM*BLKSIZE\n#define CLIM 8192 \/\/ outer loop\n#define DLIM 256 \/\/ inner loop\n#define BLKSIZE 4096 \/\/ block size\n\n#define STAT_LINE_READY 2\n#define STAT_LINE_NOW 2\n#define STAT_LINE_ANIM 2\n    \n#define TIMEFORMAT \"%H:%M %Z\"\n#define TIMEFORMAT2 \"%a %H:%M %Z\"\n#define DATEFORMAT \"%a %d %b %Y\"\n    \n    unsigned int c, d;\n    unsigned char buffer&#91;BLKSIZE];\n    FILE *fp1;\n    time_t secondsstart, secondsnow;\n#ifdef STAT_LINE_ANIM\n    long int secs, prev_secs=-1;\n    int crs=0;\n#endif\n\n    if((fp1=fopen(samplefilename,\"a\")) != NULL) {\n\n      secondsstart=time(NULL);\n\n      for(c=0;c&lt;CLIM;c++) {\n\tsecondsnow=time(NULL);\n\t\n\t\/\/ print status line:\n\t\/\/ blk 8171, written 8.0GB, 869KB\/sec, now Sat 23:30 UTC, left 24 seconds, ready at 23:31 UTC\n\t\n\tstat_line_begin();\n\tstat_line_printf(\"\\rblk %d, written \",c);\n\tstat_line_readable((unsigned long)c*DLIM*BLKSIZE);\n\t\n\tif(c&gt;0) {\n\t  stat_line_printf(\", \");\n\t  stat_line_readable((unsigned long)((double)c*DLIM*BLKSIZE\/(secondsnow-secondsstart)) );\n\t  stat_line_printf(\"\/sec\");\n\n\t  char timebuf&#91;128], timebuf2&#91;128];\n\t  \n#ifdef STAT_LINE_NOW\n\n\t  \/\/ print now\n\t  \n\t  stat_line_printf(\", now\");\n\t  strftime(timebuf,sizeof(timebuf),TIMEFORMAT2,\n\t\t   localtime((time_t *)&amp;secondsnow));\n\t  stat_line_printf(\" %s\",timebuf);\n#endif\n\n\t  \/\/ print left\n\t  \n\t  long int secondsleft=(int)((((double)secondsnow-secondsstart)\/c)*(CLIM-c) );\n\t  long int secondsleft2;\n\t  long int temp,timeprinted=0;\n\n\t  secondsleft2=secondsleft;\n\t  stat_line_printf(\", left\");\n\t  \n\t  temp=secondsleft2\/(24*3600);\n\t  if(temp&gt;0) {\n\t    timeprinted=1;\n\t    stat_line_printf(\" %dd\",temp);\n\t    secondsleft2-=temp*(24*3600);\n\t  }\n\t  temp=secondsleft2\/3600;\n\t  if(temp&gt;0) {\n\t    timeprinted=1;\n\t    stat_line_printf(\" %dh\",temp);\n\t    secondsleft2-=temp*3600;\n\t  }\n\t  temp=secondsleft2\/60;\n\t  if(temp&gt;0) {\n\t    timeprinted=1;\n\t    stat_line_printf(\" %dm\",temp);\n\t    secondsleft2-=temp*60;\n\t  }\n\t  temp=secondsleft2;\n\t  if(!timeprinted) {\n\t    stat_line_printf(\" %d seconds\",temp);\n\t  }\n\n#ifdef STAT_LINE_READY\n\n\t  long int secondsend=(int)secondsstart+((((double)secondsnow-secondsstart)\/c)*CLIM);\n\n\t  \/\/ print end date if different\n\t  \n\t  stat_line_printf(\", ready at\");\n\t  strftime(timebuf,sizeof(timebuf),DATEFORMAT,\n\t\t   localtime((time_t *)&amp;secondsend));\n\t  strftime(timebuf2,sizeof(timebuf2),DATEFORMAT,\n\t\t   localtime((time_t *)&amp;secondsnow));\n\t  if(strcmp(timebuf,timebuf2)) {\n\t    stat_line_printf(\" %s\",timebuf);\n\t  }\n\n\t  \/\/ print end time\n\t  \n\t  strftime(timebuf,sizeof(timebuf),TIMEFORMAT,\n\t\t   localtime((time_t *)&amp;secondsend));\n\t  stat_line_printf(\" %s\",timebuf);\n#endif\n\n\t}\n\n\tstat_line_end();\n\t\n\t\/\/ do the work\n\t\n#ifdef STAT_LINE_ANIM\n\tunsigned char cursor&#91;4] = { '|', '\/', '-', '\\\\' };\n\n\tfprintf(stderr,\" \");\n#endif\n\tfor(d=0;d&lt;DLIM;d++) {\n#ifdef STAT_LINE_ANIM\n\t  secs=time(NULL)%sizeof(cursor);\n\t  if(prev_secs!=secs) {\n\t    if(prev_secs!=-1) \n\t      crs=(crs+1)%sizeof(cursor);\n\t    fprintf(stderr,\"\\b%c\",cursor&#91;crs]);\n\t    fflush(stderr);\n\t    prev_secs=secs;\n\t  }\n#endif\n\t  if(input==0) \/\/ ressu prod\n\t    ressu_genbytes(sizeof(buffer),buffer);\n\t  else if(input==1) \/\/ ressu debug\n\t    ressu_genbytes_debug(sizeof(buffer),buffer);\n\t  else if(input==2) { \/\/ ressu fast\n\t    clockbytes=0;\n\t    for(e=0; e&lt;RESSU_MIN_ROUNDS ||\n\t\t  clockbytes &lt; RESSU_MIN_CLOCKBYTES;e++) {\n\t      ressu_genbytes_single(sizeof(buffer),buffer);\n\t    }\n\t  } else if(input==3) \/\/ ressu single\n\t    ressu_genbytes_single(sizeof(buffer),buffer);\n\t  else if(input==8) \/\/ urandom\n\t    readfile_xor(sizeof(buffer),buffer,urandomfilename);\n\t  else if(input==9) \/\/ random\n\t    readfile_xor(sizeof(buffer),buffer,randomfilename);\n\t    \n#ifdef WRITE_SAMPLE\n\t  fwrite(buffer,1,sizeof(buffer),fp1);\n#endif\n\t}\n#ifdef STAT_LINE_ANIM\n\tfprintf(stderr,\"\\b \\b\");\n\tprev_secs=-1;\n#endif\n      }\n      fclose(fp1);\n    }\n    \/\/ remove last status line\n    \n    stat_line_begin();\n    stat_line_printf(\"Done!\");\n    stat_line_end();\n    fprintf(stdout,\"\\n\");\n    fflush(stdout);\n    exit(0);\n  }<\/code><\/pre>\n\n\n\n<p>Viel\u00e4 joukko &#8220;naapureiden&#8221; ja muiden merkist\u00f6j\u00e4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      } else if(!strcmp(\"--rus\",argv&#91;c])) { \/\/ russian alphabet\n\tdigits=\n\t  \"\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\" \\\n\t  \"\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\";\n\tsize=8;\n\n      } else if(!strcmp(\"--dnk\",argv&#91;c]) || \/\/ danish alphabet\n\t\t!strcmp(\"--nor\",argv&#91;c])) { \/\/ norwegian alphabet\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c6\u00d8\u00c5\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\u00e6\u00f8\u00e5\";\n\tsize=8;\n\n      } else if(!strcmp(\"--fin\",argv&#91;c]) || \/\/ finnish alphabet\n\t\t!strcmp(\"--swe\",argv&#91;c])) { \/\/ swedish alphabet\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c5\u00c4\u00d6\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\u00e5\u00e4\u00f6\";\n\tsize=8;\n\n      } else if(!strcmp(\"--est\",argv&#91;c])) { \/\/ estonian alphabet\n\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRS\u0160Z\u017dTUVW\u00d5\u00c4\u00d6\u00dcXY\" \\\n\t  \"abcdefghijklmnopqrs\u0161z\u017etuvw\u00f5\u00e4\u00f6\u00fcxy\";\n\tsize=8;\n  \n      } else if(!strcmp(\"--ltu\",argv&#91;c])) { \/\/ lithuanian alphabet\n\tdigits=\n\t  \"A\u0104BC\u010cDE\u0118\u0116FGHI\u012eYJKLMNOPRS\u0160TU\u0172\u016aVZ\u017d\" \\\n\t  \"a\u0105bc\u010dde\u0119\u0117fghi\u012fyjklmnoprs\u0161tu\u0173\u016bvz\u017e\";\n\t  \n\tsize=8;\n\n      } else if(!strcmp(\"--lva\",argv&#91;c])) { \/\/ latvian alphabet\n\tdigits=\n\t  \"A\u0100BC\u010cDE\u0112FG\u0122HI\u012aJK\u0136L\u013bMN\u0145OPRS\u0160TU\u016aVZ\u017d\" \\\n\t  \"a\u0101bc\u010dde\u0113fg\u0123hi\u012bjk\u0137l\u013cmn\u0146oprs\u0161tu\u016bvz\u017e\";\n\tsize=8;\n\n      } else if(!strcmp(\"--fra\",argv&#91;c]) \/\/ french alphabet\n\t\t||!strcmp(\"--gbr\",argv&#91;c]) \/\/ great britain alphabet\n\t\t||!strcmp(\"--usa\",argv&#91;c]) \/\/ united states alphabet\n\t\t||!strcmp(\"--ita\",argv&#91;c]) \/\/ italian alphabet\n\t\t) {\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\";\n\tsize=8;\n\n      } else if(!strcmp(\"--deu\",argv&#91;c])) { \/\/ deutche alphabet\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c4\u00d6\u00dc\u1e9e\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\u00e4\u00f6\u00fc\u00df\";\n\tsize=8;\n\n      } else if(!strcmp(\"--grc\",argv&#91;c])) { \/\/ greek alphabet                                                                               \n\tdigits=\n          \"\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\" \\\n          \"\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\";\n        size=8;\n\n      }\n\n      ...<\/code><\/pre>\n\n\n\n<p>Seuraavassa satunnaismerkkej\u00e4 suomalaisella merkist\u00f6ll\u00e4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ newressu --fin\n00000 gaClJUi\u00d6LFyyzKOKSh\u00e4Iwhp\u00e4yckfsITLjpI\u00e5CbPjZgfoNMqpK\u00e4uw\u00e4YyJYeqYaWBO\n00001 CuhaxfbcefEsCwdAHuTMrcLqhkz\u00c4S\u00e4CNicgDsN\u00c4qekVl\u00e4\u00c5StgZiKuDVN\u00c5kfhua\u00e5T\n00002 h\u00e4OhuzNOQuBSoCAjPuf\u00e4AlRAhtRGzbGMo\u00f6\u00e4PSg\u00c5z\u00f6BWQAGi\u00d6Sct\u00e4TSuLwxTuxhff\n00003 yryQRXiDQV\u00e5kK\u00c5bivTBulywRzG\u00c5pUaT\u00e5J\u00e4cboZCq\u00c5vskCc\u00c4UCtnbJLHOWe\u00c4\u00c5x\u00c5GV\n00004 M\u00c5\u00f6VxnCb\u00c4\u00e4b\u00f6SmjjGVDp\u00c4TFSEUCV\u00c4xMR\u00c5iqA\u00e4zpctsuaNvkbgkLTUXwpbNhMblLh\n00005 oLUwEgv\u00c5VVS\u00c5\u00e5JvhmZDKU\u00e4Kks\u00c4ja\u00e5wRdzEhPe\u00f6qUyZYPD\u00f6ezupm\u00c5\u00e4gkHmzoH\u00d6bIc\n00006 xNYbbKucMktDQlWcPxDJ\u00e5YEOaHMo\u00e4fyQLEUdQxkIjKcXydQVJPjRJdUshdZj\u00c5Bur\n00007 pWvxTCqAbnjsTJhkQtSDphJumoUogeIhKmV\u00e5AYSrLq\u00d6oHsVrKrDFOm\u00e5PR\u00c4iRRTbD\n00008 Gi\u00f6DR\u00d6\u00c4ez\u00e4wFg\u00e4wuFcpApInTdXYbMvOpwscbQyrZPdmBbCRVqgkeZBpALsxQP\u00e4eG\n00009 rTrM\u00f6xjW\u00f6uFMZASgGjrlr\u00d6\u00c5\u00e4oZrvAWvTpa\u00f6VIEIZxPFPHzFyGeIM\u00e4BrVlIQsOhFF<\/code><\/pre>\n\n\n\n<p>Ja viel\u00e4 satunnaismerkkej\u00e4 kreikkalaisella merkist\u00f6ll\u00e4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ .\/newressu --grc\n00000 \u03a7\u0399\u03bc\u0398\u0397\u03b6\u03b6\u03b7\u0393\u03bb\u03a8\u03a5\u03bb\u0394\u03c5\u03c3\u03a4\u0392\u0392\u03b7\u03bb\u03a8\u03b3\u03c4\u0395\u03c3\u03a6\u03b8\u039c\u03ba\u03a3\u03bc\u03c8\u03c8\u03b4\u03b9\u0392\u03c8\u0397\u03c9\u03c1\u03b2\u039a\u039f\u03a1\u03a6\u0394\u039f\u0397\u03c3\u03b1\u03bb\u03a4\u0391\u03a7\u03a7\u03c1\u03c9\u03b5\u03b3\u039c\u03a5\u0392\u0393\n00001 \u03a4\u03b2\u039a\u0392\u0398\u03a3\u039a\u03b3\u039e\u03a6\u03b7\u0397\u03b3\u03bf\u03a6\u03bf\u03c6\u03b3\u0392\u03b6\u03b2\u03c0\u03a3\u039c\u03b4\u0399\u03b6\u03c0\u03c8\u03b4\u03c8\u03b5\u039e\u03b7\u0396\u0392\u0394\u0396\u03b7\u03bf\u039c\u03bd\u03a0\u0392\u03c4\u03b3\u03a0\u0397\u03c1\u03b7\u039c\u03a3\u03be\u03b7\u03c1\u03a4\u03a1\u03bd\u0396\u039e\u03bf\u03c6\u03b1\u03bb\n00002 \u0392\u0394\u0397\u03b1\u03bf\u03c1\u0399\u039a\u03a6\u03a5\u03b7\u03bf\u03c6\u03a4\u03b7\u03a6\u039d\u03c1\u039c\u0399\u03bc\u039e\u03c0\u03a1\u03b2\u03b4\u03b4\u039d\u03b2\u03a9\u039a\u03c5\u0399\u03bf\u039d\u0397\u03b9\u03a1\u0396\u0393\u03a4\u03a5\u03c0\u03c0\u0398\u0394\u03bb\u03a5\u0399\u03a3\u03a9\u039b\u0392\u03b6\u03be\u03bb\u03b8\u039b\u03c7\u0392\u03b7\u03c8\u03a8\u039b\n00003 \u03c3\u03a7\u039b\u03a5\u03b3\u03be\u03a0\u03a0\u0392\u03c1\u03b9\u039a\u03b9\u0394\u03c0\u0398\u03a8\u0393\u03b1\u03a3\u03a4\u03b5\u03b5\u03be\u039d\u03bf\u0397\u03c0\u0394\u03a8\u03bd\u03a0\u03bd\u039c\u03b7\u03a0\u03bb\u03c6\u0392\u03c0\u03a3\u039e\u03be\u03b2\u03c1\u0391\u03a9\u03a8\u0399\u03a0\u03c1\u03b8\u03b4\u03c0\u03b1\u03be\u03c8\u03b8\u03c9\u039f\u03a0\u03a6\u039d\u03bb\n00004 \u039a\u03a8\u039d\u03c4\u03c0\u03b2\u03c3\u03b1\u03a5\u03a8\u039a\u03b7\u03b4\u0394\u0396\u03b2\u03a9\u03a6\u039c\u03bc\u03c8\u03bb\u03a4\u0394\u03b5\u03c7\u039e\u0391\u03c5\u03a1\u03bd\u0393\u03b5\u03ba\u03b9\u0399\u03b1\u03b2\u03a7\u03bc\u0395\u03b2\u03a4\u03b5\u03a9\u03b7\u03b2\u039d\u03b5\u03a9\u0398\u03a3\u03bc\u0395\u039f\u0399\u03b5\u0398\u03b1\u03c6\u0391\u03a1\u03c5\u03b8\n00005 \u03c5\u03a8\u03c7\u03bd\u0394\u03a5\u039c\u039d\u03ba\u03b7\u03c9\u03c6\u0399\u039c\u0391\u039c\u03a7\u03a7\u0395\u03c1\u03c5\u03be\u03c5\u039d\u03c4\u03c9\u03bb\u039e\u03c1\u039f\u03b8\u03c8\u03c1\u03c7\u03a9\u03c9\u039a\u039c\u0392\u03a7\u03bd\u0393\u0397\u0394\u0392\u03b1\u03c5\u039f\u03bd\u03c8\u0397\u03c9\u03bc\u03c3\u03b4\u0397\u03c3\u03c1\u03c3\u039e\u0394\u03c0\u03a9\u03a5\n00006 \u03b5\u03b3\u039c\u03c4\u03b6\u03b3\u03c3\u03bc\u0395\u039d\u039f\u03b3\u03c6\u03bd\u03b4\u0394\u03bc\u0399\u03bb\u03be\u03ba\u039e\u03b6\u03b4\u03b9\u0393\u03b7\u03bb\u0398\u03b8\u03b6\u03c5\u03bf\u0397\u03a6\u03c8\u03c0\u03b4\u03a0\u03a6\u0397\u03b7\u0397\u03c8\u039c\u03c9\u03b8\u03b1\u03b9\u03a3\u03c0\u0398\u03c5\u03c8\u03a5\u03a4\u03bb\u03a3\u03bc\u039d\u03a6\u03bf\u0393\u03c5\n00007 \u03a4\u0395\u03b5\u039b\u0399\u03c5\u0394\u03a4\u03bc\u039f\u0397\u03c9\u03a1\u0394\u03c4\u03c0\u03c0\u039c\u0394\u0391\u0394\u03bf\u03b3\u03b3\u03ba\u03c3\u03bb\u03a0\u0392\u039b\u039f\u039a\u03c1\u03b1\u0393\u0394\u039b\u03bc\u03c0\u03b2\u03be\u03c9\u03be\u039a\u03b6\u03a3\u03bf\u03b7\u03c0\u03bf\u039d\u03c7\u0397\u03c9\u03a1\u03b3\u03a8\u03b8\u03c9\u039e\u039a\u03a1\u03b7\u03b3\n00008 \u039d\u0393\u0398\u03c6\u0393\u03c4\u03a3\u03bb\u03a0\u03b9\u03b1\u03a8\u03b5\u03a8\u039b\u039a\u0391\u0397\u03c6\u03b2\u03b6\u03a0\u03a6\u03a9\u039c\u03c6\u03c6\u03a8\u039e\u03b1\u03a3\u03be\u03b4\u03b8\u03a0\u0395\u0391\u03c9\u03b6\u0391\u039b\u039c\u03b6\u03c9\u03c9\u0393\u03be\u03a9\u03c0\u0398\u039f\u03b4\u03b8\u03b4\u0393\u0391\u03bc\u03bb\u03a5\u039e\u03a1\u039a\u03c7\u039d\n00009 \u03b5\u03a0\u0399\u03b2\u0392\u039a\u03b7\u0398\u03a3\u039a\u03a8\u03c4\u03b2\u03a8\u0397\u03a7\u0391\u039a\u03a6\u03b1\u03be\u03a8\u03b9\u03b1\u03b1\u03b4\u0398\u03b9\u03bc\u03bd\u0396\u03c0\u03a6\u0392\u03bd\u0394\u03c7\u03c1\u03b6\u0393\u03bf\u03bc\u03b3\u03b3\u03b6\u03c5\u03b3\u0394\u03b6\u0398\u0391\u03c0\u0394\u039d\u03bc\u039b\u039f\u03bf\u039a\u0395\u0397\u0392\u03a6\u03be<\/code><\/pre>\n\n\n\n<p>Edit: Lis\u00e4tty #define m\u00e4\u00e4ritykset eri input tyypeille:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#define INPUT_RESSU 0\n#define INPUT_DEBUG 1\n#define INPUT_FAST 2\n#define INPUT_SINGLE 3\n#define INPUT_URANDOM 8\n#define INPUT_RANDOM 9\n\nstatic int input=0;\n\nchar *randomgen&#91;] = { \"ressu\", \"debug\",\"fast\",\"single\",\"4\",\"5\",\"6\",\"7\",\"urandom\",\"random\" };\n<\/code><\/pre>\n\n\n\n<p>Eri input:tien k\u00e4sittely parametreissa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>} else if(!strcmp(\"--ressu\",argv&#91;c])) {\n\tinput=INPUT_RESSU;\n\n      } else if(!strcmp(\"--debug\",argv&#91;c])) {\n\tinput=INPUT_DEBUG;\n\n      } else if(!strcmp(\"--fast\",argv&#91;c])) {\n\tinput=INPUT_FAST;\n\n      } else if(!strcmp(\"--single\",argv&#91;c])) {\n\tinput=INPUT_SINGLE;\n\n      } else if(!strcmp(\"--urandom\",argv&#91;c])) {\n\tinput=INPUT_URANDOM;\n\n#ifdef USE_RANDOM\n      } else if(!strcmp(\"--random\",argv&#91;c])) {\n\tinput=INPUT_RANDOM;\n\n#endif<\/code><\/pre>\n\n\n\n<p>Eri inputtien k\u00e4sittely Ressu_genbyte():ss\u00e4:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int ressu_genbyte()\n{\n  static unsigned char gent&#91;GENT_SIZE];\n  static unsigned int gent_pos=0;\n  unsigned char ch;\n\n  if(input==INPUT_RESSU) { \/\/ ressu prod\n    ressu_genbytes(sizeof(ch), &amp;ch);\n  } else if(input==INPUT_DEBUG) { \/\/ ressu debug\n    ressu_genbytes_debug(sizeof(ch), &amp;ch);\n  } else {\n    if(gent_pos==0) {\n      if(input==INPUT_FAST) { \/\/ ressu_fast\n\tressu_genbytes_fast(sizeof(gent),gent);\n      } else if(input==INPUT_SINGLE) { \/\/ ressu single\n\tressu_genbytes_single(sizeof(gent),gent);\n      } else if(input==INPUT_URANDOM) { \/\/ urandom\n\treadfile_xor(sizeof(gent),gent,urandomfilename);\n#ifdef USE_RANDOM\n      } else if(input==INPUT_RANDOM) { \/\/ random\n\treadfile_xor(sizeof(gent),gent,randomfilename);\n#endif\n      }\n    } \/\/ if(gent_pos==0\n    ch=gent&#91;gent_pos];\n    gent_pos=(gent_pos+1)%sizeof(gent);\n  }\n  return(ch);\n}<\/code><\/pre>\n\n\n\n<p>Inputtien k\u00e4sittely &#8211;sample rutiinissa:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>...\n\t  if(input==INPUT_RESSU) \/\/ ressu prod\n\t    ressu_genbytes(sizeof(buffer),buffer);\n\t  else if(input==INPUT_DEBUG) \/\/ ressu debug\n\t    ressu_genbytes_debug(sizeof(buffer),buffer);\n\t  else if(input==INPUT_FAST) \/\/ ressu fast\n\t    ressu_genbytes_fast(sizeof(buffer),buffer);\n\t  else if(input==INPUT_SINGLE) \/\/ ressu single\n\t    ressu_genbytes_single(sizeof(buffer),buffer);\n\t  else if(input==INPUT_URANDOM) \/\/ urandom\n\t    readfile_xor(sizeof(buffer),buffer,urandomfilename);\n#ifdef USE_RANDOM\n\t  else if(input==INPUT_RANDOM) \/\/ random\n\t    readfile_xor(sizeof(buffer),buffer,randomfilename);\n#endif\n...<\/code><\/pre>\n\n\n\n<p>&#8211;space parametria muutettu siten ett\u00e4 sill\u00e4 voidaan ryhmitell\u00e4 rivit kuinka monen sanan ryhm\u00e4ksi tahansa. Lis\u00e4tty my\u00f6s &#8211;newline parametri, jolla kerrotaan kuinka monen rivin v\u00e4lin tulostetaan tyhj\u00e4 rivi. Aluksi &#8211;space ja &#8211;newline parametrin k\u00e4sittely:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      } else if(!strncmp(\"--space\",argv&#91;c],7)) {\n\tif(*(argv&#91;c]+7)!='\\0' &amp;&amp; atoi(argv&#91;c]+7)&gt;1) {\n\t  sspace=atoi(argv&#91;c]+7);\n\t} else if(c+1&lt;argc &amp;&amp; atoi(argv&#91;c+1])&gt;1) {\n\t  sspace=atoi(argv&#91;c+1]);\n\t  c++;\n\t} else {\n\t  sspace=!sspace;\n\t}\n\n      } else if(!strncmp(\"--newline\",argv&#91;c],9)) {\n\tif(*(argv&#91;c]+9)!='\\0' &amp;&amp; atoi(argv&#91;c]+9)&gt;1) {\n\t  snewline=atoi(argv&#91;c]+9);\n\t} else if(c+1&lt;argc &amp;&amp; atoi(argv&#91;c+1])&gt;1) {\n\t  snewline=atoi(argv&#91;c+1]);\n\t  c++;\n\t} else {\n\t  snewline=!snewline;\n\t}\n<\/code><\/pre>\n\n\n\n<p>Muutos &#8211;rand toimintoon (ennen sspace asetettiin kolmoseksi, nyt kakkoseksi, eli kahden sanan ryhm\u00e4t, ja newline asetetaan viitoseksi, tyhj\u00e4 rivi viiden rivin v\u00e4lein):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>      } else if(!strcmp(\"--rand\",argv&#91;c])) {\n\tdigits = \"0123456789\";\n\tsspace=2;\n\tsnewline=5;\n\tslineno=1;\n\twords=10;\n\tchars=0;\n\tlimit=100000;\n\t\/\/size=5;\n\t\/\/lines=20000;\n<\/code><\/pre>\n\n\n\n<p>Seuraavassa esimerkkej\u00e4 &#8211;space toiminnosta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ newressu --space2 -w12\n00000   40576 19224  31061 56270  17558 40937  34594 10659  74339 12974  22074 55552\n00001   16458 38377  11774 16585  22914 91334  07864 56857  67861 21625  60387 19236\n00002   89247 64778  70347 88680  18056 41666  21943 54933  98467 47080  72261 75113\n00003   85600 85785  21279 60961  44469 44224  07816 05428  12713 47709  00767 21351\n00004   44610 12782  36115 18451  35002 32467  57140 45450  52562 19903  23200 42600\n00005   41334 49165  43451 22812  35567 97697  33419 54424  99249 73074  78173 33494\n00006   46004 49866  74092 88375  66402 06470  84535 42922  19028 54769  40706 56304\n00007   23769 33368  34626 62956  76015 13668  63460 88936  16224 07373  95768 58904\n00008   69892 32434  47599 52513  59030 96318  71762 83897  84475 66329  97716 37462\n00009   49860 55143  28166 55053  24563 70116  81067 09653  68256 69821  35928 62961\n$ newressu --space3 -w12\n00000   17152 43421 73154  88356 08724 22361  98840 58719 38530  71759 99457 54797\n00001   34274 64843 30530  09491 75975 09179  07263 28982 07386  42666 87893 42997\n00002   79771 40056 80666  48071 95604 53112  11807 43640 97394  83588 99039 15051\n00003   24446 20612 27304  39014 61616 12134  66611 26373 08435  10287 76092 84674\n00004   51142 23682 70818  15506 33787 87524  27784 70951 40143  93128 05481 37800\n00005   92343 56280 49333  63783 87591 69719  91171 03362 25838  51097 71197 07878\n00006   37752 74753 85191  70998 41906 76664  03094 36603 26754  63766 35271 66881\n00007   30308 55030 36917  91142 83198 72776  56947 07046 01347  91820 34930 46188\n00008   76167 95789 56123  00234 68842 55135  01123 61807 36224  10612 53782 58296\n00009   60449 49813 78428  13318 35303 92252  76849 68503 27659  21438 20675 24302\n$ newressu --space4 -w12\n00000   20742 22650 28906 31905  47341 04150 50584 13183  17049 80113 91663 72823\n00001   18451 62550 03962 72838  70153 04558 04736 05078  32753 58747 59763 85999\n00002   13546 21343 80647 86450  08986 70814 52073 89482  16833 69109 83168 74567\n00003   43312 08071 10380 79643  05954 04207 79686 58144  32362 12612 49240 77737\n00004   09080 40197 19063 83600  71642 53301 42849 13056  24062 84903 99760 74049\n00005   58252 03578 26906 69699  54557 99905 97538 10684  48060 11384 36784 22614\n00006   62784 41888 44974 92600  54416 74768 04900 40537  21423 48921 05873 87655\n00007   79264 95285 31512 88833  95410 48463 18757 65606  47583 62909 61778 98167\n00008   21430 53643 59374 10165  66253 18774 52714 97702  66947 83793 96488 74019\n00009   19585 27211 43086 98500  78116 97613 11368 97086  07767 75589 49746 85101\n$ newressu --space6 -w12\n00000   54562 43657 61862 90326 06376 68543  13187 74217 34102 99570 00506 08494\n00001   43796 71105 76359 36295 05082 17566  83453 67076 01490 85085 89075 90791\n00002   96623 74591 02669 84605 35980 77577  48690 37794 52479 63557 22829 04179\n00003   62797 50805 37389 27107 88850 70272  90188 75741 81854 59182 87981 04882\n00004   13869 45007 30936 83500 77868 82829  94888 97847 91576 45645 82972 11360\n00005   69896 87217 37225 57165 46607 05168  26226 57438 52827 74413 74600 41372\n00006   13930 89230 03171 90853 79694 61314  08778 82186 92948 66862 70041 66197\n00007   53014 51311 04614 80982 78052 99464  30259 68724 10193 26498 36534 33548\n00008   36716 94076 88796 12946 17293 42641  89329 14410 66266 92296 49736 20468\n00009   89022 22758 19994 67680 20271 33398  90060 85101 31617 11169 89386 62883<\/code><\/pre>\n\n\n\n<p>Seuraavassa esimerkkej\u00e4 &#8211;newline toiminnosta:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ newressu --newline2\n00000 12813454512274517122425130115329366202515091666002172505025708446\n00001 71096917961720806622398424293094570593626081571407468856782029942\n\n00002 31047589039493088825514190891802272638960735378240661287270814933\n00003 44089360986269804268430685930815151891798848432529601113180624795\n\n00004 19569055111387376033524341992010566706684305745782920146962411455\n00005 40925179314794580859485054809954191393015027380242681571601836439\n\n00006 39004105241760250328315129737539505105940903109668904054251135855\n00007 14587962370655169678732121574908360695089442013629060386702741659\n\n00008 86993427583498077107114114430973231820885984160751028895695538981\n00009 99373782264354982010189723728714999104059933148883694576500989637\n$ newressu --newline3\n00000 38623820473984903715490633923035337747665655115872184341824384094\n00001 11547415184513070913520251785473334799146294338887127786659410999\n00002 15410172629583358480662649136383040138410387647765016582268881965\n\n00003 00863451030577367274360418081943523452940675438253783662606719532\n00004 01250079675066865757517649726995679792198002260657201736023787837\n00005 94042313276943376689259878147623444882366379288007965386275558839\n\n00006 23468210585440511486572986161349224492165783119937326761815799604\n00007 75580944804404621982050962301318881792685082315718928756343655877\n00008 97838780101007189801544198322649565267631399973289857678700275243\n\n00009 00363356898906130839164602585292709158234658394677097875319319258\n$ newressu --newline4\n00000 72786849533113500677581727520646514466992947738841761551460659422\n00001 17424406153258926055361193709969183192241783314364747963252396187\n00002 62974292705081577883093518402663586933467293523840132980383941609\n00003 09632535989837189578312034432800371535312445316521384541985342710\n\n00004 58019241328566825267006667886417218528388447275955778929489919053\n00005 25858380015274227163548822248333717139214276930655496085958767633\n00006 58319515459516655356787764450762739262081023905149877752114500182\n00007 71846494587648754437205332298599954664694916723684381200029099175\n\n00008 71730873837817666232939724815562175781809864537799316370685741021\n00009 62465837514841138083445025234974607020150852582309301951684391272<\/code><\/pre>\n\n\n\n<p>Muotoiltu tulostus luuppia uudestaan, seuraavassa uusi koodi(aluksi apurutiinit): (v\u00e4hennetty !quiet if lauseita, v\u00e4hennetty pchars muuttelua)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static void print_spaces()\n{\n  if(sspace&gt;=2 &amp;&amp;\n       \/\/ rand space between double words\n     ( (pwords&gt;0 &amp;&amp; pwords%sspace==0) ||\n     \/\/ rand space after linenumber\n       (slineno &amp;&amp; pwords==0) ) )\n    fprintf(stdout,\" \");\n\n  if(sspace &amp;&amp;\n       \/\/ space between words\n     ( (pwords&gt;0) ||\n     \/\/ space after linenumber\n       (slineno &amp;&amp; pwords==0) ) ) \n    fprintf(stdout,\" \");\n}\n\n#ifdef OLD1\nstatic void print_spaces()\n{\n  if(sspace &amp;&amp; pchars&gt;0 &amp;&amp; !quiet) {\n    if(sspace==3 &amp;&amp; pwords%2==0) {\n      fprintf(stdout,\" \");\n      pchars++;\n    }\n    fprintf(stdout,\" \");\n    pchars++;\n  }\n}\n#endif\n\nstatic void print_word(unsigned char *buf)\n{\n  if(size!=0) {\n    fprintf(stdout,\"%*s\",size,buf);\n  } else {\n    fprintf(stdout,\"%s\",buf);\n  }\n}<\/code><\/pre>\n\n\n\n<p>Ja varsinainen selkiytetty\/lyhennetty tulostusluuppi:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  for(;;) {\n\n    if(!sort) { \/\/ also lotto\n\n      pwords=0;\n\n      while(pwords&lt;linew) {\n\treadword(wordbuf);\n\n\tif(!quiet) {\n\n\t  \/\/ in beginning of line, print line number\n\n\t  print_line_number();\n\t\n\t  \/\/ want to print spaces between \"words\"?\n\n\t  print_spaces();\n\t\n\t  \/\/ print word\n\n\t  print_word(wordbuf);\n\t}\n\n\tpwords++;\n      } \/\/ while(pwords&lt;linew) {\n    } else { \/\/ if(!sort)\n\n      pwords=0;\n      \n      line_clear(&amp;linecnt,&amp;line);\n\n      \/\/ fetch and save words on this row\n\n      while(pwords&lt;linew) {\n\treadword(wordbuf);\n\n\tif(line_add_string_sort(&amp;linecnt,&amp;line,wordbuf)) {\n\t  pwords++;\n\t}\n      } \/\/ while(pwords&lt;linew) {\n\n      pwords=0;\n\n      \/\/ print words on this row\n\n      while(pwords&lt;linew) {\n\n\tline_get_string(sizeof(wordbuf),wordbuf,pwords,line);\n\n\tif(!quiet) {\n\n\t  \/\/ in beginning of line, print line number\n\n\t  print_line_number();\n\t\n\t  \/\/ want to print spaces between \"words\"?\n\t\n\t  print_spaces();\n\n\t  \/\/ print word\n\t\n\t  print_word(wordbuf);\n\t}\n\tpwords++;\n      } \/\/ while(pwords&lt;linew) {\n    } \/\/ if(!sort)\n\n    if(!quiet) {\n      fprintf(stdout,\"\\n\");\n    }\n    plines++;\n    if(!quiet &amp;&amp; snewline&gt;1 &amp;&amp;\n       plines&lt;lines &amp;&amp;\n       plines%snewline==0)\n      fprintf(stdout,\"\\n\");\n\n    \/\/ all needed lines printed?\n\n    if(plines &gt;= lines)\n      break;\n\n  } \/\/ for(;;)<\/code><\/pre>\n\n\n\n<p>Lopuksi viel\u00e4 koko ohjelma:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;unistd.h>\n#include &lt;malloc.h>\n\n#include &lt;string.h>\n#include &lt;ctype.h>\n#include &lt;math.h>\n#include &lt;sys\/time.h>\n#include &lt;time.h>\n\nstatic unsigned char *procname;\nstatic char *programname = \"Newressu version 2.3 \u00a9\";\nstatic unsigned char *copyright = \"Copyright (c) 2013-2021 Jari Kuivaniemi, Helsinki, Finland. Kaikki oikeudet pid\u00e4tet\u00e4\u00e4n!\";\n\nstatic unsigned long periods&#91;1024];\nstatic unsigned long genbytes=0;\nstatic unsigned long clockbytes=0;\n\n#define RESSUT_BYTES 1024\n#define RESSU_BITS_NEEDED 128\n#define RESSU_MIN_ROUNDS 2\n#define RESSU_MIN_CLOCKBYTES 16384+1024\n\n#define aWRITE_SAMPLE 2\n#define USE_RANDOM 2\n#define aDEBUG1\n#define aDEBUG2 2\n#define aDEBUG4 2\n#define DEBUG_SORTED 2\n\nstatic char samplefilename&#91;128]=\"newressusample.rnd\";\nstatic char urandomfilename&#91;128]=\"\/dev\/urandom\";\nstatic char randomfilename&#91;128]=\"\/dev\/random\";\n\n#ifdef DEBUG4\nstatic char debugfilename&#91;128]=\"newressu.deb\";\n#endif\n\nstatic int ressu_bits_needed = RESSU_BITS_NEEDED;\nstatic int ressut_bytes = RESSUT_BYTES;\n\nstatic int stats=0;\n\nstatic unsigned char ressu_clockbyte() \/* JariK 2013 *\/\n{\n  struct timeval tv;\n  gettimeofday(&amp;tv, NULL);\n  return(tv.tv_usec &amp; 0xff);\n}\n\nvoid ressu_genbytes_single(int size, unsigned char *buffer)\n{\n  int c, d, e, byte;\n  static int f = 0, prevbyte = -1, count = 0;\n\n  for(c=0; c&lt;8; c++) {\n    for(d=0; d&lt;size; d++) {\n      e = buffer&#91;d];\n      e = ((e&amp;0x80)>>7) | ((e&amp;0x7f)&lt;&lt;1); \/\/ rotate left 1\n      \/\/e = ((e&amp;0xe0)>>5) | ((e&amp;0x1f)&lt;&lt;3); \/\/ rotate left 3\n      \/\/e = ((e&amp;0xfe)>>1) | ((e&amp;0x1)&lt;&lt;7);  \/\/ rotate right 1\n      byte = ressu_clockbyte();\n      if(prevbyte==-1)\n\tprevbyte=byte;\n      buffer&#91;d] = e^byte;\n      if(prevbyte!=byte) {\n\tperiods&#91;count]++;\n\tclockbytes+=count;\n\tcount=0;\n\tprevbyte=byte;\n      }\n      count++;\n    }\n    for(d=0; d&lt;size; d++) {\n      f = (f + buffer&#91;d]) % size;\n      e = buffer&#91;d];\n      buffer&#91;d] = buffer&#91;f];\n      buffer&#91;f] = e;\n    }\n  }\n}\n\nvoid ressu_genbytes_fast(int size, unsigned char *buffer)\n{\n  int c;\n\n  clockbytes=0;\n  for(c=0; c&lt;RESSU_MIN_ROUNDS ||\n\tclockbytes &lt; RESSU_MIN_CLOCKBYTES;c++) {\n    ressu_genbytes_single(size,buffer);\n  }\n}\n\nvoid ressu_genbytes(int size, unsigned char *buffer) \/\/ 6.5.2021 JariK\n{\n  int c, d, e, f;\n  static int ressut_first=1,\n    ressut_pos = 0,\n    ressut_f = 0;\n  static unsigned char ressut&#91;RESSUT_BYTES];\n  unsigned long prevperiods&#91;1024];\n  \n  for(c=0; c&lt;size; c++) {\n    if(ressut_pos == 0) {\n      if(ressut_first) {\n\tmemset(ressut,0,ressut_bytes);\n\tressut_first=0;\n      }\n\n      clockbytes=0;\n      for(d=0;d&lt;1024;d++) {\n\tperiods&#91;d]=0;\n      }\n      \n      int rndbits=0;\n      int lim, lim1=0, lim2=0;\n      int lim1a, lim1b;\n      int high1, high2;\n      \n      for(d=0; rndbits&lt;ressu_bits_needed ||\n\t  d&lt;RESSU_MIN_ROUNDS ||\n\t  clockbytes &lt; RESSU_MIN_CLOCKBYTES; d++) {\n\n\t\/\/ save previous round\n\n        for(e=0;e&lt;1024;e++) {\n\t  prevperiods&#91;e]=periods&#91;e];\n\t}\n\n\tressu_genbytes_single(ressut_bytes,ressut);\n\n\t\/\/ find new lim1\n\t\n\tlim=lim1;\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(prevperiods&#91;e]>0 &amp;&amp; prevperiods&#91;e]==lim) {\n\t    if(f==-1 || (periods&#91;e]>0 &amp;&amp; f&lt;periods&#91;e])) {\n\t      f=periods&#91;e];\n\t    }\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim1a=lim;\n\t\n\t\/\/ find highest amount of chains\n\t\n\thigh1=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(high1==-1 || high1&lt;periods&#91;e]) {\n\t    high1=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and second highest\n\t\n\thigh2=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (high2==-1 &amp;&amp; periods&#91;e]&lt;high1) ||\n\t      (high2&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;high1) ) {\n\t    high2=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and average\n\n\tint psum=0;\n\tint pcnt=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>0) {\n\t    psum+=periods&#91;e];\n\t    pcnt++;\n\t  }\n\t}\n\n\tlim1b=(int)((double)psum\/pcnt);\n\t\n\t\/\/ find next smaller than average\n\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (f==-1 &amp;&amp; periods&#91;e]&lt;lim1b) ||\n\t      (f&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;lim1b) ) {\n\t    f=periods&#91;e];\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim1b=f;\n\n\tif(lim==0 || lim>lim1b)\n\t  lim=lim1b;\n\n\t\/\/ if lim greater that second highest,\n\t\/\/ set to second highest\n\n\tif(lim>high2) {\n\t  lim=high2;\n\t}\n\t\t\n\tlim1=lim;\n\n\t\/\/ find next greater than lim\n\t\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>lim &amp;&amp;\n\t     (f==-1 || periods&#91;e]&lt;f))\n\t    f=periods&#91;e];\n\t}\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim2=lim;\n\n\t\/\/ calculate bits\n\t\t\n\trndbits=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>0 &amp;&amp; periods&#91;e]&lt;lim) {\n\t    rndbits+=periods&#91;e];\n\t  }\n\t}\n      } \/\/ for(d=0;\n      if(stats) {\n\tfprintf(stdout,\"rounds: %d\",d);\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>0)\n\t    fprintf(stdout,\" %d:%lu\",e,periods&#91;e]);\n\t}\n\n#ifdef DEBUG_SORTED\n\t\n\tfprintf(stdout,\", sorted:\");\n\tint g=0;\n\tfor(;;) {\n\t  f=-1;\n\t  for(e=0;e&lt;1024;e++) {\n\t    if( (f==-1 &amp;&amp; periods&#91;e]>g) ||\n\t\t(periods&#91;e]>g &amp;&amp; f>periods&#91;e]) )\n\t      f=periods&#91;e];\n\t  }\n\t  if(f==-1)\n\t    break;\n\n\t  g=f;\n\t  fprintf(stdout,\" %d\",g);\n\t}\n\n#endif\n\tfprintf(stdout,\", high1:%d\",high1);\n\tfprintf(stdout,\", high2:%d\",high2);\n\tfprintf(stdout,\", lim1a:%d\",lim1a);\n\tfprintf(stdout,\", lim1b:%d\",lim1b);\n\tfprintf(stdout,\", lim1:%d\",lim1);\n\tfprintf(stdout,\", lim2:%d\",lim2);\n\tfprintf(stdout,\", div:%f\",(double)lim2\/lim1);\n\tfprintf(stdout,\", clockbytes:%ld\",clockbytes);\n\tfprintf(stdout,\", rndbits:%d\",rndbits);\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n    } \/\/ if(ressut_pos == 0)\n    ressut_f = (ressut_f + ressut&#91;ressut_pos]) % ressut_bytes;\n    buffer&#91;c] ^= ressut&#91;ressut_f];\n    ressut_pos = (ressut_pos+1) % ressut_bytes;\n  } \/\/ for(c=0; c&lt;size; c++)\n\n  genbytes+=size;\n}\n\n#ifdef DEBUG4\nstatic unsigned char cc&#91;256*1048576]; \/\/ clock_chain\nstatic unsigned char *ccp;\nstatic int cc_bytes;\n#endif\n\nstatic unsigned char ressu_clockbyte_debug() \/* JariK 2013 *\/\n{\n  unsigned char c;\n  struct timeval tv;\n  gettimeofday(&amp;tv, NULL);\n  c=tv.tv_usec &amp; 0xff;\n#ifdef DEBUG4\n  if(cc_bytes&lt;sizeof(cc)) {\n    *ccp++ = c;\n    cc_bytes++;\n  }\n#endif\n  return(c);\n}\n\nvoid ressu_genbytes_single_debug(int size, unsigned char *buffer)\n{\n  int c, d, e, byte;\n  static int f = 0, prevbyte = -1, count = 0;\n\n  for(c=0; c&lt;8; c++) {\n    for(d=0; d&lt;size; d++) {\n      e = buffer&#91;d];\n      e = ((e&amp;0x80)>>7) | ((e&amp;0x7f)&lt;&lt;1); \/\/ rotate left 1\n      \/\/e = ((e&amp;0xe0)>>5) | ((e&amp;0x1f)&lt;&lt;3); \/\/ rotate left 3\n      \/\/e = ((e&amp;0xfe)>>1) | ((e&amp;0x1)&lt;&lt;7);  \/\/ rotate right 1\n      byte = ressu_clockbyte_debug();\n      if(prevbyte==-1)\n\tprevbyte=byte;\n      buffer&#91;d] = e^byte;\n      if(prevbyte!=byte) {\n\tperiods&#91;count]++;\n\tclockbytes+=count;\n\tcount=0;\n\tprevbyte=byte;\n      }\n      count++;\n    }\n    for(d=0; d&lt;size; d++) {\n      f = (f + buffer&#91;d]) % size;\n      e = buffer&#91;d];\n      buffer&#91;d] = buffer&#91;f];\n      buffer&#91;f] = e;\n    }\n  }\n}\n\nvoid ressu_genbytes_debug(int size, unsigned char *buffer) \/\/ 6.5.2021 JariK\n{\n  int c, d, e, f;\n  static int ressut_first=1,\n    ressut_pos = 0,\n    ressut_f = 0;\n  static unsigned char ressut&#91;RESSUT_BYTES];\n  unsigned long prevperiods&#91;1024];\n  \n  for(c=0; c&lt;size; c++) {\n    if(ressut_pos == 0) {\n      if(ressut_first) {\n\tmemset(ressut,0,ressut_bytes);\n\tressut_first=0;\n      }\n\n      clockbytes=0;\n      for(d=0;d&lt;1024;d++)\n\tperiods&#91;d]=0;\n\n#ifdef DEBUG4\n      ccp=cc;\n      cc_bytes=0;\n\n      while(ressu_clockbyte_debug()!=0);\n      while(ressu_clockbyte_debug()==0);\n\n      ccp=cc;\n      cc_bytes=0;\n#endif\n\n      int rndbits=0;\n      int lim, lim1=0, lim2=0;\n      int lim1a, lim1b;\n      int high1, high2;\n\n      for(d=0; rndbits&lt;ressu_bits_needed ||\n\t  d&lt;RESSU_MIN_ROUNDS; d++) {\n\n\t\/\/ save previous round\n\n        for(e=0;e&lt;1024;e++) {\n\t  prevperiods&#91;e]=periods&#91;e];\n\t}\n\t\t\n\tressu_genbytes_single_debug(ressut_bytes,ressut);\n\n\t\/\/ find new lim1\n\t\n\tlim=lim1;\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(prevperiods&#91;e]>0 &amp;&amp; prevperiods&#91;e]==lim) {\n\t    if(f==-1 || (periods&#91;e]>0 &amp;&amp; f&lt;periods&#91;e])) {\n\t      f=periods&#91;e];\n\t    }\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim1a=lim;\n\t\n\t\/\/ find highest amount of chains\n\n\thigh1=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(high1==-1 || high1&lt;periods&#91;e]) {\n\t      high1=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and second highest\n\n\thigh2=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (high2==-1 &amp;&amp; periods&#91;e]&lt;high1) ||\n\t      (high2&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;high1) ) {\n\t    high2=periods&#91;e];\n\t  }\n\t}\n\n\t\/\/ and average\n\n\tint psum=0;\n\tint pcnt=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>0) {\n\t    psum+=periods&#91;e];\n\t    pcnt++;\n\t  }\n\t}\n\n\tlim1b=(int)((double)psum\/pcnt);\n\t\n\t\/\/ find next smaller than average\n\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if( (f==-1 &amp;&amp; periods&#91;e]&lt;lim1b) ||\n\t      (f&lt;periods&#91;e] &amp;&amp; periods&#91;e]&lt;lim1b) ) {\n\t    f=periods&#91;e];\n\t  }\n\t}\n\n\tif(f!=-1)\n\t  lim1b=f;\n\n\tif(lim==0 || lim>lim1b)\n\t  lim=lim1b;\n\n\t\/\/ if lim greater that second highest,\n\t\/\/ set to second highest\n\n\tif(lim>high2) {\n\t  lim=high2;\n\t}\n\t\n\tlim1=lim;\n\n\t\/\/ find next greater than lim\n\n\tf=-1;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>lim &amp;&amp;\n\t     (f==-1 || periods&#91;e]&lt;f))\n\t    f=periods&#91;e];\n\t}\n\tif(f!=-1)\n\t  lim=f;\n\n\tlim2=lim;\n\n\t\/\/ calculate bits\n\t\n\trndbits=0;\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>0 &amp;&amp; periods&#91;e]&lt;lim) {\n\t    rndbits+=periods&#91;e];\n\t  }\n\t}\n\t\n\tif(stats) {\n\t  fprintf(stdout,\" round: %d\",d);\n\t  for(e=0;e&lt;1024;e++) {\n\t    if(periods&#91;e]>0)\n\t      fprintf(stdout,\" %d:%lu\",e,periods&#91;e]);\n\t  }\n\n#ifdef DEBUG_SORTED\n\n\t  fprintf(stdout,\", sorted:\");\n\t  int g=0;\n\t  for(;;) {\n\t    f=-1;\n\t    for(e=0;e&lt;1024;e++) {\n\t      if( (f==-1 &amp;&amp; periods&#91;e]>g) ||\n\t\t  (periods&#91;e]>g &amp;&amp; f>periods&#91;e]) )\n\t\tf=periods&#91;e];\n\t    }\n\t    if(f==-1)\n\t      break;\n\t    \n\t    g=f;\n\t    fprintf(stdout,\" %d\",g);\n\t  }\n\n#endif\n\t  \n\t  fprintf(stdout,\" high1:%d\",high1);\n\t  fprintf(stdout,\" high2:%d\",high2);\n\t  fprintf(stdout,\" lim1a:%d\",lim1a);\n\t  fprintf(stdout,\" lim1b:%d\",lim1b);\n\t  fprintf(stdout,\" lim1:%d\",lim1);\n\t  fprintf(stdout,\" lim2:%d\",lim2);\n\t  fprintf(stdout,\" clockbytes:%ld\",clockbytes);\n\t  fprintf(stdout,\" rndbits:%d\",rndbits);\n\t  fprintf(stdout,\"\\n\");\n\t  fflush(stdout);\n\t}\n      } \/\/ for(d=0;\n      if(stats) {\n\tfprintf(stdout,\"rounds: %d\",d);\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>0)\n\t    fprintf(stdout,\" %d:%lu\",e,periods&#91;e]);\n\t}\n\n#ifdef DEBUG_SORTED\n\n\tfprintf(stdout,\", sorted:\");\n\tint g=0;\n\tfor(;;) {\n\t  f=-1;\n\t  for(e=0;e&lt;1024;e++) {\n\t    if( (f==-1 &amp;&amp; periods&#91;e]>g) ||\n\t\t(periods&#91;e]>g &amp;&amp; f>periods&#91;e]) )\n\t      f=periods&#91;e];\n\t  }\n\t  if(f==-1)\n\t    break;\n\n\t  g=f;\n\t  fprintf(stdout,\" %d\",g);\n\t}\n\n#endif\n\t\n\tfprintf(stdout,\" high1:%d\",high1);\n\tfprintf(stdout,\" high2:%d\",high2);\n\tfprintf(stdout,\" lim1a:%d\",lim1a);\n\tfprintf(stdout,\" lim1b:%d\",lim1b);\n\tfprintf(stdout,\" lim1:%d\",lim1);\n\tfprintf(stdout,\" lim2:%d\",lim2);\n\tfprintf(stdout,\" clockbytes:%ld\",clockbytes);\n\tfprintf(stdout,\" rndbits:%d\",rndbits);\n\tfprintf(stdout,\"\\n\");\n\tfflush(stdout);\n      }\n      \n#ifdef DEBUG4\n      FILE *fp1;\n      if((fp1=fopen(debugfilename,\"a\"))!=NULL) {\n\t\/\/if(lim1==-1 || lim2==-1 || lim1==lim2) {\n\tfor(e=0;e&lt;32;e++)\n\t  fprintf(fp1,\"%02x\",ressut&#91;e]);\n\n\tfprintf(fp1,\", ressut_bytes: %d\",ressut_bytes);\n\tfprintf(fp1,\", ressu_bits_needed: %d\",ressu_bits_needed);\n\tfprintf(fp1,\", ressu_min_rounds: %d\",RESSU_MIN_ROUNDS);\n\n\tfprintf(fp1,\", clockbytes: %ld\",clockbytes);\n\t\n\tunsigned long total=0;\t\n\tfprintf(fp1,\", fluctuations:\");\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]!=0) {\n\t    fprintf(fp1,\" %d:%lu\",e,periods&#91;e]);\n\t    total+=(periods&#91;e]*e);\n\t  }\n\t}\n\tfprintf(fp1,\", total: %lu\",total);\n\tfprintf(fp1,\", high1: %d\",high1);\n\tfprintf(fp1,\", high2: %d\",high2);\n\tfprintf(fp1,\", limit1: %d\",lim1);\n\tfprintf(fp1,\", limit2: %d\",lim2);\n\tfprintf(fp1,\", limit: %d\",lim);\n\n\tfprintf(fp1,\", skipped:\");\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>=lim) {\n\t    fprintf(fp1,\" %d:%lu\",e,periods&#91;e]);\n\t  }\n\t}\n\t\n\tfprintf(fp1,\", counted:\");\n\tfor(e=0;e&lt;1024;e++) {\n\t  if(periods&#91;e]>0 &amp;&amp; periods&#91;e]&lt;lim) {\n\t    fprintf(fp1,\" %d:%lu\",e,periods&#91;e]);\n\t  }\n\t}\t\n\tfprintf(fp1,\", rndbits: %d\",rndbits);\n\tfprintf(fp1,\", rounds: %d\",d);\n\n\tint prevbyte=-1, count=0, count2=0;\n\tunsigned char byte, small=-1;\n\n\tfprintf(fp1,\", small chains:\");\n\tfor(e=0;e&lt;cc_bytes;e++) {\n\t  byte=cc&#91;e];\n\t  if(prevbyte==-1) {\n\t    prevbyte=byte;\n\t    count=1;\n\t  }\n\t  if(prevbyte!=byte) {\n\t    if(periods&#91;count]>=lim) {\n\t      if(small==1 || small==-1)\n\t\tfprintf(fp1,\" *\");\n\t      small=0;\n\t    } else small=1;\n\t    if(small) {\n\t      fprintf(fp1,\" %d\",count);\n\t      count2++;\n\t    }\n\t    count=0;\n\t    prevbyte=byte;\n\t  }\n\t  count++;\n\t}\n\tif(small) {\n\t  fprintf(fp1,\" %d\",count);\n\t  count2++;\n\t}\n\tfprintf(fp1,\", count: %d\",count2);\n\n\tfprintf(fp1,\"\\n\");\n\tfflush(fp1);\n\t\/\/}\n\tfclose(fp1);\n      } \/\/ if((fp1=fopen\n#endif\n    } \/\/ if(ressut_pos == 0)\n    ressut_f = (ressut_f + ressut&#91;ressut_pos]) % ressut_bytes;\n    buffer&#91;c] ^= ressut&#91;ressut_f];\n    ressut_pos = (ressut_pos+1) % ressut_bytes;\n  } \/\/ for(c=0; c&lt;size; c++)\n\n  genbytes+=size;\n}\n\nstatic void readfile_xor(int len,\n    unsigned char *buf,\n    unsigned char *filename)\n{\n  int c, n, n2;\n  unsigned char temp&#91;64];\n  FILE *fp1;\n\n  if((fp1 = fopen(filename, \"rb\"))\n      != NULL) {\n    while(len != 0) {\n      n = (len &lt; sizeof(temp)) ?\n          len : sizeof(temp);\n      n2=fread(temp, 1, n, fp1);\n      for(c = 0; c &lt; n2; c++)\n        buf&#91;c] ^= temp&#91;c];\n      len -= n2;\n      buf += n2;\n    }\n    fclose(fp1);\n  }\n}\n\n#define INPUT_RESSU 0\n#define INPUT_DEBUG 1\n#define INPUT_FAST 2\n#define INPUT_SINGLE 3\n#define INPUT_URANDOM 8\n#define INPUT_RANDOM 9\n\nstatic int input=0;\n\n#define GENT_SIZE 2048\n\n#define aDEBUG9 2\n\nchar *randomgen&#91;] = { \"ressu\", \"debug\",\"fast\",\"single\",\"4\",\"5\",\"6\",\"7\",\"urandom\",\"random\" };\n\nint ressu_genbyte()\n{\n  static unsigned char gent&#91;GENT_SIZE];\n  static unsigned int gent_pos=0;\n  unsigned char ch;\n\n  if(input==INPUT_RESSU) { \/\/ ressu prod\n    ressu_genbytes(sizeof(ch), &amp;ch);\n  } else if(input==INPUT_DEBUG) { \/\/ ressu debug\n    ressu_genbytes_debug(sizeof(ch), &amp;ch);\n  } else {\n    if(gent_pos==0) {\n      if(input==INPUT_FAST) \/\/ ressu_fast\n\tressu_genbytes_fast(sizeof(gent),gent);\n      else if(input==INPUT_SINGLE) \/\/ ressu single\n\tressu_genbytes_single(sizeof(gent),gent);\n      else if(input==INPUT_URANDOM) \/\/ urandom\n\treadfile_xor(sizeof(gent),gent,urandomfilename);\n#ifdef USE_RANDOM\n      else if(input==INPUT_RANDOM) \/\/ random\n\treadfile_xor(sizeof(gent),gent,randomfilename);\n#endif\n    } \/\/ if(gent_pos==0\n    ch=gent&#91;gent_pos];\n    gent_pos=(gent_pos+1)%sizeof(gent);\n  }\n  return(ch);\n}\n\nint ressu_genbyte_limit(int limit)\n{\n  int c;\n  while((c=ressu_genbyte()) >= (256\/limit)*limit);\n  return(c%limit);\n}\n\nint ressu_genshort()\n{\n  return(ressu_genbyte() | ressu_genbyte()&lt;&lt;8);\n}\n\nint ressu_genshort_limit(int limit)\n{\n  int c;\n  while((c=ressu_genshort()) >= (65536\/limit)*limit);\n  return(c%limit);\n}\n\nunsigned int ressu_genint()\n{\n  return(ressu_genshort() | ressu_genshort()&lt;&lt;16);\n}\n\nunsigned int ressu_genint_limit(unsigned long limit)\n{\n  unsigned int c;\n  while((c=ressu_genint()) >= (((unsigned long)65536*65536)\/limit)*limit);\n  return(c%limit);\n}\n\nunsigned long ressu_genlong()\n{\n  return(((unsigned long)ressu_genint()) | ((unsigned long)ressu_genint())&lt;&lt;32);\n}\n\nunsigned long ressu_genlong_limit(unsigned long limit)\n{\n  unsigned long c;\n  while((c=ressu_genlong()) >= (((unsigned long)0xffffffffffffffff)\/limit)*limit);\n  return(c%limit);\n}\n\nunsigned long ressu_gen_limit(unsigned long limit)\n{\n  if(limit&lt;=256)\n    return(ressu_genbyte_limit(limit));\n  else if(limit&lt;=65536)\n    return(ressu_genshort_limit(limit));\n  else if(limit&lt;=(unsigned long)65536*65536)\n    return(ressu_genint_limit(limit));\n  else if(limit&lt;=(unsigned long)0xffffffffffffffff)\n    return(ressu_genlong_limit(limit));\n  else\n    return(-1);\n}\n\n#define MAIN 2\n\n#ifdef MAIN\n\n#include &lt;stdarg.h>\n\n#define aDEBUG31\n\nstatic int stat_line_chars=0;\nstatic int stat_line_edchars=0;\n\nstatic void stat_line_begin()\n{\n#ifdef DEBUG31\n  fprintf(stderr,\"\\n\");\n#else\n  fprintf(stderr,\"\\r\");\n#endif  \n  stat_line_edchars=stat_line_chars;\n  stat_line_chars=0;\n}\n\n\nstatic void stat_line_printf(const unsigned char *format, ...)\n{\n  int count;\n  va_list args;\n  static unsigned char *stat_line_buf;\n  static size_t stat_line_buf_length;\n\n  va_start(args, format);\n  count = vsnprintf(stat_line_buf, stat_line_buf_length, format, args) + 1;\n  va_end(args);\n  if(stat_line_buf_length &lt; count) {\n    stat_line_buf_length=count;\n    stat_line_buf=realloc(stat_line_buf, stat_line_buf_length);\n    va_start(args, format);\n    count = vsnprintf(stat_line_buf, stat_line_buf_length, format, args) + 1;\n    va_end(args);\n  }\n  fprintf(stderr,\"%s\",stat_line_buf);\n  stat_line_chars+=strlen(stat_line_buf);\n}\n\n#define READABLE_NUMBER_BIN 2\n\n#ifdef READABLE_NUMBER_BIN\n#define READABLE_NUMBER_HIGH 1023\n#define READABLE_NUMBER_DIVIDER 1024\n#else\n#define READABLE_NUMBER_HIGH 999\n#define READABLE_NUMBER_DIVIDER 1000\n#endif\n\n#define READABLE_NUMBER_WIDTH 32\n\nstatic void stat_line_readable(unsigned long length)\n{\n  int c, low;\n  double length2;\n  unsigned char buf10&#91;10];\n  \/\/ B = byte\n  \/\/ K = kilo   10^3   2^10\n  \/\/ M = mega   10^6   2^20\n  \/\/ G = giga   10^9   2^30\n  \/\/ T = tera   10^12  2^40\n  \/\/ P = peta   10^15  2^50\n  \/\/ E = exa    10^18  2^60\n  \/\/ Z = zetta  10^21  2^70\n  \/\/ Y = yotta  10^24  2^80\n  char units&#91;] = \"BKMGTPEZY\";\n\n  strcpy(buf10,\"***\");\n  low=0;\n\n  for(c=0; length>=low &amp;&amp;\n      c&lt;sizeof(units)-1; c++) {\n    if(length>=low &amp;&amp;\n       length&lt;=READABLE_NUMBER_HIGH) {\n      if(units&#91;c]=='B')\n        sprintf(buf10,\"%ld\", length);\n      else if(units&#91;c]=='K')\n\tsprintf(buf10,\"%ld%cB\", length, units&#91;c]);\n      else if(length==length2)\n\tsprintf(buf10,\"%ld%cB\", length, units&#91;c]);\n      else\n\tsprintf(buf10,\"%.1f%cB\", length2, units&#91;c]);\n\t\n      break;\n    }\n    length2=(double)length\/READABLE_NUMBER_DIVIDER;\n    length\/=READABLE_NUMBER_DIVIDER;\n    low=1;\n  }\n  stat_line_printf(\"%s\",buf10);\n}\n\n#ifdef OLD1\n\nstatic void stat_line_readable(unsigned long length)\n{\n  int c, low;\n  unsigned char buf10&#91;10];\n  \/\/ B = byte\n  \/\/ K = kilo   10^3   2^10\n  \/\/ M = mega   10^6   2^20\n  \/\/ G = giga   10^9   2^30\n  \/\/ T = tera   10^12  2^40\n  \/\/ P = peta   10^15  2^50\n  \/\/ E = exa    10^18  2^60\n  \/\/ Z = zetta  10^21  2^70\n  \/\/ Y = yotta  10^24  2^80\n  char units&#91;] = \"BKMGTPEZY\";\n\n  strcpy(buf10,\"***\");\n  low=0;\n\n  for(c=0; length>=low &amp;&amp;\n      c&lt;sizeof(units)-1; c++) {\n    if(length>=low &amp;&amp;\n       length&lt;=READABLE_NUMBER_HIGH) {\n      if(units&#91;c]!='B')\n        sprintf(buf10,\"%ld%cB\", length, units&#91;c]);\n      else\n        sprintf(buf10,\"%ld\", length);\n      break;\n    }\n    length\/=READABLE_NUMBER_DIVIDER;\n    low=1;\n  }\n  stat_line_printf(\"%s\",buf10);\n}\n\n#endif\n\nvoid stat_line_end()\n{\n  int c,d;\n\n  \/\/ previous line longer than this one,\n  \/\/ overwrite with spaces and backspace to\n  \/\/ end\n  \n  if(stat_line_edchars>stat_line_chars) {\n    d=stat_line_edchars-stat_line_chars;\n    for(c=0;c&lt;d;c++) {\n#ifdef DEBUG31\n      fprintf(stderr,\"*\");\n#else\n      fprintf(stderr,\" \");\n#endif\n    }\n    for(c=0;c&lt;d;c++)\n      fprintf(stderr,\"\\b\");\n  }\n  fflush(stderr);\n}\n\nint help=0;\n\nstatic int utf8len(unsigned char *buf)\n{\n  int len;\n  unsigned char *p;\n  \n  p=buf;\n  len=0;\n  while(*p!='\\0') {\n    if(*p&lt;0x80 || \/\/ ascii char\n       *p>0xbf) \/\/ first utf8 byte\n      len++;\n    p++;\n  }\n  return(len);\n}\n\n#define aDEBUG38 2\n\nstatic void utf8getchar(int size, unsigned char *buf, int n, unsigned char *string)\n{\n  int d;\n  unsigned char *p,*q;\n  \n  d=0;\n  p=string;\n  q=buf;\n\n  \/\/ find first byte of character\n  \n  while(*p!='\\0') {\n    if(*p&lt;0x80 || \/\/ ascii char\n       *p>0xbf) { \/\/ first utf8 char\n      if(d==n)\n\tbreak;\n      d++;\n    }\n    p++;\n  }\n\n  \/\/ copy first byte and rest\n  \/\/ of character\n  \n  if(*p!='\\0') {\n    *q++=*p; \/\/ copy first byte\n    if(*p>0xbf) { \/\/ if first is utf8 char\n      p++;\n      for(;;) {\n\tif(*p>0xbf || \/\/ first utf8 char\n\t   *p&lt;0x80 || \/\/ ascii char\n\t   *p=='\\0')  \/\/ end of file\n\t  break;\n\t*q++=*p++; \/\/ copy rest of the bytes\n      }\n    }\n  }\n  *q='\\0';\n\n#ifdef DEBUG38\n  fprintf(stdout,\"%s: utf8getchar:\",procname);\n  fprintf(stdout,\" string: %s\",string);\n  fprintf(stdout,\", n: %d\",n);\n  fprintf(stdout,\", character: %s\",buf);\n  fprintf(stdout,\"\\n\");\n#endif\n}\n\n#define aDEBUG45\n\nstatic void out_word(int size, unsigned char *buf, unsigned char *digits, unsigned long word2) \/\/ 8.5.2021 JariK\n{\n  int c, d, len, digitslen;\n  unsigned long word;\n  unsigned char string&#91;132], character&#91;32];\n\n  digitslen = utf8len(digits);\n  word=word2;\n  len=0;\n  string&#91;0]='\\0';\n\n  if(word==0 || digitslen&lt;2) {\n    \/\/ zero\n    utf8getchar(sizeof(character),character,0,digits);\n    if(len+strlen(character)&lt;sizeof(string)) {\n      strcat(string,character);\n      len+=strlen(character);\n    }\n  } else {\n    \/\/ non zero\n    while(word>0) {\n      utf8getchar(sizeof(character),character,word%digitslen,digits);\n      if(len+strlen(character)&lt;sizeof(string)) {\n\tstrcat(string,character);\n\tlen+=strlen(character);\n      }\n      word\/=digitslen;\n    }\n  }\n\n  \/\/ reverse string\n  \n  *buf='\\0';\n  len=0;\n  d=utf8len(string);\n  for(c=d-1;c>=0;c--) {\n    utf8getchar(sizeof(character),character,c,string);\n    if(len+strlen(character)&lt;size) {\n      strcat(buf,character);\n      len+=strlen(character);\n    }\n  }\n\n#ifdef DEBUG45\n  fprintf(stdout,\"]\\n%s: out_word: \",procname);\n  fprintf(stdout,\" reverse string: %s\",string);\n  fprintf(stdout,\", digits: %s\",digits);\n  fprintf(stdout,\", int: %lu\",word2);\n  fprintf(stdout,\"\\n&#91;\");\n#endif\n}\n\n#define aDEBUG58 2\n\nstatic void in_word(unsigned long *word, unsigned char *digits, unsigned char *buf)\n{\n  int c,d,e,f,ok;\n  unsigned char character&#91;32], character2&#91;32];\n\n  *word=0;\n  d=utf8len(buf);\n  f=utf8len(digits);\n\n  for(c=0;c&lt;d;c++) {\n    utf8getchar(sizeof(character2),character2,c,buf);\n    ok=0;\n    for(e=0;e&lt;f;e++) {\n      utf8getchar(sizeof(character),character,e,digits);\n      if(!strcmp(character,character2)) {\n\tok=1;\n\tbreak;\n      }\n    }\n    if(ok) {\n      *word=((*word)*f)+e;\n    } else {\n      fprintf(stdout,\"%s: in_word:\",procname);\n      fprintf(stdout,\" illegal digit '%s'\\n\",character2);\n      help=1;\n    }\n  }\n\n#ifdef DEBUG58\n  fprintf(stdout,\"%s: in_word:\",procname);\n  fprintf(stdout,\" word: %lu\",*word);\n  fprintf(stdout,\", digits: %s\",digits);\n  fprintf(stdout,\", string: %s\",buf);\n  fprintf(stdout,\"\\n\");\n#endif\n}\n\nstatic void line_clear(int *len, unsigned char **buf)\n{\n  if(*len&lt;1) {\n    *len=129;\n    *buf=realloc(*buf,*len);\n  }\n  **buf='\\0';\n}\n\nstatic int line_add_string_sort(int *len, unsigned char **buf, unsigned char *string)\n{\n  int cmp,count,add;\n  unsigned char *p;\n\n  p=*buf;\n  add=1;\n  while(*p!='\\0') {\n    cmp=strncmp(string,p,strlen(string));\n    if(cmp>0) {\n      while(*p!=' ' &amp;&amp; *p!='\\0') \/\/ find next space\n\tp++;\n      while(*p==' ' &amp;&amp; *p!='\\0') \/\/ find next non space\n\tp++;\n    } else if(cmp==0) {\n      add=0;\n      break;\n    } else {\n      break;\n    }\n  }\n\n  if(add) {\n    count=strlen(*buf)+strlen(string)+1+1;\n    if(*buf==NULL || count>*len) {\n      int diff=p-*buf;\n      *len = *len + 128;\n      *buf=realloc(*buf,*len);\n      p=*buf+diff;\n    }\n    memmove(p+strlen(string)+1,p,strlen(p)+1);\n    memmove(p,string,strlen(string));\n    p+=strlen(string);\n    *p=' ';\n  }\n\n  return(add);\n}\n\nstatic void line_get_string(int len, unsigned char *buf, int n, unsigned char *string)\n{\n  int e,ok,count;\n  unsigned char *p,*q;\n\n  ok=0;\n  p=string;\n  e=0;\n\n  while(*p!='\\0') {\n    if(e==n) {\n      ok=1;\n      break;\n    }\n    while(*p!=' ' &amp;&amp; *p!='\\0') \/\/ find next space\n      p++;\n    while(*p==' ' &amp;&amp; *p!='\\0') \/\/ find next non space\n      p++;\n    e++;\n  }\n  if(ok) {\n    q=buf;\n    count=0;\n    while(*q!=' ' &amp;&amp; *q!='\\0') {\n      if(++count&lt;len)\n\t*q++=*p;\n      p++;\n    }\n    *q='\\0';\n  } else {\n    buf&#91;0]='\\0';\n  }\n}\n\nstatic int size=5, zero=1, sspace=0, snewline=1,\n  scrlf=1, chars=72, pchars=0, words=0, pwords=0,\n  lines=10, plines=0, plinesdigits=5, slineno=1,\n  quiet=0, sort=0, unique=0, sample=0;\nstatic unsigned long limit, word;\nstatic unsigned char *digits=\"0123456789\", character&#91;32];\nstatic unsigned char digitstemp&#91;256];\nstatic unsigned char linenobuf&#91;1024];\n\nstatic void readword(unsigned char *buf)\n{\n  int d,e;\n  unsigned char temp1024&#91;1024];\n  \n  if(limit!=0) {\n    word=0;\n    \n    if(zero) {\n      word=ressu_gen_limit(limit); \/\/ include zeroes\n      \/\/fprintf(stdout,\"(%02ld)\",word);\n    } else if(limit>=1) {\n      while((word=ressu_gen_limit(limit))==0); \/\/ skip zeroes\n    }\n\t  \n    out_word(sizeof(temp1024),temp1024,digits,word);\n\t  \n    \/\/ fill leading zeroes\n    \n    buf&#91;0]='\\0';\n    utf8getchar(sizeof(character),character,0,digits);\n    for(d=size-utf8len(temp1024);d>0;d--) {\n      strcat(buf,character);\n    }\n\t  \n    \/\/ rest of the number\n\t  \n    strcat(buf,temp1024);\n\t  \n  } else if(digits!=NULL) {\n    int digitslen;\n\t  \n    buf&#91;0]='\\0';\n    digitslen=utf8len(digits);\n\t  \n    \/\/ fill whole word digit by digit\n\t  \n    \/\/fprintf(stdout,\"&#91;\");\n    for(d=0;d&lt;size;d++) {\n      if(digits&#91;0]=='0' &amp;&amp; !zero)\n\te=ressu_gen_limit(digitslen-1)+1;\n      else\n\te=ressu_gen_limit(digitslen);\n      utf8getchar(sizeof(temp1024),temp1024,e,digits);\n      \/\/fprintf(stdout,\"%s\",temp1024);\n      strcat(buf,temp1024);\n    }\n    \/\/fprintf(stdout,\"]\");\n  }\n}\n\nstatic int line_number_length()\n{\n  int c;\n  out_word(sizeof(linenobuf),linenobuf,\"0123456789\",lines-1);\n  c=strlen(linenobuf);\n  if(c&lt;5)\n    c=5;\n  return(c);\n}\n\nstatic void print_line_number()\n{\n  unsigned char linenobuf&#91;1024];\n  \n  if(pwords==0 &amp;&amp; slineno) {\n    sprintf(linenobuf,\"%0*d\",plinesdigits,plines);\n    fprintf(stdout,\"%s\",linenobuf);\n    fprintf(stdout,\" \");\n  }\n}\n\nstatic void print_spaces()\n{\n  if(sspace>=2 &amp;&amp;\n       \/\/ rand space between double words\n     ( (pwords>0 &amp;&amp; pwords%sspace==0) ||\n     \/\/ rand space after linenumber\n       (slineno &amp;&amp; pwords==0) ) )\n    fprintf(stdout,\" \");\n\n  if(sspace &amp;&amp;\n       \/\/ space between words\n     ( (pwords>0) ||\n     \/\/ space after linenumber\n       (slineno &amp;&amp; pwords==0) ) ) \n    fprintf(stdout,\" \");\n}\n\n#ifdef OLD1\nstatic void print_spaces()\n{\n  if(sspace &amp;&amp; pchars>0 &amp;&amp; !quiet) {\n    if(sspace==3 &amp;&amp; pwords%2==0) {\n      fprintf(stdout,\" \");\n      pchars++;\n    }\n    fprintf(stdout,\" \");\n    pchars++;\n  }\n}\n#endif\n\nstatic void print_word(unsigned char *buf)\n{\n  if(size!=0) {\n    fprintf(stdout,\"%*s\",size,buf);\n  } else {\n    fprintf(stdout,\"%s\",buf);\n  }\n}\n\nint main(int argc, char *argv&#91;])\n{\n  int c,d;\n \n  procname=argv&#91;0];\n\n  limit=0;\n#ifdef DEBUG4\n  ccp=cc;\n  cc_bytes=0;\n#endif\n  clockbytes=0;\n  for(d=0;d&lt;1024;d++)\n    periods&#91;d]=0;\n\n  \/\/ look thru command line parameters\n  \n  for(c=1;c&lt;argc;c++) {\n    if(!strncmp(\"-\",argv&#91;c],1)) {\n      if(!strcmp(\"--lineno\",argv&#91;c])) {\n\tslineno=!slineno;\n\n      } else if(!strcmp(\"--crlf\",argv&#91;c])) {\n\tscrlf=!scrlf;\n\tslineno=0;\n\n      } else if(!strcmp(\"--quiet\",argv&#91;c])) {\n\tquiet=!quiet;\n\n      } else if(!strcmp(\"--stats\",argv&#91;c]) ||\n\t!strcmp(\"--stat\",argv&#91;c])) {\n\tstats=!stats;\n\n      } else if(!strcmp(\"--rand\",argv&#91;c])) {\n\tdigits = \"0123456789\";\n\tsspace=2;\n\tsnewline=5;\n\tslineno=1;\n\twords=10;\n\tchars=0;\n\tlimit=100000;\n\t\/\/size=5;\n\t\/\/lines=20000;\n\t\n      } else if(!strncmp(\"--space\",argv&#91;c],7)) {\n\tif(*(argv&#91;c]+7)!='\\0' &amp;&amp; atoi(argv&#91;c]+7)>1) {\n\t  sspace=atoi(argv&#91;c]+7);\n\t} else if(c+1&lt;argc &amp;&amp; atoi(argv&#91;c+1])>1) {\n\t  sspace=atoi(argv&#91;c+1]);\n\t  c++;\n\t} else {\n\t  sspace=!sspace;\n\t}\n\n      } else if(!strncmp(\"--newline\",argv&#91;c],9)) {\n\tif(*(argv&#91;c]+9)!='\\0' &amp;&amp; atoi(argv&#91;c]+9)>1) {\n\t  snewline=atoi(argv&#91;c]+9);\n\t} else if(c+1&lt;argc &amp;&amp; atoi(argv&#91;c+1])>1) {\n\t  snewline=atoi(argv&#91;c+1]);\n\t  c++;\n\t} else {\n\t  snewline=!snewline;\n\t}\n\n     } else if(!strcmp(\"--zero\",argv&#91;c])) {\n\tzero=!zero;\n\n      } else if(!strcmp(\"--sort\",argv&#91;c])) {\n\tsort=!sort;\n\tif(sspace==0)\n\t  sspace=1;\n\t\t\n      } else if(!strcmp(\"--unique\",argv&#91;c])) {\n\tunique=!unique;\n\tif(sspace==0)\n\t  sspace=1;\n\t\t\n      } else if(!strcmp(\"--lotto\",argv&#91;c])) {\n\tsort=!sort;\n\tif(sspace==0)\n\t  sspace=1;\n\t\/\/sort=1;\n\t\/\/unique=1;\n\n      } else if(!strcmp(\"--sample\",argv&#91;c])) {\n\tsample=!sample;\n\t\n      } else if(!strcmp(\"--copyright\",argv&#91;c]) ||\n\t !strcmp(\"--version\",argv&#91;c])) {\n\tfprintf(stderr,\"%s\",programname);\n\tfprintf(stderr,\", %s\",copyright);\n\tfprintf(stderr,\"\\n\\n\");\n\thelp=1;\n\t\n      } else if(!strncmp(\"--lim\",argv&#91;c],5)) {\n\tif(*(argv&#91;c]+5)!='\\0') {\n\t  in_word(&amp;limit, digits, argv&#91;c]+5);\n\t} else if(c+1&lt;argc) {\n\t  in_word(&amp;limit, digits, argv&#91;c+1]);\n\t  c++;\n\t}\n\tif(sspace&lt;1) \/\/ 23.6.2021\n\t  sspace=1;\n\n      } else if(!strncmp(\"-s\",argv&#91;c],2)) {\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  size=atoi(argv&#91;c]+2);\n\t} else if(c+1&lt;argc) {\n\t  size=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\n\tlimit=0; \/\/ 23.6.2021\n\tif(size==0)\n\t  size=1;\n\tif(size>1024)\n\t  size=1024;\n\n      } else if(!strncmp(\"--bits\",argv&#91;c],6)) {\n\tif(*(argv&#91;c]+6)!='\\0') {\n\t  ressu_bits_needed=atoi(argv&#91;c]+6);\n\t} else if(c+1&lt;argc) {\n\t  ressu_bits_needed=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\t\n\n      } else if(!strncmp(\"--bytes\",argv&#91;c],7)) {\n\tif(*(argv&#91;c]+7)!='\\0') {\n\t  ressut_bytes=atoi(argv&#91;c]+7);\n\t} else if(c+1&lt;argc) {\n\t  ressut_bytes=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\t\n\n      } else if(!strncmp(\"-w\",argv&#91;c],2)) { \/\/ words per line\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  words=atoi(argv&#91;c]+2);\n\t} else if(c+1&lt;argc) {\n\t  words=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\n\tif(words&lt;1)\n\t  words=1;\n\t\n\tchars = 0;\n\t\n      } else if(!strncmp(\"-c\",argv&#91;c],2)) {  \/\/ characters per line\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  chars=atoi(argv&#91;c]+2);\n\t} else if(c+1&lt;argc) {\n\t  chars=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\n\twords=0;\n\t\n      } else if(!strncmp(\"-l\",argv&#91;c],2)) { \/\/ lines\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  lines=atoi(argv&#91;c]+2);\n\t} else if(c+1&lt;argc) {\n\t  lines=atoi(argv&#91;c+1]);\n\t  c++;\n\t}\n\tif(lines&lt;1)\n\t  lines=1;\n\n      } else if(!strcmp(\"-x\",argv&#91;c])) {\n\tdigits = \"0123456789abcdef\";\n\tsize=4;\n\n      } else if(!strcmp(\"-d\",argv&#91;c])) {\n\tdigits = \"0123456789\";\n\tsize=5;\n\n      } else if(!strcmp(\"-o\",argv&#91;c])) {\n\tdigits = \"01234567\";\n\tsize=3;\n\n      } else if(!strcmp(\"-b\",argv&#91;c])) {\n\tdigits = \"01\";\n\tsize=8;\n\n      } else if(!strcmp(\"-1\",argv&#91;c])) {\n\tdigits=\n\t  \"0123456789\" \\\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\";\n\tsize=8;\n\n      } else if(!strcmp(\"-11\",argv&#91;c])) {\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n\tsize=8;\n\n      } else if(!strcmp(\"-12\",argv&#91;c])) {\n\tdigits=\n\t  \"0123456789\";\n\tsize=8;\n\n      } else if(!strcmp(\"-2\",argv&#91;c])) {\n\tdigits=\n\t  \"0123456789\" \\\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\" \\\n\t  \"_-\";\n\tsize=8;\n\n      } else if(!strcmp(\"-3\",argv&#91;c])) { \/\/ 9.5.2021 JariK\n\tdigits=\n\t  \"!\\\"#$%&amp;'()*+,-.\/0123456789:;&lt;=>?@\" \\\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ&#91;\\\\]^_`\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz{|}~\";\n\tsize=8;\n\n      } else if(!strcmp(\"--rus\",argv&#91;c])) { \/\/ russian alphabet\n\tdigits=\n\t  \"\u0410\u0411\u0412\u0413\u0414\u0415\u0401\u0416\u0417\u0418\u0419\u041a\u041b\u041c\u041d\u041e\u041f\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042a\u042b\u042c\u042d\u042e\u042f\" \\\n\t  \"\u0430\u0431\u0432\u0433\u0434\u0435\u0451\u0436\u0437\u0438\u0439\u043a\u043b\u043c\u043d\u043e\u043f\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044a\u044b\u044c\u044d\u044e\u044f\";\n\tsize=8;\n\n      } else if(!strcmp(\"--dnk\",argv&#91;c]) || \/\/ danish alphabet\n\t\t!strcmp(\"--nor\",argv&#91;c])) { \/\/ norwegian alphabet\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c6\u00d8\u00c5\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\u00e6\u00f8\u00e5\";\n\tsize=8;\n\n      } else if(!strcmp(\"--fin\",argv&#91;c]) || \/\/ finnish alphabet\n\t\t!strcmp(\"--swe\",argv&#91;c])) { \/\/ swedish alphabet\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c5\u00c4\u00d6\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\u00e5\u00e4\u00f6\";\n\tsize=8;\n\n      } else if(!strcmp(\"--est\",argv&#91;c])) { \/\/ estonian alphabet\n\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRS\u0160Z\u017dTUVW\u00d5\u00c4\u00d6\u00dcXY\" \\\n\t  \"abcdefghijklmnopqrs\u0161z\u017etuvw\u00f5\u00e4\u00f6\u00fcxy\";\n\tsize=8;\n  \n      } else if(!strcmp(\"--ltu\",argv&#91;c])) { \/\/ lithuanian alphabet\n\tdigits=\n\t  \"A\u0104BC\u010cDE\u0118\u0116FGHI\u012eYJKLMNOPRS\u0160TU\u0172\u016aVZ\u017d\" \\\n\t  \"a\u0105bc\u010dde\u0119\u0117fghi\u012fyjklmnoprs\u0161tu\u0173\u016bvz\u017e\";\n\t  \n\tsize=8;\n\n      } else if(!strcmp(\"--lva\",argv&#91;c])) { \/\/ latvian alphabet\n\tdigits=\n\t  \"A\u0100BC\u010cDE\u0112FG\u0122HI\u012aJK\u0136L\u013bMN\u0145OPRS\u0160TU\u016aVZ\u017d\" \\\n\t  \"a\u0101bc\u010dde\u0113fg\u0123hi\u012bjk\u0137l\u013cmn\u0146oprs\u0161tu\u016bvz\u017e\";\n\tsize=8;\n\n      } else if(!strcmp(\"--fra\",argv&#91;c]) \/\/ french alphabet\n\t\t||!strcmp(\"--gbr\",argv&#91;c]) \/\/ great britain alphabet\n\t\t||!strcmp(\"--usa\",argv&#91;c]) \/\/ united states alphabet\n\t\t||!strcmp(\"--ita\",argv&#91;c]) \/\/ italian alphabet\n\t\t) {\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\";\n\tsize=8;\n\n      } else if(!strcmp(\"--deu\",argv&#91;c])) { \/\/ deutche alphabet\n\tdigits=\n\t  \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\u00c4\u00d6\u00dc\u1e9e\" \\\n\t  \"abcdefghijklmnopqrstuvwxyz\u00e4\u00f6\u00fc\u00df\";\n\tsize=8;\n\n      } else if(!strcmp(\"--grc\",argv&#91;c])) { \/\/ greek alphabet\n\tdigits=\n\t  \"\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039a\u039b\u039c\u039d\u039e\u039f\u03a0\u03a1\u03a3\u03a4\u03a5\u03a6\u03a7\u03a8\u03a9\" \\\n\t  \"\u03b1\u03b2\u03b3\u03b4\u03b5\u03b6\u03b7\u03b8\u03b9\u03ba\u03bb\u03bc\u03bd\u03be\u03bf\u03c0\u03c1\u03c3\u03c4\u03c5\u03c6\u03c7\u03c8\u03c9\";\n\tsize=8;\n   \n      } else if(!strcmp(\"--cards\",argv&#91;c])) {\n\tdigits=\n\t  \"\ud83c\udca1\ud83c\udca2\ud83c\udca3\ud83c\udca4\ud83c\udca5\ud83c\udca6\ud83c\udca7\ud83c\udca8\ud83c\udca9\ud83c\udcaa\ud83c\udcab\ud83c\udcad\ud83c\udcae\" \\\n\t  \"\ud83c\udcb1\ud83c\udcb2\ud83c\udcb3\ud83c\udcb4\ud83c\udcb5\ud83c\udcb6\ud83c\udcb7\ud83c\udcb8\ud83c\udcb9\ud83c\udcba\ud83c\udcbb\ud83c\udcbd\ud83c\udcbe\" \\\n\t  \"\ud83c\udcc1\ud83c\udcc2\ud83c\udcc3\ud83c\udcc4\ud83c\udcc5\ud83c\udcc6\ud83c\udcc7\ud83c\udcc8\ud83c\udcc9\ud83c\udcca\ud83c\udccb\ud83c\udccd\ud83c\udcce\" \\\n\t  \"\ud83c\udcd1\ud83c\udcd2\ud83c\udcd3\ud83c\udcd4\ud83c\udcd5\ud83c\udcd6\ud83c\udcd7\ud83c\udcd8\ud83c\udcd9\ud83c\udcda\ud83c\udcdb\ud83c\udcdd\ud83c\udcde\";\n\tsize=1;\n\n      } else if(!strcmp(\"--isalnum\",argv&#91;c]) || \/\/ 9.5.2021 JariK\n\t        !strcmp(\"--isalpha\",argv&#91;c]) ||\n\t        !strcmp(\"--isdigit\",argv&#91;c]) ||\n\t        !strcmp(\"--isgraph\",argv&#91;c]) ||\n\t        !strcmp(\"--islower\",argv&#91;c]) ||\n\t        !strcmp(\"--isprint\",argv&#91;c]) ||\n\t        !strcmp(\"--ispunct\",argv&#91;c]) ||\n\t        !strcmp(\"--isupper\",argv&#91;c]) ||\n\t\t!strcmp(\"--isxdigit\",argv&#91;c])) {\n\tunsigned char *p=digitstemp;\n\tfor(d=0;d&lt;256;d++) {\n\t  if((!strcmp(\"--isalnum\",argv&#91;c]) &amp;&amp; isalnum(d)) ||\n\t     (!strcmp(\"--isalpha\",argv&#91;c]) &amp;&amp; isalpha(d)) ||\n\t     (!strcmp(\"--isdigit\",argv&#91;c]) &amp;&amp; isdigit(d)) ||\n\t     (!strcmp(\"--isgraph\",argv&#91;c]) &amp;&amp; isgraph(d)) ||\n\t     (!strcmp(\"--islower\",argv&#91;c]) &amp;&amp; islower(d)) ||\n\t     (!strcmp(\"--isprint\",argv&#91;c]) &amp;&amp; isprint(d)) ||\n\t     (!strcmp(\"--ispunct\",argv&#91;c]) &amp;&amp; ispunct(d)) ||\n\t     (!strcmp(\"--isupper\",argv&#91;c]) &amp;&amp; isupper(d)) ||\n\t     (!strcmp(\"--isxdigit\",argv&#91;c]) &amp;&amp; isxdigit(d))) {\n\t    *p++=d;\n\t  }\n\t}\n\t*p='\\0';\n\tdigits=digitstemp;\n\tsize=8;\n\n      } else if(!strncmp(\"-i\",argv&#91;c],2)) {\n\tdigits=NULL;\n\tif(*(argv&#91;c]+2)!='\\0') {\n\t  digits=argv&#91;c]+2;\n\t} else if(c+1 &lt; argc) {\n\t  digits=argv&#91;c+1];\n\t  c++;\n\t}\n\tif(digits==NULL || utf8len(digits)&lt;2) {\n\t  fprintf(stderr,\"%s: not enough digits \\\"%s\\\"\\n\",procname,argv&#91;c]);\n\t  help = 1;\n\t}\n\tsize=1;\n\n      } else if(!strcmp(\"--ressu\",argv&#91;c])) {\n\tinput=INPUT_RESSU;\n\n      } else if(!strcmp(\"--debug\",argv&#91;c])) {\n\tinput=INPUT_DEBUG;\n\n      } else if(!strcmp(\"--fast\",argv&#91;c])) {\n\tinput=INPUT_FAST;\n\n      } else if(!strcmp(\"--single\",argv&#91;c])) {\n\tinput=INPUT_SINGLE;\n\n      } else if(!strcmp(\"--urandom\",argv&#91;c])) {\n\tinput=INPUT_URANDOM;\n\n#ifdef USE_RANDOM\n      } else if(!strcmp(\"--random\",argv&#91;c])) {\n\tinput=INPUT_RANDOM;\n\n#endif\n      } else {\n\tfprintf(stderr,\"%s: invalid option %s\\n\",procname,argv&#91;c]);\n\thelp = 1;\n\n      }\n    } else {\n      help = 1;\n\n    } \/\/ if(!strncmp\n  } \/\/ for(c=0\n\n  if(sample) {\n\n\/\/sample file size = CLIM*DLIM*BLKSIZE\n#define CLIM 8192 \/\/ outer loop\n#define DLIM 256 \/\/ inner loop\n#define BLKSIZE 4096 \/\/ block size\n\n#define STAT_LINE_READY 2\n#define STAT_LINE_NOW 2\n#define STAT_LINE_ANIM 2\n    \n#define TIMEFORMAT \"%H:%M %Z\"\n#define TIMEFORMAT2 \"%a %H:%M %Z\"\n#define DATEFORMAT \"%a %d %b %Y\"\n    \n    unsigned int c, d;\n    unsigned char buffer&#91;BLKSIZE];\n    FILE *fp1;\n    time_t secondsstart, secondsnow;\n#ifdef STAT_LINE_ANIM\n    long int secs, prev_secs=-1;\n    int crs=0;\n#endif\n\n    if((fp1=fopen(samplefilename,\"a\")) != NULL) {\n\n      secondsstart=time(NULL);\n\n      for(c=0;c&lt;CLIM;c++) {\n\tsecondsnow=time(NULL);\n\t\n\t\/\/ print status line:\n\t\/\/ blk 10, written 10MB, 269KB\/sec, left 8 h 38 m, ready at Sat 17 Jul 2021 01:57:43 EEST, now Fri 17:19:32 EEST\n\t\n\tstat_line_begin();\n\tstat_line_printf(\"\\rblk %d, written \",c);\n\tstat_line_readable((unsigned long)c*DLIM*BLKSIZE);\n\t\n\tif(c>0) {\n\t  stat_line_printf(\", \");\n\t  stat_line_readable((unsigned long)((double)c*DLIM*BLKSIZE\/(secondsnow-secondsstart)) );\n\t  stat_line_printf(\"\/sec\");\n\n\t  char timebuf&#91;128], timebuf2&#91;128];\n\t  \n#ifdef STAT_LINE_NOW\n\n\t  \/\/ print now\n\t  \n\t  stat_line_printf(\", now\");\n\t  strftime(timebuf,sizeof(timebuf),TIMEFORMAT2,\n\t\t   localtime((time_t *)&amp;secondsnow));\n\t  stat_line_printf(\" %s\",timebuf);\n#endif\n\n\t  \/\/ print left\n\t  \n\t  long int secondsleft=(int)((((double)secondsnow-secondsstart)\/c)*(CLIM-c) );\n\t  long int secondsleft2;\n\t  long int temp,timeprinted=0;\n\n\t  secondsleft2=secondsleft;\n\t  stat_line_printf(\", left\");\n\t  \n\t  temp=secondsleft2\/(24*3600);\n\t  if(temp>0) {\n\t    timeprinted=1;\n\t    stat_line_printf(\" %dd\",temp);\n\t    secondsleft2-=temp*(24*3600);\n\t  }\n\t  temp=secondsleft2\/3600;\n\t  if(temp>0) {\n\t    timeprinted=1;\n\t    stat_line_printf(\" %dh\",temp);\n\t    secondsleft2-=temp*3600;\n\t  }\n\t  temp=secondsleft2\/60;\n\t  if(temp>0) {\n\t    timeprinted=1;\n\t    stat_line_printf(\" %dm\",temp);\n\t    secondsleft2-=temp*60;\n\t  }\n\t  temp=secondsleft2;\n\t  if(!timeprinted) {\n\t    stat_line_printf(\" %d seconds\",temp);\n\t  }\n\n#ifdef STAT_LINE_READY\n\n\t  long int secondsend=(int)secondsstart+((((double)secondsnow-secondsstart)\/c)*CLIM);\n\n\t  \/\/ print end date if different7\n\t  \n\t  stat_line_printf(\", ready at\");\n\t  strftime(timebuf,sizeof(timebuf),DATEFORMAT,\n\t\t   localtime((time_t *)&amp;secondsend));\n\t  strftime(timebuf2,sizeof(timebuf2),DATEFORMAT,\n\t\t   localtime((time_t *)&amp;secondsnow));\n\t  if(strcmp(timebuf,timebuf2)) {\n\t    stat_line_printf(\" %s\",timebuf);\n\t  }\n\n\t  \/\/ print end time\n\t  \n\t  strftime(timebuf,sizeof(timebuf),TIMEFORMAT,\n\t\t   localtime((time_t *)&amp;secondsend));\n\t  stat_line_printf(\" %s\",timebuf);\n#endif\n\n\t}\n\n\tstat_line_end();\n\t\n\t\/\/ do the work\n\t\n#ifdef STAT_LINE_ANIM\n\tunsigned char cursor&#91;4] = { '|', '\/', '-', '\\\\' };\n\n\tfprintf(stderr,\" \");\n#endif\n\tfor(d=0;d&lt;DLIM;d++) {\n#ifdef STAT_LINE_ANIM\n\t  secs=time(NULL)%sizeof(cursor);\n\t  if(prev_secs!=secs) {\n\t    if(prev_secs!=-1) \n\t      crs=(crs+1)%sizeof(cursor);\n\t    fprintf(stderr,\"\\b%c\",cursor&#91;crs]);\n\t    fflush(stderr);\n\t    prev_secs=secs;\n\t  }\n#endif\n\t  if(input==INPUT_RESSU) \/\/ ressu prod\n\t    ressu_genbytes(sizeof(buffer),buffer);\n\t  else if(input==INPUT_DEBUG) \/\/ ressu debug\n\t    ressu_genbytes_debug(sizeof(buffer),buffer);\n\t  else if(input==INPUT_FAST) \/\/ ressu fast\n\t    ressu_genbytes_fast(sizeof(buffer),buffer);\n\t  else if(input==INPUT_SINGLE) \/\/ ressu single\n\t    ressu_genbytes_single(sizeof(buffer),buffer);\n\t  else if(input==INPUT_URANDOM) \/\/ urandom\n\t    readfile_xor(sizeof(buffer),buffer,urandomfilename);\n#ifdef USE_RANDOM\n\t  else if(input==INPUT_RANDOM) \/\/ random\n\t    readfile_xor(sizeof(buffer),buffer,randomfilename);\n#endif\n\t  \n#ifdef WRITE_SAMPLE\n\t  fwrite(buffer,1,sizeof(buffer),fp1);\n#endif\n\t} \/\/ for(d=0;\n#ifdef STAT_LINE_ANIM\n\tfprintf(stderr,\"\\b \\b\");\n\tprev_secs=-1;\n#endif\n      }\n      fclose(fp1);\n    } \/\/ if((fp1=fopen\n\n    \/\/ remove last status line\n    \n    stat_line_begin();\n    stat_line_printf(\"Done!\");\n    stat_line_end();\n    fprintf(stdout,\"\\n\");\n    fflush(stdout);\n    exit(0);\n  } \/\/ if(sample)\n  \n  \/\/ get linenumber length in digits\n\n  plinesdigits=line_number_length();\n\n  \/\/ get data length in digits\n\n  if(limit!=0) {\n    unsigned char wordbuf&#91;128];\n    out_word(sizeof(wordbuf),wordbuf,digits,limit-1);\n    size=utf8len(wordbuf);\n  }\n\n  pchars=0;\n  pwords=0;\n  int linew=0;\n\n  \/\/ in beginning of line, count printed line number\n      \n  if(!quiet &amp;&amp; slineno) {\n    sprintf(linenobuf,\"%0*d\",plinesdigits,plines);\n    pchars += strlen(linenobuf);\n    pchars++;\n  }\n\n  \/\/ count words\n  \n  while((chars>0 &amp;&amp; pchars+size &lt; chars) ||\n\t(words>0 &amp;&amp; pwords &lt; words)) {\n\n    linew++;\n\n    if(sspace>=2 &amp;&amp;\n       ( (pwords>0 &amp;&amp; pwords%sspace==0) ||\n\t (slineno &amp;&amp; pwords==0) ) )\n      pchars++;\n    \n    if(sspace &amp;&amp;\n       ( (pwords>0) ||\n\t (slineno &amp;&amp; pwords==0) ) ) \n      pchars++;\n\n    pchars+=size;\n    pwords++;\n  }\n\n  unsigned long wordvalues=1;\n\n  for(c=0;c&lt;size;c++) {\n    if(wordvalues!=0 &amp;&amp; wordvalues*utf8len(digits)&lt;(unsigned long)65536*65536*65536) {\n      wordvalues*=utf8len(digits);\n    } else {\n      wordvalues=0;\n    }\n  }\n\n  if(limit > 0) {\n    if(sort==1 &amp;&amp; limit-!zero&lt;words) {\n      fprintf(stderr,\"%s: limit is less than words (zero)\",procname);\n      fprintf(stderr,\", limit:%lu\",limit);\n      fprintf(stderr,\", words:%d\",words);\n      fprintf(stderr,\", zero:%d\",zero);\n      fprintf(stderr,\"\\n\");\n      \n      help=1;\n      lines=0;\n    }\n  } else {\n    if(sort==1 &amp;&amp; size>0 &amp;&amp; wordvalues>0 &amp;&amp; wordvalues&lt;linew) {\n      fprintf(stderr,\"%s:\",procname);\n      fprintf(stderr,\" digits is less than calculated words\");\n      fprintf(stderr,\", digits:%d(%lu)\",utf8len(digits),wordvalues);\n      fprintf(stderr,\", words:%d\\n\",linew);\n      help=1;\n      lines=0;\n    }\n  }\n\n  \/\/ small words as single ressu_gen_limit()\n  \n  if(limit==0 &amp;&amp; wordvalues>0)\n    limit=wordvalues;\n\n  if(stats) {\n    fprintf(stdout,\"randomsource: %s\",randomgen&#91;input]);\n    fprintf(stdout,\", size: %d\",size);\n    fprintf(stdout,\", linew: %d\",linew);\n    fprintf(stdout,\", pchars: %d\",pchars);\n    fprintf(stdout,\", pwords: %d\",pwords);\n    fprintf(stdout,\", digitslen: %d\",utf8len(digits));\n    if(wordvalues>0)\n      fprintf(stdout,\", wordvalues: %lu\",wordvalues);\n    if(limit>0)\n      fprintf(stdout,\", limit: %lu\",limit);\n    fprintf(stdout,\"\\n\");\n  }\n  \n  if(help) {\n    struct helpline {\n      char *command;\n      char *text;\n    } helplines&#91;] = {\n      { \"newressu -d\", \"print random decimal digits\" },\n      { \"newressu -o\", \"print octal digits\" },\n      { \"newressu -x\", \"print hexadecimal digits\" },\n      { \"newressu -b\", \"print binary digits\" },\n      { \"newressu -d --space\", \"print decimal digits, with spaces between \\\"words\\\"\" },\n      { \"newressu -b --space\", \"print binary digits, with spaces between \\\"words\\\"\" },\n      { \"newressu -d -l30\", \"print decimal digits, 30 lines\" },\n      { \"newressu -d -l30 --lineno\", \"print decimal digits, 30 lines, no linenumbers\"  },\n      { \"newressu -d -c128\", \"print decimal digits, 128 characters per line\"  },\n      { \"newressu -d --lim10\", \"print decimal numbers between 0-9\" },\n      { \"newressu -d --lim10 -x\",\"print hexadecimal numbers with decimal limit\" },\n      { \"newressu -d -s10 --space\",\"print decimal numbers with spaces and wordsize 10\" },\n      { \"newressu -d --space --zero --lim7\",\"print rollings of dice (1-6)\" },\n      { \"newressu -b -s1 --space\",\"print throws of coin (0,1)\" },\n      { \"newressu -d --lim41 -w7 --zero --lotto\",\"print lotto numbers for finnish lotto 7x(1-40)\" },\n      { \"newressu -d -s5 --sort -w16\",\"print 16 sorted decimal numbers from 0 to 99999\" },\n      { \"newressu --isalnum\", \"print alphanumeric characters\" },\n      { \"newressu --isalpha\", \"print alphabetic characters\" },\n      { \"newressu --isgraph\", \"print printables excluding space\" },\n      { \"newressu --islower\", \"print lowercase characters\" },\n      { \"newressu --ispunct\", \"print punctuation characters\" },\n      { \"newressu --isupper\", \"print uppercase characters\" },\n      { \"newressu -1\", \"print material for passwords\" },\n      { \"newressu -i\u0430\u044d\u044b\u0443\u043e\u044f\u0435\u0451\u044e\u0438\", \"print russian vowels\" },\n      { \"newressu --ressu\", \"use randomness from ressu (default)\" },\n      { \"newressu --debug\", \"use randomness from debugging ressu\" },\n      { \"newressu --fast\", \"use randomness from fast ressu\" },\n      { \"newressu --single\", \"use randomness from single round of ressu\" },\n      { \"newressu --urandom\", \"use randomness from \/dev\/urandom\" },\n#ifdef USE_RANDOM\n      { \"newressu --random\", \"use randomness from \/dev\/random\" },\n#endif\n    };\n    \n    for(c=0;c&lt;sizeof(helplines)\/sizeof(helplines&#91;0]);c++) {\n      fprintf(stderr,\"%-50s\",helplines&#91;c].text);\n      fprintf(stderr,\"%-25s\",helplines&#91;c].command);\n      fprintf(stderr,\"\\n\");\n    }\n    for(c=0;c&lt;chars;c++)\n      fprintf(stdout,\"*\");\n    fprintf(stdout,\"\\n\");\n    if(lines>1)\n      lines=1; \/\/ print one line below help as a sample\n  }\n\n  if(lines==0)\n    exit(1);\n\n  int linecnt=0;\n  unsigned char *line=NULL;\n  unsigned char wordbuf&#91;1025];\n  \n  for(;;) {\n\n    if(!sort) { \/\/ also lotto\n\n      pwords=0;\n\n      while(pwords&lt;linew) {\n\treadword(wordbuf);\n\n\tif(!quiet) {\n\n\t  \/\/ in beginning of line, print line number\n\n\t  print_line_number();\n\t\n\t  \/\/ want to print spaces between \"words\"?\n\n\t  print_spaces();\n\t\n\t  \/\/ print word\n\n\t  print_word(wordbuf);\n\t}\n\n\tpwords++;\n      } \/\/ while(pwords&lt;linew) {\n    } else { \/\/ if(!sort)\n\n      pwords=0;\n      \n      line_clear(&amp;linecnt,&amp;line);\n\n      \/\/ fetch and save words on this row\n\n      while(pwords&lt;linew) {\n\treadword(wordbuf);\n\n\tif(line_add_string_sort(&amp;linecnt,&amp;line,wordbuf)) {\n\t  pwords++;\n\t}\n      } \/\/ while(pwords&lt;linew) {\n\n      pwords=0;\n\n      \/\/ print words on this row\n\n      while(pwords&lt;linew) {\n\n\tline_get_string(sizeof(wordbuf),wordbuf,pwords,line);\n\n\tif(!quiet) {\n\n\t  \/\/ in beginning of line, print line number\n\n\t  print_line_number();\n\t\n\t  \/\/ want to print spaces between \"words\"?\n\t\n\t  print_spaces();\n\n\t  \/\/ print word\n\t\n\t  print_word(wordbuf);\n\t}\n\tpwords++;\n      } \/\/ while(pwords&lt;linew) {\n    } \/\/ if(!sort)\n\n    if(!quiet) {\n      fprintf(stdout,\"\\n\");\n    }\n    plines++;\n    if(!quiet &amp;&amp; snewline>1 &amp;&amp;\n       plines&lt;lines &amp;&amp;\n       plines%snewline==0)\n      fprintf(stdout,\"\\n\");\n\n    \/\/ all needed lines printed?\n\n    if(plines >= lines)\n      break;\n\n  } \/\/ for(;;)\n  fflush(stdout);\n}\n\n#endif \/\/ MAIN<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Kaikki oikeudet pid\u00e4tet\u00e4\u00e4n. T\u00e4ss\u00e4 versiossa ressusta on uusi yksinkertaisempi keskiarvoon perustuva tapa luokitella ketjut laskettaviin ja ei laskettaviin. Lis\u00e4ksi &#8211;sample kytkimeen on lis\u00e4tty status rivi, joka kertoo t\u00e4ll\u00e4 hetkell\u00e4 kirjoitettavan 1MB blokin, generaattorin nopeuden, t\u00e4m\u00e4n hetkisen kellonajan, j\u00e4ljell\u00e4 olevan ajoajan ja valmistumisajan. Lis\u00e4ksi ohjelmaan on lis\u00e4tty &#8220;naapureiden&#8221; ja muiden kirjainmerkist\u00f6j\u00e4. Edit: lis\u00e4tty kappaleita postin loppuun,&hellip; <a class=\"more-link\" href=\"https:\/\/moijari.com\/?p=1724\">Continue reading <span class=\"screen-reader-text\">Ressu 2.3 Little rewrite, changes to &#8211;sample, some new alphabets,  new INPUT definations, change in &#8211;space option, new &#8211;newline option, rewrite to output routine<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6,11],"tags":[],"_links":{"self":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/1724"}],"collection":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1724"}],"version-history":[{"count":25,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/1724\/revisions"}],"predecessor-version":[{"id":1754,"href":"https:\/\/moijari.com\/index.php?rest_route=\/wp\/v2\/posts\/1724\/revisions\/1754"}],"wp:attachment":[{"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1724"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1724"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/moijari.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1724"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}