⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbtowc_jp.cxx

📁 eCos操作系统源码
💻 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 + -