#include <windows.h>

#include <stdio.h>

#include "restok.h"
#include "showerrs.h"


extern UCHAR szDHW[];
extern CHAR  szAppName[];

//............................................................

void ShowEngineErr( int n, void *p1, void *p2)
{
    CHAR *pMsg = NULL;
    CHAR *pArg[2];


    pArg[0] = p1;
    pArg[1] = p2;


    if ( B_FormatMessage( (FORMAT_MESSAGE_MAX_WIDTH_MASK & 78)
                        | FORMAT_MESSAGE_FROM_HMODULE
                        | FORMAT_MESSAGE_ARGUMENT_ARRAY,
                         NULL,
                         (DWORD)n,
                         szDHW,
                         DHWSIZE,
                         (va_list *)pArg) )
    {
        RLMessageBoxA( szDHW);
    }
    else
    {

        sprintf( szDHW,
                 "Internal error: FormatMessage call failed: msg %d: err %Lu",
                 n,
                 GetLastError());

        RLMessageBoxA( szDHW);

    }
}

//...................................................................

void ShowErr( int n, void *p1, void *p2)
{
    CHAR *pMsg = NULL;
    CHAR *pArg[2];

    pArg[0] = p1;
    pArg[1] = p2;

    pMsg = GetErrMsg( n);

    if ( ! pMsg )
    {
        pMsg = "Internal error: UNKNOWN ERROR MESSAGE id# %1!d!";
        pArg[0] = IntToPtr(n);
    }

    if ( pMsg )
    {
        if ( FormatMessageA( FORMAT_MESSAGE_MAX_WIDTH_MASK | 72
                            | FORMAT_MESSAGE_FROM_STRING
                            | FORMAT_MESSAGE_ARGUMENT_ARRAY,
                             pMsg,
                             0,
                             0,
                             szDHW,
                             DHWSIZE,
                             (va_list *)pArg) )
        {
            RLMessageBoxA( szDHW);
        }
        else
        {
            RLMessageBoxA( "Internal error: FormatMessage call failed");
        }
    }
    else
    {
        RLMessageBoxA( "Internal error: GetErrMsg call failed");
    }
}

//............................................................

CHAR *GetErrMsg( UINT uErrID)
{
    static CHAR szBuf[ 1024];

    int n = LoadStringA( NULL, uErrID, szBuf, sizeof( szBuf));

    return( n ? szBuf : NULL);
}

//.......................................................
//...
//... Bi-Lingual FormatMessage

DWORD B_FormatMessage(

DWORD    dwFlags,
LPCVOID  lpSource,
DWORD    dwMessageId,
LPSTR    lpBuffer,
DWORD    nSize,
va_list *Arguments )
{

    DWORD ret;
                                //... Look for message in current locale
    if ( !(ret = FormatMessageA( dwFlags,
                                 lpSource,
                                 dwMessageId,
	                             LOWORD( GetThreadLocale()),
	                             lpBuffer,
	                             nSize,
	                             Arguments)) )
    {
                                //... Not found, so look for US English message

        if ( GetLastError() == ERROR_RESOURCE_LANG_NOT_FOUND )
        {
            return( FormatMessageA( dwFlags,
                                    lpSource,
                                    dwMessageId,
                                    0x0409L,
                                    lpBuffer,
                                    nSize,
                                    Arguments) );
        }
    }
    return( ret);
}