Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}