TexMacroDef *MatchMacro(wxChar *buffer, int *pos, wxChar **env, bool *parseToBrace)
{
- *parseToBrace = true;
- int i = (*pos);
- TexMacroDef *def = NULL;
- wxChar macroBuf[40];
-
- // First, try to find begin{thing}
- if (wxStrncmp(buffer+i, _T("begin{"), 6) == 0)
- {
- i += 6;
+ *parseToBrace = true;
+ int i = (*pos);
+ TexMacroDef *def = NULL;
+ wxChar macroBuf[40];
- int j = i;
- while ((isalpha(buffer[j]) || buffer[j] == '*') && ((j - i) < 39))
+ // First, try to find begin{thing}
+ if (wxStrncmp(buffer+i, _T("begin{"), 6) == 0)
{
- macroBuf[j-i] = buffer[j];
- j ++;
- }
- macroBuf[j-i] = 0;
- def = (TexMacroDef *)MacroDefs.Get(macroBuf);
+ i += 6;
- if (def)
- {
- *pos = j + 1; // BUGBUG Should this be + 1???
- *env = def->name;
- ForbidWarning(def);
- return def;
+ int j = i;
+ while ((isalpha(buffer[j]) || buffer[j] == '*') && ((j - i) < 39))
+ {
+ macroBuf[j-i] = buffer[j];
+ j ++;
+ }
+ macroBuf[j-i] = 0;
+ def = (TexMacroDef *)MacroDefs.Get(macroBuf);
+
+ if (def)
+ {
+ *pos = j + 1; // BUGBUG Should this be + 1???
+ *env = def->name;
+ ForbidWarning(def);
+ return def;
+ }
+ else
+ {
+ return NULL;
+ }
}
- else return NULL;
- }
- // Failed, so try to find macro from definition list
- int j = i;
+ // Failed, so try to find macro from definition list
+ int j = i;
- // First try getting a one-character macro, but ONLY
- // if these TWO characters are not both alphabetical (could
- // be a longer macro)
- if (!(isalpha(buffer[i]) && isalpha(buffer[i+1])))
- {
- macroBuf[0] = buffer[i];
- macroBuf[1] = 0;
+ // First try getting a one-character macro, but ONLY
+ // if these TWO characters are not both alphabetical (could
+ // be a longer macro)
+ if (!(isalpha(buffer[i]) && isalpha(buffer[i+1])))
+ {
+ macroBuf[0] = buffer[i];
+ macroBuf[1] = 0;
- def = (TexMacroDef *)MacroDefs.Get(macroBuf);
- if (def) j ++;
- }
+ def = (TexMacroDef *)MacroDefs.Get(macroBuf);
+ if (def) j ++;
+ }
- if (!def)
- {
- while ((isalpha(buffer[j]) || buffer[j] == '*') && ((j - i) < 39))
+ if (!def)
{
- macroBuf[j-i] = buffer[j];
- j ++;
+ while ((isalpha(buffer[j]) || buffer[j] == '*') && ((j - i) < 39))
+ {
+ macroBuf[j-i] = buffer[j];
+ j ++;
+ }
+ macroBuf[j-i] = 0;
+ def = (TexMacroDef *)MacroDefs.Get(macroBuf);
}
- macroBuf[j-i] = 0;
- def = (TexMacroDef *)MacroDefs.Get(macroBuf);
- }
-
- if (def)
- {
- i = j;
- // We want to check whether this is a space-consuming macro
- // (e.g. {\bf word})
- // No brace, e.g. \input thing.tex instead of \input{thing};
- // or a numeric argument, such as \parindent0pt
- if ((def->no_args > 0) && ((buffer[i] == 32) || (buffer[i] == '=') || (isdigit(buffer[i]))))
+ if (def)
{
- if ((buffer[i] == 32) || (buffer[i] == '='))
- i ++;
+ i = j;
+
+ // We want to check whether this is a space-consuming macro
+ // (e.g. {\bf word})
+ // No brace, e.g. \input thing.tex instead of \input{thing};
+ // or a numeric argument, such as \parindent0pt
+ if ((def->no_args > 0) && ((buffer[i] == 32) || (buffer[i] == '=') || (isdigit(buffer[i]))))
+ {
+ if ((buffer[i] == 32) || (buffer[i] == '='))
+ i ++;
- *parseToBrace = false;
+ *parseToBrace = false;
+ }
+ *pos = i;
+ ForbidWarning(def);
+ return def;
}
- *pos = i;
- ForbidWarning(def);
- return def;
- }
- return NULL;
+ return NULL;
}
void EatWhiteSpace(wxChar *buffer, int *pos)
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)
*
*/
+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();
}
// 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;
}
// Read string (double-quoted or not) to end quote or EOL
-void BibReadToEOL(wxSTD istream& istr, wxChar *buffer)
+wxString BibReadToEOL(wxString& line)
{
- int i = 0;
- buffer[i] = 0;
- char ch = (char)istr.peek();
- bool inQuotes = false;
- if (ch == '"')
- {
- istr.get(ch);
- ch = (char)istr.peek();
- inQuotes = true;
- }
- // If in quotes, read white space too. If not,
- // stop at white space or comment.
- while (!istr.eof() && ch != 13 && ch != 10 && ch != _T('"') &&
- (inQuotes || ((ch != _T(' ')) && (ch != 9) &&
- (ch != _T(';')) && (ch != _T('%')) && (ch != _T('#')))))
- {
- istr.get(ch);
- buffer[i] = ch;
- i ++;
- ch = (char)istr.peek();
- }
- if (ch == '"')
- istr.get(ch);
- buffer[i] = 0;
+ 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;
}
-// Read }-terminated value, taking nested braces into account.
-void BibReadValue(wxSTD istream& istr, wxChar *buffer, bool ignoreBraces = true,
- bool quotesMayTerminate = true)
+void BibReadToEOL(wxSTD istream& istr, wxChar *buffer)
{
- int braceCount = 1;
- int i = 0;
- buffer[i] = 0;
- char ch = (char)istr.peek();
- bool stopping = false;
- while (!istr.eof() && !stopping)
- {
-// i ++;
- if (i >= 4000)
+ int i = 0;
+ buffer[i] = 0;
+ char ch = (char)istr.peek();
+ bool inQuotes = false;
+ if (ch == '"')
{
- 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;
+ istr.get(ch);
+ ch = (char)istr.peek();
+ inQuotes = true;
}
- istr.get(ch);
+ // If in quotes, read white space too. If not,
+ // stop at white space or comment.
+ while (!istr.eof() && ch != 13 && ch != 10 && ch != _T('"') &&
+ (inQuotes || ((ch != _T(' ')) && (ch != 9) &&
+ (ch != _T(';')) && (ch != _T('%')) && (ch != _T('#')))))
+ {
+ istr.get(ch);
+ buffer[i] = ch;
+ i ++;
+ ch = (char)istr.peek();
+ }
+ if (ch == '"')
+ istr.get(ch);
+ buffer[i] = 0;
+}
- if (ch == '{')
- braceCount ++;
+// 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 (ch == '}')
+ if (line.length() >= 4000)
{
- braceCount --;
- if (braceCount == 0)
- {
- stopping = true;
- break;
- }
+ 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;
}
- else if (quotesMayTerminate && ch == '"')
+
+ while (!line.empty() && !stopping)
{
- stopping = true;
- break;
+ 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;
+ }
+ }
}
- if (!stopping)
- {
- if (!ignoreBraces || (ch != '{' && ch != '}'))
- {
- buffer[i] = ch;
- i ++;
- }
+
+ return val;
+}
+
+void BibReadValue(wxSTD istream& istr, wxChar *buffer, bool ignoreBraces = true,
+ bool quotesMayTerminate = true)
+{
+ int braceCount = 1;
+ int i = 0;
+ buffer[i] = 0;
+ char ch = (char)istr.peek();
+ bool stopping = false;
+ while (!istr.eof() && !stopping)
+ {
+// i ++;
+ if (i >= 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;
+ }
+ istr.get(ch);
+
+ if (ch == '{')
+ braceCount ++;
+
+ if (ch == '}')
+ {
+ braceCount --;
+ if (braceCount == 0)
+ {
+ stopping = true;
+ break;
+ }
+ }
+ else if (quotesMayTerminate && ch == '"')
+ {
+ stopping = true;
+ break;
+ }
+ if (!stopping)
+ {
+ if (!ignoreBraces || (ch != '{' && ch != '}'))
+ {
+ buffer[i] = ch;
+ i ++;
+ }
+ }
+ if (ch == 10)
+ BibLine ++;
}
- if (ch == 10)
- BibLine ++;
- }
- buffer[i] = 0;
- wxUnusedVar(stopping);
+ buffer[i] = 0;
+ wxUnusedVar(stopping);
}
bool ReadBib(wxChar *filename)
*
*/
-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)
- return true;
- else
+ wxString up(val);
+ up.MakeUpper();
+
+ if (up.IsSameAs(_T("YES")) ||
+ up.IsSameAs(_T("ON")) ||
+ up.IsSameAs(_T("OK")) |
+ up.IsSameAs(_T("1")))
+ return true;
+
return false;
}
}
// 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 );
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);
return errorCode;
}
-bool ReadCustomMacros(wxChar *filename)
+bool ReadCustomMacros(const wxString& filename)
{
- if (!wxFileExists(filename))
- return false;
+ if (!wxFileExists(filename))
+ return false;
- wxString name = filename;
- wxSTD ifstream istr((char const *)name.fn_str(), wxSTD ios::in);
+ wxFileInputStream input( filename );
+ if(!input.Ok()) return false;
+ wxTextInputStream ini( input );
- if (istr.bad()) return false;
+ CustomMacroList.Clear();
- CustomMacroList.Clear();
- char ch;
- wxChar macroName[100];
- wxChar macroBody[1000];
- int noArgs;
+ while (!input.Eof())
+ {
+ wxString line = ini.ReadLine();
+ BibEatWhiteSpace(line);
+ if (line.empty()) continue;
- while (!istr.eof())
- {
- BibEatWhiteSpace(istr);
- istr.get(ch);
- if (istr.eof())
- break;
+ if (line[0] != _T('\\')) // Not a macro definition, so must be NAME=VALUE
+ {
+ wxString settingName = BibReadWord(line);
+ BibEatWhiteSpace(line);
+ if (line.empty() || line[0] != _T('='))
+ {
+ OnError(_T("Expected = following name: malformed tex2rtf.ini file."));
+ return false;
+ }
+ else
+ {
+ line = line.substr(1);
+ BibEatWhiteSpace(line);
+ wxString settingValue = BibReadToEOL(line);
+ RegisterSetting(settingName, settingValue);
+ }
+ }
+ else
+ {
+ 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;
+ }
+ 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(line);
+ if (line[0] != _T('{'))
+ {
+ OnError(_T("Expected { followed by macro body: malformed tex2rtf.ini file."));
+ return false;
+ }
- if (ch != '\\') // 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 != '=')
- {
- OnError(_T("Expected = following name: malformed tex2rtf.ini file."));
- return false;
- }
- else
- {
- wxChar settingValue[200];
- BibEatWhiteSpace(istr);
- BibReadToEOL(istr, settingValue);
- RegisterSetting(settingName, settingValue);
- }
- }
- else
- {
- BibReadWord(istr, macroName);
- BibEatWhiteSpace(istr);
- istr.get(ch);
- if (ch != '[')
- {
- OnError(_T("Expected [ followed by number of arguments: malformed tex2rtf.ini file."));
- return false;
- }
- istr >> noArgs;
- istr.get(ch);
- if (ch != ']')
- {
- OnError(_T("Expected ] following number of arguments: malformed tex2rtf.ini file."));
- return false;
- }
- BibEatWhiteSpace(istr);
- istr.get(ch);
- if (ch != '{')
- {
- 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);
+ 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);
+ }
- BibEatWhiteSpace(istr);
- CustomMacroList.Append(macroName, macro);
- AddMacroDef(ltCUSTOM_MACRO, macroName, noArgs);
}
- }
- wxChar mbuf[200];
- wxSnprintf(mbuf, sizeof(mbuf), _T("Read initialization file %s."), filename);
- OnInform(mbuf);
- return true;
+ wxChar mbuf[200];
+ wxSnprintf(mbuf, sizeof(mbuf), _T("Read initialization file %s."), filename.c_str());
+ OnInform(mbuf);
+ return true;
}
CustomMacro *FindCustomMacro(wxChar *name)