shithub: nime

Download patch

ref: 6775c0a9a046673bb6e472bd286271725013968a
parent: 920367d75626ca3077dc881dcba8c19530bbab03
author: Ethan Long <ethandavidlong@gmail.com>
date: Mon Jun 28 01:27:59 EDT 2021

Cleaned up the code, added comments, fixed ん handling.

--- a/src/test.c
+++ b/src/test.c
@@ -1,4 +1,5 @@
 #include <u.h>
+#include <stdio.h>
 #include <libc.h>
 #include <String.h>
 
@@ -43,5 +44,18 @@
 		print("%C\n", (Rune)(12353 + i));
 	}
 	
+	print("%d , %d\n", (1 == 1), (1 != 1));
+	if(1){
+		print("True\n");
+	}
+	
+	char teststring[3] = "abc";
+	print("%s\n", teststring);
+	teststring[0] = 0;
+	print("%s\n", teststring);
+	char lol[3] = "lol";
+	Rune tesuto[4] = L"テスト";
+	int fp = fileno(stdout);
+	fprint(fp, "%s\n%S\n", lol, tesuto);
 	exits(nil);
 }
--- a/src/to-kana.c
+++ b/src/to-kana.c
@@ -1,11 +1,103 @@
 #include <u.h>
 #include <stdio.h>
 #include <libc.h>
-#include <String.h>
 
+void eval(int, int);
+void kanafill(Rune, char*, int, Rune*);
+void kanalook(char*, Rune*);
+void printhelp(void);
+int strappend(char*, char);
+
+
 void
-kanafill(Rune base, char in[2], int dakuten, Rune* out)
+main(int argc, char *argv[])
 {
+	int fpin, fpout;
+	ARGBEGIN{
+	case 's':
+		fpin = fileno(stdin);
+		fpout = fileno(stdout);
+		eval(fpin, fpout);
+		break;
+	case 'h':
+		printhelp();
+		exits(0);
+	default:
+		fprint(2, "usage: %s [-s][-h]\n", argv0);
+		printhelp();
+		exits("usage");
+	}ARGEND;
+	exits(nil);
+}
+
+void
+printhelp(void)
+{
+	print("options:\n");
+	print(" [-s] - use stdin stream\n");
+	print(" [-h] - show this help\n");
+	return;
+}
+
+/*
+ * Runs through the input at the file pointer fpin until it reaches EOF
+ * outputs kana to file pointer fpout.
+ */
+void
+eval(int fpin, int fpout)
+{
+	int reading = 1;
+	char charin;
+	char buf[10];
+	Rune kana[10];
+	while(reading){
+		if(read(fpin, &charin, 1)){
+			if(strappend(buf, charin)){
+				kanalook(buf, kana);
+				fprint(fpout, "%s %S\n", buf, kana);
+				for(int i=0; i<10; i++){
+					kana[i] = 0;
+					buf[i] = 0;
+				}
+			}
+		}
+		else{
+			reading = 0;
+		}
+	}
+	fprint(fpout, "%s\n", buf);
+	return;
+}
+
+/*
+ * Appends the provided character to the end of the provided string.
+ * If this results in a complete kana being formable, return 1.
+ */
+int
+strappend(char* string, char in)
+{
+	int end;
+	int i;
+	
+	for(i=0; string[i] != 0; i++);
+	end = (in == 'a' || in == 'i' || in == 'u' || in == 'e' || in == 'o');
+	if (in == 'n'){
+		if (string[i-1] == 'n')
+			end = 1;
+	}
+	string[i] = in;
+	return end;
+}
+
+/*
+ * The kanafill function takes in the base kana of the family to be output,
+ * the character representation of the ending syllabaries, an integer
+ * representing the type of dakuten (1 for regular, 2 for maru), and a pointer
+ * to a rune array that is being edited.
+ */
+void
+kanafill(Rune base, char* in, int dakuten, Rune* out)
+{
 	switch(base){
 	/* Special Boys */
 	case L'や':
@@ -190,13 +282,15 @@
 	return;
 }
 
+/*
+ * kanalook takes in a pointer to a string and a pointer to a string of Rune
+ * and converts the string in romaji to a string of runes of kana.
+ */
 void
-kanalook(char buf[3], Rune* str)
+kanalook(char* buf, Rune* str)
 {
-	print("%s\n", buf);
-	char end[2];
-	end[0] = buf[1];
-	end[1] = buf[2];
+	char* end;
+	end = buf + 1;
 	switch(buf[0]){
 	/* あ family */
 	case 'a':
@@ -257,7 +351,10 @@
 	
 	/* な family (and ん) */
 	case 'n':
-		kanafill(L'な', end, 0, str);
+		if(buf[1] == 'n')
+			str[0] = L'ん';
+		else
+			kanafill(L'な', end, 0, str);
 		break;
 	
 	/* は family */
@@ -299,25 +396,7 @@
 	default:
 		break;
 	}
-	print("%S\n", str);
 	return;
 }
 
-void
-main(int argc, char *argv[])
-{
-	ARGBEGIN{
-	default:
-		print("No commandline arguments have been implemented yet\n");
-		break;
-	}ARGEND;
-	int fp = fileno(stdin);
-	char buf[3];
-	read(fp, buf, 2);
-	Rune kana[2];
-	kanalook(buf, kana);
-	print("%s\n", buf);
-	print("%S\n", kana);
-	print("Hello World\n");
-	exits(nil);
-}
+