Forward port from 2.6 branch to avoid wxSTD usage crashes.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38143 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba
2006-03-16 13:06:39 +00:00
parent 7487919e55
commit 9c9691ba24
4 changed files with 361 additions and 247 deletions

View File

@@ -327,7 +327,10 @@ TexMacroDef *MatchMacro(wxChar *buffer, int *pos, wxChar **env, bool *parseToBra
ForbidWarning(def);
return def;
}
else return NULL;
else
{
return NULL;
}
}
// Failed, so try to find macro from definition list
@@ -1271,16 +1274,20 @@ int ParseArg(TexChunk *thisArg, wxList& children, wxChar *buffer, int pos, wxCha
children.Append((wxObject *)chunk);
// Eliminate newline after a \begin{} or a \\ if possible
if (env || wxStrcmp(def->name, _T("\\")) == 0)
if (buffer[pos] == 13)
if ((env || wxStrcmp(def->name, _T("\\")) == 0) && (buffer[pos] == 13))
{
pos ++;
if (buffer[pos] == 10)
pos ++;
}
pos = ParseMacroBody(def->name, chunk, chunk->no_args,
buffer, pos, env, tmpParseToBrace, customMacroArgs);
pos = ParseMacroBody(def->name,
chunk, chunk->no_args,
buffer,
pos,
env,
tmpParseToBrace,
customMacroArgs);
// If custom macro, parse the body substituting the above found args.
if (customMacro)

View File

@@ -14,6 +14,8 @@
#include "wx/list.h"
#include "wx/hash.h"
#include "wx/tokenzr.h"
#include "wx/wfstream.h"
#include "wx/txtstrm.h"
#include "wxhlpblk.h"
/*
@@ -176,7 +178,7 @@ extern wxPathList TexPathList; // Path list, can be used for file searching
extern bool StringMatch(const wxChar *one, const wxChar *two, bool subString = true, bool exact = false);
// Define a variable value from the .ini file
wxChar *RegisterSetting(wxChar *settingName, wxChar *settingValue, bool interactive = true);
wxChar *RegisterSetting(const wxString& settingName, const wxString& settingValue, bool interactive = true);
// Major document styles
#define LATEX_REPORT 1
@@ -504,7 +506,7 @@ class CustomMacro: public wxObject
wxChar *macroName;
wxChar *macroBody;
int noArgs;
inline CustomMacro(wxChar *name, int args, wxChar *body)
inline CustomMacro(const wxChar *name, int args, wxChar *body)
{
noArgs = args;
macroName = wxStrcpy(new wxChar[wxStrlen(name) + 1], name);
@@ -516,7 +518,7 @@ class CustomMacro: public wxObject
~CustomMacro();
};
bool ReadCustomMacros(wxChar *filename);
bool ReadCustomMacros(const wxString& filename);
void ShowCustomMacros(void);
CustomMacro *FindCustomMacro(wxChar *name);
wxChar *ParseMultifieldString(wxChar *s, int *pos);
@@ -1066,6 +1068,3 @@ extern void InitialiseColourTable(void);
#define ltTOPLEVEL 15000
#define ltCUSTOM_MACRO 15001
#define ltSOLO_BLOCK 15002

View File

@@ -402,7 +402,7 @@ bool MyApp::OnInit()
wxString path = TexPathList.FindValidPath(MacroFile);
if (!path.empty())
ReadCustomMacros((wxChar *)path.c_str());
ReadCustomMacros(path);
#if wxUSE_STATUSBAR
wxString inStr(_T("In "));
@@ -444,7 +444,7 @@ bool MyApp::OnInit()
wxString path = TexPathList.FindValidPath(MacroFile);
if (!path.empty())
ReadCustomMacros((wxChar*)path.c_str());
ReadCustomMacros(path);
Go();
if (runTwice)
@@ -758,7 +758,7 @@ void MyFrame::OnLoadMacros(wxCommandEvent& WXUNUSED(event))
if (!s.empty() && wxFileExists(s))
{
MacroFile = copystring(s);
ReadCustomMacros((wxChar *)s.c_str());
ReadCustomMacros(s);
ShowCustomMacros();
}
#endif // wxUSE_FILEDLG

View File

@@ -483,6 +483,22 @@ void ReadTexReferences(wxChar *filename)
*
*/
void BibEatWhiteSpace(wxString& line)
{
while(!line.empty() && (line[0] == _T(' ') || line[0] == _T('\t') || line[0] == (wxChar)EOF))
{
if (line[0] == 10)
BibLine ++;
line = line.substr(1);
}
// Ignore end-of-line comments
if (line[0] == _T('%') || line[0] == _T(';') || line[0] == _T('#'))
{
line = wxEmptyString;
}
}
void BibEatWhiteSpace(wxSTD istream& str)
{
char ch = (char)str.peek();
@@ -511,6 +527,24 @@ void BibEatWhiteSpace(wxSTD istream& str)
}
// Read word up to { or , or space
wxString BibReadWord(wxString& line)
{
wxString val;
while (!line.empty() &&
line[0] != _T('\t') &&
line[0] != _T(' ') &&
line[0] != _T('{') &&
line[0] != _T('(') &&
line[0] != _T(',') &&
line[0] != _T('='))
{
val << line[0];
line = line.substr(1);
}
return val;
}
void BibReadWord(wxSTD istream& istr, wxChar *buffer)
{
int i = 0;
@@ -528,6 +562,33 @@ void BibReadWord(wxSTD istream& istr, wxChar *buffer)
}
// Read string (double-quoted or not) to end quote or EOL
wxString BibReadToEOL(wxString& line)
{
if(line.empty())
return wxEmptyString;
wxString val;
bool inQuotes = false;
if (line[0] == _T('"'))
{
line = line.substr(1);
inQuotes = true;
}
// If in quotes, read white space too. If not,
// stop at white space or comment.
while (!line.empty() && line[0] != _T('"') &&
(inQuotes || ((line[0] != _T(' ')) && (line[0] != 9) &&
(line[0] != _T(';')) && (line[0] != _T('%')) && (line[0] != _T('#')))))
{
val << line[0];
line = line.substr(1);
}
if (line[0] == '"')
line = line.substr(1);
return val;
}
void BibReadToEOL(wxSTD istream& istr, wxChar *buffer)
{
int i = 0;
@@ -557,6 +618,57 @@ void BibReadToEOL(wxSTD istream& istr, wxChar *buffer)
}
// Read }-terminated value, taking nested braces into account.
wxString BibReadValue(wxString& line,
bool ignoreBraces = true,
bool quotesMayTerminate = true)
{
wxString val;
int braceCount = 1;
bool stopping = false;
if (line.length() >= 4000)
{
wxChar buf[100];
wxSnprintf(buf, sizeof(buf), _T("Sorry, value > 4000 chars in bib file at line %ld."), BibLine);
wxLogError(buf, "Tex2RTF Fatal Error");
return wxEmptyString;
}
while (!line.empty() && !stopping)
{
wxChar ch = line[0];
line = line.substr(1);
if (ch == _T('{'))
braceCount ++;
if (ch == _T('}'))
{
braceCount --;
if (braceCount == 0)
{
stopping = true;
break;
}
}
else if (quotesMayTerminate && ch == _T('"'))
{
stopping = true;
break;
}
if (!stopping)
{
if (!ignoreBraces || (ch != _T('{') && ch != _T('}')))
{
val << ch;
}
}
}
return val;
}
void BibReadValue(wxSTD istream& istr, wxChar *buffer, bool ignoreBraces = true,
bool quotesMayTerminate = true)
{
@@ -1082,15 +1194,17 @@ TexRef *FindReference(wxChar *key)
*
*/
bool StringTobool(wxChar *val)
bool StringTobool(const wxString& val)
{
if (wxStrncmp(val, _T("yes"), 3) == 0 || wxStrncmp(val, _T("YES"), 3) == 0 ||
wxStrncmp(val, _T("on"), 2) == 0 || wxStrncmp(val, _T("ON"), 2) == 0 ||
wxStrncmp(val, _T("true"), 4) == 0 || wxStrncmp(val, _T("true"), 4) == 0 ||
wxStrncmp(val, _T("ok"), 2) == 0 || wxStrncmp(val, _T("OK"), 2) == 0 ||
wxStrncmp(val, _T("1"), 1) == 0)
wxString up(val);
up.MakeUpper();
if (up.IsSameAs(_T("YES")) ||
up.IsSameAs(_T("ON")) ||
up.IsSameAs(_T("OK")) |
up.IsSameAs(_T("1")))
return true;
else
return false;
}
@@ -1105,7 +1219,7 @@ void RegisterIntSetting (const wxString& s, int *number)
}
// Define a variable value from the .ini file
wxChar *RegisterSetting(wxChar *settingName, wxChar *settingValue, bool interactive)
wxChar *RegisterSetting(const wxString& settingName, const wxString& settingValue, bool interactive)
{
wxString settingValueStr( settingValue );
@@ -1351,7 +1465,7 @@ wxChar *RegisterSetting(wxChar *settingName, wxChar *settingValue, bool interact
else
{
wxChar buf[200];
wxSnprintf(buf, sizeof(buf), _T("Initialisation file error: unrecognised setting %s."), settingName);
wxSnprintf(buf, sizeof(buf), _T("Initialisation file error: unrecognised setting %s."), settingName.c_str());
if (interactive)
OnInform(buf);
wxStrcpy(errorCode, buf);
@@ -1359,85 +1473,79 @@ wxChar *RegisterSetting(wxChar *settingName, wxChar *settingValue, bool interact
return errorCode;
}
bool ReadCustomMacros(wxChar *filename)
bool ReadCustomMacros(const wxString& filename)
{
if (!wxFileExists(filename))
return false;
wxString name = filename;
wxSTD ifstream istr((char const *)name.fn_str(), wxSTD ios::in);
if (istr.bad()) return false;
wxFileInputStream input( filename );
if(!input.Ok()) return false;
wxTextInputStream ini( input );
CustomMacroList.Clear();
char ch;
wxChar macroName[100];
wxChar macroBody[1000];
int noArgs;
while (!istr.eof())
while (!input.Eof())
{
BibEatWhiteSpace(istr);
istr.get(ch);
if (istr.eof())
break;
wxString line = ini.ReadLine();
BibEatWhiteSpace(line);
if (line.empty()) continue;
if (ch != '\\') // Not a macro definition, so must be NAME=VALUE
if (line[0] != _T('\\')) // Not a macro definition, so must be NAME=VALUE
{
wxChar settingName[100];
settingName[0] = ch;
BibReadWord(istr, (settingName+1));
BibEatWhiteSpace(istr);
istr.get(ch);
if (ch != '=')
wxString settingName = BibReadWord(line);
BibEatWhiteSpace(line);
if (line.empty() || line[0] != _T('='))
{
OnError(_T("Expected = following name: malformed tex2rtf.ini file."));
return false;
}
else
{
wxChar settingValue[200];
BibEatWhiteSpace(istr);
BibReadToEOL(istr, settingValue);
line = line.substr(1);
BibEatWhiteSpace(line);
wxString settingValue = BibReadToEOL(line);
RegisterSetting(settingName, settingValue);
}
}
else
{
BibReadWord(istr, macroName);
BibEatWhiteSpace(istr);
istr.get(ch);
if (ch != '[')
line = line.substr(1);
wxString macroName = BibReadWord(line);
BibEatWhiteSpace(line);
if (line[0] != _T('['))
{
OnError(_T("Expected [ followed by number of arguments: malformed tex2rtf.ini file."));
return false;
}
istr >> noArgs;
istr.get(ch);
if (ch != ']')
line = line.substr(1);
wxString noAargStr = line.BeforeFirst(_T(']'));
line = line.AfterFirst(_T(']'));
long noArgs;
if (!noAargStr.ToLong(&noArgs) || line.empty())
{
OnError(_T("Expected ] following number of arguments: malformed tex2rtf.ini file."));
return false;
}
BibEatWhiteSpace(istr);
istr.get(ch);
if (ch != '{')
BibEatWhiteSpace(line);
if (line[0] != _T('{'))
{
OnError(_T("Expected { followed by macro body: malformed tex2rtf.ini file."));
return false;
}
CustomMacro *macro = new CustomMacro(macroName, noArgs, NULL);
BibReadValue(istr, macroBody, false, false); // Don't ignore extra braces
if (wxStrlen(macroBody) > 0)
macro->macroBody = copystring(macroBody);
BibEatWhiteSpace(istr);
CustomMacroList.Append(macroName, macro);
AddMacroDef(ltCUSTOM_MACRO, macroName, noArgs);
CustomMacro *macro = new CustomMacro(macroName.c_str(), noArgs, NULL);
wxString macroBody = BibReadValue(line, false, false); // Don't ignore extra braces
if (!macroBody.empty())
macro->macroBody = copystring(macroBody.c_str());
BibEatWhiteSpace(line);
CustomMacroList.Append(macroName.c_str(), macro);
AddMacroDef(ltCUSTOM_MACRO, macroName.c_str(), noArgs);
}
}
wxChar mbuf[200];
wxSnprintf(mbuf, sizeof(mbuf), _T("Read initialization file %s."), filename);
wxSnprintf(mbuf, sizeof(mbuf), _T("Read initialization file %s."), filename.c_str());
OnInform(mbuf);
return true;
}