]> git.saurik.com Git - wxWidgets.git/blame - utils/tex2rtf/src/tex2rtf.cpp
ODBC updates (it almost works now)
[wxWidgets.git] / utils / tex2rtf / src / tex2rtf.cpp
CommitLineData
9a29912f
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: tex2rtf.cpp
3// Purpose: Converts Latex to linear/WinHelp RTF, HTML, wxHelp.
4// Author: Julian Smart
5// Modified by:
6// Created: 7.9.93
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
24#include "wx/wx.h"
25#endif
26
27#ifndef NO_GUI
28#include <wx/help.h>
29#include <wx/timer.h>
30#endif
31
32#ifdef NO_GUI
33#if wxUSE_IOSTREAMH
34#include <iostream.h>
35#include <fstream.h>
36#else
37#include <iostream>
38#include <fstream>
39#endif
40#endif
41
42#include <ctype.h>
43#include <stdlib.h>
44#include "tex2any.h"
45#include "tex2rtf.h"
46#include "rtfutils.h"
47
48#if (defined(__WXGTK__) || defined(__WXMOTIF__)) && !defined(NO_GUI)
49#include "tex2rtf.xpm"
50#endif
51
52const float versionNo = 2.0;
53
54TexChunk *currentMember = NULL;
55bool startedSections = FALSE;
56char *contentsString = NULL;
57bool suppressNameDecoration = FALSE;
58bool OkToClose = TRUE;
59int passNumber = 1;
60
61#ifndef NO_GUI
62wxHelpController *HelpInstance = NULL;
63
64#ifdef __WXMSW__
65static char *ipc_buffer = NULL;
66static char Tex2RTFLastStatus[100];
67Tex2RTFServer *TheTex2RTFServer = NULL;
68#endif
69#endif
70
71char *bulletFile = NULL;
72
73FILE *Contents = NULL; // Contents page
74FILE *Chapters = NULL; // Chapters (WinHelp RTF) or rest of file (linear RTF)
75FILE *Sections = NULL;
76FILE *Subsections = NULL;
77FILE *Subsubsections = NULL;
78FILE *Popups = NULL;
79FILE *WinHelpContentsFile = NULL;
80
81char *InputFile = NULL;
82char *OutputFile = NULL;
83char *MacroFile = copystring("tex2rtf.ini");
84
85char *FileRoot = NULL;
86char *ContentsName = NULL; // Contents page from last time around
87char *TmpContentsName = NULL; // Current contents page
88char *TmpFrameContentsName = NULL; // Current frame contents page
89char *WinHelpContentsFileName = NULL; // WinHelp .cnt file
90char *RefName = NULL; // Reference file name
91
92char *RTFCharset = copystring("ansi");
93
94#ifdef __WXMSW__
95int BufSize = 100; // Size of buffer in K
96#else
97int BufSize = 500;
98#endif
99
100bool Go(void);
101void ShowOptions(void);
102
103#ifdef NO_GUI
104int main(int argc, char **argv)
105#else
106wxMenuBar *menuBar = NULL;
107MyFrame *frame = NULL;
108
109// DECLARE_APP(MyApp)
110IMPLEMENT_APP(MyApp)
111
112// `Main program' equivalent, creating windows and returning main app frame
113bool MyApp::OnInit()
114#endif
115{
116 // Use default list of macros defined in tex2any.cc
117 DefineDefaultMacros();
118 AddMacroDef(ltHARDY, "hardy", 0);
119
120 FileRoot = new char[300];
121 ContentsName = new char[300];
122 TmpContentsName = new char[300];
123 TmpFrameContentsName = new char[300];
124 WinHelpContentsFileName = new char[300];
125 RefName = new char[300];
126
127 int n = 1;
128
129 // Read input/output files
130 if (argc > 1)
131 {
132 if (argv[1][0] != '-')
133 {
134 InputFile = argv[1];
135 n ++;
136
137 if (argc > 2)
138 {
139 if (argv[2][0] != '-')
140 {
141 OutputFile = argv[2];
142 n ++;
143 }
144 }
145 }
146 }
147
148#ifdef NO_GUI
149 if (!InputFile || !OutputFile)
150 {
151 cout << "Tex2RTF: input or output file is missing.\n";
152 ShowOptions();
153 exit(1);
154 }
155#endif
156 if (InputFile)
157 {
158 TexPathList.EnsureFileAccessible(InputFile);
159 }
160 if (!InputFile || !OutputFile)
161 isInteractive = TRUE;
162
163 for (int i = n; i < argc;)
164 {
165 if (strcmp(argv[i], "-winhelp") == 0)
166 {
167 i ++;
168 convertMode = TEX_RTF;
169 winHelp = TRUE;
170 }
171#ifndef NO_GUI
172 else if (strcmp(argv[i], "-interactive") == 0)
173 {
174 i ++;
175 isInteractive = TRUE;
176 }
177#endif
178 else if (strcmp(argv[i], "-sync") == 0) // Don't yield
179 {
180 i ++;
181 isSync = TRUE;
182 }
183 else if (strcmp(argv[i], "-rtf") == 0)
184 {
185 i ++;
186 convertMode = TEX_RTF;
187 }
188 else if (strcmp(argv[i], "-html") == 0)
189 {
190 i ++;
191 convertMode = TEX_HTML;
192 }
193 else if (strcmp(argv[i], "-xlp") == 0)
194 {
195 i ++;
196 convertMode = TEX_XLP;
197 }
198 else if (strcmp(argv[i], "-twice") == 0)
199 {
200 i ++;
201 runTwice = TRUE;
202 }
203 else if (strcmp(argv[i], "-macros") == 0)
204 {
205 i ++;
206 if (i < argc)
207 {
208 MacroFile = copystring(argv[i]);
209 i ++;
210 }
211 }
212 else if (strcmp(argv[i], "-bufsize") == 0)
213 {
214 i ++;
215 if (i < argc)
216 {
217 BufSize = atoi(argv[i]);
218 i ++;
219 }
220 }
221 else if (strcmp(argv[i], "-charset") == 0)
222 {
223 i ++;
224 if (i < argc)
225 {
226 char *s = argv[i];
227 i ++;
228 if (strcmp(s, "ansi") == 0 || strcmp(s, "pc") == 0 || strcmp(s, "mac") == 0 ||
229 strcmp(s, "pca") == 0)
230 RTFCharset = copystring(s);
231 else
232 {
233 OnError("Incorrect argument for -charset");
234 }
235 }
236 }
237 else
238 {
239 char buf[100];
240 sprintf(buf, "Invalid switch %s.\n", argv[i]);
241 OnError(buf);
242 i++;
243#ifdef NO_GUI
244 ShowOptions();
245 exit(1);
246#endif
247 }
248 }
249
250#if defined(__WXMSW__) && !defined(NO_GUI)
251 wxDDEInitialize();
252 Tex2RTFLastStatus[0] = 0; // DDE connection return value
253 TheTex2RTFServer = new Tex2RTFServer;
254 TheTex2RTFServer->Create("TEX2RTF");
255#endif
256
257#if defined(__WXMSW__) && defined(__WIN16__)
258 // Limit to max Windows array size
259 if (BufSize > 64) BufSize = 64;
260#endif
261
262 TexInitialize(BufSize);
263 ResetContentsLevels(0);
264
265#ifndef NO_GUI
266
267 if (isInteractive)
268 {
269 char buf[100];
270
271 // Create the main frame window
272 frame = new MyFrame(NULL, -1, "Tex2RTF", wxPoint(-1, -1), wxSize(400, 300));
273 frame->CreateStatusBar(2);
274
275 // Give it an icon
276 // TODO: uncomment this when we have tex2rtf.xpm
277 frame->SetIcon(wxICON(tex2rtf));
278
279 if (InputFile)
280 {
281 sprintf(buf, "Tex2RTF [%s]", FileNameFromPath(InputFile));
282 frame->SetTitle(buf);
283 }
284
285 // Make a menubar
286 wxMenu *file_menu = new wxMenu;
287 file_menu->Append(TEX_GO, "&Go", "Run converter");
288 file_menu->Append(TEX_SET_INPUT, "Set &Input File", "Set the LaTeX input file");
289 file_menu->Append(TEX_SET_OUTPUT, "Set &Output File", "Set the output file");
290 file_menu->AppendSeparator();
291 file_menu->Append(TEX_VIEW_LATEX, "View &LaTeX File", "View the LaTeX input file");
292 file_menu->Append(TEX_VIEW_OUTPUT, "View Output &File", "View output file");
293 file_menu->Append(TEX_SAVE_FILE, "&Save log file", "Save displayed text into file");
294 file_menu->AppendSeparator();
295 file_menu->Append(TEX_QUIT, "E&xit", "Exit Tex2RTF");
296
297 wxMenu *macro_menu = new wxMenu;
298
299 macro_menu->Append(TEX_LOAD_CUSTOM_MACROS, "&Load Custom Macros", "Load custom LaTeX macro file");
300 macro_menu->Append(TEX_VIEW_CUSTOM_MACROS, "View &Custom Macros", "View custom LaTeX macros");
301
302 wxMenu *mode_menu = new wxMenu;
303
304 mode_menu->Append(TEX_MODE_RTF, "Output linear &RTF", "Wordprocessor-compatible RTF");
305 mode_menu->Append(TEX_MODE_WINHELP, "Output &WinHelp RTF", "WinHelp-compatible RTF");
306 mode_menu->Append(TEX_MODE_HTML, "Output &HTML", "HTML World Wide Web hypertext file");
307 mode_menu->Append(TEX_MODE_XLP, "Output &XLP", "wxHelp hypertext help file");
308
309 wxMenu *help_menu = new wxMenu;
310
311 help_menu->Append(TEX_HELP, "&Help", "Tex2RTF Contents Page");
312 help_menu->Append(TEX_ABOUT, "&About Tex2RTF", "About Tex2RTF");
313
314 menuBar = new wxMenuBar;
315 menuBar->Append(file_menu, "&File");
316 menuBar->Append(macro_menu, "&Macros");
317 menuBar->Append(mode_menu, "&Conversion Mode");
318 menuBar->Append(help_menu, "&Help");
319
320 frame->SetMenuBar(menuBar);
321 frame->textWindow = new wxTextCtrl(frame, -1, "", wxPoint(-1, -1), wxSize(-1, -1), wxTE_READONLY|wxTE_MULTILINE);
322
323 (*frame->textWindow) << "Welcome to Julian Smart's LaTeX to RTF converter.\n";
324// ShowOptions();
325
326 HelpInstance = new wxHelpController();
327 HelpInstance->Initialize("tex2rtf");
328
329 /*
330 * Read macro/initialisation file
331 *
332 */
333
334 wxString path;
335 if ((path = TexPathList.FindValidPath(MacroFile)) != "")
336 ReadCustomMacros((char*) (const char*) path);
337
338 strcpy(buf, "In ");
339
340 if (winHelp && (convertMode == TEX_RTF))
341 strcat(buf, "WinHelp RTF");
342 else if (!winHelp && (convertMode == TEX_RTF))
343 strcat(buf, "linear RTF");
344 else if (convertMode == TEX_HTML) strcat(buf, "HTML");
345 else if (convertMode == TEX_XLP) strcat(buf, "XLP");
346 strcat(buf, " mode.");
347 frame->SetStatusText(buf, 1);
348
349 frame->Show(TRUE);
350 return TRUE;
351 }
352 else
353#endif // NO_GUI
354 {
355 /*
356 * Read macro/initialisation file
357 *
358 */
359
360 wxString path;
361 if ((path = TexPathList.FindValidPath(MacroFile)) != "")
362 ReadCustomMacros((char*) (const char*) path);
363
364 Go();
365 if (runTwice) Go();
366#ifdef NO_GUI
367 return 0;
368#else
369 return NULL;
370#endif
371 }
372
373#ifndef NO_GUI
374 // Return the main frame window
375 return TRUE;
376#else
377 return FALSE;
378#endif
379}
380
381int MyApp::OnExit()
382{
383 wxNode *node = CustomMacroList.First();
384 while (node)
385 {
386 CustomMacro *macro = (CustomMacro *)node->Data();
387 delete macro;
388 delete node;
389 node = CustomMacroList.First();
390 }
391 MacroDefs.BeginFind();
392 node = MacroDefs.Next();
393 while (node)
394 {
395 TexMacroDef* def = (TexMacroDef*) node->Data();
396 delete def;
397 node = MacroDefs.Next();
398 }
399 MacroDefs.Clear();
400#ifdef __WXMSW__
401 delete TheTex2RTFServer;
402#endif
403 delete HelpInstance;
404
405 // TODO: this simulates zero-memory leaks!
406 // Otherwise there are just too many...
407 wxDebugContext::SetCheckpoint();
408
409 return 0;
410}
411
412void ShowOptions(void)
413{
414 char buf[100];
415 sprintf(buf, "Tex2RTF version %.2f", versionNo);
416 OnInform(buf);
417 OnInform("Usage: tex2rtf [input] [output] [switches]\n");
418 OnInform("where valid switches are");
419 OnInform(" -interactive");
420 OnInform(" -bufsize <size in K>");
421 OnInform(" -charset <pc | pca | ansi | mac> (default ansi)");
422 OnInform(" -twice");
423 OnInform(" -sync");
424 OnInform(" -macros <filename>");
425 OnInform(" -winhelp");
426 OnInform(" -rtf");
427 OnInform(" -html");
428 OnInform(" -xlp\n");
429}
430
431#ifndef NO_GUI
432
433BEGIN_EVENT_TABLE(MyFrame, wxFrame)
434 EVT_CLOSE(MyFrame::OnCloseWindow)
435 EVT_MENU(TEX_QUIT, MyFrame::OnExit)
436 EVT_MENU(TEX_GO, MyFrame::OnGo)
437 EVT_MENU(TEX_SET_INPUT, MyFrame::OnSetInput)
438 EVT_MENU(TEX_SET_OUTPUT, MyFrame::OnSetOutput)
439 EVT_MENU(TEX_SAVE_FILE, MyFrame::OnSaveFile)
440 EVT_MENU(TEX_VIEW_LATEX, MyFrame::OnViewLatex)
441 EVT_MENU(TEX_VIEW_OUTPUT, MyFrame::OnViewOutput)
442 EVT_MENU(TEX_VIEW_CUSTOM_MACROS, MyFrame::OnShowMacros)
443 EVT_MENU(TEX_LOAD_CUSTOM_MACROS, MyFrame::OnLoadMacros)
444 EVT_MENU(TEX_MODE_RTF, MyFrame::OnModeRTF)
445 EVT_MENU(TEX_MODE_WINHELP, MyFrame::OnModeWinHelp)
446 EVT_MENU(TEX_MODE_HTML, MyFrame::OnModeHTML)
447 EVT_MENU(TEX_MODE_XLP, MyFrame::OnModeXLP)
448 EVT_MENU(TEX_HELP, MyFrame::OnHelp)
449 EVT_MENU(TEX_ABOUT, MyFrame::OnAbout)
450END_EVENT_TABLE()
451
452// My frame constructor
453MyFrame::MyFrame(wxFrame *frame, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size):
454 wxFrame(frame, id, title, pos, size)
455{}
456
457void MyFrame::OnCloseWindow(wxCloseEvent& event)
458{
459 if (!stopRunning && !OkToClose)
460 {
461 stopRunning = TRUE;
462 runTwice = FALSE;
463 return;
464 }
465 else if (OkToClose)
466 {
467#ifdef __WXMSW__
468 delete TheTex2RTFServer;
469 wxDDECleanUp();
470#endif
471 this->Destroy();
472 }
473}
474
475void MyFrame::OnExit(wxCommandEvent& event)
476{
477 this->Destroy();
478}
479
480void MyFrame::OnGo(wxCommandEvent& event)
481{
482 menuBar->EnableTop(0, FALSE);
483 menuBar->EnableTop(1, FALSE);
484 menuBar->EnableTop(2, FALSE);
485 menuBar->EnableTop(3, FALSE);
486 textWindow->Clear();
487 Tex2RTFYield(TRUE);
488 Go();
489
490 if (runTwice)
491 {
492 Tex2RTFYield(TRUE);
493 Go();
494 }
495 menuBar->EnableTop(0, TRUE);
496 menuBar->EnableTop(1, TRUE);
497 menuBar->EnableTop(2, TRUE);
498 menuBar->EnableTop(3, TRUE);
499}
500
501void MyFrame::OnSetInput(wxCommandEvent& event)
502{
503 ChooseInputFile(TRUE);
504}
505
506void MyFrame::OnSetOutput(wxCommandEvent& event)
507{
508 ChooseOutputFile(TRUE);
509}
510
511void MyFrame::OnSaveFile(wxCommandEvent& event)
512{
513 wxString s = wxFileSelector("Save text to file", "", "", "txt", "*.txt");
514 if (s != "")
515 {
516 textWindow->SaveFile(s);
517 char buf[350];
518 sprintf(buf, "Saved text to %s", (const char*) s);
519 frame->SetStatusText(buf, 0);
520 }
521}
522
523void MyFrame::OnViewOutput(wxCommandEvent& event)
524{
525 ChooseOutputFile();
526 if (OutputFile && wxFileExists(OutputFile))
527 {
528 textWindow->LoadFile(OutputFile);
529 char buf[300];
530 wxString str(wxFileNameFromPath(OutputFile));
531 sprintf(buf, "Tex2RTF [%s]", (const char*) str);
532 frame->SetTitle(buf);
533 }
534}
535
536void MyFrame::OnViewLatex(wxCommandEvent& event)
537{
538 ChooseInputFile();
539 if (InputFile && wxFileExists(InputFile))
540 {
541 textWindow->LoadFile(InputFile);
542 char buf[300];
543 wxString str(wxFileNameFromPath(OutputFile));
544 sprintf(buf, "Tex2RTF [%s]", (const char*) str);
545 frame->SetTitle(buf);
546 }
547}
548
549void MyFrame::OnLoadMacros(wxCommandEvent& event)
550{
551 textWindow->Clear();
552 wxString s = wxFileSelector("Choose custom macro file", wxPathOnly(MacroFile), wxFileNameFromPath(MacroFile), "ini", "*.ini");
553 if (s != "" && wxFileExists(s))
554 {
555 MacroFile = copystring(s);
556 ReadCustomMacros((char*) (const char*) s);
557 ShowCustomMacros();
558 }
559}
560
561void MyFrame::OnShowMacros(wxCommandEvent& event)
562{
563 textWindow->Clear();
564 Tex2RTFYield(TRUE);
565 ShowCustomMacros();
566}
567
568void MyFrame::OnModeRTF(wxCommandEvent& event)
569{
570 convertMode = TEX_RTF;
571 winHelp = FALSE;
572 InputFile = NULL;
573 OutputFile = NULL;
574 SetStatusText("In linear RTF mode.", 1);
575}
576
577void MyFrame::OnModeWinHelp(wxCommandEvent& event)
578{
579 convertMode = TEX_RTF;
580 winHelp = TRUE;
581 InputFile = NULL;
582 OutputFile = NULL;
583 SetStatusText("In WinHelp RTF mode.", 1);
584}
585
586void MyFrame::OnModeHTML(wxCommandEvent& event)
587{
588 convertMode = TEX_HTML;
589 winHelp = FALSE;
590 InputFile = NULL;
591 OutputFile = NULL;
592 SetStatusText("In HTML mode.", 1);
593}
594
595void MyFrame::OnModeXLP(wxCommandEvent& event)
596{
597 convertMode = TEX_XLP;
598 InputFile = NULL;
599 OutputFile = NULL;
600 SetStatusText("In XLP mode.", 1);
601}
602
603void MyFrame::OnHelp(wxCommandEvent& event)
604{
605 HelpInstance->LoadFile();
606 HelpInstance->DisplayContents();
607}
608
609void MyFrame::OnAbout(wxCommandEvent& event)
610{
611 char buf[300];
612#ifdef __WIN32__
613 char *platform = " (32-bit)";
614#else
615#ifdef __WXMSW__
616 char *platform = " (16-bit)";
617#else
618 char *platform = "";
619#endif
620#endif
621 sprintf(buf, "Tex2RTF Version %.2f%s\nLaTeX to RTF, WinHelp, HTML and wxHelp Conversion\n\n(c) Julian Smart 1999", versionNo, platform);
622 wxMessageBox(buf, "About Tex2RTF");
623}
624
625void ChooseInputFile(bool force)
626{
627 if (force || !InputFile)
628 {
629 wxString s = wxFileSelector("Choose LaTeX input file", wxPathOnly(InputFile), wxFileNameFromPath(InputFile), "tex", "*.tex");
630 if (s != "")
631 {
632 // Different file, so clear index entries.
633 ClearKeyWordTable();
634 ResetContentsLevels(0);
635 passNumber = 1;
636 char buf[300];
637 InputFile = copystring(s);
638 wxString str = wxFileNameFromPath(InputFile);
639 sprintf(buf, "Tex2RTF [%s]", (const char*) str);
640 frame->SetTitle(buf);
641 OutputFile = NULL;
642 }
643 }
644}
645
646void ChooseOutputFile(bool force)
647{
648 char extensionBuf[10];
649 char wildBuf[10];
650 strcpy(wildBuf, "*.");
651 char *path = NULL;
652 if (OutputFile)
653 path = wxPathOnly(OutputFile);
654 else if (InputFile)
655 path = wxPathOnly(InputFile);
656
657 switch (convertMode)
658 {
659 case TEX_RTF:
660 {
661 strcpy(extensionBuf, "rtf");
662 strcat(wildBuf, "rtf");
663 break;
664 }
665 case TEX_XLP:
666 {
667 strcpy(extensionBuf, "xlp");
668 strcat(wildBuf, "xlp");
669 break;
670 }
671 case TEX_HTML:
672 {
673#if defined(__WXMSW__) && defined(__WIN16__)
674 strcpy(extensionBuf, "htm");
675 strcat(wildBuf, "htm");
676#else
677 strcpy(extensionBuf, "html");
678 strcat(wildBuf, "html");
679#endif
680 break;
681 }
682 }
683 if (force || !OutputFile)
684 {
685 wxString s = wxFileSelector("Choose output file", path, wxFileNameFromPath(OutputFile),
686 extensionBuf, wildBuf);
687 if (s != "")
688 OutputFile = copystring(s);
689 }
690}
691#endif
692
693bool Go(void)
694{
695#ifndef NO_GUI
696 ChooseInputFile();
697 ChooseOutputFile();
698#endif
699
700 if (!InputFile || !OutputFile)
701 return FALSE;
702
703#ifndef NO_GUI
704 if (isInteractive)
705 {
706 char buf[300];
707 wxString str = wxFileNameFromPath(InputFile);
708
709 sprintf(buf, "Tex2RTF [%s]", (const char*) str);
710 frame->SetTitle(buf);
711 }
712
713 wxStartTimer();
714#endif
715
716 // Find extension-less filename
717 strcpy(FileRoot, OutputFile);
718 StripExtension(FileRoot);
719
720 if (truncateFilenames && convertMode == TEX_HTML)
721 {
722 // Truncate to five characters. This ensures that
723 // we can generate DOS filenames such as thing999. But 1000 files
724 // may not be enough, of course...
725 char* sName = wxFileNameFromPath( FileRoot); // this Julian's method is non-destructive reference
726
727 if(sName)
728 if(strlen( sName) > 5)
729 sName[5] = '\0'; // that should do!
730 }
731
732 sprintf(ContentsName, "%s.con", FileRoot);
733 sprintf(TmpContentsName, "%s.cn1", FileRoot);
734 sprintf(TmpFrameContentsName, "%s.frc", FileRoot);
735 sprintf(WinHelpContentsFileName, "%s.cnt", FileRoot);
736 sprintf(RefName, "%s.ref", FileRoot);
737
738 TexPathList.EnsureFileAccessible(InputFile);
739 if (!bulletFile)
740 {
741 wxString s = TexPathList.FindValidPath("bullet.bmp");
742 if (s != "")
743 {
744 wxString str = wxFileNameFromPath(s);
745 bulletFile = copystring(str);
746 }
747 }
748
749 if (wxFileExists(RefName))
750 ReadTexReferences(RefName);
751
752 bool success = FALSE;
753
754 if (InputFile && OutputFile)
755 {
756 if (!FileExists(InputFile))
757 {
758 OnError("Cannot open input file!");
759 TexCleanUp();
760 return FALSE;
761 }
762#ifndef NO_GUI
763 if (isInteractive)
764 {
765 char buf[50];
766 sprintf(buf, "Working, pass %d...", passNumber);
767 frame->SetStatusText(buf);
768 }
769#endif
770 OkToClose = FALSE;
771 OnInform("Reading LaTeX file...");
772 TexLoadFile(InputFile);
773
774 switch (convertMode)
775 {
776 case TEX_RTF:
777 {
778 success = RTFGo();
779 break;
780 }
781 case TEX_XLP:
782 {
783 success = XLPGo();
784 break;
785 }
786 case TEX_HTML:
787 {
788 success = HTMLGo();
789 break;
790 }
791 }
792 }
793 if (stopRunning)
794 {
795 OnInform("*** Aborted by user.");
796 success = FALSE;
797 stopRunning = FALSE;
798 }
799
800 if (success)
801 {
802 WriteTexReferences(RefName);
803 TexCleanUp();
804 startedSections = FALSE;
805
806 char buf[100];
807#ifndef NO_GUI
808 long tim = wxGetElapsedTime();
809 sprintf(buf, "Finished in %ld seconds.", (long)(tim/1000.0));
810 OnInform(buf);
811 if (isInteractive)
812 {
813 sprintf(buf, "Done, %d %s.", passNumber, (passNumber > 1) ? "passes" : "pass");
814 frame->SetStatusText(buf);
815 }
816#else
817 sprintf(buf, "Done, %d %s.", passNumber, (passNumber > 1) ? "passes" : "pass");
818 OnInform(buf);
819#endif
820 passNumber ++;
821 OkToClose = TRUE;
822 return TRUE;
823 }
824
825 TexCleanUp();
826 startedSections = FALSE;
827
828 OnInform("Sorry, unsuccessful.");
829 OkToClose = TRUE;
830 return FALSE;
831}
832
833void OnError(char *msg)
834{
835#ifdef NO_GUI
836 cerr << "Error: " << msg << "\n";
837 cerr.flush();
838#else
839 if (isInteractive)
840 (*frame->textWindow) << "Error: " << msg << "\n";
841 else
842#ifdef __UNIX__
843 {
844 cerr << "Error: " << msg << "\n";
845 cerr.flush();
846 }
847#endif
848#ifdef __WXMSW__
849 wxError(msg);
850#endif
851 Tex2RTFYield(TRUE);
852#endif // NO_GUI
853}
854
855void OnInform(char *msg)
856{
857#ifdef NO_GUI
858 cout << msg << "\n";
859 cout.flush();
860#else
861 if (isInteractive)
862 (*frame->textWindow) << msg << "\n";
863 else
864#ifdef __WXMSW__
865 {
866 cout << msg << "\n";
867 cout.flush();
868 }
869#endif
870#ifdef __WXMSW__
871 {}
872#endif
873 if (isInteractive)
874 {
875 Tex2RTFYield(TRUE);
876 }
877#endif // NO_GUI
878}
879
880void OnMacro(int macroId, int no_args, bool start)
881{
882 switch (convertMode)
883 {
884 case TEX_RTF:
885 {
886 RTFOnMacro(macroId, no_args, start);
887 break;
888 }
889 case TEX_XLP:
890 {
891 XLPOnMacro(macroId, no_args, start);
892 break;
893 }
894 case TEX_HTML:
895 {
896 HTMLOnMacro(macroId, no_args, start);
897 break;
898 }
899 }
900}
901
902bool OnArgument(int macroId, int arg_no, bool start)
903{
904 switch (convertMode)
905 {
906 case TEX_RTF:
907 {
908 return RTFOnArgument(macroId, arg_no, start);
909 break;
910 }
911 case TEX_XLP:
912 {
913 return XLPOnArgument(macroId, arg_no, start);
914 break;
915 }
916 case TEX_HTML:
917 {
918 return HTMLOnArgument(macroId, arg_no, start);
919 break;
920 }
921 }
922 return TRUE;
923}
924
925/*
926 * DDE Stuff
927 */
928#if defined(__WXMSW__) && !defined(NO_GUI)
929
930/*
931 * Server
932 */
933
934wxConnectionBase *Tex2RTFServer::OnAcceptConnection(const wxString& topic)
935{
936 if (topic == "TEX2RTF")
937 {
938 if (!ipc_buffer)
939 ipc_buffer = new char[1000];
940
941 return new Tex2RTFConnection(ipc_buffer, 4000);
942 }
943 else
944 return NULL;
945}
946
947 /*
948 * Connection
949 */
950
951Tex2RTFConnection::Tex2RTFConnection(char *buf, int size):wxDDEConnection(buf, size)
952{
953}
954
955Tex2RTFConnection::~Tex2RTFConnection(void)
956{
957}
958
959bool SplitCommand(char *data, char *firstArg, char *secondArg)
960{
961 firstArg[0] = 0;
962 secondArg[0] = 0;
963 int i = 0;
964 int len = strlen(data);
965 bool stop = FALSE;
966 // Find first argument (command name)
967 while (!stop)
968 {
969 if (data[i] == ' ' || data[i] == 0)
970 stop = TRUE;
971 else
972 {
973 firstArg[i] = data[i];
974 i ++;
975 }
976 }
977 firstArg[i] = 0;
978 if (data[i] == ' ')
979 {
980 // Find second argument
981 i ++;
982 int j = 0;
983 while (data[i] != 0)
984 {
985 secondArg[j] = data[i];
986 i ++;
987 j ++;
988 }
989 secondArg[j] = 0;
990 }
991 return TRUE;
992}
993
994bool Tex2RTFConnection::OnExecute(const wxString& topic, char *data, int size, int format)
995{
996 strcpy(Tex2RTFLastStatus, "OK");
997
998 char firstArg[50];
999 char secondArg[300];
1000 if (SplitCommand(data, firstArg, secondArg))
1001 {
1002 bool hasArg = (strlen(secondArg) > 0);
1003 if (strcmp(firstArg, "INPUT") == 0 && hasArg)
1004 {
1005 if (InputFile) delete[] InputFile;
1006 InputFile = copystring(secondArg);
1007 if (frame)
1008 {
1009 char buf[100];
1010 wxString str = wxFileNameFromPath(InputFile);
1011 sprintf(buf, "Tex2RTF [%s]", (const char*) str);
1012 frame->SetTitle(buf);
1013 }
1014 }
1015 else if (strcmp(firstArg, "OUTPUT") == 0 && hasArg)
1016 {
1017 if (OutputFile) delete[] OutputFile;
1018 OutputFile = copystring(secondArg);
1019 }
1020 else if (strcmp(firstArg, "GO") == 0)
1021 {
1022 strcpy(Tex2RTFLastStatus, "WORKING");
1023 if (!Go())
1024 strcpy(Tex2RTFLastStatus, "CONVERSION ERROR");
1025 else
1026 strcpy(Tex2RTFLastStatus, "OK");
1027 }
1028 else if (strcmp(firstArg, "EXIT") == 0)
1029 {
1030 if (frame && frame->OnClose())
1031 delete frame;
1032 }
1033 else if (strcmp(firstArg, "MINIMIZE") == 0 || strcmp(firstArg, "ICONIZE") == 0)
1034 {
1035 if (frame)
1036 frame->Iconize(TRUE);
1037 }
1038 else if (strcmp(firstArg, "SHOW") == 0 || strcmp(firstArg, "RESTORE") == 0)
1039 {
1040 if (frame)
1041 {
1042 frame->Iconize(FALSE);
1043 frame->Show(TRUE);
1044 }
1045 }
1046 else
1047 {
1048 // Try for a setting
1049 strcpy(Tex2RTFLastStatus, RegisterSetting(firstArg, secondArg, FALSE));
1050#ifndef NO_GUI
1051 if (frame && strcmp(firstArg, "conversionMode") == 0)
1052 {
1053 char buf[100];
1054 strcpy(buf, "In ");
1055
1056 if (winHelp && (convertMode == TEX_RTF))
1057 strcat(buf, "WinHelp RTF");
1058 else if (!winHelp && (convertMode == TEX_RTF))
1059 strcat(buf, "linear RTF");
1060 else if (convertMode == TEX_HTML) strcat(buf, "HTML");
1061 else if (convertMode == TEX_XLP) strcat(buf, "XLP");
1062 strcat(buf, " mode.");
1063 frame->SetStatusText(buf, 1);
1064 }
1065#endif
1066 }
1067 }
1068 return TRUE;
1069}
1070
1071char *Tex2RTFConnection::OnRequest(const wxString& topic, const wxString& item, int *size, int format)
1072{
1073 return Tex2RTFLastStatus;
1074}
1075
1076#endif
1077