Exemple #1
0
/// <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);
		}
	}
}
Exemple #2
0
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;
}
Exemple #4
0
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);
}
Exemple #5
0
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);
}
Exemple #6
0
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);
	}
}