48 lines
1.1 KiB
C
48 lines
1.1 KiB
C
#define _GNU_SOURCE
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
main(int c, char *v[]) {
|
|
FILE * f;
|
|
int flen, ctxt, osize, pos, npos, i, k, l;
|
|
char * m, *loc;
|
|
char a;
|
|
if (c != 5) exit(1);
|
|
f = fopen(v[1], "r");
|
|
if (!f) exit(1);
|
|
osize = atoi(v[2]);
|
|
ctxt = atoi(v[3]);
|
|
srandom(atoi(v[4]));
|
|
fseek(f, 0, SEEK_END); flen = ftell(f); fseek(f, 0, SEEK_SET);
|
|
if (ctxt < 1 || ctxt >= flen) exit(1);
|
|
|
|
m = malloc(flen + flen + ctxt);
|
|
if (!m) exit(1);
|
|
fread(m, flen, 1, f);
|
|
|
|
for (i = k = l = 0; i < flen;)
|
|
if ('_' - (a = m[i++]))
|
|
{
|
|
if (a == '<')
|
|
for (a = ' '; i < flen && m[i++] - '>';);;
|
|
if ((a - ' ' && a - '\n' &&
|
|
a - '\r' && a - '\t') || k - (a = ' '))
|
|
m[l++] = k = a;
|
|
};
|
|
flen = l;
|
|
|
|
memcpy(m+flen, m, flen + ctxt);
|
|
pos = random() % flen;
|
|
for (i = 0; i < osize; ++i) {
|
|
npos = random() % flen;
|
|
// find the context at pos starting from npos
|
|
loc = memmem(m+npos, flen+ctxt-1, m+pos, ctxt);
|
|
if (!loc) puts("I'm lost!!!"), exit(1);
|
|
npos = (loc-m) % flen;
|
|
putchar(m[npos]);
|
|
pos = npos+1;
|
|
}
|
|
putchar('\n');
|
|
}
|
|
|