Changeset 10005 for trunk/src/msvcrt/mbcs.c
- Timestamp:
- Apr 10, 2003, 12:28:07 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/msvcrt/mbcs.c
r9633 r10005 35 35 #include "wine/debug.h" 36 36 37 #include <string.h> 38 #include <ctype.h> 39 37 40 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt); 38 41 … … 67 70 unsigned char* __p__mbctype(void) 68 71 { 72 dprintf(("MSVCRT: Query for __p__mbctype")); 69 73 return MSVCRT_mbctype; 70 74 } … … 75 79 int* __p___mb_cur_max(void) 76 80 { 81 dprintf(("MSVCRT: Query for __p__mb_cur_max")); 77 82 return &MSVCRT___mb_cur_max; 78 83 } … … 83 88 unsigned int _mbsnextc(const unsigned char* str) 84 89 { 90 dprintf(("MSVCRT: _mbsnextc")); 85 91 if(MSVCRT___mb_cur_max > 1 && MSVCRT_isleadbyte(*str)) 86 92 return *str << 8 | str[1]; … … 93 99 unsigned int _mbctolower(unsigned int c) 94 100 { 101 dprintf(("MSVCRT: _mbctolower")); 95 102 if (MSVCRT_isleadbyte(c)) 96 103 { … … 106 113 unsigned int _mbctoupper(unsigned int c) 107 114 { 115 dprintf(("MSVCRT: _mbctoupper")); 108 116 if (MSVCRT_isleadbyte(c)) 109 117 { … … 119 127 unsigned char* _mbsdec(const unsigned char* start, const unsigned char* cur) 120 128 { 129 dprintf(("MSVCRT: _mbsdec")); 121 130 if(MSVCRT___mb_cur_max > 1) 122 131 return (char *)(_ismbstrail(start,cur-1) ? cur - 2 : cur -1); … … 130 139 unsigned char* _mbsinc(const unsigned char* str) 131 140 { 141 dprintf(("MSVCRT: _mbsinc")); 132 142 if(MSVCRT___mb_cur_max > 1 && MSVCRT_isleadbyte(*str)) 133 143 return (unsigned char*)str + 2; /* MB char */ … … 141 151 unsigned char* _mbsninc(const unsigned char* str, MSVCRT_size_t num) 142 152 { 153 dprintf(("MSVCRT: _mbsninc")); 143 154 if(!str || num < 1) 144 155 return NULL; … … 157 168 unsigned int _mbclen(const unsigned char* str) 158 169 { 170 dprintf(("MSVCRT: _mbclen")); 159 171 return MSVCRT_isleadbyte(*str) ? 2 : 1; 160 172 } … … 165 177 int MSVCRT_mblen(const char* str, MSVCRT_size_t size) 166 178 { 179 dprintf(("MSVCRT: mblen")); 167 180 if (str && *str && size) 168 181 { … … 180 193 MSVCRT_size_t _mbslen(const unsigned char* str) 181 194 { 195 dprintf(("MSVCRT: _mbslen")); 182 196 if(MSVCRT___mb_cur_max > 1) 183 197 { … … 198 212 MSVCRT_size_t _mbstrlen(const char* str) 199 213 { 214 dprintf(("MSVCRT: _mbstrlen")); 200 215 if(MSVCRT___mb_cur_max > 1) 201 216 { … … 219 234 void _mbccpy(unsigned char* dest, const unsigned char* src) 220 235 { 236 dprintf(("MSVCRT: _mbccpy")); 221 237 *dest++ = *src; 222 238 if(MSVCRT___mb_cur_max > 1 && MSVCRT_isleadbyte(*src)) … … 231 247 unsigned char* _mbsncpy(unsigned char* dst, const unsigned char* src, MSVCRT_size_t n) 232 248 { 249 dprintf(("MSVCRT: _mbsncpy")); 233 250 if(!n) 234 251 return dst; … … 254 271 unsigned char* _mbsnbcpy(unsigned char* dst, const unsigned char* src, MSVCRT_size_t n) 255 272 { 273 dprintf(("MSVCRT: _mbsnbcpy")); 256 274 if(!n) 257 275 return dst; … … 288 306 int _mbscmp(const unsigned char* str, const unsigned char* cmp) 289 307 { 308 dprintf(("MSVCRT: _mbscmp")); 290 309 if(MSVCRT___mb_cur_max > 1) 291 310 { … … 308 327 309 328 /********************************************************************* 310 * _mbsicmp(MSVCRT.@) 311 */ 312 int _mbsicmp(const unsigned char* str, const unsigned char* cmp) 329 * _mbsicoll(MSVCRT.@) 330 * FIXME: handle locales. 331 */ 332 int _mbsicoll(const unsigned char* str, const unsigned char* cmp) 313 333 { 314 334 if(MSVCRT___mb_cur_max > 1) … … 332 352 333 353 /********************************************************************* 354 * _mbsicmp(MSVCRT.@) 355 */ 356 int _mbsicmp(const unsigned char* str, const unsigned char* cmp) 357 { 358 dprintf(("MSVCRT: _mbsicmp")); 359 if(MSVCRT___mb_cur_max > 1) 360 { 361 unsigned int strc, cmpc; 362 do { 363 if(!*str) 364 return *cmp ? -1 : 0; 365 if(!*cmp) 366 return 1; 367 strc = _mbctolower(_mbsnextc(str)); 368 cmpc = _mbctolower(_mbsnextc(cmp)); 369 if(strc != cmpc) 370 return strc < cmpc ? -1 : 1; 371 str +=(strc > 255) ? 2 : 1; 372 cmp +=(strc > 255) ? 2 : 1; /* equal, use same increment */ 373 } while(1); 374 } 375 return _stricmp(str, cmp); /* ASCII CP */ 376 } 377 378 /********************************************************************* 334 379 * _mbsncmp(MSVCRT.@) 335 380 */ 336 381 int _mbsncmp(const unsigned char* str, const unsigned char* cmp, MSVCRT_size_t len) 337 382 { 383 dprintf(("MSVCRT: _mbsncmp")); 338 384 if(!len) 339 385 return 0; … … 367 413 int _mbsnbcmp(const unsigned char* str, const unsigned char* cmp, MSVCRT_size_t len) 368 414 { 415 dprintf(("MSVCRT: _mbsnbcmp")); 369 416 if (!len) 370 417 return 0; … … 412 459 int _mbsnicmp(const unsigned char* str, const unsigned char* cmp, MSVCRT_size_t len) 413 460 { 461 dprintf(("MSVCRT: _mbsnicmp")); 414 462 /* FIXME: No tolower() for mb strings yet */ 415 463 if(MSVCRT___mb_cur_max > 1) … … 439 487 int _mbsnbicmp(const unsigned char* str, const unsigned char* cmp, MSVCRT_size_t len) 440 488 { 489 dprintf(("MSVCRT: _mbsnbicmp")); 441 490 if (!len) 442 491 return 0; … … 486 535 unsigned char* _mbschr(const unsigned char* s, unsigned int x) 487 536 { 537 dprintf(("MSVCRT: _mbschr")); 488 538 if(MSVCRT___mb_cur_max > 1) 489 539 { … … 507 557 unsigned char* _mbsrchr(const unsigned char* s, unsigned int x) 508 558 { 559 dprintf(("MSVCRT: _mbsrchr")); 509 560 if(MSVCRT___mb_cur_max > 1) 510 561 { … … 526 577 527 578 /********************************************************************* 579 * _mbstok(MSVCRT.@) 580 * 581 * Find and extract tokens from strings 582 */ 583 unsigned char* _mbstok(unsigned char *str, const unsigned char *delim) 584 { 585 MSVCRT_thread_data *data = msvcrt_get_thread_data(); 586 char *ret; 587 588 if(MSVCRT___mb_cur_max > 1) 589 { 590 unsigned int c; 591 592 if (!str) 593 if (!(str = data->mbstok_next)) return NULL; 594 595 while ((c = _mbsnextc(str)) && _mbschr(delim, c)) { 596 str += c > 255 ? 2 : 1; 597 } 598 if (!*str) return NULL; 599 ret = str++; 600 while ((c = _mbsnextc(str)) && !_mbschr(delim, c)) { 601 str += c > 255 ? 2 : 1; 602 } 603 if (*str) { 604 *str++ = 0; 605 if (c > 255) *str++ = 0; 606 } 607 data->mbstok_next = str; 608 return ret; 609 } 610 return strtok(str, delim); /* ASCII CP */ 611 } 612 613 /********************************************************************* 528 614 * mbtowc(MSVCRT.@) 529 615 */ 530 616 int MSVCRT_mbtowc(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n) 531 617 { 618 dprintf(("MSVCRT: _mbtowc")); 532 619 if(n <= 0 || !str) 533 620 return 0; … … 547 634 unsigned int _mbbtombc(unsigned int c) 548 635 { 636 dprintf(("MSVCRT: _mbbtombc")); 549 637 if(MSVCRT___mb_cur_max > 1 && 550 638 ((c >= 0x20 && c <=0x7e) ||(c >= 0xa1 && c <= 0xdf))) … … 562 650 int _ismbbkana(unsigned int c) 563 651 { 652 dprintf(("MSVCRT: _ismbbkana")); 564 653 /* FIXME: use lc_ctype when supported, not lc_all */ 565 654 if(MSVCRT_current_lc_all_cp == 932) … … 577 666 { 578 667 MSVCRT_wchar_t wch = msvcrt_mbc_to_wc( ch ); 668 dprintf(("MSVCRT: _ismbcdigit")); 579 669 return (get_char_typeW( wch ) & C1_DIGIT); 580 670 } … … 752 842 753 843 if(MSVCRT___mb_cur_max == 1 || c < 256) 754 return _strset(str, c); /* ASCII CP or SB char */844 return MSVCRT__strset(str, c); /* ASCII CP or SB char */ 755 845 756 846 c &= 0xffff; /* Strip high bits */ … … 768 858 769 859 /********************************************************************* 860 * _mbsnbset(MSVCRT.@) 861 */ 862 unsigned char* _mbsnbset(unsigned char *str, unsigned int c, MSVCRT_size_t len) 863 { 864 unsigned char *ret = str; 865 866 if(!len) 867 return ret; 868 869 if(MSVCRT___mb_cur_max == 1 || c < 256) 870 return _strnset(str, c, len); /* ASCII CP or SB char */ 871 872 c &= 0xffff; /* Strip high bits */ 873 874 while(str[0] && str[1] && (len > 1)) 875 { 876 *str++ = c >> 8; 877 len--; 878 *str++ = c & 0xff; 879 len--; 880 } 881 if(len && str[0]) { 882 /* as per msdn pad with a blank character */ 883 str[0] = ' '; 884 } 885 886 return ret; 887 } 888 889 /********************************************************************* 770 890 * _mbsnset(MSVCRT.@) 771 891 */ … … 778 898 779 899 if(MSVCRT___mb_cur_max == 1 || c < 256) 780 return _strnset(str, c, len); /* ASCII CP or SB char */900 return MSVCRT__strnset(str, c, len); /* ASCII CP or SB char */ 781 901 782 902 c &= 0xffff; /* Strip high bits */ … … 842 962 } 843 963 964 965 /********************************************************************* 966 * _mbsnbcat(MSVCRT.@) 967 */ 968 unsigned char* _mbsnbcat(unsigned char* dst, const unsigned char* src, MSVCRT_size_t len) 969 { 970 if(MSVCRT___mb_cur_max > 1) 971 { 972 char *res = dst; 973 while (*dst) { 974 if (MSVCRT_isleadbyte(*dst++)) { 975 if (*dst) { 976 dst++; 977 } else { 978 /* as per msdn overwrite the lead byte in front of '\0' */ 979 dst--; 980 break; 981 } 982 } 983 } 984 while (*src && len--) *dst++ = *src++; 985 *dst = '\0'; 986 return res; 987 } 988 return strncat(dst, src, len); /* ASCII CP */ 989 } 844 990 845 991 /*********************************************************************
Note:
See TracChangeset
for help on using the changeset viewer.