AttackTutorial::AttackTutorial() { // タイトル名 m_pTaskTitle.pSting = "No.04 攻撃"; // クリアから終りまで m_iWaitFrameMAX = 60; // 文字の長さを調べる UINT myByte = 0; UINT addByte = 0; // 終端文字までループ for (UINT i = 0; m_pTaskTitle.pSting[i] != '\0'; i += myByte) { // 文字のバイト数を調べる myByte = _mbclen((BYTE*)&m_pTaskTitle.pSting[i]); addByte += myByte; } m_pTaskTitle.iStingLength = addByte; // Tips //m_pIntroTips = new TipsCard("さあ、今度は基本の攻撃方法を学びましょう。\nその場で□、しゃがんで□、ジャンプ中に□、\n相手と逆方向で□を押してみましょう。"); m_pIntroTips = new TipsCard("さあ、今度は基本の攻撃方法を学びましょう。\nその場で□を押してみましょう。"); m_pClearTips = new TipsCard("よくできました!\n方向キーとの組み合わせで様々な攻撃が繰り出せます。\n「対空攻撃」は空中からの攻撃に対して【無敵】です。"); // タスクセット AddTaskData("攻撃−□"); //AddTaskData("しゃがみ攻撃−↓+□"); //AddTaskData("ジャンプ攻撃−空中で□"); //AddTaskData("対空攻撃−←+□"); Init(); }
JumpTutorial::JumpTutorial() { // タイトル名 m_pTaskTitle.pSting = "No.03 ジャンプ"; // クリアから終りまで m_iWaitFrameMAX = 60; // 文字の長さを調べる UINT myByte = 0; UINT addByte = 0; // 終端文字までループ for (UINT i = 0; m_pTaskTitle.pSting[i] != '\0'; i += myByte) { // 文字のバイト数を調べる myByte = _mbclen((BYTE*)&m_pTaskTitle.pSting[i]); addByte += myByte; } m_pTaskTitle.iStingLength = addByte; // Tips m_pIntroTips = new TipsCard("「ジャンプ」と「空中ジャンプ」です。\n地上で↑を押すことで「ジャンプ」をします。\n空中でもう一度↑を押すと「空中ジャンプ」になります。"); m_pClearTips = new TipsCard("よくできました!\n「ジャンプ」は←や→と入力することで、\n「前ジャンプ」や「後ろジャンプ」になります。"); // タスクセット AddTaskData("ジャンプ−↑"); AddTaskData("空中ジャンプ−空中で↑"); Init(); }
_WCRTLINK int _ismbcprint( unsigned int ch ) { #ifdef __NT__ BOOL rc; int len; char mbc[ MB_LEN_MAX + 1 ]; WORD char_type[ MB_LEN_MAX + 1 ]; _mbvtop( ch, mbc ); len = _mbclen( mbc ); mbc[ len ] = '\0'; rc = GetStringTypeEx( LOCALE_USER_DEFAULT, CT_CTYPE1, mbc, -1, char_type ); if( rc == FALSE ) return( 0 ); if( (char_type[ 0 ] & C1_CNTRL) != 0 ) return( 0 ); if( (char_type[ 0 ] & (C1_UPPER | C1_LOWER | C1_DIGIT | C1_SPACE | C1_PUNCT | C1_BLANK | C1_XDIGIT | C1_ALPHA)) == 0 ) return( 0 ); return( 1 ); #else /* OS/2 and others */ if( SINGLE_BYTE_CHAR( ch ) ) { return( isprint( ch ) ); } else { if( __MBCodePage == 932 ) { return( _ismbdprint( ch ) ); } else { return( 0 ); } } #endif }
SkillTutorial::SkillTutorial() { // タイトル名 m_pTaskTitle.pSting = "No.05 スキル"; // クリアから終りまで m_iWaitFrameMAX = 60; // 文字の長さを調べる UINT myByte = 0; UINT addByte = 0; // 終端文字までループ for (UINT i = 0; m_pTaskTitle.pSting[i] != '\0'; i += myByte) { // 文字のバイト数を調べる myByte = _mbclen((BYTE*)&m_pTaskTitle.pSting[i]); addByte += myByte; } m_pTaskTitle.iStingLength = addByte; // Tips m_pIntroTips = new TipsCard("「スキル」はキャラクター毎にある強力な技です。\n△ボタンでスキルを発動できます。"); m_pClearTips = new TipsCard("よくできました!\n「スキル」はキャラクター毎に様々な技があります。\nまた「攻撃」から基本的に繋げて発動できます。"); // タスクセット AddTaskData("スキル−△"); Init(); }
WalkTutorial::WalkTutorial() { // タイトル名 m_pTaskTitle.pSting = "No.01 歩き"; // クリアから終りまで m_iWaitFrameMAX = 60; // 文字の長さを調べる UINT myByte = 0; UINT addByte = 0; // 終端文字までループ for (UINT i = 0; m_pTaskTitle.pSting[i] != '\0'; i += myByte) { // 文字のバイト数を調べる myByte = _mbclen((BYTE*)&m_pTaskTitle.pSting[i]); addByte += myByte; } m_pTaskTitle.iStingLength = addByte; // Tips m_pIntroTips = new TipsCard("まずは移動の基本、「歩き」です。\n方向キーでキャラクターを動かしてみましょう。"); m_pClearTips = new TipsCard("よくできました!\n 相手の方向へ方向キーを押すと「前歩き」、\n相手の逆方向へ押すと「後ろ歩き」になります。"); // タスクセット AddTaskData("前歩き−→押しっぱなし"); AddTaskData("後ろ歩き−←押しっぱなし"); Init(); }
_WCRTLINK int _ismbcpunct( unsigned int ch ) { #ifdef __NT__ BOOL rc; int len; char mbc[ MB_LEN_MAX + 1 ]; WORD char_type[ MB_LEN_MAX + 1 ]; _mbvtop( ch, mbc ); len = _mbclen( mbc ); mbc[ len ] = '\0'; rc = GetStringTypeEx( LOCALE_USER_DEFAULT, CT_CTYPE1, mbc, -1, char_type ); if( rc == FALSE ) return( 0 ); if( (char_type[ 0 ] & C1_PUNCT) == 0 ) return( 0 ); return( 1 ); #else /* OS/2 and others */ if( SINGLE_BYTE_CHAR( ch ) ) { if( __MBCodePage == 932 ) { return( ispnkana( ch ) ); } else { return( ispunct( ch ) ); } } else { return( 0 ); } #endif }
OverDriveTutorial::OverDriveTutorial() { // タイトル名 m_pTaskTitle.pSting = "No.06 必殺技"; // クリアから終りまで m_iWaitFrameMAX = 120; // 文字の長さを調べる UINT myByte = 0; UINT addByte = 0; // 終端文字までループ for (UINT i = 0; m_pTaskTitle.pSting[i] != '\0'; i += myByte) { // 文字のバイト数を調べる myByte = _mbclen((BYTE*)&m_pTaskTitle.pSting[i]); addByte += myByte; } m_pTaskTitle.iStingLength = addByte; // Tips m_pIntroTips = new TipsCard("ゲージが50以上ある時に�奄�押し込むと。\n「必殺技」を発動できます。"); m_pClearTips = new TipsCard("よくできました!\n「必殺技」はとても強力な技です。\nまた「攻撃」や「スキル」から繋げて発動できます。"); // タスクセット AddTaskData("必殺技−ゲージ50%以上で▽"); Init(); }
void FontManager::DrawFontStringNumSet(FontSet font, int pX, int pY, char *string, int pWidth, int charNum, int color) { if( m_FontData[font].handle == 0) { Load(font); } char buffer[256]; int allCount = 0; // 全体の文字数 int count = 0; // 現在保存中の文字数 int length = 0; // 文字列の横ピクセル int charNumCount = 0; // 文字数カウント // 終端文字までループ while(string[allCount] != '\0') { if(charNumCount > charNum-1){ buffer[count] = '\0'; DrawStringToHandle(pX, pY, buffer, color, m_FontData[font].handle); break; } char c = string[allCount]; // 2バイト文字なら //if((c >= 0x81 && c <= 0x9F) || (c >= 0xE0 && c <= 0xFC)) if( _mbclen((BYTE*)&string[allCount]) == 2) { // 指定した横幅を超えたら描画 if(length + m_FontData[font].stringWidth >= pWidth) { buffer[count] = '\0'; DrawStringToHandle(pX, pY, buffer, color, m_FontData[font].handle); pY += m_FontData[font].size; length = 0; count = 0; } buffer[count] = c; buffer[count + 1] = string[allCount + 1]; allCount += 2; count += 2; length += m_FontData[font].stringWidth; } else { if(length + m_FontData[font].halfStringWidth >= pWidth) { buffer[count] = '\0'; DrawStringToHandle(pX, pY, buffer, color, m_FontData[font].handle); pY += m_FontData[font].size; length = 0; count = 0; } buffer[count] = c; allCount++; count++; length += m_FontData[font].halfStringWidth; } charNumCount++; } buffer[count] = '\0'; DrawStringToHandle(pX, pY, buffer, color, m_FontData[font].handle); }
void FontManager::DrawCenter(FontSet font, int x, int y, char *string, int color) { // fontをまだ作っていなかった場合ロードする if( m_FontData[font].handle == 0) { Load(font); } char buffer[256]; int count = 0; // 現在保存中の文字数 int length = 0; // 文字列の横ピクセル // 終端文字までループ while(string[count] != '\0') { char c = string[count]; // 2バイト文字なら //if((c >= 0x81 && c <= 0x9F) || (c >= 0xE0 && c <= 0xFC)) if( _mbclen((BYTE*)&string[count]) == 2) { buffer[count] = c; buffer[count + 1] = string[count + 1]; count += 2; length += m_FontData[font].stringWidth; } else { buffer[count] = c; count++; length += m_FontData[font].halfStringWidth; } } buffer[count] = '\0'; DrawStringToHandle(x - length / 2, y, buffer, color, m_FontData[font].handle); }
_WCRTLINK int _ismbcalpha( unsigned int ch ) { #ifdef __NT__ BOOL rc; int len; char mbc[ MB_LEN_MAX + 1 ]; WORD char_type[ MB_LEN_MAX + 1 ]; _mbvtop( ch, mbc ); len = _mbclen( mbc ); mbc[ len ] = '\0'; rc = GetStringTypeEx( LOCALE_USER_DEFAULT, CT_CTYPE1, mbc, -1, char_type ); if( rc == FALSE ) return( 0 ); if( (char_type[ 0 ] & C1_ALPHA) == 0 ) return( 0 ); return( 1 ); #else /* OS/2 and others */ if( __MBCodePage == 932 ) { /* Japanese code page */ if( SINGLE_BYTE_CHAR( ch ) ) { if( ch >= 0xA6 && ch <= 0xDF ) { /* Katakana letters */ return( 1 ); } else { return( isalpha( ch ) ); } } else { /* double-byte chars */ return( _ismbdalpha( ch ) ); } } else { if( SINGLE_BYTE_CHAR( ch ) ) { return( isalpha( ch ) ); } else { return( 0 ); } } #endif }
SquatTutorial::SquatTutorial() { // タイトル名 m_pTaskTitle.pSting = "No.02 しゃがみ"; // クリアから終りまで m_iWaitFrameMAX = 60; // 文字の長さを調べる UINT myByte = 0; UINT addByte = 0; // 終端文字までループ for (UINT i = 0; m_pTaskTitle.pSting[i] != '\0'; i += myByte) { // 文字のバイト数を調べる myByte = _mbclen((BYTE*)&m_pTaskTitle.pSting[i]); addByte += myByte; } m_pTaskTitle.iStingLength = addByte; // Tips m_pIntroTips = new TipsCard("次はキャラクターをしゃがませてみましょう。\n↓でその場でしゃがみます。"); m_pClearTips = new TipsCard("よくできました!\n/や\と入力しても、しゃがむことが出来ます。"); // タスクセット AddTaskData("しゃがみ−↓押しっぱなし"); Init(); }
void main() { int i, j; _setmbcp( 932 ); for( i = 0; i < sizeof(chars); i += j ) { j = _mbclen( &chars[i] ); printf( "%d bytes in character\n", j ); } }
/* * assume MB_CUR_MAX == 2 * * @implemented */ int mblen( const char *s, size_t count ) { size_t l; if ( s == NULL ) return 0; l = _mbclen((const unsigned char *)s); if ( l < count ) return -1; return l; }
void WdeInfoLookupComboEntry( HWND hWnd, WORD hw ) { char *cp; char *str; WdeHashValue value; bool found; LRESULT index; int count; if( WdeCurrentInfo.res_info->hash_table == NULL ) { return; } count = SendDlgItemMessage( hWnd, IDB_INFO_IDSTR, CB_GETCOUNT, 0, 0 ); if( count == 0 || count == CB_ERR ) { return; } str = NULL; if( hw == CBN_EDITCHANGE ) { str = WdeGetStrFromCombo( hWnd, IDB_INFO_IDSTR ); } else { index = SendDlgItemMessage( hWnd, IDB_INFO_IDSTR, CB_GETCURSEL, 0, 0 ); if( index != CB_ERR ) { str = WdeGetStrFromComboLBox( hWnd, IDB_INFO_IDSTR, index ); } } if( str == NULL ) { return; } WRStripSymbol( str ); // if the string numeric or empty then return strtoul( str, &cp, 0 ); if( *cp == '\0' ) { WRMemFree( str ); return; } if( _mbclen( (unsigned char *)str ) == 1 && str[0] == '"' ) { value = WdeLookupName( WdeCurrentInfo.res_info->hash_table, str, &found ); if( found ) { WdeSetEditWithSINT32( (int_32)value, 10, hWnd, IDB_INFO_IDNUM ); } } WRMemFree( str ); }
_WCRTLINK int _ismbcalnum( unsigned int ch ) { #ifdef __NT__ BOOL rc; int len; char mbc[ MB_LEN_MAX + 1 ]; WORD char_type[ MB_LEN_MAX + 1 ]; _mbvtop( ch, mbc ); len = _mbclen( mbc ); mbc[ len ] = '\0'; rc = GetStringTypeEx( LOCALE_USER_DEFAULT, CT_CTYPE1, mbc, -1, char_type ); if( rc == FALSE ) return( 0 ); if( (char_type[ 0 ] & (C1_DIGIT | C1_ALPHA)) == 0 ) return( 0 ); return( 1 ); #else /* OS/2 and others */ return( _ismbcalpha( ch ) || _ismbcdigit( ch ) ); #endif }
void BaseWindow::AddIconData(LPSTR string, LPSTR infoString) { IconData data; data.pString = string; data.pInfoString = infoString; // 文字の長さを調べる UINT myByte = 0; UINT addByte = 0; // 終端文字までループ for (UINT i = 0; string[i] != '\0'; i += myByte) { // 文字のバイト数を調べる myByte = _mbclen((BYTE*)&string[i]); addByte += myByte; } data.iStringLength = addByte; m_aIconData.push_back(data); }
_WCRTLINK int _ismbclegal( unsigned int ch ) { #ifdef __NT__ BOOL rc; int len; char mbc[ MB_LEN_MAX + 1 ]; WORD char_type[ MB_LEN_MAX + 1 ]; _mbvtop( ch, mbc ); len = _mbclen( mbc ); mbc[ len ] = '\0'; if( len <= 1 ) return( 0 ); rc = GetStringTypeEx( LOCALE_USER_DEFAULT, CT_CTYPE1, mbc, -1, char_type ); if( rc == FALSE ) return( 0 ); if( char_type[ 0 ] == 0 ) return( 0 ); return( 1 ); #else /* OS/2 and others */ return( _ismbblead( ch >> 8 ) && _ismbbtrail( ch & 0xFF ) ); #endif }
void BaseTutorial::AddTaskData(LPSTR string) { Task data; data.pSting = string; data.bClear = false; // 文字の長さを調べる UINT myByte = 0; UINT addByte = 0; // 終端文字までループ for (UINT i = 0; string[i] != '\0'; i += myByte) { // 文字のバイト数を調べる myByte = _mbclen((BYTE*)&string[i]); addByte += myByte; } data.iStingLength = addByte; m_aTask.push_back(data); }
_WCRTLINK unsigned char _FFAR *_NEARFAR(_mbschr,_fmbschr)( const unsigned char _FFAR *string, unsigned int ch ) { char mbc[MB_LEN_MAX+1]; // if( !__IsDBCS && !ch&0xFF00 ) return( strchr( string, ch ) ); /*** Search for the specified character ***/ _mbvtop( ch, mbc ); mbc[_mbclen(mbc)] = '\0'; #ifdef __FARFUNC__ while( !_fmbterm(string) && _fmbccmp(string,mbc)!=0 ) string = _fmbsinc( string ); /* skip over character */ #else while( !_mbterm(string) && _mbccmp(string,mbc)!=0 ) string = _mbsinc( string ); /* skip over character */ #endif /*** Return character address, or NULL if not found ***/ if( !_NEARFAR(_mbterm,_fmbterm)(string) || ch==0 ) return( (unsigned char _FFAR*) string ); else return( NULL ); }
_WCRTLINK int _ismbccntrl( unsigned int ch ) { #ifdef __NT__ BOOL rc; int len; unsigned char mbc[ MB_LEN_MAX + 1 ]; WORD char_type[ MB_LEN_MAX + 1 ]; _mbvtop( ch, mbc ); len = _mbclen( mbc ); mbc[len] = '\0'; rc = GetStringTypeEx( LOCALE_USER_DEFAULT, CT_CTYPE1, (char *)mbc, -1, char_type ); if( rc == FALSE ) return( 0 ); if( (char_type[ 0 ] & C1_CNTRL) == 0 ) return( 0 ); return( 1 ); #else /* OS/2 and others */ if( SINGLE_BYTE_CHAR( ch ) ) { return( iscntrl( ch ) ); } else { return( 0 ); } #endif }
void _RepaintWindow( LPWDATA w, PRECT rcPaint, HDC ph ) #endif { WORD i; WORD ptop, pbot, pleft, pright, poff, pdown; WORD width; #ifdef _MBCS mb_char _WCI86FAR *image; unsigned char mbc[MB_CUR_MAX + 1]; #else LPSTR image; #endif #if !defined( __OS2__ ) HFONT oldfont; #endif /* * get area to redraw */ ptop = rcPaint->top / w->ychar; if( ptop > 0 && ( rcPaint->top % w->ychar ) != 0 ) ptop--; pbot = rcPaint->bottom / w->ychar ; if( pbot == 0 ) return; if( pbot >= w->height ) pbot = w->height - 1; if( ( rcPaint->bottom % w->ychar ) == 0 ) pbot--; pleft = 0; pright = w->width - 1; width = w->width; poff = pleft * w->xchar; pdown = ptop * w->ychar; /* * draw all lines */ #if defined( __OS2__ ) #else oldfont = SelectObject( (HDC)ph, _FixedFont ); #endif for( i = ptop; i <= pbot; i++ ) { image = &w->image[i * w->width]; #if defined( __OS2__ ) { POINTL ptl; ptl.x = poff; ptl.y = ( w->y2 - w->y1 ) - ( pdown + w->ychar ) + w->base_offset; #ifdef _MBCS { WORD count; LPSTR buff; buff = FARmalloc( sizeof( mb_char ) * ( width + 1 ) ); if( buff == NULL ) _OutOfMemoryExit(); *buff = '\0'; for( count = 0; count < width; count++ ) { _mbvtop( image[pleft + count], mbc ); mbc[_mbclen( mbc )] = '\0'; FARstrcat( buff, (char *)mbc ); } GpiCharStringAt( (HPS)ph, &ptl, FAR_mbsnbcnt( (PBYTE)buff, width ), buff ); FARfree( buff ); } #else GpiCharStringAt( (HPS)ph, &ptl, width, &image[pleft] ); #endif } #else SetBkColor( (HDC)ph, _ColorMap[w->background_color] ); SetTextColor( (HDC)ph, _ColorMap[w->text_color] ); #ifdef _MBCS { WORD count; size_t bytes; LPSTR buff; buff = FARmalloc( sizeof( mb_char ) * ( width + 1 ) ); if( buff == NULL ) _OutOfMemoryExit(); *buff = '\0'; for( count = 0; count < width; count++ ) { _mbvtop( image[pleft + count], mbc ); mbc[_mbclen( mbc )] = '\0'; FARstrcat( buff, (LPSTR)mbc ); } bytes = FARstrlen( buff ); TextOut( (HDC)ph, poff, pdown, buff, bytes ); FARfree( buff ); } #else TextOut( (HDC)ph, poff, pdown, &image[pleft], width ); #endif #endif pdown += w->ychar; } #if !defined( __OS2__ ) SelectObject( (HDC)ph, oldfont ); #endif } /* _RepaintWindow */
static void test_mbcp(void) { int mb_orig_max = *p__mb_cur_max; int curr_mbcp = _getmbcp(); unsigned char *mbstring = (unsigned char *)"\xb0\xb1\xb2 \xb3\xb4 \xb5"; /* incorrect string */ unsigned char *mbstring2 = (unsigned char *)"\xb0\xb1\xb2\xb3Q\xb4\xb5"; /* correct string */ unsigned char *mbsonlylead = (unsigned char *)"\xb0\0\xb1\xb2 \xb3"; unsigned char buf[16]; int step; /* _mbtype tests */ /* An SBCS codepage test. The ctype of characters on e.g. CP1252 or CP1250 differs slightly * between versions of Windows. Also Windows 9x seems to ignore the codepage and always uses * CP1252 (or the ACP?) so we test only a few ASCII characters */ _setmbcp(1252); expect_eq(p_mbctype[10], 0, char, "%x"); expect_eq(p_mbctype[50], 0, char, "%x"); expect_eq(p_mbctype[66], _SBUP, char, "%x"); expect_eq(p_mbctype[100], _SBLOW, char, "%x"); expect_eq(p_mbctype[128], 0, char, "%x"); _setmbcp(1250); expect_eq(p_mbctype[10], 0, char, "%x"); expect_eq(p_mbctype[50], 0, char, "%x"); expect_eq(p_mbctype[66], _SBUP, char, "%x"); expect_eq(p_mbctype[100], _SBLOW, char, "%x"); expect_eq(p_mbctype[128], 0, char, "%x"); /* double byte code pages */ test_codepage(932); test_codepage(936); test_codepage(949); test_codepage(950); _setmbcp(936); ok(*p__mb_cur_max == mb_orig_max, "__mb_cur_max shouldn't be updated (is %d != %d)\n", *p__mb_cur_max, mb_orig_max); ok(_ismbblead('\354'), "\354 should be a lead byte\n"); ok(_ismbblead(' ') == FALSE, "' ' should not be a lead byte\n"); ok(_ismbblead(0x1234b0), "0x1234b0 should not be a lead byte\n"); ok(_ismbblead(0x123420) == FALSE, "0x123420 should not be a lead byte\n"); ok(_ismbbtrail('\xb0'), "\xa0 should be a trail byte\n"); ok(_ismbbtrail(' ') == FALSE, "' ' should not be a trail byte\n"); /* _ismbslead */ expect_eq(_ismbslead(mbstring, &mbstring[0]), -1, int, "%d"); expect_eq(_ismbslead(mbstring, &mbstring[1]), FALSE, int, "%d"); expect_eq(_ismbslead(mbstring, &mbstring[2]), -1, int, "%d"); expect_eq(_ismbslead(mbstring, &mbstring[3]), FALSE, int, "%d"); expect_eq(_ismbslead(mbstring, &mbstring[4]), -1, int, "%d"); expect_eq(_ismbslead(mbstring, &mbstring[5]), FALSE, int, "%d"); expect_eq(_ismbslead(mbstring, &mbstring[6]), FALSE, int, "%d"); expect_eq(_ismbslead(mbstring, &mbstring[7]), -1, int, "%d"); expect_eq(_ismbslead(mbstring, &mbstring[8]), FALSE, int, "%d"); expect_eq(_ismbslead(mbsonlylead, &mbsonlylead[0]), -1, int, "%d"); expect_eq(_ismbslead(mbsonlylead, &mbsonlylead[1]), FALSE, int, "%d"); expect_eq(_ismbslead(mbsonlylead, &mbsonlylead[2]), FALSE, int, "%d"); expect_eq(_ismbslead(mbsonlylead, &mbsonlylead[5]), FALSE, int, "%d"); /* _ismbstrail */ expect_eq(_ismbstrail(mbstring, &mbstring[0]), FALSE, int, "%d"); expect_eq(_ismbstrail(mbstring, &mbstring[1]), -1, int, "%d"); expect_eq(_ismbstrail(mbstring, &mbstring[2]), FALSE, int, "%d"); expect_eq(_ismbstrail(mbstring, &mbstring[3]), -1, int, "%d"); expect_eq(_ismbstrail(mbstring, &mbstring[4]), FALSE, int, "%d"); expect_eq(_ismbstrail(mbstring, &mbstring[5]), -1, int, "%d"); expect_eq(_ismbstrail(mbstring, &mbstring[6]), FALSE, int, "%d"); expect_eq(_ismbstrail(mbstring, &mbstring[7]), FALSE, int, "%d"); expect_eq(_ismbstrail(mbstring, &mbstring[8]), -1, int, "%d"); expect_eq(_ismbstrail(mbsonlylead, &mbsonlylead[0]), FALSE, int, "%d"); expect_eq(_ismbstrail(mbsonlylead, &mbsonlylead[1]), -1, int, "%d"); expect_eq(_ismbstrail(mbsonlylead, &mbsonlylead[2]), FALSE, int, "%d"); expect_eq(_ismbstrail(mbsonlylead, &mbsonlylead[3]), FALSE, int, "%d"); expect_eq(_ismbstrail(mbsonlylead, &mbsonlylead[4]), FALSE, int, "%d"); expect_eq(_ismbstrail(mbsonlylead, &mbsonlylead[5]), FALSE, int, "%d"); /* _mbsbtype */ expect_eq(_mbsbtype(mbstring, 0), _MBC_LEAD, int, "%d"); expect_eq(_mbsbtype(mbstring, 1), _MBC_TRAIL, int, "%d"); expect_eq(_mbsbtype(mbstring, 2), _MBC_LEAD, int, "%d"); expect_eq(_mbsbtype(mbstring, 3), _MBC_ILLEGAL, int, "%d"); expect_eq(_mbsbtype(mbstring, 4), _MBC_LEAD, int, "%d"); expect_eq(_mbsbtype(mbstring, 5), _MBC_TRAIL, int, "%d"); expect_eq(_mbsbtype(mbstring, 6), _MBC_SINGLE, int, "%d"); expect_eq(_mbsbtype(mbstring, 7), _MBC_LEAD, int, "%d"); expect_eq(_mbsbtype(mbstring, 8), _MBC_ILLEGAL, int, "%d"); expect_eq(_mbsbtype(mbsonlylead, 0), _MBC_LEAD, int, "%d"); expect_eq(_mbsbtype(mbsonlylead, 1), _MBC_ILLEGAL, int, "%d"); expect_eq(_mbsbtype(mbsonlylead, 2), _MBC_ILLEGAL, int, "%d"); expect_eq(_mbsbtype(mbsonlylead, 3), _MBC_ILLEGAL, int, "%d"); expect_eq(_mbsbtype(mbsonlylead, 4), _MBC_ILLEGAL, int, "%d"); expect_eq(_mbsbtype(mbsonlylead, 5), _MBC_ILLEGAL, int, "%d"); /* _mbsnextc */ expect_eq(_mbsnextc(mbstring), 0xb0b1, int, "%x"); expect_eq(_mbsnextc(&mbstring[2]), 0xb220, int, "%x"); /* lead + invalid tail */ expect_eq(_mbsnextc(&mbstring[3]), 0x20, int, "%x"); /* single char */ /* _mbclen/_mbslen */ expect_eq(_mbclen(mbstring), 2, int, "%d"); expect_eq(_mbclen(&mbstring[2]), 2, int, "%d"); expect_eq(_mbclen(&mbstring[3]), 1, int, "%d"); expect_eq(_mbslen(mbstring2), 4, int, "%d"); expect_eq(_mbslen(mbsonlylead), 0, int, "%d"); /* lead + NUL not counted as character */ expect_eq(_mbslen(mbstring), 4, int, "%d"); /* lead + invalid trail counted */ /* _mbccpy/_mbsncpy */ memset(buf, 0xff, sizeof(buf)); _mbccpy(buf, mbstring); expect_bin(buf, "\xb0\xb1\xff", 3); memset(buf, 0xff, sizeof(buf)); _mbsncpy(buf, mbstring, 1); expect_bin(buf, "\xb0\xb1\xff", 3); memset(buf, 0xff, sizeof(buf)); _mbsncpy(buf, mbstring, 2); expect_bin(buf, "\xb0\xb1\xb2 \xff", 5); memset(buf, 0xff, sizeof(buf)); _mbsncpy(buf, mbstring, 3); expect_bin(buf, "\xb0\xb1\xb2 \xb3\xb4\xff", 7); memset(buf, 0xff, sizeof(buf)); _mbsncpy(buf, mbstring, 4); expect_bin(buf, "\xb0\xb1\xb2 \xb3\xb4 \xff", 8); memset(buf, 0xff, sizeof(buf)); _mbsncpy(buf, mbstring, 5); expect_bin(buf, "\xb0\xb1\xb2 \xb3\xb4 \0\0\xff", 10); memset(buf, 0xff, sizeof(buf)); _mbsncpy(buf, mbsonlylead, 6); expect_bin(buf, "\0\0\0\0\0\0\0\xff", 8); memset(buf, 0xff, sizeof(buf)); _mbsnbcpy(buf, mbstring2, 2); expect_bin(buf, "\xb0\xb1\xff", 3); _mbsnbcpy(buf, mbstring2, 3); expect_bin(buf, "\xb0\xb1\0\xff", 4); _mbsnbcpy(buf, mbstring2, 4); expect_bin(buf, "\xb0\xb1\xb2\xb3\xff", 5); memset(buf, 0xff, sizeof(buf)); _mbsnbcpy(buf, mbsonlylead, 5); expect_bin(buf, "\0\0\0\0\0\xff", 6); /* _mbsinc/mbsdec */ step = _mbsinc(mbstring) - mbstring; ok(step == 2, "_mbsinc adds %d (exp. 2)\n", step); step = _mbsinc(&mbstring[2]) - &mbstring[2]; /* lead + invalid tail */ ok(step == 2, "_mbsinc adds %d (exp. 2)\n", step); step = _mbsninc(mbsonlylead, 1) - mbsonlylead; ok(step == 0, "_mbsninc adds %d (exp. 0)\n", step); step = _mbsninc(mbsonlylead, 2) - mbsonlylead; /* lead + NUL byte + lead + char */ ok(step == 0, "_mbsninc adds %d (exp. 0)\n", step); step = _mbsninc(mbstring2, 0) - mbstring2; ok(step == 0, "_mbsninc adds %d (exp. 2)\n", step); step = _mbsninc(mbstring2, 1) - mbstring2; ok(step == 2, "_mbsninc adds %d (exp. 2)\n", step); step = _mbsninc(mbstring2, 2) - mbstring2; ok(step == 4, "_mbsninc adds %d (exp. 4)\n", step); step = _mbsninc(mbstring2, 3) - mbstring2; ok(step == 5, "_mbsninc adds %d (exp. 5)\n", step); step = _mbsninc(mbstring2, 4) - mbstring2; ok(step == 7, "_mbsninc adds %d (exp. 7)\n", step); step = _mbsninc(mbstring2, 5) - mbstring2; ok(step == 7, "_mbsninc adds %d (exp. 7)\n", step); step = _mbsninc(mbstring2, 17) - mbstring2; ok(step == 7, "_mbsninc adds %d (exp. 7)\n", step); /* functions that depend on locale codepage, not mbcp. * we hope the current locale to be SBCS because setlocale(LC_ALL, ".1252") seems not to work yet * (as of Wine 0.9.43) */ if (*p__mb_cur_max == 1) { expect_eq(mblen((char *)mbstring, 3), 1, int, "%x"); expect_eq(_mbstrlen((char *)mbstring2), 7, int, "%d"); }
_WCRTLINK void __F_NAME(_makepath,_wmakepath)( CHAR_TYPE *path, const CHAR_TYPE *drive, const CHAR_TYPE *dir, const CHAR_TYPE *fname, const CHAR_TYPE *ext ) { UINT_WC_TYPE first_pc = NULLCHAR; #ifndef __WIDECHAR__ char *pathstart = path; unsigned ch; #endif if( drive != NULL ) { if( *drive != NULLCHAR ) { if( ( drive[0] == DIR_SEP ) && ( drive[1] == DIR_SEP ) ) { __F_NAME(strcpy, wcscpy)( path, drive ); path += __F_NAME(strlen, wcslen)( drive ); } else { *path++ = *drive; /* OK for MBCS */ *path++ = DRV_SEP; } } } *path = NULLCHAR; if( dir != NULL ) { if( *dir != NULLCHAR ) { do { #ifdef __WIDECHAR__ *path++ = pickup( *dir++, &first_pc ); #else ch = pickup( _mbsnextc( (unsigned char *)dir ), &first_pc ); _mbvtop( ch, (unsigned char *)path ); path[_mbclen( (unsigned char *)path )] = NULLCHAR; path = (char *)_mbsinc( (unsigned char *)path ); dir = (char *)_mbsinc( (unsigned char *)dir ); #endif } while( *dir != NULLCHAR ); /* if no path separator was specified then pick a default */ if( first_pc == NULLCHAR ) first_pc = DIR_SEP; /* if dir did not end in '/' then put in a provisional one */ #ifdef __WIDECHAR__ if( path[-1] == first_pc ) { path--; } else { *path = first_pc; } #else if( *(_mbsdec( (unsigned char *)pathstart, (unsigned char *)path )) == first_pc ) { path--; } else { *path = first_pc; } #endif } } /* if no path separator was specified thus far then pick a default */ if( first_pc == NULLCHAR ) first_pc = DIR_SEP; if( fname != NULL ) { #ifdef __WIDECHAR__ if( pickup( *fname, &first_pc ) != first_pc && *path == first_pc ) path++; #else ch = _mbsnextc( (unsigned char *)fname ); if( pickup( ch, &first_pc ) != first_pc && *path == first_pc ) path++; #endif while( *fname != NULLCHAR ) { //do { #ifdef __WIDECHAR__ *path++ = pickup( *fname++, &first_pc ); #else ch = pickup( _mbsnextc( (unsigned char *)fname ), &first_pc ); _mbvtop( ch, (unsigned char *)path ); path[_mbclen( (unsigned char *)path )] = NULLCHAR; path = (char *)_mbsinc( (unsigned char *)path ); fname = (char *)_mbsinc( (unsigned char *)fname ); #endif } //while( *fname != NULLCHAR ); } else { if( *path == first_pc ) { path++; } } if( ext != NULL ) { if( *ext != NULLCHAR ) { if( *ext != EXT_SEP ) *path++ = EXT_SEP; while( *ext != NULLCHAR ) { *path++ = *ext++; /* OK for MBCS */ } } } *path = NULLCHAR; }
_WCRTLINK INTCHAR_TYPE __F_NAME(ungetc,ungetwc)( INTCHAR_TYPE c, FILE *fp ) { if( c == INTCHAR_EOF ) { /* cannot push EOF */ return( c ); } _ValidFile( fp, INTCHAR_EOF ); _AccessFile( fp ); /*** Deal with stream orientation ***/ ORIENT_STREAM( fp, INTCHAR_EOF ); if( fp->_flag & _DIRTY ) { /* cannot unget after a put */ _ReleaseFile( fp ); return( INTCHAR_EOF ); } if(( fp->_flag & _READ ) == 0 ) { /* not open for input */ _ReleaseFile( fp ); return( INTCHAR_EOF ); } if( _FP_BASE( fp ) == NULL ) { /* no buffer allocated */ __ioalloc( fp ); } #ifdef __WIDECHAR__ if( fp->_flag & _BINARY ) { /*** Leave the character in wide form ***/ if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = sizeof( wchar_t ); fp->_ptr = _FP_BASE( fp ) + fp->_bufsize - sizeof( wchar_t ); fp->_flag |= _UNGET; /* 10-mar-90 */ memcpy( fp->_ptr, &c, sizeof( wchar_t ) ); } else if( fp->_ptr != _FP_BASE( fp ) ) { fp->_cnt += sizeof( wchar_t ); fp->_ptr -= sizeof( wchar_t ); fp->_flag |= _UNGET; memcpy( fp->_ptr, &c, sizeof( wchar_t ) ); } else { /* read buffer is full */ _ReleaseFile( fp ); return( WEOF ); } } else { unsigned char mbc[MB_CUR_MAX]; int mbcLen; /*** Convert the character to multibyte form ***/ if( wctomb( (char *)mbc, c ) == -1 ) { _RWD_errno = EILSEQ; return( WEOF ); } mbcLen = _mbclen( mbc ); /*** Store the converted character ***/ if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = mbcLen; fp->_ptr = _FP_BASE( fp ) + fp->_bufsize - mbcLen; fp->_flag |= _UNGET; /* 10-mar-90 */ _mbccpy( fp->_ptr, mbc ); } else if( fp->_ptr != _FP_BASE( fp ) ) { fp->_cnt += mbcLen; fp->_ptr -= mbcLen; fp->_flag |= _UNGET; _mbccpy( fp->_ptr, mbc ); } else { /* read buffer is full */ _ReleaseFile( fp ); return( WEOF ); } } #else if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = 1; fp->_ptr = _FP_BASE( fp ) + fp->_bufsize - 1; fp->_flag |= _UNGET; /* 10-mar-90 */ *fp->_ptr = c; } else if( fp->_ptr != _FP_BASE( fp ) ) { fp->_cnt++; fp->_ptr--; if( *fp->_ptr != c ) { fp->_flag |= _UNGET; /* 10-mar-90 */ } *fp->_ptr = c; } else { /* read buffer is full */ _ReleaseFile( fp ); return( EOF ); } #endif fp->_flag &= ~ _EOF; _ReleaseFile( fp ); return( (UCHAR_TYPE)c ); }
_WCRTLINK wint_t (ungetwc)( wint_t c, FILE *fp ) #endif { if( c == __F_NAME(EOF,WEOF) ) { /* cannot push EOF */ return( c ); } _ValidFile( fp, __F_NAME(EOF,WEOF) ); _AccessFile( fp ); /*** Deal with stream orientation ***/ #ifndef __NETWARE__ #ifdef __WIDECHAR__ if( _FP_ORIENTATION(fp) != _WIDE_ORIENTED ) { if( _FP_ORIENTATION(fp) == _NOT_ORIENTED ) { _FP_ORIENTATION(fp) = _WIDE_ORIENTED; } else { _ReleaseFile( fp ); return( WEOF ); } } #else if( _FP_ORIENTATION(fp) != _BYTE_ORIENTED ) { if( _FP_ORIENTATION(fp) == _NOT_ORIENTED ) { _FP_ORIENTATION(fp) = _BYTE_ORIENTED; } else { _ReleaseFile( fp ); return( EOF ); } } #endif #endif if( fp->_flag & _DIRTY ) { /* cannot unget after a put */ _ReleaseFile( fp ); return( __F_NAME(EOF,WEOF) ); } if(( fp->_flag & _READ ) == 0 ) { /* not open for input */ _ReleaseFile( fp ); return( __F_NAME(EOF,WEOF) ); } if( _FP_BASE(fp) == NULL ) { /* no buffer allocated */ __ioalloc( fp ); } #ifdef __WIDECHAR__ if( fp->_flag & _BINARY ) { /*** Leave the character in wide form ***/ if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = sizeof(wchar_t); fp->_ptr = _FP_BASE(fp) + fp->_bufsize - sizeof(wchar_t); fp->_flag |= _UNGET; /* 10-mar-90 */ memcpy( fp->_ptr, &c, sizeof(wchar_t) ); } else if( fp->_ptr != _FP_BASE(fp) ) { fp->_cnt += sizeof(wchar_t); fp->_ptr -= sizeof(wchar_t); fp->_flag |= _UNGET; memcpy( fp->_ptr, &c, sizeof(wchar_t) ); } else { /* read buffer is full */ _ReleaseFile( fp ); return( WEOF ); } } else { char mbc[MB_CUR_MAX]; int mbcLen; /*** Convert the character to multibyte form ***/ if( wctomb( mbc, c ) == -1 ) { __set_errno( EILSEQ ); return( WEOF ); } mbcLen = _mbclen( mbc ); /*** Store the converted character ***/ if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = mbcLen; fp->_ptr = _FP_BASE(fp) + fp->_bufsize - mbcLen; fp->_flag |= _UNGET; /* 10-mar-90 */ _mbccpy( fp->_ptr, mbc ); } else if( fp->_ptr != _FP_BASE(fp) ) { fp->_cnt += mbcLen; fp->_ptr -= mbcLen; fp->_flag |= _UNGET; _mbccpy( fp->_ptr, mbc ); } else { /* read buffer is full */ _ReleaseFile( fp ); return( WEOF ); } } #else if( fp->_cnt == 0 ) { /* read buffer is empty */ fp->_cnt = CHARSIZE; fp->_ptr = _FP_BASE(fp) + fp->_bufsize - CHARSIZE; fp->_flag |= _UNGET; /* 10-mar-90 */ *(CHAR_TYPE*)(fp->_ptr) = c; } else if( fp->_ptr != _FP_BASE(fp) ) { fp->_cnt += CHARSIZE; fp->_ptr -= CHARSIZE; if( *(CHAR_TYPE*)(fp->_ptr) != c ) fp->_flag |= _UNGET; /* 10-mar-90 */ *(CHAR_TYPE*)(fp->_ptr) = c; } else { /* read buffer is full */ _ReleaseFile( fp ); return( EOF ); } #endif fp->_flag &= ~ _EOF; _ReleaseFile( fp ); return( (UCHAR_TYPE) c ); }
/* * _AddLine - add a line to the lines data structures */ void _AddLine( LPWDATA w, const void *in_data, unsigned len ) { int i; BOOL hadbreak; HWND hwnd; int tabcnt = 0; int nlcnt = 0; int curbufoff = 0; const char *data; #ifdef _MBCS static char leadByte; static int leadByteWaiting; unsigned char ch[MB_CUR_MAX+1]; LPBYTE p; #else char ch; #endif data = (const char *)in_data; hwnd = w->hwnd; _AccessWinLines(); if( w->LineTail != NULL && !w->LineTail->has_cr ) { FARstrcpy( w->tmpbuff->data, w->LineTail->data ); #ifdef _MBCS curbufoff = FAR_mbslen( (LPBYTE)w->tmpbuff->data ); #else curbufoff = FARstrlen( w->tmpbuff->data ); #endif if( curbufoff > w->buffoff ) { w->buffoff = curbufoff; } } if( w->no_advance ) { curbufoff = 0; } for( i = 0; i < len; i ++ ) { w->no_advance = FALSE; do { hadbreak = FALSE; #ifdef _MBCS /* MBCS */ if( tabcnt ) { _mbccpy( ch, (unsigned char *)" " ); /* copy the character */ ch[_mbclen( ch )] = '\0'; /* terminate char with NULL */ tabcnt--; } else if( nlcnt ) { _mbccpy( ch, (unsigned char *)"\n" ); /* copy the character */ ch[_mbclen( ch )] = '\0'; /* terminate char with NULL */ nlcnt--; } else { if( !leadByteWaiting ) { if( _ismbblead( *data ) ) { leadByteWaiting = 1; leadByte = *data; ch[0] = '\0'; } else { ch[0] = *data; ch[1] = '\0'; } } else { leadByteWaiting = 0; ch[0] = leadByte; ch[1] = *data; ch[2] = '\0'; } data++; } if( !_mbccmp( ch, (unsigned char *)"\t" ) ) { tabcnt = TAB( curbufoff + 1 ); continue; } else if( !_mbccmp( ch, (unsigned char *)"\f" ) ) { nlcnt = w->height; continue; } else if( !_mbccmp( ch, (unsigned char *)"\r" ) ) { curbufoff = 0; w->no_advance = TRUE; w->tmpbuff->has_cr = TRUE; continue; } else if( !_mbccmp( ch, (unsigned char *)"\n" ) ) { hadbreak = TRUE; newLine( w ); curbufoff = w->buffoff; } else if( !_mbccmp( ch, (unsigned char *)"\b" ) ) { if( curbufoff > 0 ) { p = FAR_mbsninc( (LPBYTE)w->tmpbuff->data, curbufoff - 1 ); if( _ismbblead( *p ) ) { *p = ' '; /* stomp lead byte */ /* char split into 2; don't change curbufoff */ } else { curbufoff--; /* back up one character */ } } } else if( ch[0] != '\0' ) { FAR_mbccpy( FAR_mbsninc( (LPBYTE)w->tmpbuff->data, curbufoff ), ch ); curbufoff++; if( curbufoff > w->buffoff ) { w->buffoff = curbufoff; } if( TOOWIDE( w->buffoff, w ) ) { hadbreak = TRUE; newLine( w ); curbufoff = w->buffoff; } } #else /* SBCS */ if( tabcnt ) { ch = ' '; tabcnt--; } else if( nlcnt ) { ch = '\n'; nlcnt--; } else { ch = data[i]; } if( ch == '\t' ) { tabcnt = TAB( curbufoff + 1 ); continue; } else if( ch == '\f' ) { nlcnt = w->height; continue; } else if( ch == '\r' ) { curbufoff = 0; w->no_advance = TRUE; w->tmpbuff->has_cr = TRUE; continue; } else if( ch == '\n' ) { hadbreak = TRUE; newLine( w ); curbufoff = w->buffoff; } else if( ch == '\b' ) { if( curbufoff > 0 ) { curbufoff--; } } else { w->tmpbuff->data[curbufoff++] = ch; if( curbufoff > w->buffoff ) { w->buffoff = curbufoff; } if( TOOWIDE( w->buffoff, w ) ) { hadbreak = TRUE; newLine( w ); curbufoff = w->buffoff; } } #endif } while( tabcnt || nlcnt ); } if( !hadbreak ) { updateBuff( w ); } _ReleaseWinLines(); } /* _AddLine */
void WdeChangeDialogInfo( WdeInfoStruct *is ) { WdeInfoStruct c_is; char *str; char *cp; bool quoted_str; bool str_is_ordinal; uint_16 ord; bool found; WdeHashValue value; c_is = *is; str = NULL; cp = WdeGetStrFromEdit( WdeInfoWindow, IDB_INFO_CAPTION, NULL ); if( cp != NULL ) { str = WRConvertStringTo( cp, "\t\n", "tn" ); WRMemFree( cp ); } c_is.d.caption = str; str = WdeGetStrFromCombo( WdeInfoWindow, IDB_INFO_IDSTR ); if( str == NULL ) { WRMemFree( c_is.d.caption ); c_is.d.caption = NULL; return; } WRStripSymbol( str ); quoted_str = FALSE; if( _mbclen( (unsigned char *)str ) == 1 && str[0] == '"' ) { unsigned char *s; str[0] = ' '; cp = NULL; for( s = (unsigned char *)str; *s != '\0'; s = _mbsinc( s ) ) { if( _mbclen( s ) == 1 && *s == '"' ) { cp = (char *)s; } } if( cp != NULL ) { *cp = '\0'; } WRStripSymbol( str ); quoted_str = TRUE; } if( str[0] == '\0' ) { WRMemFree( str ); WRMemFree( c_is.d.caption ); c_is.d.caption = NULL; return; } ord = (uint_16)strtoul( str, &cp, 0 ); str_is_ordinal = (*cp == '\0'); c_is.symbol = NULL; if( quoted_str ) { c_is.d.name = WResIDFromStr( str ); WRMemFree( str ); } else if( str_is_ordinal ) { c_is.d.name = WResIDFromNum( ord ); WRMemFree( str ); } else { if( !WdeIsValidSymbol( str ) ) { WRMemFree( str ); WRMemFree( c_is.d.caption ); c_is.d.caption = NULL; return; } strupr( str ); c_is.symbol = str; c_is.d.name = NULL; } Forward( is->obj, MODIFY_INFO, &c_is, NULL ); if( c_is.symbol ) { WdeAddUniqueStringToCombo( WdeInfoWindow, IDB_INFO_IDSTR, c_is.symbol ); value = WdeLookupName( c_is.res_info->hash_table, c_is.symbol, &found ); if( found ) { WdeSetEditWithSINT32( (int_32)value, 10, WdeInfoWindow, IDB_INFO_IDNUM ); } } else if( str_is_ordinal ) { WdeSetEditWithSINT32( (int_32)ord, 10, WdeInfoWindow, IDB_INFO_IDNUM ); } else { WdeSetEditWithStr( "", WdeInfoWindow, IDB_INFO_IDNUM ); } *is = c_is; }