view trunk/src/dil/Messages.d @ 389:c4bfceab7246

Applied fixes and improvements to hex float scanner. '0x1234i' and '0x1234Li' were wrongly matched as hex floats. Refactored scanHexReal(). It's faster now and easier to read. Renamed MID.HexFloatMissingExpDigits to MID.HexFloatExpMustStartWithDigit. Renamed MID.FloatExponentDigitExpected to MID.FloatExpMustStartWidhtDigit. Fix in scanSpecialTokenSequence(): --p must come after if statement.
author Aziz K?ksal <aziz.koeksal@gmail.com>
date Wed, 12 Sep 2007 18:18:29 +0200
parents ae154eceba65
children 4d36eea1bbc9
line wrap: on
line source

/++
  Author: Aziz Köksal
  License: GPL3
+/
module dil.Messages;
import dil.Settings;
import std.stdarg;

/// Index into table of compiler messages.
enum MID
{
  // Lexer messages:
  InvalidUnicodeCharacter,
  InvalidUTF8Sequence,
  // ''
  UnterminatedCharacterLiteral,
  EmptyCharacterLiteral,
  // #line
  ExpectedIdentifierSTLine,
  ExpectedIntegerAfterSTLine,
  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,
  HexFloatExpMustStartWithDigit,
  FloatExpMustStartWithDigit,

  // Parser messages:
  ExpectedButFound,
  RedundantStorageClass,
  TemplateTupleParameter,
  InContract,
  OutContract,
  MissingLinkageType,
  UnrecognizedLinkageType,

  // Help messages:
  HelpMain,
  HelpGenerate,
  HelpImportGraph,
}

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;
}