Mercurial > projects > dil
view trunk/src/Messages.d @ 323:6259fb93e3dd
- Rewrote scanSpecialToken().
- Added Filespec to enum TOK.
- Added another nested struct to union in Token.
- Deleted ExpectedNormalStringLiteral from enum MID and added ExpectedFilespec and UnterminatedFilespec. Adapted lang_de.d and lang_en.d accordingly.
- Fixed some code in scanNumber(). Added some assert statements.
author | aziz |
---|---|
date | Tue, 21 Aug 2007 15:26:00 +0000 |
parents | b4d842b0d2c7 |
children |
line wrap: on
line source
/++ Author: Aziz Köksal License: GPL3 +/ module Messages; import Settings; import std.stdarg; /// Index into table of compiler messages. enum MID { // Lexer messages: InvalidUnicodeCharacter, InvalidUTF8Sequence, // '' UnterminatedCharacterLiteral, EmptyCharacterLiteral, // #line ExpectedIdentifierSTLine, ExpectedNumberAfterSTLine, ExpectedFilespec, UnterminatedFilespec, UnterminatedSpecialToken, // "" UnterminatedString, // x"" NonHexCharInHexString, OddNumberOfDigitsInHexString, UnterminatedHexString, // /* */ /+ +/ UnterminatedBlockComment, UnterminatedNestedComment, // `` r"" UnterminatedRawString, UnterminatedBackQuoteString, // \x \u \U UndefinedEscapeSequence, InsufficientHexDigits, // \&[a-zA-Z][a-zA-Z0-9]+; UndefinedHTMLEntity, UnterminatedHTMLEntity, InvalidBeginHTMLEntity, // integer overflows OverflowDecimalSign, OverflowDecimalNumber, OverflowHexNumber, OverflowBinaryNumber, OverflowOctalNumber, OverflowFloatNumber, OctalNumberHasDecimals, NoDigitsInHexNumber, NoDigitsInBinNumber, HexFloatExponentRequired, HexFloatMissingExpDigits, FloatExponentDigitExpected, // Parser messages: ExpectedButFound, RedundantStorageClass, // Help messages: HelpMain, } string GetMsg(MID mid) { assert(mid < GlobalSettings.messages.length); return GlobalSettings.messages[mid]; } char[] format(MID mid, ...) { auto args = arguments(_arguments, _argptr); return format_args(GetMsg(mid), args); } char[] format(char[] format_str, ...) { auto args = arguments(_arguments, _argptr); return format_args(format_str, args); } char[] format_args(char[] format_str, char[][] args) { char[] result = format_str; foreach (i, arg; args) result = std.string.replace(result, std.string.format("{%s}", i+1), arg); return result; } char[][] arguments(TypeInfo[] tinfos, void* argptr) { char[][] args; foreach (ti; tinfos) { if (ti == typeid(char[])) args ~= va_arg!(char[])(argptr); else if (ti == typeid(int)) args ~= std.string.format(va_arg!(int)(argptr)); else if (ti == typeid(dchar)) args ~= std.string.format(va_arg!(dchar)(argptr)); else assert(0, "argument type not supported yet."); } return args; }