* [PATCH] kconfig: multibyte character support for lxdialog
@ 2008-01-12 12:01 EGRY Gabor
2008-01-12 13:58 ` Sam Ravnborg
0 siblings, 1 reply; 2+ messages in thread
From: EGRY Gabor @ 2008-01-12 12:01 UTC (permalink / raw)
To: linux-kbuild, linux-kernel, linux-kernel
UTF-8 support for lxdialog with wchar. The installed wide ncurses (ncursesw) is optional.
Signed-off-by: Egry Gabor <gaboregry1@t-online.hu>
---
kbuild-szilard/scripts/kconfig/lxdialog/check-lxdialog.sh | 6
kbuild-szilard/scripts/kconfig/lxdialog/checklist.c | 13 -
kbuild-szilard/scripts/kconfig/lxdialog/dialog.h | 60 ++++++
kbuild-szilard/scripts/kconfig/lxdialog/inputbox.c | 32 ++-
kbuild-szilard/scripts/kconfig/lxdialog/menubox.c | 25 +-
kbuild-szilard/scripts/kconfig/lxdialog/textbox.c | 31 +--
kbuild-szilard/scripts/kconfig/lxdialog/util.c | 124 +++++++++++---
kbuild-szilard/scripts/kconfig/lxdialog/yesno.c | 5
8 files changed, 223 insertions(+), 73 deletions(-)
diff -puN scripts/kconfig/lxdialog/checklist.c~kconfig-i18n-04-lxdialog-multibyte scripts/kconfig/lxdialog/checklist.c
--- kbuild/scripts/kconfig/lxdialog/checklist.c~kconfig-i18n-04-lxdialog-multibyte 2008-01-12 12:21:03.000000000 +0100
+++ kbuild-szilard/scripts/kconfig/lxdialog/checklist.c 2008-01-12 12:21:03.000000000 +0100
@@ -44,9 +44,9 @@ static void print_item(WINDOW * win, int
wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
- mvwaddch(win, choice, item_x, item_str()[0]);
+ LXD_MVWADDCH(win, choice, item_x, item_str()[0]);
wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
- waddstr(win, (char *)item_str() + 1);
+ LXD_WADDSTR(win, &item_str()[1]);
if (selected) {
wmove(win, choice, check_x + 1);
wrefresh(win);
@@ -112,8 +112,9 @@ int dialog_checklist(const char *title,
int width, int list_height)
{
int i, x, y, box_x, box_y;
- int key = 0, button = 0, choice = 0, scroll = 0, max_choice;
+ int button = 0, choice = 0, scroll = 0, max_choice;
WINDOW *dialog, *list;
+ LXD_KEYTYPE key = 0;
/* which item to highlight */
item_foreach() {
@@ -173,7 +174,7 @@ do_resize:
/* Find length of longest item in order to center checklist */
check_x = 0;
item_foreach()
- check_x = MAX(check_x, strlen(item_str()) + 4);
+ check_x = MAX(check_x, MIN(list_width, LXD_STRLEN(item_str()) + 4));
check_x = (list_width - check_x) / 2;
item_x = check_x + 4;
@@ -199,11 +200,11 @@ do_resize:
doupdate();
while (key != KEY_ESC) {
- key = wgetch(dialog);
+ LXD_WGETCH(dialog, key);
for (i = 0; i < max_choice; i++) {
item_set(i + scroll);
- if (toupper(key) == toupper(item_str()[0]))
+ if (LXD_TOUPPER(key) == LXD_TOUPPER(item_str()[0]))
break;
}
diff -puN scripts/kconfig/lxdialog/dialog.h~kconfig-i18n-04-lxdialog-multibyte scripts/kconfig/lxdialog/dialog.h
--- kbuild/scripts/kconfig/lxdialog/dialog.h~kconfig-i18n-04-lxdialog-multibyte 2008-01-12 12:21:03.000000000 +0100
+++ kbuild-szilard/scripts/kconfig/lxdialog/dialog.h 2008-01-12 12:23:17.000000000 +0100
@@ -37,6 +37,60 @@
#endif
#include CURSES_LOC
+/* Wide character support for lxdialog */
+#ifdef USE_WIDE_CURSES
+#include <wchar.h>
+#include <wctype.h>
+#define LXD_CHAR wchar_t
+#define LXD_KEYTYPE wchar_t
+#define LXD_WADDCH(a, b) waddnwstr(a, &b, 1)
+#define LXD_WADDSTR waddwstr
+#define LXD_WADDNSTR waddnwstr
+#define LXD_MVWADDCH(a, b, c, d) mvwaddnwstr(a, b, c, &d, 1)
+#define LXD_MVWADDSTR mvwaddwstr
+#define LXD_MVWADDNSTR mvwaddnwstr
+#define LXD_WGETCH(a, b) wget_wch(a, &b)
+#define LXD_STRLEN wcslen
+#define LXD_STRCPY wcscpy
+#define LXD_STRNCPY wcsncpy
+#define LXD_STRADDWCS(str1, str2, n) stradd2wcs(str1, str2, n)
+#define LXD_WCSADDSTR(str1, str2, n) wcsadd2str(str1, str2, n)
+#define LXD_STRCHR wcschr
+#define LXD_ISALPHA iswalpha
+#define LXD_ISPRINT iswprint
+#define LXD_TOLOWER towlower
+#define LXD_TOUPPER towupper
+#define LXD_STR2WCS(var1, var2) var1 = str2wcs(var2)
+#define LXD_FREE(var) free(var)
+wchar_t* str2wcs (const char *mbs);
+int stradd2wcs (wchar_t* wcs, const char *mbs, size_t n);
+int wcsadd2str (char *mbs, const wchar_t *wcs, size_t n);
+
+#else /* USE_WIDE_CURSES */
+
+#define LXD_CHAR char
+#define LXD_KEYTYPE int
+#define LXD_WADDCH(a, b) waddch(a, b)
+#define LXD_WADDSTR waddstr
+#define LXD_WADDNSTR waddnstr
+#define LXD_MVWADDCH(a, b, c, d) mvwaddch(a, b, c, d)
+#define LXD_MVWADDSTR mvwaddstr
+#define LXD_MVWADDNSTR mvwaddnstr
+#define LXD_WGETCH(a, b) b = wgetch(a)
+#define LXD_STRLEN strlen
+#define LXD_STRCPY strcpy
+#define LXD_STRNCPY strncpy
+#define LXD_WCSADDSTR(str1, str2, n) strncpy(str1, str2, n)
+#define LXD_STRADDWCS(str1, str2, n) strncpy(str1, str2, n)
+#define LXD_STRCHR strchr
+#define LXD_ISALPHA isalpha
+#define LXD_ISPRINT isprint
+#define LXD_TOLOWER tolower
+#define LXD_TOUPPER toupper
+#define LXD_STR2WCS(var1, var2) var1 = (char*)var2
+#define LXD_FREE(var)
+#endif /* USE_WIDE_CURSES */
+
/*
* Colors in ncurses 1.9.9e do not work properly since foreground and
* background colors are OR'd rather than separately masked. This version
@@ -163,7 +217,7 @@ char item_tag(void);
/* item list manipulation for lxdialog use */
#define MAXITEMSTR 200
struct dialog_item {
- char str[MAXITEMSTR]; /* promtp displayed */
+ LXD_CHAR str[MAXITEMSTR]; /* prompt displayed */
char tag;
void *data; /* pointer to menu item - used by menubox+checklist */
int selected; /* Set to 1 by dialog_*() function if selected. */
@@ -182,7 +236,7 @@ extern struct dialog_list *item_head;
int item_count(void);
void item_set(int n);
int item_n(void);
-const char *item_str(void);
+const LXD_CHAR *item_str(void);
int item_is_selected(void);
int item_is_tag(char tag);
#define item_foreach() \
@@ -205,7 +259,7 @@ void draw_box(WINDOW * win, int y, int x
chtype border);
void draw_shadow(WINDOW * win, int y, int x, int height, int width);
-int first_alpha(const char *string, const char *exempt);
+int first_alpha(const LXD_CHAR *string, const char *exempt);
int dialog_yesno(const char *title, const char *prompt, int height, int width);
int dialog_msgbox(const char *title, const char *prompt, int height,
int width, int pause);
diff -puN scripts/kconfig/lxdialog/inputbox.c~kconfig-i18n-04-lxdialog-multibyte scripts/kconfig/lxdialog/inputbox.c
--- kbuild/scripts/kconfig/lxdialog/inputbox.c~kconfig-i18n-04-lxdialog-multibyte 2008-01-12 12:21:03.000000000 +0100
+++ kbuild-szilard/scripts/kconfig/lxdialog/inputbox.c 2008-01-12 12:21:03.000000000 +0100
@@ -45,14 +45,15 @@ int dialog_inputbox(const char *title, c
const char *init)
{
int i, x, y, box_y, box_x, box_width;
- int input_x = 0, scroll = 0, key = 0, button = -1;
- char *instr = dialog_input_result;
+ int input_x = 0, scroll = 0, button = -1;
+ LXD_CHAR instr[MAX_LEN + 1];
+ LXD_KEYTYPE key = 0;
WINDOW *dialog;
if (!init)
instr[0] = '\0';
else
- strcpy(instr, init);
+ LXD_STRADDWCS(instr, init, MAX_LEN + 1);
do_resize:
if (getmaxy(stdscr) <= (height - 2))
@@ -97,15 +98,15 @@ do_resize:
wmove(dialog, box_y, box_x);
wattrset(dialog, dlg.inputbox.atr);
- input_x = strlen(instr);
+ input_x = LXD_STRLEN(instr);
if (input_x >= box_width) {
scroll = input_x - box_width + 1;
input_x = box_width - 1;
for (i = 0; i < box_width - 1; i++)
- waddch(dialog, instr[scroll + i]);
+ LXD_WADDCH(dialog, instr[scroll + i]);
} else {
- waddstr(dialog, instr);
+ LXD_WADDSTR(dialog, instr);
}
wmove(dialog, box_y, box_x + input_x);
@@ -113,7 +114,7 @@ do_resize:
wrefresh(dialog);
while (key != KEY_ESC) {
- key = wgetch(dialog);
+ LXD_WGETCH(dialog, key);
if (button == -1) { /* Input box selected */
switch (key) {
@@ -133,10 +134,10 @@ do_resize:
scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1);
wmove(dialog, box_y, box_x);
for (i = 0; i < box_width; i++)
- waddch(dialog,
- instr[scroll + input_x + i] ?
- instr[scroll + input_x + i] : ' ');
- input_x = strlen(instr) - scroll;
+ instr[scroll + input_x + i] ?
+ LXD_WADDCH(dialog, instr[scroll + input_x + i]) :
+ waddch(dialog, ' ');
+ input_x = LXD_STRLEN(instr) - scroll;
} else
input_x--;
instr[scroll + input_x] = '\0';
@@ -146,7 +147,7 @@ do_resize:
}
continue;
default:
- if (key < 0x100 && isprint(key)) {
+ if (LXD_ISPRINT(key)) {
if (scroll + input_x < MAX_LEN) {
wattrset(dialog, dlg.inputbox.atr);
instr[scroll + input_x] = key;
@@ -155,10 +156,10 @@ do_resize:
scroll++;
wmove(dialog, box_y, box_x);
for (i = 0; i < box_width - 1; i++)
- waddch(dialog, instr [scroll + i]);
+ LXD_WADDCH(dialog, instr[scroll + i]);
} else {
wmove(dialog, box_y, input_x++ + box_x);
- waddch(dialog, key);
+ LXD_WADDCH(dialog, key);
}
wrefresh(dialog);
} else
@@ -170,10 +171,12 @@ do_resize:
switch (key) {
case 'O':
case 'o':
+ LXD_WCSADDSTR(dialog_input_result, instr, MAX_LEN + 1);
delwin(dialog);
return 0;
case 'H':
case 'h':
+ LXD_WCSADDSTR(dialog_input_result, instr, MAX_LEN + 1);
delwin(dialog);
return 1;
case KEY_UP:
@@ -217,6 +220,7 @@ do_resize:
break;
case ' ':
case '\n':
+ LXD_WCSADDSTR(dialog_input_result, instr, MAX_LEN + 1);
delwin(dialog);
return (button == -1 ? 0 : button);
case 'X':
diff -puN scripts/kconfig/lxdialog/menubox.c~kconfig-i18n-04-lxdialog-multibyte scripts/kconfig/lxdialog/menubox.c
--- kbuild/scripts/kconfig/lxdialog/menubox.c~kconfig-i18n-04-lxdialog-multibyte 2008-01-12 12:21:03.000000000 +0100
+++ kbuild-szilard/scripts/kconfig/lxdialog/menubox.c 2008-01-12 12:55:15.000000000 +0100
@@ -63,13 +63,13 @@ static int menu_width, item_x;
/*
* Print menu item
*/
-static void do_print_item(WINDOW * win, const char *item, int line_y,
+static void do_print_item(WINDOW * win, const LXD_CHAR *item, int line_y,
int selected, int hotkey)
{
int j;
- char *menu_item = malloc(menu_width + 1);
+ LXD_CHAR *menu_item = malloc((menu_width + 1) * sizeof(LXD_CHAR));
- strncpy(menu_item, item, menu_width - item_x);
+ LXD_STRNCPY(menu_item, item, menu_width - item_x);
menu_item[menu_width - item_x] = '\0';
j = first_alpha(menu_item, "YyNnMmHh");
@@ -86,11 +86,11 @@ static void do_print_item(WINDOW * win,
wclrtoeol(win);
#endif
wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
- mvwaddstr(win, line_y, item_x, menu_item);
+ LXD_MVWADDSTR(win, line_y, item_x, menu_item);
if (hotkey) {
wattrset(win, selected ? dlg.tag_key_selected.atr
: dlg.tag_key.atr);
- mvwaddch(win, line_y, item_x + j, menu_item[j]);
+ LXD_MVWADDCH(win, line_y, item_x + j, menu_item[j]);
}
if (selected) {
wmove(win, line_y, item_x + 1);
@@ -184,9 +184,10 @@ int dialog_menu(const char *title, const
{
int i, j, x, y, box_x, box_y;
int height, width, menu_height;
- int key = 0, button = 0, scroll = 0, choice = 0;
+ int button = 0, scroll = 0, choice = 0;
int first_item = 0, max_choice;
WINDOW *dialog, *menu;
+ LXD_KEYTYPE key = 0;
do_resize:
height = getmaxy(stdscr);
@@ -278,25 +279,25 @@ do_resize:
wrefresh(menu);
while (key != KEY_ESC) {
- key = wgetch(menu);
+ LXD_WGETCH(menu, key);
- if (key < 256 && isalpha(key))
- key = tolower(key);
+ if (key < 256 && LXD_ISALPHA(key))
+ key = LXD_TOLOWER(key);
- if (strchr("ynmh", key))
+ if (strchr("ynmh", (int)key))
i = max_choice;
else {
for (i = choice + 1; i < max_choice; i++) {
item_set(scroll + i);
j = first_alpha(item_str(), "YyNnMmHh");
- if (key == tolower(item_str()[j]))
+ if (key == LXD_TOLOWER(item_str()[j]))
break;
}
if (i == max_choice)
for (i = 0; i < max_choice; i++) {
item_set(scroll + i);
j = first_alpha(item_str(), "YyNnMmHh");
- if (key == tolower(item_str()[j]))
+ if (key == LXD_TOLOWER(item_str()[j]))
break;
}
}
diff -puN scripts/kconfig/lxdialog/textbox.c~kconfig-i18n-04-lxdialog-multibyte scripts/kconfig/lxdialog/textbox.c
--- kbuild/scripts/kconfig/lxdialog/textbox.c~kconfig-i18n-04-lxdialog-multibyte 2008-01-12 12:21:03.000000000 +0100
+++ kbuild-szilard/scripts/kconfig/lxdialog/textbox.c 2008-01-12 12:21:03.000000000 +0100
@@ -24,13 +24,13 @@
static void back_lines(int n);
static void print_page(WINDOW * win, int height, int width);
static void print_line(WINDOW * win, int row, int width);
-static char *get_line(void);
+static LXD_CHAR *get_line(void);
static void print_position(WINDOW * win);
static int hscroll;
static int begin_reached, end_reached, page_length;
-static const char *buf;
-static const char *page;
+static LXD_CHAR *buf;
+static const LXD_CHAR *page;
/*
* refresh window content
@@ -51,16 +51,17 @@ static void refresh_text_box(WINDOW *dia
int dialog_textbox(const char *title, const char *tbuf,
int initial_height, int initial_width)
{
- int i, x, y, cur_x, cur_y, key = 0;
+ int i, x, y, cur_x, cur_y;
int height, width, boxh, boxw;
int passed_end;
WINDOW *dialog, *box;
+ LXD_KEYTYPE key = 0;
begin_reached = 1;
end_reached = 0;
page_length = 0;
hscroll = 0;
- buf = tbuf;
+ LXD_STR2WCS(buf, tbuf);
page = buf; /* page is pointer to start of page to be displayed */
do_resize:
@@ -123,7 +124,7 @@ do_resize:
refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x);
while ((key != KEY_ESC) && (key != '\n')) {
- key = wgetch(dialog);
+ LXD_WGETCH(dialog, key);
switch (key) {
case 'E': /* Exit */
case 'e':
@@ -146,7 +147,7 @@ do_resize:
end_reached = 1;
/* point to last char in buf */
- page = buf + strlen(buf);
+ page = &buf[LXD_STRLEN(buf)];
back_lines(boxh);
refresh_text_box(dialog, box, boxh, boxw,
cur_y, cur_x);
@@ -321,13 +322,13 @@ static void print_page(WINDOW * win, int
static void print_line(WINDOW * win, int row, int width)
{
int y, x;
- char *line;
+ LXD_CHAR *line;
line = get_line();
- line += MIN(strlen(line), hscroll); /* Scroll horizontally */
+ line += MIN(LXD_STRLEN(line), hscroll) * sizeof(LXD_CHAR); /* Scroll horizontally */
wmove(win, row, 0); /* move cursor to correct line */
waddch(win, ' ');
- waddnstr(win, line, MIN(strlen(line), width - 2));
+ LXD_WADDNSTR(win, line, MIN(LXD_STRLEN(line), width - 2));
getyx(win, y, x);
/* Clear 'residue' of previous line */
@@ -337,9 +338,9 @@ static void print_line(WINDOW * win, int
for (i = 0; i < width - x; i++)
waddch(win, ' ');
}
-#else
+#else /* OLD_NCURSES */
wclrtoeol(win);
-#endif
+#endif /* OLD_NCURSES */
}
/*
@@ -347,10 +348,10 @@ static void print_line(WINDOW * win, int
* 'page' should point to start of current line before calling, and will be
* updated to point to start of next line.
*/
-static char *get_line(void)
+static LXD_CHAR *get_line(void)
{
int i = 0;
- static char line[MAX_LEN + 1];
+ static LXD_CHAR line[MAX_LEN + 1];
end_reached = 0;
while (*page != '\n') {
@@ -385,7 +386,7 @@ static void print_position(WINDOW * win)
wattrset(win, dlg.position_indicator.atr);
wbkgdset(win, dlg.position_indicator.atr & A_COLOR);
- percent = (page - buf) * 100 / strlen(buf);
+ percent = (page - buf) * 100 / LXD_STRLEN(buf);
wmove(win, getmaxy(win) - 3, getmaxx(win) - 9);
wprintw(win, "(%3d%%)", percent);
}
diff -puN scripts/kconfig/lxdialog/util.c~kconfig-i18n-04-lxdialog-multibyte scripts/kconfig/lxdialog/util.c
--- kbuild/scripts/kconfig/lxdialog/util.c~kconfig-i18n-04-lxdialog-multibyte 2008-01-12 12:21:03.000000000 +0100
+++ kbuild-szilard/scripts/kconfig/lxdialog/util.c 2008-01-12 12:48:28.000000000 +0100
@@ -309,12 +309,15 @@ void end_dialog(int x, int y)
**/
void print_title(WINDOW *dialog, const char *title, int width)
{
+ LXD_CHAR *wtitle;
if (title) {
- int tlen = MIN(width - 2, strlen(title));
+ LXD_STR2WCS(wtitle, title);
+ int tlen = MIN(width - 2, LXD_STRLEN(wtitle));
wattrset(dialog, dlg.title.atr);
mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' ');
- mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen);
+ LXD_MVWADDNSTR(dialog, 0, (width - tlen) / 2, wtitle, tlen);
waddch(dialog, ' ');
+ LXD_FREE(wtitle);
}
}
@@ -328,11 +331,11 @@ void print_autowrap(WINDOW * win, const
{
int newl, cur_x, cur_y;
int i, prompt_len, room, wlen;
- char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
+ LXD_CHAR tempstr[MAX_LEN + 1], *word, *sp, *sp2;
- strcpy(tempstr, prompt);
+ LXD_STRADDWCS(tempstr, prompt, MAX_LEN + 1);
- prompt_len = strlen(tempstr);
+ prompt_len = LXD_STRLEN(tempstr);
/*
* Remove newlines
@@ -344,14 +347,14 @@ void print_autowrap(WINDOW * win, const
if (prompt_len <= width - x * 2) { /* If prompt is short */
wmove(win, y, (width - prompt_len) / 2);
- waddstr(win, tempstr);
+ LXD_WADDSTR(win, tempstr);
} else {
cur_x = x;
cur_y = y;
newl = 1;
word = tempstr;
while (word && *word) {
- sp = strchr(word, ' ');
+ sp = LXD_STRCHR(word, ' ');
if (sp)
*sp++ = 0;
@@ -359,17 +362,17 @@ void print_autowrap(WINDOW * win, const
or it is the first word of a new sentence, and it is
short, and the next word does not fit. */
room = width - cur_x;
- wlen = strlen(word);
+ wlen = LXD_STRLEN(word);
if (wlen > room ||
(newl && wlen < 4 && sp
- && wlen + 1 + strlen(sp) > room
- && (!(sp2 = strchr(sp, ' '))
+ && wlen + 1 + LXD_STRLEN(sp) > room
+ && (!(sp2 = LXD_STRCHR(sp, ' '))
|| wlen + 1 + (sp2 - sp) > room))) {
cur_y++;
cur_x = x;
}
wmove(win, cur_y, cur_x);
- waddstr(win, word);
+ LXD_WADDSTR(win, word);
getyx(win, cur_y, cur_x);
cur_x++;
if (sp && *sp == ' ') {
@@ -389,6 +392,7 @@ void print_autowrap(WINDOW * win, const
void print_button(WINDOW * win, const char *label, int y, int x, int selected)
{
int i, temp;
+ LXD_CHAR *wlabel;
wmove(win, y, x);
wattrset(win, selected ? dlg.button_active.atr
@@ -396,20 +400,22 @@ void print_button(WINDOW * win, const ch
waddstr(win, "<");
temp = strspn(label, " ");
label += temp;
+ LXD_STR2WCS(wlabel, label);
wattrset(win, selected ? dlg.button_label_active.atr
: dlg.button_label_inactive.atr);
for (i = 0; i < temp; i++)
waddch(win, ' ');
wattrset(win, selected ? dlg.button_key_active.atr
: dlg.button_key_inactive.atr);
- waddch(win, label[0]);
+ waddch(win, wlabel[0]);
wattrset(win, selected ? dlg.button_label_active.atr
: dlg.button_label_inactive.atr);
- waddstr(win, (char *)label + 1);
+ LXD_WADDSTR(win, &wlabel[1]);
wattrset(win, selected ? dlg.button_active.atr
: dlg.button_inactive.atr);
waddstr(win, ">");
wmove(win, y, x + temp + 1);
+ LXD_FREE(wlabel);
}
/*
@@ -471,19 +477,19 @@ void draw_shadow(WINDOW * win, int y, in
/*
* Return the position of the first alphabetic character in a string.
*/
-int first_alpha(const char *string, const char *exempt)
+int first_alpha(const LXD_CHAR *string, const char *exempt)
{
int i, in_paren = 0, c;
- for (i = 0; i < strlen(string); i++) {
- c = tolower(string[i]);
+ for (i = 0; i < LXD_STRLEN(string); i++) {
+ c = LXD_TOLOWER(string[i]);
if (strchr("<[(", c))
++in_paren;
if (strchr(">])", c) && in_paren > 0)
--in_paren;
- if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0)
+ if ((!in_paren) && LXD_ISALPHA(c) && strchr(exempt, c) == 0)
return i;
}
@@ -548,6 +554,10 @@ void item_reset(void)
void item_make(const char *fmt, ...)
{
va_list ap;
+#ifdef USE_WIDE_CURSES
+ char *tempstr;
+ size_t n;
+#endif /* USE_WIDE_CHAR */
struct dialog_list *p = malloc(sizeof(*p));
if (item_head)
@@ -558,21 +568,39 @@ void item_make(const char *fmt, ...)
memset(p, 0, sizeof(*p));
va_start(ap, fmt);
+#ifdef USE_WIDE_CURSES
+ n = sizeof(item_cur->node.str) / sizeof(LXD_CHAR);
+ tempstr = malloc(n + 1);
+ vsnprintf(tempstr, n, fmt, ap);
+ LXD_STRADDWCS(item_cur->node.str, tempstr, n);
+ free(tempstr);
+#else /* USE_WIDE_CHAR */
vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap);
+#endif /* USE_WIDE_CHAR */
va_end(ap);
}
void item_add_str(const char *fmt, ...)
{
va_list ap;
+#ifdef USE_WIDE_CURSES
+ char *tempstr;
+#endif /* USE_WIDE_CHAR */
size_t avail;
- avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str);
+ avail = sizeof(item_cur->node.str) / sizeof(LXD_CHAR) - LXD_STRLEN(item_cur->node.str);
va_start(ap, fmt);
+#ifdef USE_WIDE_CURSES
+ tempstr = malloc(avail);
+ vsnprintf(tempstr, avail, fmt, ap);
+ LXD_STRADDWCS(&item_cur->node.str[LXD_STRLEN(item_cur->node.str)], tempstr, avail);
+ free(tempstr);
+#else /* USE_WIDE_CHAR */
vsnprintf(item_cur->node.str + strlen(item_cur->node.str),
avail, fmt, ap);
- item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0';
+#endif /* USE_WIDE_CHAR */
+ item_cur->node.str[sizeof(item_cur->node.str) / sizeof(LXD_CHAR) - 1] = '\0';
va_end(ap);
}
@@ -639,7 +667,7 @@ int item_n(void)
return 0;
}
-const char *item_str(void)
+const LXD_CHAR *item_str(void)
{
return item_cur->node.str;
}
@@ -653,3 +681,59 @@ int item_is_tag(char tag)
{
return (item_cur->node.tag == tag);
}
+
+#ifdef USE_WIDE_CURSES
+/* Return the wide char version of multibyte character */
+wchar_t* str2wcs (const char *mbs)
+{
+ wchar_t *wcs;
+ size_t n;
+
+ if (mbs) {
+ n = (2 + strlen(mbs)) * sizeof(wchar_t);
+ wcs = (wchar_t*) malloc (n);
+ if (stradd2wcs(wcs, mbs, n) != 0) {
+ free (wcs);
+ wcs = 0;
+ }
+ }
+ else
+ wcs = 0;
+
+ return wcs;
+}
+
+/* Copy a multibyte string into the allocated widechar string */
+int stradd2wcs (wchar_t *wcs, const char *mbs, size_t n)
+{
+ mbstate_t state;
+ const char *mbsptr;
+
+ if (mbs) {
+ memset (&state, 0, sizeof(state));
+ mbsptr = mbs;
+ if (mbsrtowcs (wcs, &mbsptr, n, &state) < 0)
+ return -1;
+ return 0;
+ }
+
+ return -1;
+}
+
+/* Copy a widechar string into the allocated multibyte string */
+int wcsadd2str (char *mbs, const wchar_t *wcs, size_t n)
+{
+ mbstate_t state;
+ const wchar_t *wcsptr;
+
+ if (wcs) {
+ memset (&state, 0, sizeof(state));
+ wcsptr = wcs;
+ if (wcsrtombs (mbs, &wcsptr, n, &state) < 0)
+ return -1;
+ return 0;
+ }
+
+ return -1;
+}
+#endif /* USE_WIDE_CURSES */
diff -puN scripts/kconfig/lxdialog/yesno.c~kconfig-i18n-04-lxdialog-multibyte scripts/kconfig/lxdialog/yesno.c
--- kbuild/scripts/kconfig/lxdialog/yesno.c~kconfig-i18n-04-lxdialog-multibyte 2008-01-12 12:21:03.000000000 +0100
+++ kbuild-szilard/scripts/kconfig/lxdialog/yesno.c 2008-01-12 12:21:03.000000000 +0100
@@ -41,8 +41,9 @@ static void print_buttons(WINDOW * dialo
*/
int dialog_yesno(const char *title, const char *prompt, int height, int width)
{
- int i, x, y, key = 0, button = 0;
+ int i, x, y, button = 0;
WINDOW *dialog;
+ LXD_KEYTYPE key = 0;
do_resize:
if (getmaxy(stdscr) < (height + 4))
@@ -76,7 +77,7 @@ do_resize:
print_buttons(dialog, height, width, 0);
while (key != KEY_ESC) {
- key = wgetch(dialog);
+ LXD_WGETCH(dialog, key);
switch (key) {
case 'Y':
case 'y':
diff -puN scripts/kconfig/lxdialog/check-lxdialog.sh~kconfig-i18n-04-lxdialog-multibyte scripts/kconfig/lxdialog/check-lxdialog.sh
--- kbuild/scripts/kconfig/lxdialog/check-lxdialog.sh~kconfig-i18n-04-lxdialog-multibyte 2008-01-12 12:21:03.000000000 +0100
+++ kbuild-szilard/scripts/kconfig/lxdialog/check-lxdialog.sh 2008-01-12 12:54:51.000000000 +0100
@@ -19,7 +19,11 @@ ldflags()
# Where is ncurses.h?
ccflags()
{
- if [ -f /usr/include/ncurses/ncurses.h ]; then
+ if [ -f /usr/include/ncursesw/curses.h ]; then
+ echo '-DCURSES_LOC="<ncursesw/curses.h>" -DUSE_WIDE_CURSES'
+ elif [ -f /usr/include/ncursesw/ncurses.h ]; then
+ echo '-DCURSES_LOC="<ncursesw/ncurses.h>" -DUSE_WIDE_CURSES'
+ elif [ -f /usr/include/ncurses/ncurses.h ]; then
echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"'
elif [ -f /usr/include/ncurses/curses.h ]; then
echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"'
_
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [PATCH] kconfig: multibyte character support for lxdialog
2008-01-12 12:01 [PATCH] kconfig: multibyte character support for lxdialog EGRY Gabor
@ 2008-01-12 13:58 ` Sam Ravnborg
0 siblings, 0 replies; 2+ messages in thread
From: Sam Ravnborg @ 2008-01-12 13:58 UTC (permalink / raw)
To: EGRY Gabor; +Cc: linux-kbuild, linux-kernel, linux-kernel
On Sat, Jan 12, 2008 at 01:01:55PM +0100, EGRY Gabor wrote:
>
> UTF-8 support for lxdialog with wchar. The installed wide ncurses (ncursesw) is optional.
Building this on my 64 bit box with ncursesw support I saw several warnings.
Adding the following to dialog.h decreased the number:
#ifdef USE_WIDE_CURSES
#define _XOPEN_SOURCE_EXTENDED
#endif
But it was not warning free.
In addition in your patch below you assume that
ncurses wide char support and wide char support follows each other.
This assumption makes things overly complicated.
Can we assume we have wide char support everywhere today where
we will support building Linux?
I am mostly concerned about sun, cygwin and MingW here...
If we can assume wide char support everywhere your patch will
become simplerAnd adding wide char support should be a separate step.
I tried to take a look at varous source packages and they do not
need this long list of redefinitions of the ncurses functions.
Do we do something fundamentally different than for example
dialog since this indirection is needed?
Sam
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-01-12 13:58 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-12 12:01 [PATCH] kconfig: multibyte character support for lxdialog EGRY Gabor
2008-01-12 13:58 ` Sam Ravnborg
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox