2010-08-25 21:42:57 +00:00
|
|
|
/*
|
|
|
|
* 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
|
2013-07-18 01:02:34 +00:00
|
|
|
* alteration the source code to the Tecplot Input/Output library, known
|
|
|
|
* as TecIO, as part of its distribution of OpenFOAM and the
|
2010-08-25 21:42:57 +00:00
|
|
|
* 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.
|
|
|
|
*
|
2013-07-18 01:02:34 +00:00
|
|
|
* This limited grant of distribution does not supersede Tecplot, Inc.'s
|
2010-08-25 21:42:57 +00:00
|
|
|
* copyright in TecIO. Contact Tecplot, Inc. for further information.
|
2013-07-18 01:02:34 +00:00
|
|
|
*
|
2010-08-25 21:42:57 +00:00
|
|
|
* 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 */
|
|
|
|
|