00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
#include "precomp.h"
00014
#pragma hdrstop
00015
00016
00017
00018
00019
00020
00021
00022 #define LATIN_CAPITAL_LETTER_A_GRAVE (CHAR)0xc0
00023 #define LATIN_CAPITAL_LETTER_THORN (CHAR)0xde
00024 #define LATIN_SMALL_LETTER_SHARP_S (CHAR)0xdf
00025 #define LATIN_SMALL_LETTER_Y_DIAERESIS (CHAR)0xff
00026 #define DIVISION_SIGN (CHAR)0xf7
00027 #define MULTIPLICATION_SIGN (CHAR)0xd7
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 LPSTR WINAPI
CharLowerA(
00047 LPSTR psz)
00048 {
00049
NTSTATUS st;
00050
00051
00052
00053
00054
if (psz ==
NULL) {
00055
return psz;
00056 }
00057
00058
if (!
IS_PTR(psz)) {
00059 WCHAR wch;
00060
00061
#ifdef FE_SB // CharLowerA()
00062
00063
00064
00065
00066
if (
IS_DBCS_ENABLED() && IsDBCSLeadByte((
BYTE)(ULONG_PTR)psz)) {
00067
return psz;
00068 }
00069
#endif // FE_SB
00070
00071
00072
00073
00074
00075
00076
00077 st =
RtlMultiByteToUnicodeN(&wch,
sizeof(WCHAR),
NULL, (PCH)&psz,
sizeof(
CHAR));
00078
if (!
NT_SUCCESS(st)) {
00079
00080
00081
00082
00083 RIPMSG1(RIP_WARNING,
"CharLowerA(%#p) failed\n", psz);
00084 }
else {
00085
00086
00087
00088 LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, &wch, 1, &wch, 1);
00089
RtlUnicodeToMultiByteN((PCH)&psz,
sizeof(
CHAR),
NULL, &wch,
sizeof(WCHAR));
00090 }
00091
return psz;
00092
00093 }
00094
00095
00096
00097
00098
CharLowerBuffA(psz,
strlen(psz)+1);
00099
return psz;
00100 }
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 LPSTR WINAPI
CharUpperA(
00120 LPSTR psz)
00121 {
00122
NTSTATUS st;
00123
00124
00125
00126
00127
if (psz ==
NULL) {
00128
return psz;
00129 }
00130
00131
if (!
IS_PTR(psz)) {
00132 WCHAR wch;
00133
00134
#ifdef FE_SB // CharLowerA()
00135
00136
00137
00138
00139
if (
IS_DBCS_ENABLED() && IsDBCSLeadByte((
BYTE)(ULONG_PTR)psz)) {
00140
return psz;
00141 }
00142
#endif // FE_SB
00143
00144
00145
00146
00147
00148
00149
00150 st =
RtlMultiByteToUnicodeN(&wch,
sizeof(WCHAR),
NULL, (PCH)&psz,
sizeof(
CHAR));
00151
if (!
NT_SUCCESS(st)) {
00152
00153
00154
00155
00156 RIPMSG1(RIP_WARNING,
"CharUpperA(%#p) failed\n", psz);
00157 }
else {
00158
00159
00160
00161 LCMapStringW(LOCALE_USER_DEFAULT, LCMAP_UPPERCASE, &wch, 1, &wch, 1);
00162
RtlUnicodeToMultiByteN((PCH)&psz,
sizeof(
CHAR),
NULL, &wch,
sizeof(WCHAR));
00163 }
00164
return psz;
00165
00166 }
00167
00168
00169
00170
00171
CharUpperBuffA(psz,
strlen(psz)+1);
00172
return psz;
00173 }
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 LPSTR WINAPI
CharNextA(
00191 LPCSTR lpCurrentChar)
00192 {
00193
#ifdef FE_SB // CharNextA(): dbcs enabling
00194
if (
IS_DBCS_ENABLED() && IsDBCSLeadByte(*lpCurrentChar)) {
00195 lpCurrentChar++;
00196 }
00197
00198
00199
00200
#endif // FE_SB
00201
00202
if (*lpCurrentChar) {
00203 lpCurrentChar++;
00204 }
00205
return (LPSTR)lpCurrentChar;
00206 }
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 LPSTR WINAPI
CharNextExA(
00219 WORD CodePage,
00220 LPCSTR lpCurrentChar,
00221 DWORD dwFlags)
00222 {
00223
if (lpCurrentChar == (LPSTR)
NULL)
00224 {
00225
return (LPSTR)lpCurrentChar;
00226 }
00227
00228
if (IsDBCSLeadByteEx(CodePage, *lpCurrentChar))
00229 {
00230 lpCurrentChar++;
00231 }
00232
00233
if (*lpCurrentChar)
00234 {
00235 lpCurrentChar++;
00236 }
00237
return (LPSTR)lpCurrentChar;
00238
00239 UNREFERENCED_PARAMETER(
dwFlags);
00240 }
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 LPSTR WINAPI
CharPrevA(
00258 LPCSTR lpStart,
00259 LPCSTR lpCurrentChar)
00260 {
00261
#ifdef FE_SB // CharPrevA : dbcs enabling
00262
if (lpCurrentChar > lpStart) {
00263
if (
IS_DBCS_ENABLED()) {
00264 LPCSTR lpChar;
00265
BOOL bDBC =
FALSE;
00266
00267
for (lpChar = --lpCurrentChar - 1 ; lpChar >= lpStart ; lpChar--) {
00268
if (!IsDBCSLeadByte(*lpChar))
00269
break;
00270 bDBC = !bDBC;
00271 }
00272
00273
if (bDBC)
00274 lpCurrentChar--;
00275 }
00276
else
00277 lpCurrentChar--;
00278 }
00279
return (LPSTR)lpCurrentChar;
00280
#else
00281
if (lpCurrentChar > lpStart) {
00282 lpCurrentChar--;
00283 }
00284
return (LPSTR)lpCurrentChar;
00285
#endif // FE_SB
00286
}
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297 LPSTR WINAPI
CharPrevExA(
00298 WORD CodePage,
00299 LPCSTR lpStart,
00300 LPCSTR lpCurrentChar,
00301 DWORD dwFlags)
00302 {
00303
if (lpCurrentChar > lpStart) {
00304 LPCSTR lpChar;
00305
BOOL bDBC =
FALSE;
00306
00307
for (lpChar = --lpCurrentChar - 1 ; lpChar >= lpStart ; lpChar--) {
00308
if (!IsDBCSLeadByteEx(CodePage, *lpChar))
00309
break;
00310 bDBC = !bDBC;
00311 }
00312
00313
if (bDBC)
00314 lpCurrentChar--;
00315 }
00316
return (LPSTR)lpCurrentChar;
00317
00318 UNREFERENCED_PARAMETER(
dwFlags);
00319 }
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 #define CCH_LOCAL_BUFF 256
00334
00335 DWORD WINAPI
CharLowerBuffA(
00336 LPSTR psz,
00337 DWORD nLength)
00338 {
00339 ULONG cb;
00340 WCHAR awchLocal[
CCH_LOCAL_BUFF];
00341 LPWSTR pwszT = awchLocal;
00342
int cwch;
00343
00344
if (nLength == 0) {
00345
return(0);
00346 }
00347
00348
00349
00350
00351
00352 cwch = MBToWCS(
00353 psz,
00354 nLength,
00355 &pwszT,
00356 (nLength >
CCH_LOCAL_BUFF ? -1 : nLength),
00357 (nLength >
CCH_LOCAL_BUFF) );
00358
00359
if (cwch != 0) {
00360
CharLowerBuffW(pwszT, cwch);
00361
00362
00363
00364
00365
RtlUnicodeToMultiByteN(
00366 psz,
00367 nLength,
00368 &cb,
00369 pwszT,
00370 cwch *
sizeof(WCHAR));
00371
00372
if (pwszT != awchLocal) {
00373
UserLocalFree(pwszT);
00374 }
00375
00376
return (
DWORD)cb;
00377 }
00378
00379
00380
00381
00382
00383 RIPMSG2(RIP_WARNING,
00384
"CharLowerBuffA(%#p, %lx) failed\n", psz, nLength);
00385
00386
for (cb=0; cb < nLength; cb++) {
00387
#ifdef FE_SB // CharLowerBuffA(): skip double byte character
00388
if (
IS_DBCS_ENABLED() && IsDBCSLeadByte(psz[cb])) {
00389 cb++;
00390 }
else if (
IsCharUpperA(psz[cb])) {
00391 psz[cb] +=
'a'-
'A';
00392 }
00393
#else
00394
if (
IsCharUpperA(psz[cb])) {
00395 psz[cb] +=
'a'-
'A';
00396 }
00397
#endif // FE_SB
00398
}
00399
00400
return nLength;
00401 }
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416 DWORD WINAPI
CharUpperBuffA(
00417 LPSTR psz,
00418 DWORD nLength)
00419 {
00420
DWORD cb;
00421 WCHAR awchLocal[
CCH_LOCAL_BUFF];
00422 LPWSTR pwszT = awchLocal;
00423
int cwch;
00424
00425
if (nLength==0) {
00426
return(0);
00427 }
00428
00429
00430
00431
00432
00433 cwch = MBToWCS(
00434 psz,
00435 nLength,
00436 &pwszT,
00437 (nLength >
CCH_LOCAL_BUFF ? -1 : nLength),
00438 (nLength >
CCH_LOCAL_BUFF) );
00439
00440
if (cwch != 0) {
00441
CharUpperBuffW(pwszT, cwch);
00442
00443
RtlUnicodeToMultiByteN(
00444 psz,
00445 nLength,
00446 &cb,
00447 pwszT,
00448 cwch *
sizeof(WCHAR));
00449
00450
if (pwszT != awchLocal) {
00451
UserLocalFree(pwszT);
00452 }
00453
00454
return (
DWORD)cb;
00455 }
00456
00457
00458
00459
00460
00461 RIPMSG2(RIP_WARNING,
00462
"CharLowerBuffA(%#p, %lx) failed\n", psz, nLength);
00463
00464
for (cb=0; cb < nLength; cb++) {
00465
#ifdef FE_SB // CharUpperBuffA(): skip double byte characters
00466
if (
IS_DBCS_ENABLED() && IsDBCSLeadByte(psz[cb])) {
00467 cb++;
00468 }
else if (
IsCharLowerA(psz[cb]) &&
00469
00470
00471
00472
00473 (psz[cb] !=
LATIN_SMALL_LETTER_SHARP_S) &&
00474 (psz[cb] !=
LATIN_SMALL_LETTER_Y_DIAERESIS)) {
00475 psz[cb] +=
'A'-
'a';
00476 }
00477
#else
00478
if (
IsCharLowerA(psz[cb]) &&
00479 (psz[cb] !=
LATIN_SMALL_LETTER_SHARP_S) &&
00480 (psz[cb] !=
LATIN_SMALL_LETTER_Y_DIAERESIS)) {
00481 psz[cb] +=
'A'-
'a';
00482 }
00483
#endif // FE_SB
00484
}
00485
00486
return nLength;
00487 }
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502 BOOL WINAPI
IsCharLowerA(
00503
char cChar)
00504 {
00505 WORD ctype1info = 0;
00506 WCHAR wChar = 0;
00507
00508
#ifdef FE_SB // IsCharLowerA()
00509
00510
00511
00512
00513
if (
IS_DBCS_ENABLED() && IsDBCSLeadByte(cChar)) {
00514
return FALSE;
00515 }
00516
#endif // FE_SB
00517
00518
00519
00520
00521
RtlMultiByteToUnicodeN(&wChar,
sizeof(WCHAR),
NULL, &cChar,
sizeof(
CHAR));
00522 GetStringTypeW(CT_CTYPE1, &wChar, 1, &ctype1info);
00523
return (ctype1info & C1_LOWER) == C1_LOWER;
00524 }
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538 BOOL WINAPI
IsCharUpperA(
00539
char cChar)
00540 {
00541 WORD ctype1info = 0;
00542 WCHAR wChar = 0;
00543
00544
#ifdef FE_SB // IsCharUpperA()
00545
00546
00547
00548
00549
if (
IS_DBCS_ENABLED() && IsDBCSLeadByte(cChar)) {
00550
return FALSE;
00551 }
00552
#endif // FE_SB
00553
00554
00555
00556
00557
RtlMultiByteToUnicodeN(&wChar,
sizeof(WCHAR),
NULL, &cChar,
sizeof(
CHAR));
00558 GetStringTypeW(CT_CTYPE1, &wChar, 1, &ctype1info);
00559
return (ctype1info & C1_UPPER) == C1_UPPER;
00560 }
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577 BOOL WINAPI
IsCharAlphaNumericA(
00578
char cChar)
00579 {
00580 WORD ctype1info = 0;
00581 WCHAR wChar = 0;
00582
00583
00584
00585
00586
RtlMultiByteToUnicodeN(&wChar,
sizeof(WCHAR),
NULL, &cChar,
sizeof(
CHAR));
00587 GetStringTypeW(CT_CTYPE1, &wChar, 1, &ctype1info);
00588
#ifdef FE_SB // IsCharAlphaNumericA()
00589
if (ctype1info & C1_ALPHA) {
00590 WORD ctype3info = 0;
00591
if (!
IS_DBCS_ENABLED()) {
00592
return TRUE;
00593 }
00594
00595
00596
00597
00598
00599 GetStringTypeW(CT_CTYPE3, &wChar, 1, &ctype3info);
00600
return ((ctype3info & (C3_KATAKANA|C3_HIRAGANA)) ?
FALSE :
TRUE);
00601 }
00602
00603
return !!(ctype1info & C1_DIGIT);
00604
#else
00605
return (ctype1info & C1_ALPHA) || (ctype1info & C1_DIGIT);
00606
#endif // FE_SB
00607
}
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623 BOOL WINAPI
IsCharAlphaA(
00624
char cChar)
00625 {
00626 WORD ctype1info = 0;
00627 WCHAR wChar = 0;
00628
00629
00630
00631
00632
RtlMultiByteToUnicodeN(&wChar,
sizeof(WCHAR),
NULL, &cChar,
sizeof(
CHAR));
00633 GetStringTypeW(CT_CTYPE1, &wChar, 1, &ctype1info);
00634
#ifdef FE_SB // IsCharAlphaA()
00635
if ((ctype1info & C1_ALPHA) == C1_ALPHA) {
00636 WORD ctype3info = 0;
00637
if (!
IS_DBCS_ENABLED()) {
00638
return TRUE;
00639 }
00640
00641
00642
00643
00644
00645 GetStringTypeW(CT_CTYPE3, &wChar, 1, &ctype3info);
00646
return ((ctype3info & (C3_KATAKANA|C3_HIRAGANA)) ?
FALSE :
TRUE);
00647 }
00648
return (
FALSE);
00649
#else
00650
return (ctype1info & C1_ALPHA) == C1_ALPHA;
00651
#endif // FE_SB
00652
}
00653