/// <summary> /// Assert that the given string is a valid string and matches the given text and length. /// This will fail the current unit test if this string does not match. /// </summary> /// <param name="str">The string to validate.</param> /// <param name="expectedString">The expected contents of that string.</param> /// <param name="expectedLength">The expected length of that string.</param> /// <param name="message">A message to display to the user to explain why the test failed.</param> /// <param name="file">The file in which a failure would be considered to have occured.</param> /// <param name="line">The line at which a failure would be considered to have occured.</param> void AssertStringWithLineInternal(String str, const char *expectedString, Int expectedLength, const char *message, const char *file, int line) { char buffer[1024]; if (str == NULL) { sprintf(buffer, "%s: actual string is a NULL pointer", message); FailTestWithLineInternal(buffer, file, line); } if (String_Length(str) != expectedLength) { sprintf(buffer, "%s: actual string length is %d", message, (int)String_Length(str)); FailTestWithLineInternal(buffer, file, line); } if (String_GetBytes(str)[expectedLength] != '\0') { sprintf(buffer, "%s: actual string is missing '\\0' after end", message); FailTestWithLineInternal(buffer, file, line); } if (expectedLength > 0) { if (MemCmp(String_GetBytes(str), expectedString, expectedLength)) { sprintf(buffer, "%s: actual string bytes do not match", message); FailTestWithLineInternal(buffer, file, line); } } else { if (str != String_Empty) { sprintf(buffer, "%s: actual string is not the String_Empty singleton", message); FailTestWithLineInternal(buffer, file, line); } } }
static Bool PrintParseMessages(CommandLineArgs options, Parser parser) { SmileList list; ParseMessage parseMessage; Bool hasErrors; Bool shouldPrint; const char *prefix; LexerPosition position; String message; hasErrors = False; for (list = parser->firstMessage; SMILE_KIND(list) != SMILE_KIND_NULL; list = LIST_REST(list)) { parseMessage = (ParseMessage)LIST_FIRST(list); shouldPrint = False; switch (parseMessage->messageKind) { case PARSEMESSAGE_INFO: if (options->verbose) { shouldPrint = True; prefix = ""; } break; case PARSEMESSAGE_WARNING: if (options->warningsAsErrors) { shouldPrint = True; prefix = "warning: "; hasErrors = True; } else if (!options->quiet) { shouldPrint = True; prefix = "warning: "; } break; case PARSEMESSAGE_ERROR: shouldPrint = True; prefix = ""; hasErrors = True; break; } if (!shouldPrint) continue; position = parseMessage->position; if (position->filename != NULL) { if (position->line > 0) { // Have a filename and a line number. message = String_Format("%S:%d: %s%S\r\n", position->filename, position->line, prefix, parseMessage->message); } else { // Have a filename but no line number. message = String_Format("%S: %s%S\r\n", position->filename, prefix, parseMessage->message); } } else { // Have no filename. message = String_Format("smile: %s%S\r\n", prefix, parseMessage->message); } fwrite(String_GetBytes(message), 1, String_Length(message), stderr); } return hasErrors; }
/// <summary> /// Convert the given name to its HTML entity value. This is AUTO-GENERATED, and uses an optimized /// decision tree that runs in O(n) time to convert the string as quickly as possible. /// </summary> /// <param name="name">The name of the HTML entity to look up.</param> /// <returns>The value for that entity, if it is an entity with a value, or -1 if there is no such entity.</returns> Int32 HtmlEntityNameToValue(String name) { Byte ch; const Byte *src; Int length; if (String_IsNullOrEmpty(name)) return -1; src = (const Byte *)String_GetBytes(name); length = String_Length(name); if (length-- <= 0) return -1; switch (*src++) { case 'A': if (length-- <= 0) return -1; switch (*src++) { case 'E': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 198; break; case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 193; break; case 'c': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 194; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 192; break; case 'l': if (length-- >= 0 && *src++ == 'p') if (length-- >= 0 && *src++ == 'h') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 913; break; case 'r': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'n') if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 197; break; case 't': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 195; break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 196; break; } break; case 'B': if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 914; break; case 'C': if (length-- <= 0) return -1; if ((ch = *src++) == 'c') { if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 199; } else if (ch == 'h') { if (length-- >= 0 && *src++ == 'i') if (length <= 0) return 935; } break; case 'D': if (length-- <= 0) return -1; if ((ch = *src++) == 'a') { if (length-- >= 0 && *src++ == 'g') if (length-- >= 0 && *src++ == 'g') if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8225; } else if (ch == 'e') { if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 916; } break; case 'E': if (length-- <= 0) return -1; switch (*src++) { case 'T': if (length-- >= 0 && *src++ == 'H') if (length <= 0) return 208; break; case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 201; break; case 'c': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 202; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 200; break; case 'p': if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 917; break; case 't': if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 919; break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 203; break; } break; case 'G': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 915; break; case 'I': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 205; break; case 'c': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 206; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 204; break; case 'o': if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 921; break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 207; break; } break; case 'K': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'p') if (length-- >= 0 && *src++ == 'p') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 922; break; case 'L': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'b') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 923; break; case 'M': if (length-- >= 0 && *src++ == 'u') if (length <= 0) return 924; break; case 'N': if (length-- <= 0) return -1; if ((ch = *src++) == 't') { if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 209; } else if (ch == 'u') { if (length <= 0) return 925; } break; case 'O': if (length-- <= 0) return -1; switch (*src++) { case 'E': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 338; break; case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 211; break; case 'c': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 212; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 210; break; case 'm': if (length-- <= 0) return -1; if ((ch = *src++) == 'e') { if (length-- >= 0 && *src++ == 'g') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 937; } else if (ch == 'i') { if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 927; } break; case 's': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'h') if (length <= 0) return 216; break; case 't': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 213; break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 214; break; } break; case 'P': if (length-- <= 0) return -1; switch (*src++) { case 'h': if (length-- >= 0 && *src++ == 'i') if (length <= 0) return 934; break; case 'i': if (length <= 0) return 928; break; case 'r': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 8243; break; case 's': if (length-- >= 0 && *src++ == 'i') if (length <= 0) return 936; break; } break; case 'R': if (length-- >= 0 && *src++ == 'h') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 929; break; case 'S': if (length-- <= 0) return -1; if ((ch = *src++) == 'c') { if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 352; } else if (ch == 'i') { if (length-- >= 0 && *src++ == 'g') if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 931; } break; case 'T': if (length-- <= 0) return -1; switch (*src++) { case 'H': if (length-- >= 0 && *src++ == 'O') if (length-- >= 0 && *src++ == 'R') if (length-- >= 0 && *src++ == 'N') if (length <= 0) return 222; break; case 'a': if (length-- >= 0 && *src++ == 'u') if (length <= 0) return 932; break; case 'h': if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 920; break; } break; case 'U': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 218; break; case 'c': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 219; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 217; break; case 'p': if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 933; break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 220; break; } break; case 'X': if (length-- >= 0 && *src++ == 'i') if (length <= 0) return 926; break; case 'Y': if (length-- <= 0) return -1; if ((ch = *src++) == 'a') { if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 221; } else if (ch == 'u') { if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 376; } break; case 'Z': if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 918; break; case 'a': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 225; break; case 'c': if (length-- <= 0) return -1; if ((ch = *src++) == 'i') { if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 226; } else if (ch == 'u') { if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 180; } break; case 'e': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 230; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 224; break; case 'l': if (length-- <= 0) return -1; if ((ch = *src++) == 'e') { if (length-- >= 0 && *src++ == 'f') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'y') if (length-- >= 0 && *src++ == 'm') if (length <= 0) return 8501; } else if (ch == 'p') { if (length-- >= 0 && *src++ == 'h') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 945; } break; case 'm': if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 38; break; case 'n': if (length-- <= 0) return -1; if ((ch = *src++) == 'd') { if (length <= 0) return 8743; } else if (ch == 'g') { if (length <= 0) return 8736; } break; case 'p': if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 's') if (length <= 0) return 39; break; case 'r': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'n') if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 229; break; case 's': if (length-- >= 0 && *src++ == 'y') if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 8776; break; case 't': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 227; break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 228; break; } break; case 'b': if (length-- <= 0) return -1; switch (*src++) { case 'd': if (length-- >= 0 && *src++ == 'q') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 8222; break; case 'e': if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 946; break; case 'r': if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'b') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 166; break; case 'u': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 8226; break; } break; case 'c': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 8745; break; case 'c': if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 231; break; case 'e': if (length-- <= 0) return -1; if ((ch = *src++) == 'd') { if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 184; } else if (ch == 'n') { if (length-- >= 0 && *src++ == 't') if (length <= 0) return 162; } break; case 'h': if (length-- >= 0 && *src++ == 'i') if (length <= 0) return 967; break; case 'i': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 710; break; case 'l': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'b') if (length-- >= 0 && *src++ == 's') if (length <= 0) return 9827; break; case 'o': if (length-- <= 0) return -1; if ((ch = *src++) == 'n') { if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 8773; } else if (ch == 'p') { if (length-- >= 0 && *src++ == 'y') if (length <= 0) return 169; } break; case 'r': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8629; break; case 'u': if (length-- <= 0) return -1; if ((ch = *src++) == 'p') { if (length <= 0) return 8746; } else if (ch == 'r') { if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 164; } break; } break; case 'd': if (length-- <= 0) return -1; switch (*src++) { case 'A': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8659; break; case 'a': if (length-- <= 0) return -1; if ((ch = *src++) == 'g') { if (length-- >= 0 && *src++ == 'g') if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8224; } else if (ch == 'r') { if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8595; } break; case 'e': if (length-- <= 0) return -1; if ((ch = *src++) == 'g') { if (length <= 0) return 176; } else if (ch == 'l') { if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 948; } break; case 'i': if (length-- <= 0) return -1; if ((ch = *src++) == 'a') { if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 's') if (length <= 0) return 9830; } else if (ch == 'v') { if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 247; } break; } break; case 'e': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 233; break; case 'c': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 234; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 232; break; case 'm': if (length-- <= 0) return -1; if ((ch = *src++) == 'p') { if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'y') if (length <= 0) return 8709; } else if (ch == 's') { if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 8195; } break; case 'n': if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 8194; break; case 'p': if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 949; break; case 'q': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'v') if (length <= 0) return 8801; break; case 't': if (length-- <= 0) return -1; if ((ch = *src++) == 'a') { if (length <= 0) return 951; } else if (ch == 'h') { if (length <= 0) return 240; } break; case 'u': if (length-- <= 0) return -1; if ((ch = *src++) == 'm') { if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 235; } else if (ch == 'r') { if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 8364; } break; case 'x': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 't') if (length <= 0) return 8707; break; } break; case 'f': if (length-- <= 0) return -1; switch (*src++) { case 'n': if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'f') if (length <= 0) return 402; break; case 'o': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 8704; break; case 'r': if (length-- >= 0 && *src++ == 'a') { if (length-- <= 0) return -1; if ((ch = *src++) == 'c') { if (length-- <= 0) return -1; if ((ch = *src++) == '1') { if (length-- <= 0) return -1; if ((ch = *src++) == '2') { if (length <= 0) return 189; } else if (ch == '4') { if (length <= 0) return 188; } } else if (ch == '3') { if (length-- >= 0 && *src++ == '4') if (length <= 0) return 190; } } else if (ch == 's') { if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 8260; } } break; } break; case 'g': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 947; break; case 'e': if (length <= 0) return 8805; break; case 't': if (length <= 0) return 62; break; } break; case 'h': if (length-- <= 0) return -1; switch (*src++) { case 'A': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8660; break; case 'a': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8596; break; case 'e': if (length-- <= 0) return -1; if ((ch = *src++) == 'a') { if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 's') if (length <= 0) return 9829; } else if (ch == 'l') { if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 8230; } break; } break; case 'i': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 237; break; case 'c': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 238; break; case 'e': if (length-- >= 0 && *src++ == 'x') if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 161; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 236; break; case 'm': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'g') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 8465; break; case 'n': if (length-- <= 0) return -1; if ((ch = *src++) == 'f') { if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 8734; } else if (ch == 't') { if (length <= 0) return 8747; } break; case 'o': if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 953; break; case 'q': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 't') if (length <= 0) return 191; break; case 's': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 8712; break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 239; break; } break; case 'k': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'p') if (length-- >= 0 && *src++ == 'p') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 954; break; case 'l': if (length-- <= 0) return -1; switch (*src++) { case 'A': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8656; break; case 'a': if (length-- <= 0) return -1; switch (*src++) { case 'm': if (length-- >= 0 && *src++ == 'b') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 955; break; case 'n': if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 9001; break; case 'q': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 171; break; case 'r': if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8592; break; } break; case 'c': if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 8968; break; case 'd': if (length-- >= 0 && *src++ == 'q') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 8220; break; case 'e': if (length <= 0) return 8804; break; case 'f': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8970; break; case 'o': if (length-- <= 0) return -1; if ((ch = *src++) == 'w') { if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 't') if (length <= 0) return 8727; } else if (ch == 'z') { if (length <= 0) return 9674; } break; case 'r': if (length-- >= 0 && *src++ == 'm') if (length <= 0) return 8206; break; case 's': if (length-- <= 0) return -1; if ((ch = *src++) == 'a') { if (length-- >= 0 && *src++ == 'q') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 8249; } else if (ch == 'q') { if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 8216; } break; case 't': if (length <= 0) return 60; break; } break; case 'm': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 175; break; case 'd': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'h') if (length <= 0) return 8212; break; case 'i': if (length-- <= 0) return -1; switch (*src++) { case 'c': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 181; break; case 'd': if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 't') if (length <= 0) return 183; break; case 'n': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 's') if (length <= 0) return 8722; break; } break; case 'u': if (length <= 0) return 956; break; } break; case 'n': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'b') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 8711; break; case 'b': if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 160; break; case 'd': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'h') if (length <= 0) return 8211; break; case 'e': if (length <= 0) return 8800; break; case 'i': if (length <= 0) return 8715; break; case 'o': if (length-- >= 0 && *src++ == 't') { if (length <= 0) return 172; } break; case 's': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'b') if (length <= 0) return 8836; break; case 't': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 241; break; case 'u': if (length <= 0) return 957; break; } break; case 'o': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 243; break; case 'c': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 244; break; case 'e': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 339; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 242; break; case 'l': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'n') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 8254; break; case 'm': if (length-- <= 0) return -1; if ((ch = *src++) == 'e') { if (length-- >= 0 && *src++ == 'g') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 969; } else if (ch == 'i') { if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 959; } break; case 'p': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 's') if (length <= 0) return 8853; break; case 'r': if (length <= 0) return 8744; break; case 's': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'h') if (length <= 0) return 248; break; case 't': if (length-- >= 0 && *src++ == 'i') { if (length-- <= 0) return -1; if ((ch = *src++) == 'l') { if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 245; } else if (ch == 'm') { if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 's') if (length <= 0) return 8855; } } break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 246; break; } break; case 'p': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'r') { if (length-- <= 0) return -1; if ((ch = *src++) == 'a') { if (length <= 0) return 182; } else if (ch == 't') { if (length <= 0) return 8706; } } break; case 'e': if (length-- >= 0 && *src++ == 'r') { if (length-- <= 0) return -1; if ((ch = *src++) == 'm') { if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 8240; } else if (ch == 'p') { if (length <= 0) return 8869; } } break; case 'h': if (length-- >= 0 && *src++ == 'i') if (length <= 0) return 966; break; case 'i': if (length <= 0) return 960; break; case 'l': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 177; break; case 'o': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'n') if (length-- >= 0 && *src++ == 'd') if (length <= 0) return 163; break; case 'r': if (length-- <= 0) return -1; if ((ch = *src++) == 'i') { if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 8242; } else if (ch == 'o') { if (length-- <= 0) return -1; if ((ch = *src++) == 'd') { if (length <= 0) return 8719; } else if (ch == 'p') { if (length <= 0) return 8733; } } break; case 's': if (length-- >= 0 && *src++ == 'i') if (length <= 0) return 968; break; } break; case 'q': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 't') if (length <= 0) return 34; break; case 'r': if (length-- <= 0) return -1; switch (*src++) { case 'A': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8658; break; case 'a': if (length-- <= 0) return -1; switch (*src++) { case 'd': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 8730; break; case 'n': if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 9002; break; case 'q': if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 187; break; case 'r': if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8594; break; } break; case 'c': if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 8969; break; case 'd': if (length-- >= 0 && *src++ == 'q') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 8221; break; case 'e': if (length-- <= 0) return -1; if ((ch = *src++) == 'a') { if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 8476; } else if (ch == 'g') { if (length <= 0) return 174; } break; case 'f': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8971; break; case 'h': if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 961; break; case 'l': if (length-- >= 0 && *src++ == 'm') if (length <= 0) return 8207; break; case 's': if (length-- <= 0) return -1; if ((ch = *src++) == 'a') { if (length-- >= 0 && *src++ == 'q') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 8250; } else if (ch == 'q') { if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 8217; } break; } break; case 's': if (length-- <= 0) return -1; switch (*src++) { case 'b': if (length-- >= 0 && *src++ == 'q') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 'o') if (length <= 0) return 8218; break; case 'c': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 353; break; case 'd': if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 't') if (length <= 0) return 8901; break; case 'e': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 't') if (length <= 0) return 167; break; case 'h': if (length-- >= 0 && *src++ == 'y') if (length <= 0) return 173; break; case 'i': if (length-- <= 0) return -1; if ((ch = *src++) == 'g') { if (length-- >= 0 && *src++ == 'm') { if (length-- >= 0 && *src++ == 'a') { if (length <= 0) return 963; } } } else if (ch == 'm') { if (length <= 0) return 8764; } break; case 'p': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 's') if (length <= 0) return 9824; break; case 'u': if (length-- <= 0) return -1; switch (*src++) { case 'b': if (length <= 0) return 8834; break; case 'm': if (length <= 0) return 8721; break; case 'p': if (length <= 0) return 8835; break; } break; case 'z': if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'g') if (length <= 0) return 223; break; } break; case 't': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'u') if (length <= 0) return 964; break; case 'h': if (length-- <= 0) return -1; switch (*src++) { case 'e': if (length-- <= 0) return -1; if ((ch = *src++) == 'r') { if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == '4') if (length <= 0) return 8756; } else if (ch == 't') { if (length-- >= 0 && *src++ == 'a') { if (length <= 0) return 952; } } break; case 'i': if (length-- >= 0 && *src++ == 'n') if (length-- >= 0 && *src++ == 's') if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 8201; break; case 'o': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 254; break; } break; case 'i': if (length-- <= 0) return -1; if ((ch = *src++) == 'l') { if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 732; } else if (ch == 'm') { if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 's') if (length <= 0) return 215; } break; case 'r': if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'd') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 8482; break; } break; case 'u': if (length-- <= 0) return -1; switch (*src++) { case 'A': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8657; break; case 'a': if (length-- <= 0) return -1; if ((ch = *src++) == 'c') { if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 250; } else if (ch == 'r') { if (length-- >= 0 && *src++ == 'r') if (length <= 0) return 8593; } break; case 'c': if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'c') if (length <= 0) return 251; break; case 'g': if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'a') if (length-- >= 0 && *src++ == 'v') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 249; break; case 'm': if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 168; break; case 'p': if (length-- >= 0 && *src++ == 's') { if (length-- >= 0 && *src++ == 'i') { if (length-- <= 0) return -1; if ((ch = *src++) == 'h') { if (length <= 0) return 978; } else if (ch == 'l') { if (length-- >= 0 && *src++ == 'o') if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 965; } } } break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 252; break; } break; case 'v': if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'l') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 8942; break; case 'w': if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'i') if (length-- >= 0 && *src++ == 'e') if (length-- >= 0 && *src++ == 'r') if (length-- >= 0 && *src++ == 'p') if (length <= 0) return 8472; break; case 'x': if (length-- >= 0 && *src++ == 'i') if (length <= 0) return 958; break; case 'y': if (length-- <= 0) return -1; switch (*src++) { case 'a': if (length-- >= 0 && *src++ == 'c') if (length-- >= 0 && *src++ == 'u') if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'e') if (length <= 0) return 253; break; case 'e': if (length-- >= 0 && *src++ == 'n') if (length <= 0) return 165; break; case 'u': if (length-- >= 0 && *src++ == 'm') if (length-- >= 0 && *src++ == 'l') if (length <= 0) return 255; break; } break; case 'z': if (length-- <= 0) return -1; if ((ch = *src++) == 'e') { if (length-- >= 0 && *src++ == 't') if (length-- >= 0 && *src++ == 'a') if (length <= 0) return 950; } else if (ch == 'w') { if (length-- <= 0) return -1; if ((ch = *src++) == 'j') { if (length <= 0) return 8205; } else if (ch == 'n') { if (length-- >= 0 && *src++ == 'j') if (length <= 0) return 8204; } } break; } return -1; }
SMILE_API_FUNC Bool Real128_TryParse(String str, Real128 *result) { DECLARE_INLINE_STRINGBUILDER(cleanString, 256); const Byte *src, *end, *start; Byte ch; src = String_GetBytes(str); end = src + String_Length(str); INIT_INLINE_STRINGBUILDER(cleanString); // We need to clean the Smile-isms out of the string so that it's just raw digits, // decimal points, and possibly 'E' and signs. Then we can pass it to the native // parsing function. // Skip initial whitespace. while (src < end && (ch = *src) >= '\x00' && ch <= '\x20') src++; // If there's no content, this is a fail. if (src >= end) { *result = Real128_Zero; return False; } // Trim off trailing whitespace. while (end > src && (ch = end[-1]) >= '\x00' && ch <= '\x20') end--; // Check for named numeric values like "inf" and "nan". We only allow quiet NaNs, since // nothing in Smile's numerics supports signaling NaNs. We have to check for these up front, // since the underlying parser can't indicate the difference beween a failed parse and the // user actually requesting "NaN". It also allows "infinity", fully-spelled-out, which we // do not. // // Note: These tests are carefully ordered so that the compiler's optimizer can easily // perform CSE on them; these read cleanly, but they optimize down to the most-efficient way // of testing for this. Don't reorder these without a good reason. if (src + 3 == end && (((ch = src[0]) == 'i' || ch == 'I') && ((ch = src[1]) == 'n' || ch == 'N') && ((ch = src[2]) == 'f' || ch == 'F'))) { *result = Real128_Inf; return True; } else if (src + 3 == end && (((ch = src[0]) == 'n' || ch == 'N') && ((ch = src[1]) == 'a' || ch == 'A') && ((ch = src[2]) == 'n' || ch == 'N'))) { *result = Real128_NaN; return True; } else if (src + 4 == end && (src[0] == '+' && ((ch = src[1]) == 'i' || ch == 'I') && ((ch = src[2]) == 'n' || ch == 'N') && ((ch = src[3]) == 'f' || ch == 'F'))) { *result = Real128_Inf; return True; } else if (src + 4 == end && (src[0] == '+' && ((ch = src[1]) == 'n' || ch == 'N') && ((ch = src[2]) == 'a' || ch == 'A') && ((ch = src[3]) == 'n' || ch == 'N'))) { *result = Real128_NaN; return True; } else if (src + 4 == end && (src[0] == '-' && ((ch = src[1]) == 'i' || ch == 'I') && ((ch = src[2]) == 'n' || ch == 'N') && ((ch = src[3]) == 'f' || ch == 'F'))) { *result = Real128_NegInf; return True; } else if (src + 4 == end && (src[0] == '-' && ((ch = src[1]) == 'n' || ch == 'N') && ((ch = src[2]) == 'a' || ch == 'A') && ((ch = src[3]) == 'n' || ch == 'N'))) { *result = Real128_NegNaN; return True; } start = src; // Copy an optional initial '+' or '-' as a sign. if ((ch = *src) == '+' || ch == '-') { src++; } // Make sure this doesn't start with a ' or " or _ character, since those separators are illegal starting chars. if ((ch = *src) == '\'' || ch == '\"' || ch == '_') { *result = Real128_Zero; return False; } // Copy digit chunks and radix and exponent characters, discarding embedded ' and " and _ characters. // We don't need to validate this part, because the underlying parser will do so. while (src < end) { switch (ch = *src) { case '\'': case '\"': case '_': // Separator character. if (src > start) { StringBuilder_Append(cleanString, start, 0, src - start); } else { // Two separator chars in a row is illegal. *result = Real128_Zero; return False; } start = ++src; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'e': case 'E': case '+': case '-': case '.': // Legal numeric character of some kind. src++; break; default: // Unknown character is an error. *result = Real128_Zero; return False; break; } } if (src > start) { StringBuilder_Append(cleanString, start, 0, src - start); } else { // Ending with a separator character is illegal. *result = Real128_Zero; return False; } // Make sure this results in a C-style string. StringBuilder_AppendByte(cleanString, '\0'); // The StringBuilder now contains the desired string, at it's at least *somewhat* // legitimately structured. The rest of the parsing (and validation) can be done // by the underlying raw parser, which will return a NaN if the string isn't valid. // We read the content right out of the StringBuilder: If the content is short // enough, all of the data will be on the stack, so we can avoid ever allocating // anything at all on the heap, which is great for performance. *result = Real128_FromRawCString((const char *)StringBuilder_GetBytes(cleanString)); return !Real128_IsNaN(*result); }
Int Lexer_ParseReal(Lexer lexer, Bool isFirstContentOnLine) { DECLARE_INLINE_STRINGBUILDER(digitBuilder, 256); // 256 is plenty for most numbers, but it can grow if necessary. const Byte *src = lexer->src; const Byte *end = lexer->end; const Byte *start; Byte ch; Token token = lexer->token; Int integerDigitCount = 0; Int fractionalDigitCount = 0; const Byte *digits; String digitString, suffix; const Byte *suffixText; Float64 float64; UNUSED(isFirstContentOnLine); INIT_INLINE_STRINGBUILDER(digitBuilder); START_TOKEN(src); // Collect integer digits. start = src; while (src < end && (ch = *src) >= '0' && ch <= '9') { src++; if (src + 1 < end && ((ch = *src) == '\'' || ch == '\"' || ch == '_') && src[1] >= '0' && src[1] <= '9') { if (src > start) { StringBuilder_Append(digitBuilder, start, 0, src - start); } src++; start = src; } } // Copy into the digitBuilder whatever integers are left. if (src > start) { StringBuilder_Append(digitBuilder, start, 0, src - start); } integerDigitCount = StringBuilder_GetLength(digitBuilder); // Collect the decimal point. if (src < end && *src == '.') { src++; // Collect fractional digits. while (src < end && (ch = *src) >= '0' && ch <= '9') { src++; if (src + 1 < end && ((ch = *src) == '\'' || ch == '\"' || ch == '_') && src[1] >= '0' && src[1] <= '9') { if (src > start) { StringBuilder_Append(digitBuilder, start, 0, src - start); } src++; start = src; } } fractionalDigitCount = StringBuilder_GetLength(digitBuilder) - 1 - integerDigitCount; } // Finally copy into the digitBuilder whatever's left. if (src > start) { StringBuilder_Append(digitBuilder, start, 0, src - start); } lexer->src = src; // Make the result C-friendly. StringBuilder_AppendByte(digitBuilder, '\0'); // Extract out the raw text of the number. digitString = StringBuilder_ToString(digitBuilder); digits = String_GetBytes(digitString); // Get any trailing type identifiers. suffix = CollectAlphanumericSuffix(lexer); // And make sure the result is clean. if (!EnsureEndOfNumber(lexer)) { token->text = IllegalRealValueMessage; return END_TOKEN(TOKEN_ERROR); } suffixText = String_GetBytes(suffix); if (suffixText[0] == '\0') { // Real64. if (!Real64_TryParse(digitString, &token->data.real64)) { token->text = IllegalRealValueMessage; return END_TOKEN(TOKEN_ERROR); } token->text = digitString; return END_TOKEN(TOKEN_REAL64); } else if (suffixText[0] == 'F' || suffixText[0] == 'f') { if (suffixText[1] == '\0') { // Float64. float64 = strtod(digits, NULL); token->data.float64 = float64; token->text = digitString; return END_TOKEN(TOKEN_FLOAT64); } else goto badSuffix; } else if (suffixText[0] == 'L' || suffixText[0] == 'l') { // 128-bit something-or-other. if (suffixText[1] == '\0') { // Real128. if (!Real128_TryParse(digitString, &token->data.real128)) { token->text = IllegalRealValueMessage; return END_TOKEN(TOKEN_ERROR); } token->text = String_Concat(digitString, suffix); return END_TOKEN(TOKEN_REAL128); } else if ((suffixText[1] == 'F' || suffixText[1] == 'f') && suffixText[2] == '\0') { // Float128 (not yet supported). goto badSuffix; } else goto badSuffix; } else if (suffixText[0] == 'H' || suffixText[0] == 'h') { // 32-bit something-or-other. if (suffixText[1] == '\0') { // Real32. if (!Real32_TryParse(digitString, &token->data.real32)) { token->text = IllegalRealValueMessage; return END_TOKEN(TOKEN_ERROR); } token->text = String_Concat(digitString, suffix); return END_TOKEN(TOKEN_REAL32); } else if ((suffixText[1] == 'F' || suffixText[1] == 'f') && suffixText[2] == '\0') { // Float32. float64 = strtod(digits, NULL); token->data.float32 = (Float32)float64; token->text = digitString; return END_TOKEN(TOKEN_FLOAT32); } else goto badSuffix; } else goto badSuffix; badSuffix: token->text = String_FormatString(IllegalNumericSuffixMessage, suffix); return END_TOKEN(TOKEN_ERROR); }
Inline Int ProcessIntegerValue(Lexer lexer, UInt64 value, String text, String suffix) { const Byte *suffixText = String_GetBytes(suffix); Int suffixLength = String_Length(suffix); if (String_IsNullOrEmpty(suffix)) { if (value >= (1ULL << 32)) { lexer->token->text = String_FormatString(IllegalNumericSizeMessage, "Integer32"); return (lexer->token->kind = TOKEN_ERROR); } else { lexer->token->data.i = (Int32)(UInt32)value; lexer->token->text = text; return (lexer->token->kind = TOKEN_INTEGER32); } } switch (suffixText[0]) { case 'l': case 'L': if (suffixLength == 1) { lexer->token->data.int64 = (Int64)value; lexer->token->text = text; return (lexer->token->kind = TOKEN_INTEGER64); } else goto unknown_suffix; case 'h': case 'H': if (suffixLength == 1) { if (value > 65536) { lexer->token->text = String_FormatString(IllegalNumericSizeMessage, "Integer16"); return (lexer->token->kind = TOKEN_ERROR); } else { lexer->token->data.i = (Int32)(UInt32)value; lexer->token->text = text; return (lexer->token->kind = TOKEN_INTEGER16); } } else goto unknown_suffix; case 'x': case 'X': if (suffixLength == 1) { if (value > 256) { lexer->token->text = String_FormatString(IllegalNumericSizeMessage, "Byte"); return (lexer->token->kind = TOKEN_ERROR); } else { lexer->token->data.i = (Int32)(UInt32)value; lexer->token->text = text; return (lexer->token->kind = TOKEN_BYTE); } } else goto unknown_suffix; default: unknown_suffix: lexer->token->text = String_FormatString(IllegalNumericSuffixMessage, suffix); return (lexer->token->kind = TOKEN_ERROR); } }