~ubuntu-branches/debian/sid/ncurses/sid-200908151543

« back to all changes in this revision

Viewing changes to ncurses/widechar/lib_get_wch.c

  • Committer: Bazaar Package Importer
  • Author(s): Daniel Baumann
  • Date: 2008-12-14 21:06:00 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20081214210600-2rdjwvpplgvh3zeb
Tags: 5.7+20081213-1
MergingĀ upstreamĀ versionĀ 5.7+20081213.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/****************************************************************************
2
 
 * Copyright (c) 2002-2004,2005 Free Software Foundation, Inc.              *
 
2
 * Copyright (c) 2002-2007,2008 Free Software Foundation, Inc.              *
3
3
 *                                                                          *
4
4
 * Permission is hereby granted, free of charge, to any person obtaining a  *
5
5
 * copy of this software and associated documentation files (the            *
40
40
#include <curses.priv.h>
41
41
#include <ctype.h>
42
42
 
43
 
MODULE_ID("$Id: lib_get_wch.c,v 1.12 2005/08/13 18:51:43 tom Exp $")
 
43
MODULE_ID("$Id: lib_get_wch.c,v 1.17 2008/08/16 19:22:55 tom Exp $")
44
44
 
45
45
#if HAVE_MBTOWC && HAVE_MBLEN
46
46
#define reset_mbytes(state) mblen(NULL, 0), mbtowc(NULL, NULL, 0)
60
60
NCURSES_EXPORT(int)
61
61
wget_wch(WINDOW *win, wint_t *result)
62
62
{
 
63
    SCREEN *sp;
63
64
    int code;
64
65
    char buffer[(MB_LEN_MAX * 9) + 1];  /* allow some redundant shifts */
65
66
    int status;
76
77
     * We can get a stream of single-byte characters and KEY_xxx codes from
77
78
     * _nc_wgetch(), while we want to return a wide character or KEY_xxx code.
78
79
     */
79
 
    for (;;) {
80
 
        T(("reading %d of %d", count + 1, sizeof(buffer)));
81
 
        code = _nc_wgetch(win, &value, TRUE);
82
 
        if (code == ERR) {
83
 
            break;
84
 
        } else if (code == KEY_CODE_YES) {
85
 
            /*
86
 
             * If we were processing an incomplete multibyte character, return
87
 
             * an error since we have a KEY_xxx code which interrupts it.  For
88
 
             * some cases, we could improve this by writing a new version of
89
 
             * lib_getch.c(!), but it is not clear whether the improvement
90
 
             * would be worth the effort.
91
 
             */
92
 
            if (count != 0) {
93
 
                ungetch((int) value);
 
80
    _nc_lock_global(curses);
 
81
    sp = _nc_screen_of(win);
 
82
    if (sp != 0) {
 
83
        for (;;) {
 
84
            T(("reading %d of %d", (int) count + 1, (int) sizeof(buffer)));
 
85
            code = _nc_wgetch(win, &value, TRUE EVENTLIST_2nd((_nc_eventlist
 
86
                                                               *) 0));
 
87
            if (code == ERR) {
 
88
                break;
 
89
            } else if (code == KEY_CODE_YES) {
 
90
                /*
 
91
                 * If we were processing an incomplete multibyte character,
 
92
                 * return an error since we have a KEY_xxx code which
 
93
                 * interrupts it.  For some cases, we could improve this by
 
94
                 * writing a new version of lib_getch.c(!), but it is not clear
 
95
                 * whether the improvement would be worth the effort.
 
96
                 */
 
97
                if (count != 0) {
 
98
                    _nc_ungetch(sp, (int) value);
 
99
                    code = ERR;
 
100
                }
 
101
                break;
 
102
            } else if (count + 1 >= sizeof(buffer)) {
 
103
                _nc_ungetch(sp, (int) value);
94
104
                code = ERR;
95
 
            }
96
 
            break;
97
 
        } else if (count + 1 >= sizeof(buffer)) {
98
 
            ungetch((int) value);
99
 
            code = ERR;
100
 
            break;
101
 
        } else {
102
 
            buffer[count++] = UChar(value);
103
 
            reset_mbytes(state);
104
 
            status = count_mbytes(buffer, count, state);
105
 
            if (status >= 0) {
 
105
                break;
 
106
            } else {
 
107
                buffer[count++] = (char) UChar(value);
106
108
                reset_mbytes(state);
107
 
                if (check_mbytes(wch, buffer, count, state) != status) {
108
 
                    code = ERR; /* the two calls should match */
109
 
                    ungetch((int) value);
 
109
                status = count_mbytes(buffer, count, state);
 
110
                if (status >= 0) {
 
111
                    reset_mbytes(state);
 
112
                    if (check_mbytes(wch, buffer, count, state) != status) {
 
113
                        code = ERR;     /* the two calls should match */
 
114
                        _nc_ungetch(sp, (int) value);
 
115
                    }
 
116
                    value = wch;
 
117
                    break;
110
118
                }
111
 
                value = wch;
112
 
                break;
113
119
            }
114
120
        }
 
121
    } else {
 
122
        code = ERR;
115
123
    }
116
124
    *result = value;
 
125
    _nc_unlock_global(curses);
117
126
    T(("result %#lo", value));
118
127
    returnCode(code);
119
128
}