26 va_list args; va_start(args, szWarning);
48 default: assert(!
"Unhandled Separator value");
57 case RCT_Escaped:
return c ==
'"' || !c || c ==
'\n' || c ==
'\r';
58 case RCT_All:
return !c || c ==
'\n' || c ==
'\r';
78 WriteData(szString, strlen(szString) + 1);
83 WriteData(*pszString, strlen(*pszString) + 1);
98 *getMBufPtr<T>(
Buf,
iPos) = rValue;
99 iPos +=
sizeof(rValue);
145 char *pPos = szString;
146 while ((*pPos++ = *getBufPtr<char>(
Buf,
iPos++)))
149 else if (pPos > szString + iMaxLength)
160 while (*getBufPtr<char>(
Buf,
iPos++))
164 *pszString = (
char *) malloc(
iPos - iStart);
177 while (*getBufPtr<char>(
Buf,
iPos++))
183 str.assign(getBufPtr<char>(
Buf, iStart), getBufPtr<char>(
Buf,
iPos));
207 rValue = *getBufPtr<T>(
Buf,
iPos);
310 StringN(szString, strnlen(szString, iMaxLength), eType);
333 char * szString = *pszString ? *pszString : &cNull;
334 String(szString, strlen(szString), eType);
342 WriteEscaped(
reinterpret_cast<char *
>(pData),
reinterpret_cast<char *
>(pData) +
iSize);
387 const char *pStart, *pPos; pStart = pPos = szString;
388 bool fLastNumEscape =
false;
389 for (; pPos < pEnd; pPos++)
390 if (!isprint((
unsigned char)(
unsigned char) *pPos) || *pPos ==
'\\' || *pPos ==
'"' || (fLastNumEscape && isdigit((
unsigned char)*pPos)))
393 if (pPos - pStart)
Buf.
Append(pStart, pPos - pStart);
395 fLastNumEscape =
false;
408 Buf.
AppendFormat(R
"(\%o)", *reinterpret_cast<const unsigned char *
>(pPos));
409 fLastNumEscape =
true;
415 fLastNumEscape =
false;
417 if (pEnd - pStart)
Buf.
Append(pStart, pEnd - pStart);
426 if (!fSection) iIndent--;
428 if (iIndent <= 0)
return;
464 if (!isalpha((
unsigned char)*szName))
465 { assert(
false);
return false; }
466 for (
const char *p = szName + 1; *p; p++)
468 if (!isalnum((
unsigned char)*p) && *p !=
' ' && *p !=
'_' && *p !=
'*')
469 { assert(
false);
return false; }
473 if (pNode->
Pos && pNode->
Name == szName)
497 if (pNode->Pos && !fBreak)
498 Warn(R
"(Unexpected %s "%s"!)", pNode->Section ? "section" :
"value", pNode->Name.getData());
500 pNext = pNode->NextChild;
555 if (!
pPos)
return false;
580 if (pNode->
Pos && (!szName || pNode->
Name == szName))
611 const int MIN = -(1 << 15), MAX = (1 << 15) - 1;
613 if (iNum < MIN || iNum > MAX)
614 Warn(
"number out of range (%d to %d): %d ", MIN, MAX, iNum);
615 rShort =
Clamp(iNum, MIN, MAX);
619 const unsigned int MIN = 0, MAX = (1 << 16) - 1;
622 Warn(
"number out of range (%u to %u): %u ", MIN, MAX, iNum);
623 rShort =
Clamp(iNum, MIN, MAX);
627 const int MIN = -(1 << 7), MAX = (1 << 7) - 1;
629 if (iNum < MIN || iNum > MAX)
630 Warn(
"number out of range (%d to %d): %d ", MIN, MAX, iNum);
631 rByte =
Clamp(iNum, MIN, MAX);
635 const unsigned int MIN = 0, MAX = (1 << 8) - 1;
638 Warn(
"number out of range (%u to %u): %u ", MIN, MAX, iNum);
639 rByte =
Clamp(iNum, MIN, MAX);
644 if (*
pPos ==
'1' && !isdigit((
unsigned char)*(
pPos+1)))
645 { rBool =
true;
pPos ++; }
646 else if (*
pPos ==
'0' && !isdigit((
unsigned char)*(
pPos+1)))
647 { rBool =
false;
pPos ++; }
649 { rBool =
true;
pPos += 4; }
651 { rBool =
false;
pPos += 5; }
657 if (!
pPos || !isalpha((
unsigned char)*
pPos))
666 SCopy(getBufPtr<char>(
Buf), szString, iMaxLength);
683 str = getBufPtr<char>(
Buf);
696 uint32_t StdCompilerINIRead::getLineNumberOfPos(
const char *pos)
const
699 auto entry = std::lower_bound(lineBreaks.begin(), lineBreaks.end(), pos);
700 if (entry != lineBreaks.end())
702 return std::distance(lineBreaks.begin(), entry) + 1;
707 if (!lineBreaks.empty())
708 cursor = *(lineBreaks.end() - 1) + 1;
711 if (*cursor ==
'\0' || *cursor ==
'\n')
713 lineBreaks.push_back(cursor);
717 if (*cursor ==
'\0' || pos < cursor)
724 return std::distance(lineBreaks.begin(),
725 std::lower_bound(lineBreaks.begin(), lineBreaks.end(), pos)) + 1;
769 while (*
pPos ==
' ' || *
pPos ==
'\t')
770 {
pPos++; iIndent++; }
772 bool fSection = *
pPos ==
'[' && isalpha((
unsigned char)*(
pPos+1));
773 if (fSection || isalpha((
unsigned char)*
pPos))
777 if (!fSection) iIndent++;
else pPos++;
783 while (isalnum((
unsigned char)*
pPos) || *
pPos ==
' ' || *
pPos ==
'_')
786 if ( *
pPos != (fSection ?
']' :
'=') )
788 Warn(isprint((
unsigned char)*
pPos) ?
"Unexpected character ('%c'): %s ignored" :
"Unexpected character ('0x%02x'): %s ignored",
unsigned(*
pPos), fSection ?
"section" :
"value");
811 while (*
pPos ==
'\n' || *
pPos ==
'\r')
835 if (pDelete == pDelNode) {
delete pDelete;
break; }
850 while (*
pPos ==
' ' || *
pPos ==
'\t')
856 while (*
pPos ==
'+' || *
pPos ==
'-' || isdigit((
unsigned char)*
pPos))
867 const char *pnPos =
pPos;
868 long iNum = strtol(
pPos,
const_cast<char **
>(&pnPos), 10);
870 if (!iNum && pnPos ==
pPos)
884 const char *pnPos =
pPos;
885 unsigned long iNum = strtoul(
pPos,
const_cast<char **
>(&pnPos), 10);
887 if (!iNum && pnPos ==
pPos)
902 const char *pStart =
pPos;
905 {
notFound(
"Escaped string");
return 0; }
934 StdBuf OutBuf; OutBuf.
New(iLength + (fAppendNull ?
sizeof(
'\0') : 0));
936 char *pOut = getMBufPtr<char>(OutBuf);
954 Warn(
"string not terminated!");
977 if (*
pPos >= 0 && iscntrl((
unsigned char)*
pPos))
979 Warn(
"Nonprintable character found in string: %02x",
static_cast<unsigned char>(*
pPos));
987 case 'a':
pPos++;
return '\a';
988 case 'b':
pPos++;
return '\b';
989 case 'f':
pPos++;
return '\f';
990 case 'n':
pPos++;
return '\n';
991 case 'r':
pPos++;
return '\r';
992 case 't':
pPos++;
return '\t';
993 case 'v':
pPos++;
return '\v';
994 case '\'':
pPos++;
return '\'';
995 case '"':
pPos++;
return '"';
996 case '\\':
pPos++;
return '\\';
997 case '?':
pPos++;
return '?';
1000 if (!isxdigit((
unsigned char)*++
pPos))
1007 { iCode = iCode * 16 + (isdigit((
unsigned char)*
pPos) ? *
pPos -
'0' : *
pPos -
'a' + 10);
pPos++; }
1008 while (isxdigit((
unsigned char)*
pPos));
1014 if (!isdigit((
unsigned char)*
pPos) || *
pPos >=
'8')
1021 { iCode = iCode * 8 + (*
pPos -
'0');
pPos++;}
1022 while (isdigit((
unsigned char)*
pPos) && *
pPos <
'8');
1038 const char *szName =
reinterpret_cast<const char *
>(pData);
1039 if (!szPosition || !*szPosition)
1040 DebugLogF(
"WARNING: %s (in %s)", szError, szName);
1042 DebugLogF(
"WARNING: %s (in %s, %s)", szError, szPosition, szName);
bool DebugLogF(const char *strMessage ...)
bool SEqual2(const char *szStr1, const char *szStr2)
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
T Clamp(T bval, T lbound, T rbound)
void MemCopy(const void *lpMem1, void *lpMem2, size_t dwSize)
StdStrBuf FormatString(const char *szFmt,...)
void StdCompilerWarnCallback(void *pData, const char *szPosition, const char *szError)
const void * getPtr(size_t i) const
void Shrink(size_t iShrink)
void Write(const void *pnData, size_t inSize, size_t iAt=0)
const void * getData() const
void ReadValue(T &rValue)
void DWord(int32_t &rInt) override
void Raw(void *pData, size_t iSize, RawCompileType eType=RCT_Escaped) override
StdStrBuf getPosition() const override
void Byte(int8_t &rByte) override
void String(char *szString, size_t iMaxLength, RawCompileType eType=RCT_Escaped) override
void Word(int16_t &rShort) override
void Character(char &rChar) override
void Boolean(bool &rBool) override
void DWord(int32_t &rInt) override
void BeginSecond() override
void Boolean(bool &rBool) override
void String(char *szString, size_t iMaxLength, RawCompileType eType=RCT_Escaped) override
void Byte(int8_t &rByte) override
void WriteValue(const T &rValue)
void WriteData(const void *pData, size_t iSize)
void Character(char &rChar) override
void Raw(void *pData, size_t iSize, RawCompileType eType=RCT_Escaped) override
void Word(int16_t &rShort) override
static bool IsStringEnd(char c, RawCompileType eType)
static char SeparatorToChar(Sep eSep)
void excCorrupt(const char *szMessage,...)
virtual StdStrBuf getPosition() const
void excNotFound(const char *szMessage,...)
void Warn(const char *szWarning,...)
void excEOF(const char *szMessage="EOF",...)
bool Name(const char *szName) override
StdStrBuf getPosition() const override
size_t GetStringLength(RawCompileType eTyped)
void Raw(void *pData, size_t iSize, RawCompileType eType=RCT_Escaped) override
StdCopyStrBuf NotFoundName
const char * GetNameByIndex(size_t idx) const override
void notFound(const char *szWhat)
void FreeNameNode(NameNode *pNode)
int NameCount(const char *szName=nullptr) override
void Byte(int8_t &rByte) override
void NameEnd(bool fBreak=false) override
void Word(int16_t &rShort) override
bool Separator(Sep eSep) override
~StdCompilerINIRead() override
StdBuf ReadString(size_t iLength, RawCompileType eTyped, bool fAppendNull=true)
void Character(char &rChar) override
void String(char *szString, size_t iMaxLength, RawCompileType eType=RCT_Escaped) override
void DWord(int32_t &rInt) override
void NoSeparator() override
bool TestStringEnd(RawCompileType eType)
bool FollowName(const char *szName) override
void Boolean(bool &rBool) override
void PutName(bool fSection)
void Boolean(bool &rBool) override
void NameEnd(bool fBreak=false) override
void WriteIndent(bool fSectionName)
void Byte(int8_t &rByte) override
bool Name(const char *szName) override
void Word(int16_t &rShort) override
void Raw(void *pData, size_t iSize, RawCompileType eType=RCT_Escaped) override
void DWord(int32_t &rInt) override
bool Separator(Sep eSep) override
void String(char *szString, size_t iMaxLength, RawCompileType eType=RCT_Escaped) override
void Character(char &rChar) override
void WriteEscaped(const char *szString, const char *pEnd)
void StringN(const char *szString, size_t iMaxLength, RawCompileType eType=RCT_Escaped)
void AppendChars(char cChar, size_t iCnt)
void AppendFormat(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
void FormatV(const char *szFmt, va_list args)
const char * getData() const
void AppendChar(char cChar)
void Append(const char *pnData, size_t iChars)
const char * getPtr(size_t i) const