// CaseWord - convert case of string by given type void CaseWord(wchar_t *nm, int Type) { if (!nm || !*nm) return; int I; switch (Type) { case MODE_N_WORD: *nm = FSF.LUpper(*nm); FSF.LStrlwr(nm+1); break; case MODE_LN_WORD: for (I=0; nm[I]; I++) { if (!I || IsWordDiv(nm[I-1])) nm[I]=(wchar_t)FSF.LUpper(nm[I]); else nm[I]=(wchar_t)FSF.LLower(nm[I]); } break; case MODE_LOWER: FSF.LStrlwr(nm); break; case MODE_UPPER: FSF.LStrupr(nm); break; } }
/* Ptr=CalcWordFromString(Str,I,&Start,&End); xstrncpy(Dest,Ptr,End-Start+1); Dest[End-Start+1]=0; // Параметры: // WordDiv - набор разделителей слова в кодировке OEM возвращает указатель на начало слова */ const wchar_t * const CalcWordFromString(const wchar_t *Str,int CurPos,int *Start,int *End, const wchar_t *WordDiv0) { int I, J, StartWPos, EndWPos; DWORD DistLeft, DistRight; int StrSize=StrLength(Str); if (CurPos >= StrSize) return nullptr; string strWordDiv(WordDiv0); strWordDiv += L" \t\n\r"; if (IsWordDiv(strWordDiv,Str[CurPos])) { // вычисляем дистанцию - куда копать, где ближе слово - слева или справа I=J=CurPos; // копаем влево DistLeft=-1; while (I >= 0 && IsWordDiv(strWordDiv,Str[I])) { DistLeft++; I--; } if (I < 0) DistLeft=-1; // копаем вправо DistRight=-1; while (J < StrSize && IsWordDiv(strWordDiv,Str[J])) { DistRight++; J++; } if (J >= StrSize) DistRight=-1; if (DistLeft > DistRight) // ?? >= EndWPos=StartWPos=J; else EndWPos=StartWPos=I; } else // здесь все оби, т.е. стоим на буковке EndWPos=StartWPos=CurPos; if (StartWPos < StrSize) { while (StartWPos >= 0) if (IsWordDiv(strWordDiv,Str[StartWPos])) { StartWPos++; break; } else StartWPos--; while (EndWPos < StrSize) if (IsWordDiv(strWordDiv,Str[EndWPos])) { EndWPos--; break; } else EndWPos++; } if (StartWPos < 0) StartWPos=0; if (EndWPos >= StrSize) EndWPos=StrSize; *Start=StartWPos; *End=EndWPos; return Str+StartWPos; }