Back to index

tetex-bin  3.0
Functions
lib_get_wch.c File Reference
#include <curses.priv.h>
#include <ctype.h>

Go to the source code of this file.

Functions

make an error wget_wch (WINDOW *win, wint_t *result)

Function Documentation

make an error wget_wch ( WINDOW win,
wint_t *  result 
)

Definition at line 60 of file lib_get_wch.c.

{
    int code;
    char buffer[(MB_LEN_MAX * 9) + 1];    /* allow some redundant shifts */
    int status;
    mbstate_t state;
    size_t count = 0;
    unsigned long value;
    wchar_t wch;

    T((T_CALLED("wget_wch(%p)"), win));
    (void) state;

    /*
     * We can get a stream of single-byte characters and KEY_xxx codes from
     * _nc_wgetch(), while we want to return a wide character or KEY_xxx code.
     */
    for (;;) {
       T(("reading %d of %d", count + 1, sizeof(buffer)));
       code = _nc_wgetch(win, &value, TRUE);
       if (code == ERR) {
           break;
       } else if (code == KEY_CODE_YES) {
           /*
            * If we were processing an incomplete multibyte character, return
            * an error since we have a KEY_xxx code which interrupts it.  For
            * some cases, we could improve this by writing a new version of
            * lib_getch.c(!), but it is not clear whether the improvement
            * would be worth the effort.
            */
           if (count != 0) {
              ungetch(value);
              code = ERR;
           }
           break;
       } else if (count + 1 >= sizeof(buffer)) {
           ungetch(value);
           code = ERR;
           break;
       } else {
           buffer[count++] = UChar(value);
           reset_mbytes(state);
           status = count_mbytes(buffer, count, state);
           if (status >= 0) {
              reset_mbytes(state);
              if (check_mbytes(wch, buffer, count, state) != status) {
                  code = ERR;      /* the two calls should match */
                  ungetch(value);
              }
              value = wch;
              break;
           }
       }
    }
    *result = value;
    T(("result %#lo", value));
    returnCode(code);
}

Here is the call graph for this function:

Here is the caller graph for this function: