]> git.saurik.com Git - wxWidgets.git/blob - utils/tex2rtf/src/tex2rtf.cpp
ODBC updates (it almost works now)
[wxWidgets.git] / utils / tex2rtf / src / tex2rtf.cpp
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
52 const float versionNo = 2.0;
53
54 TexChunk *currentMember = NULL;
55 bool startedSections = FALSE;
56 char *contentsString = NULL;
57 bool suppressNameDecoration = FALSE;
58 bool OkToClose = TRUE;
59 int passNumber = 1;
60
61 #ifndef NO_GUI
62 wxHelpController *HelpInstance = NULL;
63
64 #ifdef __WXMSW__
65 static char *ipc_buffer = NULL;
66 static char Tex2RTFLastStatus[100];
67 Tex2RTFServer *TheTex2RTFServer = NULL;
68 #endif
69 #endif
70
71 char *bulletFile = NULL;
72
73 FILE *Contents = NULL; // Contents page
74 FILE *Chapters = NULL; // Chapters (WinHelp RTF) or rest of file (linear RTF)
75 FILE *Sections = NULL;
76 FILE *Subsections = NULL;
77 FILE *Subsubsections = NULL;
78 FILE *Popups = NULL;
79 FILE *WinHelpContentsFile = NULL;
80
81 char *InputFile = NULL;
82 char *OutputFile = NULL;
83 char *MacroFile = copystring("tex2rtf.ini");
84
85 char *FileRoot = NULL;
86 char *ContentsName = NULL; // Contents page from last time around
87 char *TmpContentsName = NULL; // Current contents page
88 char *TmpFrameContentsName = NULL; // Current frame contents page
89 char *WinHelpContentsFileName = NULL; // WinHelp .cnt file
90 char *RefName = NULL; // Reference file name
91
92 char *RTFCharset = copystring("ansi");
93
94 #ifdef __WXMSW__
95 int BufSize = 100; // Size of buffer in K
96 #else
97 int BufSize = 500;
98 #endif
99
100 bool Go(void);
101 void ShowOptions(void);
102
103 #ifdef NO_GUI
104 int main(int argc, char **argv)
105 #else
106 wxMenuBar *menuBar = NULL;
107 MyFrame *frame = NULL;
108
109 // DECLARE_APP(MyApp)
110 IMPLEMENT_APP(MyApp)
111
112 // `Main program' equivalent, creating windows and returning main app frame
113 bool 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
381 int 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
412 void 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
433 BEGIN_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)
450 END_EVENT_TABLE()
451
452 // My frame constructor
453 MyFrame::MyFrame(wxFrame *frame, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size):
454 wxFrame(frame, id, title, pos, size)
455 {}
456
457 void 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
475 void MyFrame::OnExit(wxCommandEvent& event)
476 {
477 this->Destroy();
478 }
479
480 void 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
501 void MyFrame::OnSetInput(wxCommandEvent& event)
502 {
503 ChooseInputFile(TRUE);
504 }
505
506 void MyFrame::OnSetOutput(wxCommandEvent& event)
507 {
508 ChooseOutputFile(TRUE);
509 }
510
511 void 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
523 void 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
536 void 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
549 void 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
561 void MyFrame::OnShowMacros(wxCommandEvent& event)
562 {
563 textWindow->Clear();
564 Tex2RTFYield(TRUE);
565 ShowCustomMacros();
566 }
567
568 void 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
577 void 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
586 void 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
595 void MyFrame::OnModeXLP(wxCommandEvent& event)
596 {
597 convertMode = TEX_XLP;
598 InputFile = NULL;
599 OutputFile = NULL;
600 SetStatusText("In XLP mode.", 1);
601 }
602
603 void MyFrame::OnHelp(wxCommandEvent& event)
604 {
605 HelpInstance->LoadFile();
606 HelpInstance->DisplayContents();
607 }
608
609 void 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
625 void 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
646 void 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
693 bool 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
833 void 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
855 void 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
880 void 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
902 bool 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
934 wxConnectionBase *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
951 Tex2RTFConnection::Tex2RTFConnection(char *buf, int size):wxDDEConnection(buf, size)
952 {
953 }
954
955 Tex2RTFConnection::~Tex2RTFConnection(void)
956 {
957 }
958
959 bool 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
994 bool 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
1071 char *Tex2RTFConnection::OnRequest(const wxString& topic, const wxString& item, int *size, int format)
1072 {
1073 return Tex2RTFLastStatus;
1074 }
1075
1076 #endif
1077