| 
							- /*
 -   ==============================================================================
 - 
 -    This file is part of the JUCE library.
 -    Copyright (c) 2022 - Raw Material Software Limited
 - 
 -    JUCE is an open source library subject to commercial or open-source
 -    licensing.
 - 
 -    By using JUCE, you agree to the terms of both the JUCE 7 End-User License
 -    Agreement and JUCE Privacy Policy.
 - 
 -    End User License Agreement: www.juce.com/juce-7-licence
 -    Privacy Policy: www.juce.com/juce-privacy-policy
 - 
 -    Or: You may also use this code under the terms of the GPL v3 (see
 -    www.gnu.org/licenses).
 - 
 -    JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 -    EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 -    DISCLAIMED.
 - 
 -   ==============================================================================
 - */
 - 
 - namespace juce::build_tools
 - {
 - 
 -     static bool isReservedKeyword (String::CharPointerType token, const int tokenLength) noexcept
 -     {
 -         static const char* const keywords2Char[] =
 -                 { "do", "if", "or", nullptr };
 - 
 -         static const char* const keywords3Char[] =
 -                 { "and", "asm", "for", "int", "new", "not", "try", "xor", nullptr };
 - 
 -         static const char* const keywords4Char[] =
 -                 { "auto", "bool", "case", "char", "else", "enum", "goto",
 -                   "long", "this", "true", "void", nullptr };
 - 
 -         static const char* const keywords5Char[] =
 -                 { "bitor", "break", "catch", "class", "compl", "const", "false", "final",
 -                   "float", "or_eq", "short", "throw", "union", "using", "while", nullptr };
 - 
 -         static const char* const keywords6Char[] =
 -                 { "and_eq", "bitand", "delete", "double", "export", "extern", "friend",
 -                   "import", "inline", "module", "not_eq", "public", "return", "signed",
 -                   "sizeof", "static", "struct", "switch", "typeid", "xor_eq", nullptr };
 - 
 -         static const char* const keywords7Char[] =
 -                 { "__cdecl", "_Pragma", "alignas", "alignof", "concept", "default",
 -                   "mutable", "nullptr", "private", "typedef", "uint8_t", "virtual",
 -                   "wchar_t", nullptr };
 - 
 -         static const char* const keywordsOther[] =
 -                 { "@class", "@dynamic", "@end", "@implementation", "@interface", "@public",
 -                   "@private", "@protected", "@property", "@synthesize", "__fastcall", "__stdcall",
 -                   "atomic_cancel", "atomic_commit", "atomic_noexcept", "char16_t", "char32_t",
 -                   "co_await", "co_return", "co_yield", "const_cast", "constexpr", "continue",
 -                   "decltype", "dynamic_cast", "explicit", "namespace", "noexcept", "operator", "override",
 -                   "protected", "register", "reinterpret_cast", "requires", "static_assert",
 -                   "static_cast", "synchronized", "template", "thread_local", "typename", "unsigned",
 -                   "volatile", nullptr };
 - 
 -         const char* const* k;
 - 
 -         switch (tokenLength)
 -         {
 -             case 2:     k = keywords2Char; break;
 -             case 3:     k = keywords3Char; break;
 -             case 4:     k = keywords4Char; break;
 -             case 5:     k = keywords5Char; break;
 -             case 6:     k = keywords6Char; break;
 -             case 7:     k = keywords7Char; break;
 - 
 -             default:
 -                 if (tokenLength < 2 || tokenLength > 16)
 -                     return false;
 - 
 -                 k = keywordsOther;
 -                 break;
 -         }
 - 
 -         for (int i = 0; k[i] != nullptr; ++i)
 -             if (token.compare (CharPointer_ASCII (k[i])) == 0)
 -                 return true;
 - 
 -         return false;
 -     }
 - 
 -     static bool isReservedKeyword (const String& token) noexcept
 -     {
 -         return isReservedKeyword (token.getCharPointer(), token.length());
 -     }
 - 
 -     //==============================================================================
 -     /** Takes a UTF8 string and writes it to a stream using standard C++ escape sequences for any
 -         non-ascii bytes.
 - 
 -         Although not strictly a tokenising function, this is still a function that often comes in
 -         handy when working with C++ code!
 - 
 -         Note that addEscapeChars() is easier to use than this function if you're working with Strings.
 - 
 -         @see addEscapeChars
 -     */
 -     static void writeEscapeChars (OutputStream& out, const char* utf8, const int numBytesToRead,
 -                                   const int maxCharsOnLine, const bool breakAtNewLines,
 -                                   const bool replaceSingleQuotes, const bool allowStringBreaks)
 -     {
 -         int charsOnLine = 0;
 -         bool lastWasHexEscapeCode = false;
 -         bool trigraphDetected = false;
 - 
 -         for (int i = 0; i < numBytesToRead || numBytesToRead < 0; ++i)
 -         {
 -             auto c = (unsigned char) utf8[i];
 -             bool startNewLine = false;
 - 
 -             switch (c)
 -             {
 - 
 -                 case '\t':  out << "\\t";  trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; break;
 -                 case '\r':  out << "\\r";  trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; break;
 -                 case '\n':  out << "\\n";  trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; startNewLine = breakAtNewLines; break;
 -                 case '\\':  out << "\\\\"; trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; break;
 -                 case '\"':  out << "\\\""; trigraphDetected = false; lastWasHexEscapeCode = false; charsOnLine += 2; break;
 - 
 -                 case '?':
 -                     if (trigraphDetected)
 -                     {
 -                         out << "\\?";
 -                         charsOnLine++;
 -                         trigraphDetected = false;
 -                     }
 -                     else
 -                     {
 -                         out << "?";
 -                         trigraphDetected = true;
 -                     }
 - 
 -                     lastWasHexEscapeCode = false;
 -                     charsOnLine++;
 -                     break;
 - 
 -                 case 0:
 -                     if (numBytesToRead < 0)
 -                         return;
 - 
 -                     out << "\\0";
 -                     lastWasHexEscapeCode = true;
 -                     trigraphDetected = false;
 -                     charsOnLine += 2;
 -                     break;
 - 
 -                 case '\'':
 -                     if (replaceSingleQuotes)
 -                     {
 -                         out << "\\\'";
 -                         lastWasHexEscapeCode = false;
 -                         trigraphDetected = false;
 -                         charsOnLine += 2;
 -                         break;
 -                     }
 - 
 -                     // deliberate fall-through...
 - 
 -                 default:
 -                     if (c >= 32 && c < 127 && ! (lastWasHexEscapeCode  // (have to avoid following a hex escape sequence with a valid hex digit)
 -                                                  && CharacterFunctions::getHexDigitValue (c) >= 0))
 -                     {
 -                         out << (char) c;
 -                         lastWasHexEscapeCode = false;
 -                         trigraphDetected = false;
 -                         ++charsOnLine;
 -                     }
 -                     else if (allowStringBreaks && lastWasHexEscapeCode && c >= 32 && c < 127)
 -                     {
 -                         out << "\"\"" << (char) c;
 -                         lastWasHexEscapeCode = false;
 -                         trigraphDetected = false;
 -                         charsOnLine += 3;
 -                     }
 -                     else
 -                     {
 -                         out << (c < 16 ? "\\x0" : "\\x") << String::toHexString ((int) c);
 -                         lastWasHexEscapeCode = true;
 -                         trigraphDetected = false;
 -                         charsOnLine += 4;
 -                     }
 - 
 -                     break;
 -             }
 - 
 -             if ((startNewLine || (maxCharsOnLine > 0 && charsOnLine >= maxCharsOnLine))
 -                 && (numBytesToRead < 0 || i < numBytesToRead - 1))
 -             {
 -                 charsOnLine = 0;
 -                 out << "\"" << newLine << "\"";
 -                 lastWasHexEscapeCode = false;
 -             }
 -         }
 -     }
 - 
 - } // namespace juce::build_tools
 
 
  |