/********************************************************************* * _mbsnbcpy(MSVCRT.@) * REMARKS * Like strncpy this function doesn't enforce the string to be * NUL-terminated */ unsigned char* CDECL _mbsnbcpy(unsigned char* dst, const unsigned char* src, size_t n) { unsigned char* ret = dst; if(!n) return dst; if(get_mbcinfo()->ismbcodepage) { int is_lead = 0; while (*src && n) { is_lead = (!is_lead && _ismbblead(*src)); n--; *dst++ = *src++; } if (is_lead) /* if string ends with a lead, remove it */ *(dst - 1) = 0; } else { while (n) { n--; if (!(*dst++ = *src++)) break; } } while (n--) *dst++ = 0; return ret; }
/********************************************************************* * _mbsnbcpy_s(MSVCRT.@) * REMARKS * Unlike _mbsnbcpy this function does not pad the rest of the dest * string with 0 */ int CDECL _mbsnbcpy_s(unsigned char* dst, size_t size, const unsigned char* src, size_t n) { size_t pos = 0; if(!dst || size == 0) return EINVAL; if(!src) { dst[0] = '\0'; return EINVAL; } if(!n) return 0; if(get_mbcinfo()->ismbcodepage) { int is_lead = 0; while (*src && n) { if(pos == size) { dst[0] = '\0'; return ERANGE; } is_lead = (!is_lead && _ismbblead(*src)); n--; dst[pos++] = *src++; } if (is_lead) /* if string ends with a lead, remove it */ dst[pos - 1] = 0; } else { while (n) { n--; if(pos == size) { dst[0] = '\0'; return ERANGE; } if(!(*src)) break; dst[pos++] = *src++; } } if(pos < size) dst[pos] = '\0'; else { dst[0] = '\0'; return ERANGE; } return 0; }
/********************************************************************* * _mbbtombc(MSVCRT.@) */ unsigned int __cdecl _mbbtombc(unsigned int c) { if(get_mbcinfo()->mbcodepage == 932) { if(c >= 0x20 && c <= 0x7e) { if((c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a) || (c >= 0x30 && c <= 0x39)) return mbbtombc_932[c - 0x20] | 0x8200; else return mbbtombc_932[c - 0x20] | 0x8100; } else if(c >= 0xa1 && c <= 0xdf) { if(c >= 0xa6 && c <= 0xdd && c != 0xb0) return mbbtombc_932[c - 0xa1 + 0x5f] | 0x8300; else return mbbtombc_932[c - 0xa1 + 0x5f] | 0x8100; } } return c; /* not Japanese or no MB char */ }
/********************************************************************* * _mbsncpy(MSVCRT.@) * REMARKS * The parameter n is the number or characters to copy, not the size of * the buffer. Use _mbsnbcpy for a function analogical to strncpy */ unsigned char* CDECL _mbsncpy(unsigned char* dst, const unsigned char* src, size_t n) { unsigned char* ret = dst; if(!n) return dst; if (get_mbcinfo()->ismbcodepage) { while (*src && n) { n--; if (_ismbblead(*src)) { if (!*(src+1)) { *dst++ = 0; *dst++ = 0; break; } *dst++ = *src++; } *dst++ = *src++; } } else { while (n) { n--; if (!(*dst++ = *src++)) break; } } while (n--) *dst++ = 0; return ret; }
/********************************************************************* * _mbctombb (MSVCRT.@) */ unsigned int CDECL _mbctombb(unsigned int c) { unsigned int value; if(get_mbcinfo()->mbcodepage == 932) { if(c >= 0x829f && c <= 0x82f1) /* Hiragana */ return mbctombb_932_kana[c - 0x829f]; if(c >= 0x8340 && c <= 0x8396 && c != 0x837f) /* Katakana */ return mbctombb_932_kana[c - 0x8340 - (c >= 0x837f ? 1 : 0)]; if(c >= 0x8140 && c <= 0x8197) /* Punctuation */ { value = mbctombb_932_punct[c - 0x8140]; return value ? value : c; } if((c >= 0x824f && c <= 0x8258) || /* Fullwidth digits */ (c >= 0x8260 && c <= 0x8279)) /* Fullwidth capitals letters */ return c - 0x821f; if(c >= 0x8281 && c <= 0x829a) /* Fullwidth small letters */ return c - 0x8220; /* all other cases return c */ } return c; }
/* * @implemented */ int _ismbbkana(unsigned int c) { return (get_mbcinfo()->mbctype[c & 0xff] & _MBKANA); }
/* * @implemented */ int _ismbbkalnum( unsigned int c ) { return (get_mbcinfo()->mbctype[c & 0xff] & _MKMOJI); }
/* * @implemented */ int _ismbbpunct(unsigned int c) { // (0xA1 <= c <= 0xA6) return (get_mbcinfo()->mbctype[c & 0xff] & _MBPUNCT); }