all repos — nimisewi_c @ 57f683f181495b802761d23e36b6d7ff75863613

simple random toki pona phrase generator

added initial files

FossilOrigin-Name: ec9a2c52b6452b8e2ad9d1e6e692c3288c28c0dde71fb72371885b7750ce08c8
la-ninpre leobrekalini@gmail.com
Mon, 31 May 2021 23:22:36 +0000
commit

57f683f181495b802761d23e36b6d7ff75863613

parent

cc2975038177e2738ea9d75100d534a0296fa260

8 files changed, 535 insertions(+), 0 deletions(-)

jump to
A Makefile

@@ -0,0 +1,37 @@

+PREFIX ?= /usr/local/ +CFLAGS += -pedantic -Wall -Wextra -Wmissing-prototypes \ + -Wstrict-prototypes -Wwrite-strings + +NIMITOKI = nimitoki.c nimitoki.h + +.SUFFIXES: .c .o + +.c.o: + ${CC} ${CFLAGS} -c $< + +all: nimitoki.o nimisewi + +nimitoki.o: ${NIMITOKI} + +${NIMITOKI}: makenimitoki + ./makenimitoki nimitoki.txt + +makenimitoki: makenimitoki.o + ${CC} ${CFLAGS} -o $@ makenimitoki.o + +nimisewi: nimisewi.o nimitoki.o + ${CC} ${CFLAGS} -o $@ nimisewi.o nimitoki.o + +clean: + find . \( -name "*.o" -o -name nimisewi -o -name makenimitoki \) -delete + +distclean: + find . \( -name "*.o" \ + -o -name nimisewi \ + -o -name makenimitoki \ + -o -name nimitoki.c \ + -o -name nimitoki.h \) -delete + +install: nimisewi + install -o root -g wheel nimisewi ${PREFIX}/bin/ +
A makenimitoki.c

@@ -0,0 +1,93 @@

+/* Copyright (c) 2021, la-ninpre + * + * this file creates necessary data files for nimisewi.c. + * + * i thought that it would be stupid to hardcode all the tokipona words into + * actual code, so this little program is created. it reads nimitoki.txt file + * which is in such format that one word is on separate line. i hope it's + * easy now to add and remove desired words. + * + * it's use is very narrow and tied to nimisewi.c, but it could be adapted. + * + * TODO: make use of templates, maybe? + */ +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include "makenimitoki.h" + +void +make_header(FILE *nimitoki_h) +{ + fprintf(nimitoki_h, + _MAKENIMITOKI_COMMENT_ + "#ifndef NIMI_TOKI_H\n" + "#define NIMI_TOKI_H\n\n" + + "extern const char *nimi_toki[]; /* list of words */\n" + "extern const unsigned long suli_pi_nimi_toki /* length of word list */;\n\n" + + "#endif /* NIMI_TOKI_H */\n"); +} + +void +make_nimi_toki(FILE *nimitoki_txt, FILE *nimitoki_c) +{ + char buf[NIMI_TOKI_MAX_LENGTH]; + + fprintf(nimitoki_c, + _MAKENIMITOKI_COMMENT_ + "#include \"nimitoki.h\"\n\n"); + + fprintf(nimitoki_c, "const char *nimi_toki[] = {\n"); + + while (fgets(buf, NIMI_TOKI_MAX_LENGTH, nimitoki_txt) != NULL) { + buf[strlen(buf)-1] = '\0'; /* i know it's weird, but :) */ + fprintf(nimitoki_c, " \"%s\",\n", buf); + } + + fprintf(nimitoki_c, "};\n\n"); + + fprintf(nimitoki_c, "const unsigned long suli_pi_nimi_toki = " + "sizeof(nimi_toki)/sizeof(const char *);\n"); +} + +int +main(int argc, char *argv[]) +{ + FILE *nimitoki_txt; /* list of words */ + FILE *nimitoki_h; /* output header file */ + FILE *nimitoki_c; /* output code file */ + char *nimitoki_txt_path; + +#ifdef __OpenBSD__ + if (pledge("stdio rpath wpath cpath", NULL) == -1) { + err(EXIT_FAILURE, "pledge"); + } +#endif + + if (argc < 1 || argc > 2) { + err(EXIT_FAILURE, "usage: makenimitoki <nimitoki.txt>"); + } + + nimitoki_txt_path = argv[1]; + + nimitoki_txt = fopen(nimitoki_txt_path, "r"); + if (nimitoki_txt == NULL) { + err(EXIT_FAILURE, "file not found"); + } + + nimitoki_h = fopen("nimitoki.h", "w"); + make_header(nimitoki_h); + fclose(nimitoki_h); + + nimitoki_c = fopen("nimitoki.c", "w"); + make_nimi_toki(nimitoki_txt, nimitoki_c); + fclose(nimitoki_txt); + fclose(nimitoki_c); + + return 0; +}
A makenimitoki.h

@@ -0,0 +1,20 @@

+#ifndef MAKENIMITOKI_H +#define MAKENIMITOKI_H + +#include <stdio.h> + +/* for now the longest tokipona word is kijetesantakalu, which is + * 15 characters long, so the limit is it's length + newline + zero-character + */ +#define NIMI_TOKI_MAX_LENGTH 17 + +#define _MAKENIMITOKI_COMMENT_ \ + "/* this file is generated by makenimitoki program,\n"\ + " * so do not edit it directly, but modify makenimitoki.c as you wish\n"\ + " */\n" + +void make_header(FILE *nimitoki_h); + +void make_nimi_toki(FILE *nimitoki_txt, FILE *nimitoki_c); + +#endif /* MAKENIMITOKI_H */
A nimisewi.c

@@ -0,0 +1,104 @@

+#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include <sys/types.h> +#include <sys/time.h> + +#include "nimisewi.h" +#include "nimitoki.h" /* nimi_toki, suli_pi_nimi_toki */ + +void +open_e_nanpa_sewi() { + pid_t pid; + struct timeval time; + + gettimeofday(&time, NULL); + pid = getpid(); + srand(pid * time.tv_usec * time.tv_sec); +} + +const char +*pana_e_nimi(const char *nimi_mute[], + const int suli_pi_nimi_mute, + const int nanpa_nimi) +{ + if (nanpa_nimi > suli_pi_nimi_mute) { + err(EXIT_FAILURE, "index out of bounds"); + } else if (nanpa_nimi == -1) { + return "pi"; + } else { + return nimi_mute[nanpa_nimi]; + } +} + +void +pana_e_nanpa_nimi(struct nanpa_nimi *nn) +{ + nn->pi_li_lon = 0; + nn->nanpa_pi = -1; + nn->nanpa_nimi = (rand() % 6); + + if (nn->nanpa_nimi == 2) { + nn->pi_li_lon = rand() % 2; + } else if (nn->nanpa_nimi > 2) { + nn->pi_li_lon = 1; + } + if (nn->pi_li_lon) { + nn->nanpa_nimi++; + nn->nanpa_pi = (nn->nanpa_nimi / 2); + } +} + +void +pana_e_nanpa_pi_nimi_sewi(int *nanpa_sewi_mute, + const int suli_nimi, + struct nanpa_nimi *nn) +{ + int i; + + for (i = 0; i <= nn->nanpa_nimi; i++) { + nanpa_sewi_mute[i] = rand() % suli_nimi; + } + + if (nn->pi_li_lon) { + nanpa_sewi_mute[nn->nanpa_pi] = -1; + } +} + +int +main(void) +{ + int *nanpa_sewi_nimi; + int i; + struct nanpa_nimi nn; + +#ifdef __OpenBSD__ + if (pledge("stdio", NULL) == -1) { + err(EXIT_FAILURE, "pledge"); + } +#endif + open_e_nanpa_sewi(); + + pana_e_nanpa_nimi(&nn); + + nanpa_sewi_nimi = (int *) calloc(nn.nanpa_nimi + 1, sizeof(int)); + if (nanpa_sewi_nimi == NULL) { + err(EXIT_FAILURE, "calloc"); + } + + pana_e_nanpa_pi_nimi_sewi(nanpa_sewi_nimi, suli_pi_nimi_toki, &nn); + + for (i = 0; i < nn.nanpa_nimi; i++) { + printf("%s ", + pana_e_nimi(nimi_toki, suli_pi_nimi_toki, nanpa_sewi_nimi[i])); + } + printf("%s", pana_e_nimi(nimi_toki, suli_pi_nimi_toki, nanpa_sewi_nimi[i])); + printf("\n"); + + free(nanpa_sewi_nimi); + + return 0; +} +
A nimisewi.h

@@ -0,0 +1,22 @@

+#ifndef NIMI_SEWI_H +#define NIMI_SEWI_H + +struct nanpa_nimi { + int nanpa_nimi; + int pi_li_lon; + int nanpa_pi; +}; + +void open_e_nanpa_sewi(void); + +void pana_e_nanpa_nimi(struct nanpa_nimi *nn); + +void pana_e_nanpa_pi_nimi_sewi(int *nanpa_sewi_mute, + const int suli_nimi, + struct nanpa_nimi *nn); + +const char *pana_e_nimi(const char *nimi_mute[], + const int suli_pi_nimi_mute, + const int nanpa_nimi); + +#endif /* NIMI_SEWI_H */
A nimitoki.c

@@ -0,0 +1,129 @@

+/* this file is generated by makenimitoki program, + * so do not edit it directly, but modify makenimitoki.c as you wish + */ +#include "nimitoki.h" + +const char *nimi_toki[] = { + "a", + "ala", + "akesi", + "alasa", + "ale", + "anpa", + "ante", + "apeja", + "awen", + "esun", + "ijo", + "ike", + "ilo", + "insa", + "jaki", + "jan", + "jelo", + "jo", + "kala", + "kalama", + "kama", + "kasi", + "ken", + "kepeken", + "kijetesantakalu", + "kili", + "kiwen", + "ko", + "kon", + "kule", + "kulupu", + "kute", + "lape", + "laso", + "lawa", + "len", + "lete", + "lili", + "linja", + "lipu", + "loje", + "lon", + "luka", + "lukin", + "lupa", + "ma", + "mama", + "mani", + "meli", + "mi", + "mije", + "moku", + "moli", + "monsi", + "monsuta", + "mu", + "mun", + "musi", + "mute", + "namako", + "nanpa", + "nasa", + "nasin", + "nena", + "ni", + "nimi", + "noka", + "oko", + "olin", + "ona", + "open", + "pakala", + "pake", + "pali", + "palisa", + "pan", + "pana", + "pilin", + "pimeja", + "pini", + "pipi", + "poka", + "poki", + "pona", + "pu", + "sama", + "seli", + "selo", + "seme", + "sewi", + "sijelo", + "sike", + "sin", + "sina", + "sinpin", + "sitelen", + "sona", + "soweli", + "suli", + "suno", + "supa", + "suwi", + "tan", + "taso", + "tawa", + "telo", + "tenpo", + "toki", + "tomo", + "tonsi", + "tu", + "unpa", + "uta", + "utala", + "walo", + "wan", + "waso", + "wawa", + "weka", + "wile", +}; + +const unsigned long suli_pi_nimi_toki = sizeof(nimi_toki)/sizeof(const char *);
A nimitoki.h

@@ -0,0 +1,10 @@

+/* this file is generated by makenimitoki program, + * so do not edit it directly, but modify makenimitoki.c as you wish + */ +#ifndef NIMI_TOKI_H +#define NIMI_TOKI_H + +extern const char *nimi_toki[]; /* list of words */ +extern const unsigned long suli_pi_nimi_toki /* length of word list */; + +#endif /* NIMI_TOKI_H */
A nimitoki.txt

@@ -0,0 +1,120 @@

+a +ala +akesi +alasa +ale +anpa +ante +apeja +awen +esun +ijo +ike +ilo +insa +jaki +jan +jelo +jo +kala +kalama +kama +kasi +ken +kepeken +kijetesantakalu +kili +kiwen +ko +kon +kule +kulupu +kute +lape +laso +lawa +len +lete +lili +linja +lipu +loje +lon +luka +lukin +lupa +ma +mama +mani +meli +mi +mije +moku +moli +monsi +monsuta +mu +mun +musi +mute +namako +nanpa +nasa +nasin +nena +ni +nimi +noka +oko +olin +ona +open +pakala +pake +pali +palisa +pan +pana +pilin +pimeja +pini +pipi +poka +poki +pona +pu +sama +seli +selo +seme +sewi +sijelo +sike +sin +sina +sinpin +sitelen +sona +soweli +suli +suno +supa +suwi +tan +taso +tawa +telo +tenpo +toki +tomo +tonsi +tu +unpa +uta +utala +walo +wan +waso +wawa +weka +wile