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:
@@ -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)
|
||||
|
@@ -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
|
||||
|
||||
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user