Mercurial > projects > dil
diff trunk/src/dil/Messages.d @ 325:540ec3753263
- Moved some source files to src/dil/.
author | aziz |
---|---|
date | Tue, 21 Aug 2007 16:28:05 +0000 |
parents | trunk/src/Messages.d@6259fb93e3dd |
children | 4a7359b88c11 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trunk/src/dil/Messages.d Tue Aug 21 16:28:05 2007 +0000 @@ -0,0 +1,108 @@ +/++ + 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; +}