PCHAR STR::GotoNextLine(PCHAR Str, DWORD StrSize) { // Функция возвращает указатель на первый символ следующей линии в строке // либо на конец строки if (Str == NULL) return NULL; DWORD Pos; PCHAR Tmp = Str; for (Pos = 0; !IsStrEnd(Tmp, StrSize, Pos) && *Tmp != 10 && *Tmp != 13; Pos++, Tmp++); for (; !IsStrEnd(Tmp, StrSize, Pos) && (*Tmp == 10 || *Tmp == 13); Pos++, Tmp++); return Tmp; }
PCHAR STR::GetLine(PCHAR Str, DWORD StrSize) { // Функция возвращает текущую линию в строке. // Линия ограничивается символами 10, 13 либо концом строки // Конец строки ограничивается нулевым символом либо размером StrSize if (Str == NULL) return NULL; DWORD Size; PCHAR Tmp = Str; for (Size = 0; !IsStrEnd(Tmp, StrSize, Size) && *Tmp != 10 && *Tmp != 13; Size++, Tmp++); if (Size != 0) return STR::New(Str, Size); else return NULL; }
int STR::Pos(const char* Str, const char* SubStr, DWORD StrLen, bool CaseSensetive) { // Функция ищет подстроку _SubStr в строке _Str if( !Str || !SubStr ) return -1; DWORD s; DWORD j = 0; // DWORD slen = StrCalcLength(Str); DWORD sslen = StrCalcLength(SubStr); DWORD Pos = 0; DWORD Pos1 = 0; // Проходим циклом до конца строки char* p = (char*)Str; while (!IsStrEnd(p, StrLen, Pos)) { const char* k = SubStr; char PC = *p; char KC = *k; if (!CaseSensetive) { LowerChar(PC); LowerChar(KC); } // сравниваем первые символы if ( PC == KC ) { char* p1 = p; const char* k1 = k; Pos1 = Pos; s = 0; // Определяем количество совпадений while(!IsStrEnd(p1, StrLen, Pos1) && *k1 != 0) { char C1 = *p1; char C2 = *k1; if (!CaseSensetive) { LowerChar(C1); LowerChar(C2); } if (C1 == C2) s++; else break; if (s == (DWORD)sslen) return j; p1++; k1++; Pos1++; } } // смещаем указатели Pos++; p++; j++; } return -1; }
static int ParseFile( const char *v_pszBuf, const char *v_pszSection, const char *v_pszKey, int *v_piSecStart, int *v_piSecEnd, int *v_piKeyStart, int *v_piKeyEnd, int *v_piValueStart, int *v_piValueEnd) { const char *p = v_pszBuf; int i = 0; int iSecLen; int iKeyLen; iSecLen = strlen(v_pszSection); iKeyLen = strlen(v_pszKey); assert(NULL != v_pszBuf); assert((NULL != v_pszSection) && (0 != iSecLen)); assert((NULL != v_pszKey) && (0 != iKeyLen)); *v_piSecStart = UNKNOW_POS; *v_piSecEnd = UNKNOW_POS; *v_piKeyStart = UNKNOW_POS; *v_piKeyEnd = UNKNOW_POS; *v_piValueStart = UNKNOW_POS; *v_piValueEnd = UNKNOW_POS; while (!IsStrEnd(p[i])) { if (((0 == i) || IsNewLine(p[i-1])) && IsLeftBrace(p[i])) { /* 找到了'[' */ int iSecStart = i + 1; /* 寻找']' */ do { i++; } while (!IsRightBrace(p[i]) && !IsStrEnd(p[i])); if ((0 == strncmp(p + iSecStart, v_pszSection, i - iSecStart)) && (iSecLen == i - iSecStart)) { int iNewLineStart = 0; i++; /* 跳过']'后的空白 */ while (isspace(p[i])) { i++; } /* 找到了section */ *v_piSecStart = iSecStart; *v_piSecEnd = i; while (!(IsNewLine(p[i-1]) && IsLeftBrace(p[i])) && !IsStrEnd(p[i])) { int j = 0; /* 到了一个新行 */ iNewLineStart = i; while (!IsNewLine(p[i]) && !IsStrEnd(p[i])) { i++; } /* now i is equal to end of the line */ j = iNewLineStart; if (';' != p[j]) /* skip over comment */ { while ((j < i) && ('=' != p[j])) { j++; if ('=' == p[j]) { if ((strncmp(v_pszKey,p+iNewLineStart,j-iNewLineStart)==0) && (iKeyLen==j-iNewLineStart)) { /*find the key ok */ *v_piKeyStart = iNewLineStart; *v_piKeyEnd = j-1; *v_piValueStart = j+1; *v_piValueEnd = i; return 0; } } } } i++; } } } else { i++; } } return -INI_ERR_PARSE_FILE; }