aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorla-ninpre <leobrekalini@gmail.com>2021-05-31 23:22:36 +0000
committerla-ninpre <leobrekalini@gmail.com>2021-05-31 23:22:36 +0000
commit57f683f181495b802761d23e36b6d7ff75863613 (patch)
treea0a8777e21cdce16a6e10d49a8e6440bd38f7518
parentcc2975038177e2738ea9d75100d534a0296fa260 (diff)
downloadnimisewi_c-57f683f181495b802761d23e36b6d7ff75863613.tar.gz
nimisewi_c-57f683f181495b802761d23e36b6d7ff75863613.zip
added initial filesv0.0.1
FossilOrigin-Name: ec9a2c52b6452b8e2ad9d1e6e692c3288c28c0dde71fb72371885b7750ce08c8
-rw-r--r--Makefile37
-rw-r--r--makenimitoki.c93
-rw-r--r--makenimitoki.h20
-rw-r--r--nimisewi.c104
-rw-r--r--nimisewi.h22
-rw-r--r--nimitoki.c129
-rw-r--r--nimitoki.h10
-rw-r--r--nimitoki.txt120
8 files changed, 535 insertions, 0 deletions
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 <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;
+}
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 <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 */
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 <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;
+}
+
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