📄 mbtowc_jp.cxx
字号:
//===========================================================================//// mbtowc_jp.cxx//// Internal __mbtowc_jp() routine ////===========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//===========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): jjohnstn// Contributors: jjohnstn// Date: 2000-11-16// Purpose: Provide internal use __mbtowc_jp() routine// Description: Japanese locale version of mbtowc()// Usage: ////####DESCRIPTIONEND####////===========================================================================//// This code was taken from newlib/libc/stdlib/mbtowc_r.c// CONFIGURATION#include <pkgconf/libc_i18n.h> // Configuration header// INCLUDES#include <cyg/infra/cyg_type.h> // Common type definitions#include <cyg/infra/cyg_trac.h> // Tracing support#include <cyg/infra/cyg_ass.h> // Assertion support#include <locale.h>#include <stdlib.h> // Header for this file#include <string.h> // strcmp definition#include <stddef.h> // size_t definition#include "internal.h" // internal __isxxxx macros// TRACE#if defined(CYGDBG_USE_TRACING) && defined(CYGNUM_LIBC_STDLIB_MBTOWC_TRACE_LEVEL)static int mbtowc_trace = CYGNUM_LIBC_STDLIB_MBTOWC_TRACE_LEVEL;# define TL1 (0 < mbtowc_trace)#else# define TL1 (0)#endif// STATICS#ifdef CYGFUN_LIBC_I18N_LOCALE_C_JIStypedef enum { ESCAPE, DOLLAR, BRACKET, AT, B, J, NUL, JIS_CHAR, OTHER, JIS_C_NUM } JIS_CHAR_TYPE;typedef enum { ASCII, A_ESC, A_ESC_DL, JIS, JIS_1, JIS_2, J_ESC, J_ESC_BR, J2_ESC, J2_ESC_BR, DONE, INV, JIS_S_NUM } JIS_STATE; typedef enum { COPY_A, COPY_J, COPY_J2, MAKE_A, MAKE_J, NOOP, EMPTY, ERROR } JIS_ACTION;/************************************************************************************** * state/action tables for processing JIS encoding * Where possible, switches to JIS are grouped with proceding JIS characters and switches * to ASCII are grouped with preceding JIS characters. Thus, maximum returned length * is 2 (switch to JIS) + 2 (JIS characters) + 2 (switch back to ASCII) = 6. *************************************************************************************/static JIS_STATE JIS_state_table[JIS_S_NUM][JIS_C_NUM] = {/* ESCAPE DOLLAR BRACKET AT B J NUL JIS_CHAR OTHER *//* ASCII */ { A_ESC, DONE, DONE, DONE, DONE, DONE, DONE, DONE, DONE },/* A_ESC */ { DONE, A_ESC_DL, DONE, DONE, DONE, DONE, DONE, DONE, DONE },/* A_ESC_DL */{ DONE, DONE, DONE, JIS, JIS, DONE, DONE, DONE, DONE }, /* JIS */ { J_ESC, JIS_1, JIS_1, JIS_1, JIS_1, JIS_1, INV, JIS_1, INV },/* JIS_1 */ { INV, JIS_2, JIS_2, JIS_2, JIS_2, JIS_2, INV, JIS_2, INV },/* JIS_2 */ { J2_ESC, DONE, DONE, DONE, DONE, DONE, INV, DONE, DONE },/* J_ESC */ { INV, INV, J_ESC_BR, INV, INV, INV, INV, INV, INV },/* J_ESC_BR */{ INV, INV, INV, INV, ASCII, ASCII, INV, INV, INV },/* J2_ESC */ { INV, INV, J2_ESC_BR,INV, INV, INV, INV, INV, INV },/* J2_ESC_BR*/{ INV, INV, INV, INV, DONE, DONE, INV, INV, INV },};static JIS_ACTION JIS_action_table[JIS_S_NUM][JIS_C_NUM] = {/* ESCAPE DOLLAR BRACKET AT B J NUL JIS_CHAR OTHER *//* ASCII */ { NOOP, COPY_A, COPY_A, COPY_A, COPY_A, COPY_A, EMPTY, COPY_A, COPY_A},/* A_ESC */ { COPY_A, NOOP, COPY_A, COPY_A, COPY_A, COPY_A, COPY_A, COPY_A, COPY_A},/* A_ESC_DL */{ COPY_A, COPY_A, COPY_A, MAKE_J, MAKE_J, COPY_A, COPY_A, COPY_A, COPY_A},/* JIS */ { NOOP, NOOP, NOOP, NOOP, NOOP, NOOP, ERROR, NOOP, ERROR },/* JIS_1 */ { ERROR, NOOP, NOOP, NOOP, NOOP, NOOP, ERROR, NOOP, ERROR },/* JIS_2 */ { NOOP, COPY_J2, COPY_J2, COPY_J2, COPY_J2, COPY_J2, ERROR, COPY_J2, COPY_J2},/* J_ESC */ { ERROR, ERROR, NOOP, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR },/* J_ESC_BR */{ ERROR, ERROR, ERROR, ERROR, NOOP, NOOP, ERROR, ERROR, ERROR },/* J2_ESC */ { ERROR, ERROR, NOOP, ERROR, ERROR, ERROR, ERROR, ERROR, ERROR },/* J2_ESC_BR*/{ ERROR, ERROR, ERROR, ERROR, COPY_J, COPY_J, ERROR, ERROR, ERROR },};#endif // CYGFUN_LIBC_I18N_LOCALE_C_JIS// FUNCTIONSint__mbtowc_jp ( wchar_t *pwc, const char *s, size_t n, int *state ){ wchar_t dummy; unsigned char *t = (unsigned char *)s; int retval; const char *cur_locale = __current_ctype_locale->name; CYG_REPORT_FUNCNAMETYPE( "__mbtowc_jp", "returning %d" ); CYG_REPORT_FUNCARG4( "pwc=%08x, s=%08x, n=%ud, state=%08x", pwc, s, n, state ); if (pwc != NULL) CYG_CHECK_DATA_PTR( pwc, "pwc is not a valid pointer!" ); if (s != NULL) CYG_CHECK_DATA_PTR( s, "s is not a valid pointer!" ); CYG_CHECK_DATA_PTR( state, "state is not a valid pointer!" ); if (pwc == NULL) pwc = &dummy; if (s != NULL && n == 0) { retval = -1; CYG_REPORT_RETVAL (retval); return retval; } if (cur_locale == NULL || (strlen (cur_locale) <= 1)) { /* fall-through */ }#ifdef CYGFUN_LIBC_I18N_LOCALE_C_SJIS else if (!strcmp (cur_locale, "C-SJIS")) { int char1; if (s == NULL) { retval = 0; CYG_REPORT_RETVAL (retval); return retval; /* not state-dependent */ } char1 = *t; if (_issjis1 (char1)) { int char2 = t[1]; if (n <= 1) retval = -1; else if (_issjis2 (char2)) { *pwc = (((wchar_t)*t) << 8) + (wchar_t)(*(t+1)); retval = 2; } else retval = -1; CYG_REPORT_RETVAL (retval); return retval; } }#endif /* CYGFUN_LIBC_I18N_LOCALE_C_SJIS */#ifdef CYGFUN_LIBC_I18N_LOCALE_C_EUCJP else if (!strcmp (cur_locale, "C-EUCJP")) { int char1; if (s == NULL) { retval = 0; /* not state-dependent */ CYG_REPORT_RETVAL (retval); return retval; /* not state-dependent */ } char1 = *t; if (_iseucjp (char1)) { int char2 = t[1]; if (n <= 1) retval = -1; if (_iseucjp (char2)) { *pwc = (((wchar_t)*t) << 8) + (wchar_t)(*(t+1)); retval = 2; } else retval = -1; CYG_REPORT_RETVAL (retval); return retval; } }#endif /* CYGFUN_LIBC_I18N_LOCALE_C_EUCJP */ #ifdef CYGFUN_LIBC_I18N_LOCALE_C_JIS else if (!strcmp (cur_locale, "C-JIS")) { JIS_STATE curr_state; JIS_ACTION action; JIS_CHAR_TYPE ch; unsigned char *ptr; int i, curr_ch; if (s == NULL) { *state = 0; retval = 1; CYG_REPORT_RETVAL (retval); return retval; /* state-dependent */ } curr_state = (*state == 0 ? ASCII : JIS); ptr = t; for (i = 0; i < (int)n; ++i) { curr_ch = t[i]; switch (curr_ch) { case ESC_CHAR: ch = ESCAPE; break; case '$': ch = DOLLAR; break; case '@': ch = AT; break; case '(': ch = BRACKET; break; case 'B': ch = B; break; case 'J': ch = J; break; case '\0': ch = NUL; break; default: if (_isjis (curr_ch)) ch = JIS_CHAR; else ch = OTHER; } action = JIS_action_table[curr_state][ch]; curr_state = JIS_state_table[curr_state][ch]; switch (action) { case NOOP: break; case EMPTY: *state = 0; *pwc = (wchar_t)0; retval = i; CYG_REPORT_RETVAL (retval); return retval; case COPY_A: *state = 0; *pwc = (wchar_t)*ptr; retval = i + 1; CYG_REPORT_RETVAL (retval); return retval; case COPY_J: *state = 0; *pwc = (((wchar_t)*ptr) << 8) + (wchar_t)(*(ptr+1)); retval = i + 1; CYG_REPORT_RETVAL (retval); return retval; case COPY_J2: *state = 1; *pwc = (((wchar_t)*ptr) << 8) + (wchar_t)(*(ptr+1)); retval = (ptr - t) + 2; CYG_REPORT_RETVAL (retval); return retval; case MAKE_A: case MAKE_J: ptr = (unsigned char *)(t + i + 1); break; case ERROR: default: retval = -1; CYG_REPORT_RETVAL (retval); return retval; } } retval = -1; /* n < bytes needed */ CYG_REPORT_RETVAL (retval); return retval; }#endif /* CYGFUN_LIBC_I18N_LOCALE_C_JIS */ /* otherwise this must be the "C" locale or unknown locale */ if (s == NULL) retval = 0; /* not state-dependent */ else { if (pwc) *pwc = (wchar_t)*t; retval = (*t != '\0'); } CYG_REPORT_RETVAL (retval); return retval;} // __mbtowc_jp()// EOF mbtowc_jp.cxx
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -