Browse Source

tinyrl: Fix utf8

Serj Kalichev 1 year ago
parent
commit
8e4e71b4fc
7 changed files with 50 additions and 39 deletions
  1. 10 0
      bin/klish/klish.c
  2. 1 1
      tinyrl/tinyrl.h
  3. 19 18
      tinyrl/tinyrl/keys.c
  4. 17 17
      tinyrl/tinyrl/private.h
  5. 1 1
      tinyrl/tinyrl/tinyrl.c
  6. 1 1
      tinyrl/vt100.h
  7. 1 1
      tinyrl/vt100/vt100.c

+ 10 - 0
bin/klish/klish.c

@@ -11,6 +11,12 @@
 #include <getopt.h>
 #include <sys/socket.h>
 #include <sys/un.h>
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+#ifdef HAVE_LANGINFO_CODESET
+#include <langinfo.h>
+#endif
 
 #include <faux/faux.h>
 #include <faux/str.h>
@@ -45,6 +51,10 @@ int main(int argc, char **argv)
 	int retcode = 0;
 	faux_eloop_t *eloop = NULL;
 
+#ifdef HAVE_LOCALE_H
+	// Set current locale
+	setlocale(LC_ALL, "");
+#endif
 
 	// Parse command line options
 	opts = opts_init();

+ 1 - 1
tinyrl/tinyrl.h

@@ -58,7 +58,7 @@ typedef int tinyrl_timeout_fn_t(tinyrl_t *instance);
  *   been performed successfully
  * - BOOL_FALSE if the action was not successful
  */
-typedef bool_t tinyrl_key_func_t(tinyrl_t *instance, char key);
+typedef bool_t tinyrl_key_func_t(tinyrl_t *instance, unsigned char key);
 
 
 

+ 19 - 18
tinyrl/tinyrl/keys.c

@@ -12,22 +12,23 @@
 #include "private.h"
 
 
-bool_t tinyrl_key_default(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_default(tinyrl_t *tinyrl, unsigned char key)
 {
 	if (key > 31) {
 		// Inject new char to the line
-		tinyrl_line_insert(tinyrl, &key, 1);
+		tinyrl_line_insert(tinyrl, (const char *)(&key), 1);
 	} else {
 		// Call the external hotkey analyzer
 		if (tinyrl->hotkey_fn)
 			tinyrl->hotkey_fn(tinyrl, key);
 	}
+printf("key=%u, pos=%lu, len=%lu\n", (unsigned char)key, tinyrl->line.pos, tinyrl->line.len);
 
 	return BOOL_TRUE;
 }
 
 
-bool_t tinyrl_key_interrupt(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_interrupt(tinyrl_t *tinyrl, unsigned char key)
 {
 //	tinyrl_crlf(tinyrl);
 //	tinyrl->done = BOOL_TRUE;
@@ -40,7 +41,7 @@ bool_t tinyrl_key_interrupt(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_start_of_line(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_start_of_line(tinyrl_t *tinyrl, unsigned char key)
 {
 	// Set current position to the start of the line
 	tinyrl->line.pos = 0;
@@ -52,7 +53,7 @@ bool_t tinyrl_key_start_of_line(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_end_of_line(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_end_of_line(tinyrl_t *tinyrl, unsigned char key)
 {
 	// Set current position to the end of the line
 	tinyrl->line.pos = tinyrl->line.len;
@@ -64,7 +65,7 @@ bool_t tinyrl_key_end_of_line(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_kill(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_kill(tinyrl_t *tinyrl, unsigned char key)
 {
 /*
 	// release any old kill string 
@@ -82,7 +83,7 @@ bool_t tinyrl_key_kill(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_yank(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_yank(tinyrl_t *tinyrl, unsigned char key)
 {
 	bool_t result = BOOL_FALSE;
 /*
@@ -97,7 +98,7 @@ bool_t tinyrl_key_yank(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_crlf(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_crlf(tinyrl_t *tinyrl, unsigned char key)
 {
 /*
 	tinyrl_crlf(tinyrl);
@@ -109,7 +110,7 @@ bool_t tinyrl_key_crlf(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_up(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_up(tinyrl_t *tinyrl, unsigned char key)
 {
 	bool_t result = BOOL_FALSE;
 /*
@@ -136,7 +137,7 @@ bool_t tinyrl_key_up(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_down(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_down(tinyrl_t *tinyrl, unsigned char key)
 {
 	bool_t result = BOOL_FALSE;
 /*
@@ -163,7 +164,7 @@ bool_t tinyrl_key_down(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_left(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_left(tinyrl_t *tinyrl, unsigned char key)
 {
 	if (tinyrl->line.pos == 0)
 		return BOOL_TRUE;
@@ -180,7 +181,7 @@ bool_t tinyrl_key_left(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_right(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_right(tinyrl_t *tinyrl, unsigned char key)
 {
 	if (tinyrl->line.pos == tinyrl->line.len)
 		return BOOL_TRUE;
@@ -197,7 +198,7 @@ bool_t tinyrl_key_right(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_backspace(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_backspace(tinyrl_t *tinyrl, unsigned char key)
 {
 	if (tinyrl->line.pos == 0)
 		return BOOL_TRUE;
@@ -217,7 +218,7 @@ bool_t tinyrl_key_backspace(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_delete(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_delete(tinyrl_t *tinyrl, unsigned char key)
 {
 	if (tinyrl->line.pos == tinyrl->line.len)
 		return BOOL_TRUE;
@@ -237,7 +238,7 @@ bool_t tinyrl_key_delete(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_backword(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_backword(tinyrl_t *tinyrl, unsigned char key)
 {
 	bool_t result = BOOL_FALSE;
 /*
@@ -258,7 +259,7 @@ bool_t tinyrl_key_backword(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_clear_screen(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_clear_screen(tinyrl_t *tinyrl, unsigned char key)
 {
 /*
 	tinyrl_vt100_clear_screen(tinyrl->term);
@@ -273,7 +274,7 @@ bool_t tinyrl_key_clear_screen(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_erase_line(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_erase_line(tinyrl_t *tinyrl, unsigned char key)
 {
 /*	unsigned int end;
 
@@ -304,7 +305,7 @@ bool_t tinyrl_key_erase_line(tinyrl_t *tinyrl, char key)
 }
 
 
-bool_t tinyrl_key_tab(tinyrl_t *tinyrl, char key)
+bool_t tinyrl_key_tab(tinyrl_t *tinyrl, unsigned char key)
 {
 	bool_t result = BOOL_FALSE;
 /*

+ 17 - 17
tinyrl/tinyrl/private.h

@@ -14,23 +14,23 @@ off_t utf8_move_left(const char *line, off_t cur_pos);
 off_t utf8_move_right(const char *line, off_t cur_pos);
 
 // Keys
-bool_t tinyrl_key_default(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_interrupt(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_start_of_line(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_end_of_line(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_kill(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_yank(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_crlf(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_up(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_down(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_left(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_right(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_backspace(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_backword(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_delete(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_clear_screen(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_erase_line(tinyrl_t *tinyrl, char key);
-bool_t tinyrl_key_tab(tinyrl_t *tinyrl, char key);
+bool_t tinyrl_key_default(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_interrupt(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_start_of_line(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_end_of_line(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_kill(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_yank(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_crlf(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_up(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_down(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_left(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_right(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_backspace(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_backword(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_delete(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_clear_screen(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_erase_line(tinyrl_t *tinyrl, unsigned char key);
+bool_t tinyrl_key_tab(tinyrl_t *tinyrl, unsigned char key);
 
 // Tinyrl
 bool_t tinyrl_esc_seq(tinyrl_t *tinyrl, const char *esc_seq);

+ 1 - 1
tinyrl/tinyrl/tinyrl.c

@@ -317,7 +317,7 @@ static bool_t process_char(tinyrl_t *tinyrl, char key)
 int tinyrl_read(tinyrl_t *tinyrl)
 {
 	int rc = 0;
-	char key = 0;
+	unsigned char key = 0;
 	int count = 0;
 
 	assert(tinyrl);

+ 1 - 1
tinyrl/vt100.h

@@ -85,7 +85,7 @@ int vt100_oflush(const vt100_t *vt100);
 int vt100_ierror(const vt100_t *vt100);
 int vt100_oerror(const vt100_t *vt100);
 int vt100_ieof(const vt100_t *vt100);
-int vt100_getchar(const vt100_t *vt100, char *c);
+int vt100_getchar(const vt100_t *vt100, unsigned char *c);
 vt100_esc_e vt100_esc_decode(const vt100_t *vt100, const char *esc_seq);
 
 void vt100_ding(const vt100_t *vt100);

+ 1 - 1
tinyrl/vt100/vt100.c

@@ -144,7 +144,7 @@ int vt100_vprintf(const vt100_t *vt100, const char *fmt, va_list args)
 }
 
 
-int vt100_getchar(const vt100_t *vt100, char *c)
+int vt100_getchar(const vt100_t *vt100, unsigned char *c)
 {
 	if (!vt100 || !vt100->istream || !c) {
 		errno = ENOENT;