/** @file
EFI tools utility functions to display warning, error, and informational messages

Copyright (c) 2004 - 2017, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

--*/

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <time.h>

#include "EfiUtilityMsgs.h"

//
// Declare module globals for keeping track of the utility's
// name and other settings.
//
STATIC STATUS mStatus                 = STATUS_SUCCESS;
STATIC CHAR8  mUtilityName[50]        = { 0 };
STATIC UINT64 mPrintLogLevel          = INFO_LOG_LEVEL;
STATIC CHAR8  *mSourceFileName        = NULL;
STATIC UINT32 mSourceFileLineNum      = 0;
STATIC UINT32 mErrorCount             = 0;
STATIC UINT32 mWarningCount           = 0;
STATIC UINT32 mMaxErrors              = 0;
STATIC UINT32 mMaxWarnings            = 0;
STATIC UINT32 mMaxWarningsPlusErrors  = 0;
STATIC INT8   mPrintLimitsSet         = 0;

STATIC
VOID
PrintLimitExceeded (
  VOID
  );

/**
  Prints an error message.

  All arguments are optional, though the printed message may be useless if
  at least something valid is not specified.

 @note:
   We print the following (similar to the Warn() and Debug()
   W
   Typical error/warning message format:

   bin\VfrCompile.cpp(330) : error C2660: 'AddVfrDataStructField' : function does not take 2 parameters

   BUGBUG -- these three utility functions are almost identical, and
   should be modified to share code.

   Visual Studio does not find error messages with:

      " error :"
      " error 1:"
      " error c1:"
      " error 1000:"
      " error c100:"

   It does find:
      " error c1000:"

  @param FileName name of the file or application. If not specified, then the
             utility name (as set by the utility calling SetUtilityName()
             earlier) is used. Otherwise "Unknown utility" is used.

  @param LineNumber the line number of error, typically used by parsers. If the
               utility is not a parser, then 0 should be specified. Otherwise
               the FileName and LineNumber info can be used to cause
               MS Visual Studio to jump to the error.

  @param MessageCode an application-specific error code that can be referenced in
              other documentation.

  @param Text        the text in question, typically used by parsers.

  @param MsgFmt the format string for the error message. Can contain formatting
           controls for use with the varargs.
**/
VOID
Error (
  CHAR8   *FileName,
  UINT32  LineNumber,
  UINT32  MessageCode,
  CHAR8   *Text,
  CHAR8   *MsgFmt,
  ...
  )
{
  va_list List;
  //
  // If limits have been set, then check that we have not exceeded them
  //
  if (mPrintLimitsSet) {
    //
    // See if we've exceeded our total count
    //
    if (mMaxWarningsPlusErrors != 0) {
      if (mErrorCount + mWarningCount > mMaxWarningsPlusErrors) {
        PrintLimitExceeded ();
        return ;
      }
    }
    //
    // See if we've exceeded our error count
    //
    if (mMaxErrors != 0) {
      if (mErrorCount > mMaxErrors) {
        PrintLimitExceeded ();
        return ;
      }
    }
  }

  mErrorCount++;
  va_start (List, MsgFmt);
  PrintMessage ("ERROR", FileName, LineNumber, MessageCode, Text, MsgFmt, List);
  va_end (List);
}

/**
  Print a parser error, using the source file name and line number
  set by a previous call to SetParserPosition().

  @param MessageCode   application-specific error code
  @param Text          text to print in the error message
  @param MsgFmt        format string to print at the end of the error message
**/
VOID
ParserError (
  UINT32  MessageCode,
  CHAR8   *Text,
  CHAR8   *MsgFmt,
  ...
  )
{
  va_list List;
  //
  // If limits have been set, then check them
  //
  if (mPrintLimitsSet) {
    //
    // See if we've exceeded our total count
    //
    if (mMaxWarningsPlusErrors != 0) {
      if (mErrorCount + mWarningCount > mMaxWarningsPlusErrors) {
        PrintLimitExceeded ();
        return ;
      }
    }
    //
    // See if we've exceeded our error count
    //
    if (mMaxErrors != 0) {
      if (mErrorCount > mMaxErrors) {
        PrintLimitExceeded ();
        return ;
      }
    }
  }

  mErrorCount++;
  va_start (List, MsgFmt);
  PrintMessage ("ERROR", mSourceFileName, mSourceFileLineNum, MessageCode, Text, MsgFmt, List);
  va_end (List);
}

/**
  Print a parser warning, using the source file name and line number
  set by a previous call to SetParserPosition().

  @param ErrorCode     application-specific error code
  @param OffendingText text to print in the warning message
  @param MsgFmt        format string to print at the end of the warning message
**/
VOID
ParserWarning (
  UINT32  ErrorCode,
  CHAR8   *OffendingText,
  CHAR8   *MsgFmt,
  ...
  )
{
  va_list List;
  //
  // If limits have been set, then check them
  //
  if (mPrintLimitsSet) {
    //
    // See if we've exceeded our total count
    //
    if (mMaxWarningsPlusErrors != 0) {
      if (mErrorCount + mWarningCount > mMaxWarningsPlusErrors) {
        PrintLimitExceeded ();
        return ;
      }
    }
    //
    // See if we've exceeded our warning count
    //
    if (mMaxWarnings != 0) {
      if (mWarningCount > mMaxWarnings) {
        PrintLimitExceeded ();
        return ;
      }
    }
  }

  mWarningCount++;
  va_start (List, MsgFmt);
  PrintMessage ("WARNING", mSourceFileName, mSourceFileLineNum, ErrorCode, OffendingText, MsgFmt, List);
  va_end (List);
  //
  // Don't set warning status accordingly
  //
  //  if (mStatus < STATUS_WARNING) {
  //    mStatus = STATUS_WARNING;
  //  }
}

/**
  Print a warning message.

  @param FileName    name of the file where the warning was detected, or the name
                     of the application that detected the warning
  @param LineNumber  the line number where the warning was detected (parsers).
                     0 should be specified if the utility is not a parser.
  @param MessageCode an application-specific warning code that can be referenced in
                     other documentation.
  @param Text        the text in question (parsers)
  @param MsgFmt      the format string for the warning message. Can contain formatting
                     controls for use with varargs.
**/
VOID
Warning (
  CHAR8   *FileName,
  UINT32  LineNumber,
  UINT32  MessageCode,
  CHAR8   *Text,
  CHAR8   *MsgFmt,
  ...
  )
{
  va_list List;

  //
  // Current Print Level not output warning information.
  //
  if (WARNING_LOG_LEVEL < mPrintLogLevel) {
    return;
  }
  //
  // If limits have been set, then check them
  //
  if (mPrintLimitsSet) {
    //
    // See if we've exceeded our total count
    //
    if (mMaxWarningsPlusErrors != 0) {
      if (mErrorCount + mWarningCount > mMaxWarningsPlusErrors) {
        PrintLimitExceeded ();
        return ;
      }
    }
    //
    // See if we've exceeded our warning count
    //
    if (mMaxWarnings != 0) {
      if (mWarningCount > mMaxWarnings) {
        PrintLimitExceeded ();
        return ;
      }
    }
  }

  mWarningCount++;
  va_start (List, MsgFmt);
  PrintMessage ("WARNING", FileName, LineNumber, MessageCode, Text, MsgFmt, List);
  va_end (List);
}

/**
  Print a Debug message.

  @param FileName    typically the name of the utility printing the debug message, but
                     can be the name of a file being parsed.
  @param LineNumber  the line number in FileName (parsers)
  @param MsgLevel    Debug message print level (0~9)
  @param Text        the text in question (parsers)
  @param MsgFmt      the format string for the debug message. Can contain formatting
                     controls for use with varargs.

**/
VOID
DebugMsg (
  CHAR8   *FileName,
  UINT32  LineNumber,
  UINT64  MsgLevel,
  CHAR8   *Text,
  CHAR8   *MsgFmt,
  ...
  )
{
  va_list List;
  //
  // If the debug level is less than current print level, then do nothing.
  //
  if (MsgLevel < mPrintLogLevel) {
    return ;
  }

  va_start (List, MsgFmt);
  PrintMessage ("DEBUG", FileName, LineNumber, 0, Text, MsgFmt, List);
  va_end (List);
}

/**
  Worker routine for all the utility printing services. Prints the message in
  a format that Visual Studio will find when scanning build outputs for
  errors or warnings.

 @note:
   If FileName == NULL then this utility will use the string passed into SetUtilityName().

   LineNumber is only used if the caller is a parser, in which case FileName refers to the
   file being parsed.

   Text and MsgFmt are both optional, though it would be of little use calling this function with
   them both NULL.

   Output will typically be of the form:
     <FileName>(<LineNumber>) : <Type> <Type[0]><MessageCode>: <Text> : <MsgFmt>

     Parser (LineNumber != 0)
       VfrCompile.cpp(330) : error E2660: AddVfrDataStructField : function does not take 2 parameters
     Generic utility (LineNumber == 0)
       UtilityName : error E1234 : Text string : MsgFmt string and args

  @param Type        "warning" or "error" string to insert into the message to be
                printed. The first character of this string (converted to uppercase)
                is used to precede the MessageCode value in the output string.
  @param FileName    name of the file where the warning was detected, or the name
                of the application that detected the warning
  @param LineNumber  the line number where the warning was detected (parsers).
                0 should be specified if the utility is not a parser.
  @param MessageCode an application-specific warning code that can be referenced in
                other documentation.
  @param Text        part of the message to print
  @param MsgFmt      the format string for the message. Can contain formatting
                controls for use with varargs.
  @param List        the variable list.
**/
VOID
PrintMessage (
  CHAR8   *Type,
  CHAR8   *FileName,
  UINT32  LineNumber,
  UINT32  MessageCode,
  CHAR8   *Text,
  CHAR8   *MsgFmt,
  va_list List
  )
{
  CHAR8       Line[MAX_LINE_LEN];
  CHAR8       Line2[MAX_LINE_LEN];
  CHAR8       *Cptr;
  struct tm   *NewTime;
  time_t      CurrentTime;

  //
  // init local variable
  //
  Line[0] = '\0';
  Line2[0] = '\0';

  //
  // If given a filename, then add it (and the line number) to the string.
  // If there's no filename, then use the program name if provided.
  //
  if (FileName != NULL) {
    Cptr = FileName;
  } else {
    Cptr = NULL;
  }

  if (strcmp (Type, "DEBUG") == 0) {
    //
    // Debug Message requires current time.
    //
    time (&CurrentTime);
    NewTime = localtime (&CurrentTime);
    if (NewTime != NULL) {
      fprintf (stdout, "%04d-%02d-%02d %02d:%02d:%02d",
                       NewTime->tm_year + 1900,
                       NewTime->tm_mon + 1,
                       NewTime->tm_mday,
                       NewTime->tm_hour,
                       NewTime->tm_min,
                       NewTime->tm_sec
                       );
    }
    if (Cptr != NULL) {
      if (LineNumber != 0) {
        snprintf(Line, MAX_LINE_LEN, ": %s(%u)", Cptr, (unsigned) LineNumber);
      } else {
        snprintf(Line, MAX_LINE_LEN, ": %s", Cptr);
      }

    }
  } else {
    //
    // Error and Warning Information.
    //
    if (Cptr != NULL) {
      if (mUtilityName[0] != '\0') {
        fprintf (stdout, "%s...\n", mUtilityName);
      }
      strncpy (Line, Cptr, MAX_LINE_LEN - 1);
      Line[MAX_LINE_LEN - 1] = 0;
      if (LineNumber != 0) {
        snprintf (Line2, MAX_LINE_LEN, "(%u)", (unsigned) LineNumber);

        strncat (Line, Line2, MAX_LINE_LEN - strlen (Line) - 1);
      }
    } else {
      if (mUtilityName[0] != '\0') {
        strncpy (Line, mUtilityName, MAX_LINE_LEN - 1);
        Line[MAX_LINE_LEN - 1] = 0;
      }
    }

    if (strcmp (Type, "ERROR") == 0) {
      //
      // Set status accordingly for ERROR information.
      //
      if (mStatus < STATUS_ERROR) {
        mStatus = STATUS_ERROR;
      }
    }
  }

  //
  // Have to print an error code or Visual Studio won't find the
  // message for you. It has to be decimal digits too.
  //
  strncat (Line, ": ", MAX_LINE_LEN - strlen (Line) - 1);
  strncat (Line, Type, MAX_LINE_LEN - strlen (Line) - 1);
  if (MessageCode != 0) {
    snprintf (Line2, MAX_LINE_LEN, " %04u", (unsigned) MessageCode);

    strncat (Line, Line2, MAX_LINE_LEN - strlen (Line) - 1);
  }
  fprintf (stdout, "%s", Line);
  //
  // If offending text was provided, then print it
  //
  if (Text != NULL) {
    fprintf (stdout, ": %s", Text);
  }
  fprintf (stdout, "\n");

  //
  // Print formatted message if provided
  //
  if (MsgFmt != NULL) {
    vsnprintf (Line2, MAX_LINE_LEN, MsgFmt, List);

    fprintf (stdout, "  %s\n", Line2);
  }

}

/**
  Print message into stdout.

  @param MsgFmt      the format string for the message. Can contain formatting
                     controls for use with varargs.
  @param List        the variable list.
**/
STATIC
VOID
PrintSimpleMessage (
  CHAR8   *MsgFmt,
  va_list List
  )
{
  CHAR8       Line[MAX_LINE_LEN];
  //
  // Print formatted message if provided
  //
  if (MsgFmt != NULL) {
    vsnprintf (Line, MAX_LINE_LEN, MsgFmt, List);

    fprintf (stdout, "%s\n", Line);
  }
}

/**
  Set the position in a file being parsed. This can be used to
  print error messages deeper down in a parser.

  @param SourceFileName name of the source file being parsed
  @param LineNum        line number of the source file being parsed
**/
VOID
ParserSetPosition (
  CHAR8   *SourceFileName,
  UINT32  LineNum
  )
{
  mSourceFileName     = SourceFileName;
  mSourceFileLineNum  = LineNum;
}

/**
  All printed error/warning/debug messages follow the same format, and
  typically will print a filename or utility name followed by the error
  text. However if a filename is not passed to the print routines, then
  they'll print the utility name if you call this function early in your
  app to set the utility name.

  @param UtilityName  name of the utility, which will be printed with all
                      error/warning/debug messages.
**/
VOID
SetUtilityName (
  CHAR8   *UtilityName
  )
{
  //
  // Save the name of the utility in our local variable. Make sure its
  // length does not exceed our buffer.
  //
  if (UtilityName != NULL) {
    if (strlen (UtilityName) >= sizeof (mUtilityName)) {
      Error (UtilityName, 0, 0, "application error", "utility name length exceeds internal buffer size");
    }
    strncpy (mUtilityName, UtilityName, sizeof (mUtilityName) - 1);
    mUtilityName[sizeof (mUtilityName) - 1] = 0;
  } else {
    Error (NULL, 0, 0, "application error", "SetUtilityName() called with NULL utility name");
  }
}

/**
  When you call Error() or Warning(), this module keeps track of it and
  sets a local mStatus to STATUS_ERROR or STATUS_WARNING. When the utility
  exits, it can call this function to get the status and use it as a return
  value.

  @return Worst-case status reported, as defined by which print function was called.
**/
STATUS
GetUtilityStatus (
  VOID
  )
{
  return mStatus;
}

/**
  Set the printing message Level. This is used by the PrintMsg() function
  to determine when/if a message should be printed.

  @param LogLevel  0~50 to specify the different level message.
**/
VOID
SetPrintLevel (
  UINT64  LogLevel
  )
{
  mPrintLogLevel = LogLevel;
}

/**
  Print a verbose level message.

  @param MsgFmt      the format string for the message. Can contain formatting
                     controls for use with varargs.
  @param List        the variable list.
**/
VOID
VerboseMsg (
  CHAR8   *MsgFmt,
  ...
  )
{
  va_list List;
  //
  // If the debug level is less than current print level, then do nothing.
  //
  if (VERBOSE_LOG_LEVEL < mPrintLogLevel) {
    return ;
  }

  va_start (List, MsgFmt);
  PrintSimpleMessage (MsgFmt, List);
  va_end (List);
}

/**
  Print a default level message.

  @param MsgFmt      the format string for the message. Can contain formatting
                     controls for use with varargs.
  @param List        the variable list.
**/
VOID
NormalMsg (
  CHAR8   *MsgFmt,
  ...
  )
{
  va_list List;
  //
  // If the debug level is less than current print level, then do nothing.
  //
  if (INFO_LOG_LEVEL < mPrintLogLevel) {
    return ;
  }

  va_start (List, MsgFmt);
  PrintSimpleMessage (MsgFmt, List);
  va_end (List);
}

/**
  Print a key level message.

  @param MsgFmt      the format string for the message. Can contain formatting
                     controls for use with varargs.
  @param List        the variable list.
**/
VOID
KeyMsg (
  CHAR8   *MsgFmt,
  ...
  )
{
  va_list List;
  //
  // If the debug level is less than current print level, then do nothing.
  //
  if (KEY_LOG_LEVEL < mPrintLogLevel) {
    return ;
  }

  va_start (List, MsgFmt);
  PrintSimpleMessage (MsgFmt, List);
  va_end (List);
}

/**
  Set the limits of how many errors, warnings, and errors+warnings
  we will print.

  @param MaxErrors       maximum number of error messages to print
  @param MaxWarnings     maximum number of warning messages to print
  @param MaxWarningsPlusErrors
                  maximum number of errors+warnings to print
**/
VOID
SetPrintLimits (
  UINT32  MaxErrors,
  UINT32  MaxWarnings,
  UINT32  MaxWarningsPlusErrors
  )
{
  mMaxErrors              = MaxErrors;
  mMaxWarnings            = MaxWarnings;
  mMaxWarningsPlusErrors  = MaxWarningsPlusErrors;
  mPrintLimitsSet         = 1;
}

STATIC
VOID
PrintLimitExceeded (
  VOID
  )
{
  STATIC INT8 mPrintLimitExceeded = 0;
  //
  // If we've already printed the message, do nothing. Otherwise
  // temporarily increase our print limits so we can pass one
  // more message through.
  //
  if (mPrintLimitExceeded == 0) {
    mPrintLimitExceeded++;
    mMaxErrors++;
    mMaxWarnings++;
    mMaxWarningsPlusErrors++;
    Error (NULL, 0, 0, "error/warning print limit exceeded", NULL);
    mMaxErrors--;
    mMaxWarnings--;
    mMaxWarningsPlusErrors--;
  }
}

#if 0
VOID
TestUtilityMessages (
  VOID
  )
{
  CHAR8 *ArgStr = "ArgString";
  int   ArgInt;

  ArgInt  = 0x12345678;
  //
  // Test without setting utility name
  //
  fprintf (stdout, "* Testing without setting utility name\n");
  fprintf (stdout, "** Test debug message not printed\n");
  DebugMsg (NULL, 0, 0x00000001, NULL, NULL);
  fprintf (stdout, "** Test warning with two strings and two args\n");
  Warning (NULL, 0, 1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt);
  fprintf (stdout, "** Test error with two strings and two args\n");
  Warning (NULL, 0, 1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt);
  fprintf (stdout, "** Test parser warning with nothing\n");
  ParserWarning (0, NULL, NULL);
  fprintf (stdout, "** Test parser error with nothing\n");
  ParserError (0, NULL, NULL);
  //
  // Test with utility name set now
  //
  fprintf (stdout, "** Testingin with utility name set\n");
  SetUtilityName ("MyUtilityName");
  //
  // Test debug prints
  //
  SetDebugMsgMask (2);
  fprintf (stdout, "** Test debug message with one string\n");
  DebugMsg (NULL, 0, 0x00000002, "Text1", NULL);
  fprintf (stdout, "** Test debug message with one string\n");
  DebugMsg (NULL, 0, 0x00000002, NULL, "Text2");
  fprintf (stdout, "** Test debug message with two strings\n");
  DebugMsg (NULL, 0, 0x00000002, "Text1", "Text2");
  fprintf (stdout, "** Test debug message with two strings and two args\n");
  DebugMsg (NULL, 0, 0x00000002, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt);
  //
  // Test warning prints
  //
  fprintf (stdout, "** Test warning with no strings\n");
  Warning (NULL, 0, 1234, NULL, NULL);
  fprintf (stdout, "** Test warning with one string\n");
  Warning (NULL, 0, 1234, "Text1", NULL);
  fprintf (stdout, "** Test warning with one string\n");
  Warning (NULL, 0, 1234, NULL, "Text2");
  fprintf (stdout, "** Test warning with two strings and two args\n");
  Warning (NULL, 0, 1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt);
  //
  // Test error prints
  //
  fprintf (stdout, "** Test error with no strings\n");
  Error (NULL, 0, 1234, NULL, NULL);
  fprintf (stdout, "** Test error with one string\n");
  Error (NULL, 0, 1234, "Text1", NULL);
  fprintf (stdout, "** Test error with one string\n");
  Error (NULL, 0, 1234, NULL, "Text2");
  fprintf (stdout, "** Test error with two strings and two args\n");
  Error (NULL, 0, 1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt);
  //
  // Test parser prints
  //
  fprintf (stdout, "** Test parser errors\n");
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserError (1234, NULL, NULL);
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserError (1234, "Text1", NULL);
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserError (1234, NULL, "Text2");
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserError (1234, "Text1", "Text2");
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserError (1234, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt);

  fprintf (stdout, "** Test parser warnings\n");
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserWarning (4321, NULL, NULL);
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserWarning (4321, "Text1", NULL);
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserWarning (4321, NULL, "Text2");
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserWarning (4321, "Text1", "Text2");
  ParserSetPosition (__FILE__, __LINE__ + 1);
  ParserWarning (4321, "Text1", "Text2 %s 0x%X", ArgStr, ArgInt);
}
#endif
