This repository has been archived on 2023-11-20. You can view files and clone it, but cannot push or open issues or pull requests.
foam-extend4.1-coherent-io/applications/utilities/postProcessing/dataConversion/foamToTecplot360/tecio/tecsrc/q_msg.cpp
2013-07-18 10:15:54 +02:00

415 lines
10 KiB
C++

/*
* NOTICE and LICENSE for Tecplot Input/Output Library (TecIO) - OpenFOAM
*
* Copyright (C) 1988-2009 Tecplot, Inc. All rights reserved worldwide.
*
* Tecplot hereby grants OpenCFD limited authority to distribute without
* alteration the source code to the Tecplot Input/Output library, known
* as TecIO, as part of its distribution of OpenFOAM and the
* OpenFOAM_to_Tecplot converter. Users of this converter are also hereby
* granted access to the TecIO source code, and may redistribute it for the
* purpose of maintaining the converter. However, no authority is granted
* to alter the TecIO source code in any form or manner.
*
* This limited grant of distribution does not supersede Tecplot, Inc.'s
* copyright in TecIO. Contact Tecplot, Inc. for further information.
*
* Tecplot, Inc.
* 3535 Factoria Blvd, Ste. 550
* Bellevue, WA 98006, USA
* Phone: +1 425 653 1200
* http://www.tecplot.com/
*
*/
#include "stdafx.h"
#include "MASTER.h"
#define TECPLOTENGINEMODULE
/*
******************************************************************
******************************************************************
******* ********
****** (C) 1988-2008 Tecplot, Inc. *******
******* ********
******************************************************************
******************************************************************
*/
#define Q_MSGMODULE
#include "GLOBAL.h"
#include "TASSERT.h"
#include "Q_UNICODE.h"
#include "ALLOC.h"
#include "ARRLIST.h"
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#if !defined ENGINE
#if defined MOTIF
#endif
#if defined MSWIN
#endif
#endif
#endif
#include "STRUTIL.h"
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#endif
using std::string;
using namespace tecplot::strutil;
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#endif
#define MAXCHARACTERSPERLINE 60
/*
* Wrap a string so it contains at most CharactersPerLine
* characters. Embedded newlines are left alone. Spaces
* following newlines are also left alone.
*/
Boolean_t WrapString(const char *OldString,
char **NewString)
{
size_t L;
if (OldString == NULL)
return (FALSE);
/*
* Assume Old string has ample spaces. Will only be
* replacing some spaces with newlines and removing
* other spaces. New string can be allocated to be
* same length as old string.
*/
L = strlen(OldString);
*NewString = ALLOC_ARRAY(L + 1, char, "new error message string");
if (*NewString == NULL)
return (FALSE);
strcpy(*NewString, OldString);
if (L > MAXCHARACTERSPERLINE)
{
char *LineStart = *NewString;
char *LastWord = *NewString;
char *WPtr = *NewString;
while (WPtr && (*WPtr != '\0'))
{
size_t CurLen;
/*
* Find next hard newline. If there is one befor the
* line should be chopped then reset the Last Word to
* be at the first word after the newline.
*/
WPtr = strchr(LineStart, '\n');
if (WPtr && ((WPtr - LineStart) < MAXCHARACTERSPERLINE))
{
WPtr++;
while (*WPtr == '\n')
WPtr++;
LineStart = WPtr;
/*
* Skip over trailing spaces. Special handling to
* allow indent after hard newline.
*/
while (*WPtr == ' ')
WPtr++;
LastWord = WPtr;
continue;
}
/*
* Find next "word"
*/
WPtr = strchr(LastWord, ' ');
if (WPtr != NULL)
{
while (*WPtr == ' ')
WPtr++;
}
if (WPtr == NULL)
{
CurLen = strlen(LineStart);
}
else
{
CurLen = WPtr - LineStart;
}
if (CurLen > MAXCHARACTERSPERLINE)
{
/*
* Line is too long. Back up to previous
* word and replace preceeding space with
* a newline.
*/
if (LastWord == LineStart)
{
/*
* Bad news, line has very long word.
*/
if (WPtr && (*WPtr != '\0'))
{
*(WPtr - 1) = '\n';
LastWord = WPtr;
}
}
else
{
*(LastWord - 1) = '\n';
}
LineStart = LastWord;
}
else
LastWord = WPtr;
}
}
return (TRUE);
}
static void SendWarningToFile(FILE *F,
const char *S)
{
char *S2;
REQUIRE(VALID_REF(F));
REQUIRE(VALID_REF(S));
if (WrapString(S, &S2))
{
fprintf(F, "Warning: %s\n", S2);
FREE_ARRAY(S2, "temp warning string");
}
}
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#endif
/**
* Show the warning message. Note that the Format string can be the only
* argument, in which case it is essentially the warning message itself.
*
* param Format
* C Format string or a simple message.
* param ...
* Zero or more variable arguments. The number of arguments must correspond
* to the placeholders in the format string.
*/
void Warning(TranslatedString Format,
...) /* zero or more arguments */
{
REQUIRE(!Format.isNull());
static Boolean_t InWarning = FALSE; /* ...used to prevent recursive deadlock */
if (!InWarning)
{
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#endif
InWarning = TRUE;
{
/*
* Attempt to format the string. Failing that simply use the original format
* string argument which, if we ran out of memory while formatting, is
* probably just an warning message saying that we ran out of memory in some
* previous operation anyway.
*/
Boolean_t cleanUp = TRUE;
va_list Arguments;
va_start(Arguments, Format);
char* message = vFormatString(Format.c_str(), Arguments);
va_end(Arguments);
if (message == NULL)
{
cleanUp = FALSE; // ...this boolean allows us to "carefully" cast away the const'ness
message = (char*)Format.c_str();
}
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#ifdef MSWIN
#endif
#if defined UNIXX
#endif
#if defined MSWIN
#endif
#else /* !TECPLOTKERNEL */
{
SendWarningToFile(stderr, message);
}
#endif
if (cleanUp)
FREE_ARRAY(message, "message");
}
InWarning = FALSE;
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#endif
}
}
static void SendErrToFile(FILE *File,
const char *Msg)
{
char *FormattedMsg;
REQUIRE(VALID_REF(File));
REQUIRE(VALID_REF(Msg));
if (WrapString(Msg, &FormattedMsg))
{
fprintf(File, "Err: %s\n", FormattedMsg);
FREE_ARRAY(FormattedMsg, "temp error string");
}
else
fprintf(File, "Err: %s\n", Msg);
}
/* Fall-back ErrMsg procedure when nothing else works */
static void DefaultErrMsg(const char *Msg)
{
REQUIRE(VALID_REF(Msg));
#ifdef MSWIN
#ifdef TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#else
MessageBox(NULL, Msg, "Error", MB_OK | MB_ICONERROR);
#endif
#else
SendErrToFile(stderr, Msg);
#endif
}
static void PostErrorMessage(TranslatedString Format,
va_list Arguments)
{
REQUIRE(!Format.isNull());
/*
* Attempt to format the string. Failing that simply use the original format
* string argument which, if we ran out of memory while formatting, is
* probably just an error message saying that we ran out of memory in some
* previous operation anyway.
*/
Boolean_t cleanUp = TRUE;
char* messageString = vFormatString(Format.c_str(), Arguments);
if (messageString == NULL)
{
cleanUp = FALSE; // ...this boolean allows us to "carefully" cast away the const'ness
messageString = (char*)Format.c_str();
}
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#ifdef MSWIN
#endif
#if defined UNIXX
#if !defined ENGINE
#endif
#endif
#else /* !TECPLOTKERNEL */
{
DefaultErrMsg(messageString);
}
#endif
/* cleanup if we allocated the string */
if (cleanUp)
FREE_ARRAY(messageString, "messageString");
}
/*
* NOTES:
* This function is thread safe in that it may be safely called by multiple
* threads however when running interactively only the first error message is
* queued for display on idle. In batch mode all messages are sent to the
* batch log file.
*/
void vErrMsg(TranslatedString Format,
va_list Arguments)
{
REQUIRE(!Format.isNull());
static Boolean_t InErrMsg = FALSE; /* ...used to prevent recursive deadlock */
if (!InErrMsg)
{
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#endif
InErrMsg = TRUE;
{
PostErrorMessage(Format, Arguments);
}
InErrMsg = FALSE;
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#endif
}
}
/**
* Show the error message. Note that the Format string can be the only
* argument, in which case it is essentially the error message itself.
*
* @param Format
* C Format string or a simple message.
* @param ...
* Zero or more variable arguments. The number of arguments must correspond
* to the placeholders in the format string.
*/
void ErrMsg(TranslatedString Format,
...) /* zero or more arguments */
{
REQUIRE(!Format.isNull());
va_list Arguments;
va_start(Arguments, Format);
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#else
PostErrorMessage(Format, Arguments);
#endif
va_end(Arguments);
}
#if defined TECPLOTKERNEL
/* CORE SOURCE CODE REMOVED */
#if !defined ENGINE
#endif
#if !defined ENGINE
#if defined MOTIF
#endif
#if defined MSWIN
#endif
#endif
#if !defined ENGINE
#if defined MOTIF
#endif
#if defined MSWIN
#endif
#endif
#if !defined ENGINE
#if defined MOTIF
#endif /* MOTIF */
#if defined MSWIN
#endif
#if defined MOTIF
#endif /* MOTIF */
#endif
#if !defined ENGINE
#endif
#endif /* TECPLOTKERNEL */