int
compare_wide_to_latin1 (wchar_t *wbox1, long n1, unsigned char *box2, long n2)
{
  wchar_t temp;
  long inx = 0;
  while (1)
    {
      if (inx == n1)	/* box1 in end? */
	{
	  if (inx == n2)
	    return DVC_MATCH;  /* box2 of same length */
	  else
	    return DVC_LESS;   /* otherwise box1 is shorter than box2 */
	}
      if (inx == n2)
	return DVC_GREATER;	/* box2 in end (but not box1) */
      temp = CHAR_TO_WCHAR (box2[inx], NULL);
      if (wbox1[inx] < temp)
	return DVC_LESS;
      if (wbox1[inx] > temp)
	return DVC_GREATER;
      inx++;
    }
  /*NOTREACHED*/
  return DVC_LESS;
}
caddr_t
box_narrow_string_as_wide (unsigned char *str, caddr_t wide, long max_len, wcharset_t *charset, caddr_t * err_ret, int isbox)
{
  long i, len = (long)(isbox ? (box_length ((box_t) str) - 1) : strlen((const char *) str));
  wchar_t *box;
  size_t wide_len;
  if (!charset)
    {
      client_connection_t *cli = GET_IMMEDIATE_CLIENT_OR_NULL;
      if (cli)
	charset = cli->cli_charset;
    }
  if (!charset)
    charset = default_charset;


  if (max_len > 0 && len > max_len)
    len = max_len;
/*  if (len == 0)
    return NULL; - explicit bug */
  wide_len = (len + 1) * sizeof(wchar_t);
  if (wide_len > MAX_READ_STRING)
    {
      if (err_ret)
	*err_ret = srv_make_new_error ("22023", "SR578", "The expected result length of wide string is too large");
      return NULL;
    }
  box = (wchar_t *) (wide ? wide : dk_alloc_box_zero (wide_len, DV_WIDE));
  for (i = 0; i < len; i++)
    box[i] = CHAR_TO_WCHAR(str[i], charset);
  box[len] = L'\0';
  return ((caddr_t) box);
}
NJ_INT16 nje_convert_hira_to_kata(NJ_CHAR *hira, NJ_CHAR *kata, NJ_UINT16 len)
{
    NJ_UINT16 pnt;
    NJ_UINT16 wchar;


    pnt = 0;
    while (pnt < len) {
        if (*hira == NJ_CHAR_NUL) {
            
            return pnt;
        }

        
        wchar = CHAR_TO_WCHAR(hira);
        hira++;
        pnt++;

        if (IS_HIRAGANA_WCHAR(wchar)) {
            
            SET_WCHAR_TO_CHAR(kata, wchar + HIRA_KATA_OFFSET);
            kata += ZEN_CHAR_LEN;
        } else {
            SET_WCHAR_TO_CHAR(kata, wchar);
            kata += ZEN_CHAR_LEN;
        }
    }

    
    *kata = NJ_CHAR_NUL;
    return pnt;
}
static int
print_narrow_string_as_wide (dk_session_t *ses, unsigned char *string, wcharset_t *charset)
{
  unsigned char *pstr = string;
  long utf8_len = 0, char_utf8_len;
  virt_mbstate_t state;
  wchar_t wchar;
  unsigned char mbs[VIRT_MB_CUR_MAX];

  memset (&state, 0, sizeof (virt_mbstate_t));
  while (*pstr)
    {
      wchar = CHAR_TO_WCHAR (*pstr, charset);
      char_utf8_len = (long) virt_wcrtomb (mbs, wchar, &state);
      if (char_utf8_len < 1)
	return char_utf8_len;
      utf8_len += char_utf8_len;
      pstr += 1;
    }
  if (utf8_len < 256)
    {
      session_buffered_write_char (DV_WIDE, ses);
      session_buffered_write_char ((char) utf8_len, ses);
    }
  else
    {
      session_buffered_write_char (DV_LONG_WIDE, ses);
      print_long (utf8_len, ses);
    }

  memset (&state, 0, sizeof (virt_mbstate_t));
  pstr = string;
  while (*pstr)
    {
      wchar = CHAR_TO_WCHAR (*pstr, charset);
      char_utf8_len = (long) virt_wcrtomb (mbs, wchar, &state);
      session_buffered_write (ses, (char *) mbs, char_utf8_len);
      pstr += 1;
    }
  return utf8_len;
}
	//input the output data string,and analyze it
	bool	cPrtStartPositionInitByFrame::SetDataByDataString(char*e_pString)
	{
		char*Nexttoken = 0;
		char* l_pString = strtok(e_pString,",");
		m_eAttachFrameType = (eAttachFrameType)atoi(l_pString);

		l_pString = strtok(0,",");
		if( m_eAttachFrameType != eAFT_CAMERA )
		{
			assert(0&&"current not support");
			//wchar_t	l_tempForGetObject[MAX_PATH];
			//CHAR_TO_WCHAR(l_pString,l_tempForGetObject);
			//m_pFrame = g_pPrt->GetMeshList()->GetObject(l_tempForGetObject);
			//CT::ErrorMsg(m_pFrame?true:false,l_pString,"can't find mesh");
		}
		l_pString = strtok(0,",");
		CHAR_TO_WCHAR(l_pString,m_psSubFrameName);
		l_pString = strtok(0,",");//offset pos x
		this->m_vOffsetPos.x = (float)atof(l_pString);
		l_pString = strtok(0,",");//offset pos y
		this->m_vOffsetPos.y = (float)atof(l_pString);
		l_pString = strtok(0,",");//offset pos z
		this->m_vOffsetPos.z = (float)atof(l_pString);
		if( strtok(0,",") )
			return false;
		switch(m_eAttachFrameType)
		{
			case eAFT_CAMERA:
				assert(0&&"current not support");
				//m_pFrame = g_pEngine->m_pCamera;
				break;
			case eAFT_FRAME_OF_FRAME:
				if( m_pFrame )
				{
					assert(0&&"current not support");
					//cGameApp::OutputDebugInfoString(L"!!----I am lazy to write more flexible,support Frame-----!!\n");
					//if( m_pFrame->Type() == MESH::CDXUTMeshFrame::TypeID || 
					//	m_pFrame->Type() == MESH::CDXUTMeshFile::TypeID )
					//{
					//	MESH::CDXUTMeshFrame*l_pFrame = (MESH::CDXUTMeshFrame*)m_pFrame;
					//	m_pSubFrameOfModel = l_pFrame->FindMesh(m_psSubFrameName);
					//	CT::ErrorMsgW(m_pSubFrameOfModel?true:false,m_psSubFrameName,L"not exist");
					//}
					//else
					//	assert(0&&"eAFT_FRAME_OF_FRAME type error");
				}
				break;
			case eAFT_FRAME_OF_MESH:
				assert(0&&"current not support");
				//if( m_pFrame )
				//if( m_pFrame->Type() == MESH::CAnimationAgent::TypeID )
				//{
				//	CHAR	l_tempStringForFrame[MAX_PATH];
				//	WCHAR_TO_CHAR(m_psSubFrameName,l_tempStringForFrame);
				//	MESH::CAnimationAgent*l_p = (MESH::CAnimationAgent*)m_pFrame;
				//	this->m_pD3DMatrix = CT::GetFrameMatrixByName(l_tempStringForFrame,l_p->GetRootFrame());
				//	CT::ErrorMsgW(m_pD3DMatrix?true:false,m_psSubFrameName,L"not exist");
				//}
				break;
		}
		return true;
	}
int
parse_wide_string_literal (unsigned char **str_ptr, caddr_t box, wcharset_t *charset)
{
  unsigned int i = 0;
  volatile unsigned int q;
  wchar_t z;
  UCHAR *str = (**str_ptr == 'N' || **str_ptr == 'n') ? *str_ptr + 1 : *str_ptr;
  UCHAR beg_quote = *str++;	/* And skip past N and it. */
  wchar_t c;
  wchar_t *result = (wchar_t *)box;
  if (!charset)
    {
      client_connection_t *cli = GET_IMMEDIATE_CLIENT_OR_NULL;
      if (cli)
	charset = cli->cli_charset;
    }
  if (!charset)
    charset = default_charset;


  for (/* no init */; '\0' != str[0]; str++)
    {
      switch (str[0])
	{
	case '\\':		/* An escaped character follows? */
	  {

	    if (!parse_not_char_c_escape)
	      {
		/* New escapes added 23.AUG.1991 \a for bell, and \v for vertical tab
		   as specified in ANSI C standard. Also now recognizes hexadecimal
		   character constants beginning with \x Note that \e for escape
		   does not belong to standard. (Commented out)
		 */
		switch (*++str)	/* Check the next character. */
		  {
		    /* If a string anomalously ends with a trailing (single) backslash, then
		       leave it dangling there: */
		    case '\0':
			{
			  c = CHAR_TO_WCHAR(*(str - 1), charset);
			  break;
			}
		    case 'a':
			  {
			    c = (wchar_t)7;
			    break;
			  }		/* BEL audible alert */
		    case 'b':
			    {
			      c = (wchar_t)'\b';
			      break;
			    }		/* BS  backspace */
			    /*	      case 'e': { c = '\033'; break; } *//* ESC escape */
		    case 'f':
			      {
				c = (wchar_t)'\f';
				break;
			      }		/* FF  form feed */
		    case 'n':
				{
				  c = (wchar_t)'\n';
				  break;
				}		/* NL (LF) newline */
		    case 'r':
				  {
				    c = (wchar_t)'\r';
				    break;
				  }		/* CR  carriage return */
		    case 't':
				    {
				      c = (wchar_t)'\t';
				      break;
				    }		/* HT  horizontal tab */
		    case 'v':
				      {
					c = (wchar_t)'\013';
					break;
				      }		/* VT  vertical tab */
		    case 'x':	/* There's a hexadecimal char constant \xhh */
		    case 'X':
					{		/* We should check that only max 2 digits are parsed */
					  q = 4;
					  z = 0;
					  str++;
					  while (*str && isxdigit (*str) && (q--))
					    {
					      z = ((z << 4) + (isdigit (*str) ?
						    (*str - '0') : (toupper (*str) - 'A' + 10)));
					      str++;
					    }
					  c = z;
					  if (!z)
					    return -1;
					  str--;	/* str is incremented soon. */
					  break;
					}
		    case '0':
		    case '1':
		    case '2':
		    case '3':
		    case '4':
		    case '5':
		    case '6':
		    case '7':
					  {		/* So it's an octal sequence like \033 : */
					    q = 6;
					    z = 0;
					    while (isoctdigit (*str) && (q--))
					      {
						z = ((z << 3) + (*str++ - '0'));
					      }
					    c = z;
					    str--;	/* str is incremented soon. */
					    if (!z)
					      return -1;
					    break;
					  }		/* octal digits */
			/* \\\n should not appear in the output at all */
		    case '\n':
		    case '\r':
			continue;
		    default:		/* Every other character after backslash produces */
					    {		/* that same character, i.e. \\ = \, \' = ', etc. */
					      c = CHAR_TO_WCHAR(*str, charset);
					      break;
					    }		/* default */

		  }			/* inner switch for character after a backslash */
		if (result)
		  result[i] = c;
		i++;
		break;
	      } /* if for processing backslashes */
	  }			/* case for backslash. */
	default:
	  {
	    if (*str == beg_quote)
	      {
		/* If the next char is a quote also, then this is not yet
		   the terminating quote */
		if (*(str + 1) == beg_quote)
		  {
		    str++;	/* Skip that quote next time. */
		    goto copy_char;
		  }
		else
		  {		/* String is terminated. */
		    goto out;
		  }
	      }
	    else
	      /* Any other character. */
	      {
	      copy_char:
		if (result)
		  result[i] = CHAR_TO_WCHAR(*str, charset);
		i++;
		break;
	      }
	  }
	}			/* outer switch */
    }				/* for loop */
out:;
  if (result)
    {
      result[i] = L'\0';
    }				/* Put a terminating zero. */
  if (*str)			/* The terminating quote is here. */
    {
      *str_ptr = str + 1;	/* Skip past it. */
    }
  else
    {
      /* The terminating quote is missing, we should produce an error here! */
      *str_ptr = str;		/* But in this version we are tolerant of that. */
    }
  return ((i + 1) * sizeof(wchar_t));			/* Return the length. */
}