You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.0 KiB
C
99 lines
3.0 KiB
C
#include <stdio.h>
|
|
#include <libkoishi.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <signal.h>
|
|
|
|
#define BREAK() if(debug)raise(SIGTRAP);
|
|
|
|
int main(int argc, char **argv) {
|
|
puts("koishi.c - libkoishi example program");
|
|
|
|
int debug = 0;
|
|
if (getenv("KSH_DEBUG") && !strcmp(getenv("KSH_DEBUG"), "1")) {
|
|
debug = 1;
|
|
printf("Warning: debug tracing enabled, will raise SIGTRAP\n");
|
|
}
|
|
|
|
ksh_model_t *model = ksh_createmodel(16, NULL, 0xb00b);
|
|
printf("allocated model (%p)\n", model);
|
|
|
|
BREAK();
|
|
|
|
ksh_u32char name[] = {'a', 'b', 'c', 'd'};
|
|
ksh_u32char name2[] = {'b', 'c', 'd', 'e'};
|
|
ksh_makeassociation(model, name, 'e');
|
|
printf("associated 'e' to 'abcd'\n");
|
|
|
|
ksh_u32char c = ksh_getcontinuation(model, name);
|
|
printf("Got the character '%c' as continuation to 'abcd'\n", c);
|
|
|
|
ksh_makeassociation(model, name, 'e');
|
|
ksh_makeassociation(model, name, 'f');
|
|
ksh_makeassociation(model, name, 'g');
|
|
ksh_makeassociation(model, name2, 'f');
|
|
printf("Made associations for 'abcdef', 'abcdf', 'abcdg'\n");
|
|
|
|
BREAK();
|
|
|
|
for (int i = 0; i < 5; i++) {
|
|
c = ksh_getcontinuation(model, name);
|
|
printf("Got the character '%c' as continuation to 'abcd'\n", c);
|
|
}
|
|
c = ksh_getcontinuation(model, name2);
|
|
printf("Got the character '%c' as continuation to 'bcde'\n", c);
|
|
|
|
BREAK();
|
|
|
|
// simple long string with some random polish in it
|
|
ksh_trainmarkov(model, "Grzegorz Brzęczyszczykiewicz, Chrząszczyżewoszyce, powiat Łękołody.");
|
|
// a similar long string, just to cause the chain to jump around a bit
|
|
ksh_trainmarkov(model, "Grzegorz Brzęczyszczykiewicz, Chrząszczyżewoszyce Małe, województwo Łękołodzkie.");
|
|
// alternative timeline where Franciszek Dolas was captured by the Japanese and unicode wasnt a thing yet so he was interested to see how their systems handle both japanese and polish in the same string
|
|
ksh_trainmarkov(model, "Brzęczyszczykiewicz Grzegorz です.");
|
|
// invalid unicode sequences - only start byte, stray continuation, wrongly encoded NUL (should be stripped on read)
|
|
ksh_trainmarkov(model, "abc""\xF0""def""\x80""ghi""\xC0""\x80""jkl");
|
|
printf("Trained some strings with Unicode\n");
|
|
|
|
BREAK();
|
|
|
|
|
|
char buf[128];
|
|
for (int i = 0; i < 10; i++) {
|
|
ksh_createstring(model, buf, 128);
|
|
printf("Generated string: '\033[97m%s\033[0m'\n", buf);
|
|
}
|
|
|
|
FILE *f = fopen("test.ksh", "w");
|
|
ksh_savemodel(model, f);
|
|
fclose(f);
|
|
printf("Saved model\n");
|
|
|
|
ksh_freemodel(model);
|
|
printf("Deallocated model\n");
|
|
|
|
BREAK();
|
|
|
|
model = ksh_createmodel(8, NULL, 0x51d3b00b);
|
|
f = fopen("test.ksh", "r");
|
|
int r = ksh_loadmodel(model, f);
|
|
if (r < 0) {
|
|
printf("Loading model failed (%d), file left at byte 0x%x\n", r, ftell(f));
|
|
fclose(f);
|
|
return 1;
|
|
}
|
|
fclose(f);
|
|
BREAK();
|
|
printf("Loaded model again from file\n");
|
|
for (int i = 0; i < 10; i++) {
|
|
ksh_createstring(model, buf, 128);
|
|
printf("Generated string: '\033[97m%s\033[0m'\n", buf);
|
|
}
|
|
|
|
for (int i = 0; i < 4; i++) {
|
|
ksh_continuestring(model, buf, 128, "Brz");
|
|
printf("Generated \"Brz\" prefixed string: '\033[97m%s\033[0m'\n", buf);
|
|
}
|
|
|
|
return 0;
|
|
} |