From 57f683f181495b802761d23e36b6d7ff75863613 Mon Sep 17 00:00:00 2001 From: la-ninpre Date: Mon, 31 May 2021 23:22:36 +0000 Subject: added initial files FossilOrigin-Name: ec9a2c52b6452b8e2ad9d1e6e692c3288c28c0dde71fb72371885b7750ce08c8 --- Makefile | 37 +++++++++++++++++ makenimitoki.c | 93 +++++++++++++++++++++++++++++++++++++++++ makenimitoki.h | 20 +++++++++ nimisewi.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++ nimisewi.h | 22 ++++++++++ nimitoki.c | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ nimitoki.h | 10 +++++ nimitoki.txt | 120 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 535 insertions(+) create mode 100644 Makefile create mode 100644 makenimitoki.c create mode 100644 makenimitoki.h create mode 100644 nimisewi.c create mode 100644 nimisewi.h create mode 100644 nimitoki.c create mode 100644 nimitoki.h create mode 100644 nimitoki.txt diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1cabe1f --- /dev/null +++ b/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/ + diff --git a/makenimitoki.c b/makenimitoki.c new file mode 100644 index 0000000..e2b5ea7 --- /dev/null +++ b/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 +#include +#include +#include +#include + +#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_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; +} diff --git a/makenimitoki.h b/makenimitoki.h new file mode 100644 index 0000000..7659b3d --- /dev/null +++ b/makenimitoki.h @@ -0,0 +1,20 @@ +#ifndef MAKENIMITOKI_H +#define MAKENIMITOKI_H + +#include + +/* 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 */ diff --git a/nimisewi.c b/nimisewi.c new file mode 100644 index 0000000..34623d0 --- /dev/null +++ b/nimisewi.c @@ -0,0 +1,104 @@ +#include +#include +#include +#include + +#include +#include + +#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; +} + diff --git a/nimisewi.h b/nimisewi.h new file mode 100644 index 0000000..cf64fb4 --- /dev/null +++ b/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 */ diff --git a/nimitoki.c b/nimitoki.c new file mode 100644 index 0000000..db8cb97 --- /dev/null +++ b/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 *); \ No newline at end of file diff --git a/nimitoki.h b/nimitoki.h new file mode 100644 index 0000000..bf909fe --- /dev/null +++ b/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 */ \ No newline at end of file diff --git a/nimitoki.txt b/nimitoki.txt new file mode 100644 index 0000000..3f14ab9 --- /dev/null +++ b/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 -- cgit v1.2.3