1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Converts Latex to linear/WinHelp RTF, HTML, wxHelp.
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
32 #if defined(NO_GUI) || defined(__UNIX__)
48 #if (defined(__WXGTK__) || defined(__WXMOTIF__)) && !defined(NO_GUI)
49 #include "tex2rtf.xpm"
52 const float versionNo
= 2.0;
54 TexChunk
*currentMember
= NULL
;
55 bool startedSections
= FALSE
;
56 char *contentsString
= NULL
;
57 bool suppressNameDecoration
= FALSE
;
58 bool OkToClose
= TRUE
;
64 extern char *BigBuffer
;
65 extern char *TexFileRoot
;
66 extern char *TexBibName
; // Bibliography output file name
67 extern char *TexTmpBibName
; // Temporary bibliography output file name
68 extern wxList ColourTable
;
69 extern TexChunk
*TopLevel
;
70 extern char *PageStyle
;
71 extern char *BibliographyStyleString
;
72 extern char *DocumentStyleString
;
73 extern char *bitmapMethod
;
74 extern char *backgroundColourString
;
75 extern char *ContentsNameString
;
76 extern char *AbstractNameString
;
77 extern char *GlossaryNameString
;
78 extern char *ReferencesNameString
;
79 extern char *FiguresNameString
;
80 extern char *TablesNameString
;
81 extern char *FigureNameString
;
82 extern char *TableNameString
;
83 extern char *IndexNameString
;
84 extern char *ChapterNameString
;
85 extern char *SectionNameString
;
86 extern char *SubsectionNameString
;
87 extern char *SubsubsectionNameString
;
88 extern char *UpNameString
;
93 wxHelpController
*HelpInstance
= NULL
;
97 static char *ipc_buffer
= NULL
;
98 static char Tex2RTFLastStatus
[100];
99 Tex2RTFServer
*TheTex2RTFServer
= NULL
;
103 char *bulletFile
= NULL
;
105 FILE *Contents
= NULL
; // Contents page
106 FILE *Chapters
= NULL
; // Chapters (WinHelp RTF) or rest of file (linear RTF)
107 FILE *Sections
= NULL
;
108 FILE *Subsections
= NULL
;
109 FILE *Subsubsections
= NULL
;
111 FILE *WinHelpContentsFile
= NULL
;
113 char *InputFile
= NULL
;
114 char *OutputFile
= NULL
;
115 char *MacroFile
= copystring("tex2rtf.ini");
117 char *FileRoot
= NULL
;
118 char *ContentsName
= NULL
; // Contents page from last time around
119 char *TmpContentsName
= NULL
; // Current contents page
120 char *TmpFrameContentsName
= NULL
; // Current frame contents page
121 char *WinHelpContentsFileName
= NULL
; // WinHelp .cnt file
122 char *RefName
= NULL
; // Reference file name
124 char *RTFCharset
= copystring("ansi");
127 int BufSize
= 100; // Size of buffer in K
133 void ShowOptions(void);
137 #if wxUSE_GUI || !defined(__UNIX__)
138 // wxBase for Unix does not have wxBuffer
141 char *wxBuffer
; // we must init it, otherwise tex2rtf will crash
143 int main(int argc
, char **argv
)
145 wxMenuBar
*menuBar
= NULL
;
146 MyFrame
*frame
= NULL
;
148 // DECLARE_APP(MyApp)
151 // `Main program' equivalent, creating windows and returning main app frame
155 // Use default list of macros defined in tex2any.cc
156 DefineDefaultMacros();
157 AddMacroDef(ltHARDY
, "hardy", 0);
159 FileRoot
= new char[300];
160 ContentsName
= new char[300];
161 TmpContentsName
= new char[300];
162 TmpFrameContentsName
= new char[300];
163 WinHelpContentsFileName
= new char[300];
164 RefName
= new char[300];
166 ColourTable
.DeleteContents(TRUE
);
170 // Read input/output files
173 if (argv
[1][0] != '-')
180 if (argv
[2][0] != '-')
182 OutputFile
= argv
[2];
190 wxBuffer
= new char[1500];
191 // this is done in wxApp, but NO_GUI version doesn't call it :-(
193 if (!InputFile
|| !OutputFile
)
195 cout
<< "Tex2RTF: input or output file is missing.\n";
203 TexPathList
.EnsureFileAccessible(InputFile
);
205 if (!InputFile
|| !OutputFile
)
206 isInteractive
= TRUE
;
209 for (i
= n
; i
< argc
;)
211 if (strcmp(argv
[i
], "-winhelp") == 0)
214 convertMode
= TEX_RTF
;
218 else if (strcmp(argv
[i
], "-interactive") == 0)
221 isInteractive
= TRUE
;
224 else if (strcmp(argv
[i
], "-sync") == 0) // Don't yield
229 else if (strcmp(argv
[i
], "-rtf") == 0)
232 convertMode
= TEX_RTF
;
234 else if (strcmp(argv
[i
], "-html") == 0)
237 convertMode
= TEX_HTML
;
239 else if (strcmp(argv
[i
], "-xlp") == 0)
242 convertMode
= TEX_XLP
;
244 else if (strcmp(argv
[i
], "-twice") == 0)
249 else if (strcmp(argv
[i
], "-macros") == 0)
254 MacroFile
= copystring(argv
[i
]);
258 else if (strcmp(argv
[i
], "-bufsize") == 0)
263 BufSize
= atoi(argv
[i
]);
267 else if (strcmp(argv
[i
], "-charset") == 0)
274 if (strcmp(s
, "ansi") == 0 || strcmp(s
, "pc") == 0 || strcmp(s
, "mac") == 0 ||
275 strcmp(s
, "pca") == 0)
276 RTFCharset
= copystring(s
);
279 OnError("Incorrect argument for -charset");
284 else if (strcmp(argv
[i
], "-checkcurleybraces") == 0)
287 checkCurleyBraces
= TRUE
;
289 else if (strcmp(argv
[i
], "-checksyntax") == 0)
297 buf
.Printf("Invalid switch %s.\n", argv
[i
]);
298 OnError((char *)buf
.c_str());
308 #if defined(__WXMSW__) && !defined(NO_GUI)
310 Tex2RTFLastStatus
[0] = 0; // DDE connection return value
311 TheTex2RTFServer
= new Tex2RTFServer
;
312 TheTex2RTFServer
->Create("TEX2RTF");
315 #if defined(__WXMSW__) && defined(__WIN16__)
316 // Limit to max Windows array size
317 if (BufSize
> 64) BufSize
= 64;
320 TexInitialize(BufSize
);
321 ResetContentsLevels(0);
329 // Create the main frame window
330 frame
= new MyFrame(NULL
, -1, "Tex2RTF", wxPoint(-1, -1), wxSize(400, 300));
331 frame
->CreateStatusBar(2);
334 // TODO: uncomment this when we have tex2rtf.xpm
335 frame
->SetIcon(wxICON(tex2rtf
));
339 sprintf(buf
, "Tex2RTF [%s]", FileNameFromPath(InputFile
));
340 frame
->SetTitle(buf
);
344 wxMenu
*file_menu
= new wxMenu
;
345 file_menu
->Append(TEX_GO
, "&Go", "Run converter");
346 file_menu
->Append(TEX_SET_INPUT
, "Set &Input File", "Set the LaTeX input file");
347 file_menu
->Append(TEX_SET_OUTPUT
, "Set &Output File", "Set the output file");
348 file_menu
->AppendSeparator();
349 file_menu
->Append(TEX_VIEW_LATEX
, "View &LaTeX File", "View the LaTeX input file");
350 file_menu
->Append(TEX_VIEW_OUTPUT
, "View Output &File", "View output file");
351 file_menu
->Append(TEX_SAVE_FILE
, "&Save log file", "Save displayed text into file");
352 file_menu
->AppendSeparator();
353 file_menu
->Append(TEX_QUIT
, "E&xit", "Exit Tex2RTF");
355 wxMenu
*macro_menu
= new wxMenu
;
357 macro_menu
->Append(TEX_LOAD_CUSTOM_MACROS
, "&Load Custom Macros", "Load custom LaTeX macro file");
358 macro_menu
->Append(TEX_VIEW_CUSTOM_MACROS
, "View &Custom Macros", "View custom LaTeX macros");
360 wxMenu
*mode_menu
= new wxMenu
;
362 mode_menu
->Append(TEX_MODE_RTF
, "Output linear &RTF", "Wordprocessor-compatible RTF");
363 mode_menu
->Append(TEX_MODE_WINHELP
, "Output &WinHelp RTF", "WinHelp-compatible RTF");
364 mode_menu
->Append(TEX_MODE_HTML
, "Output &HTML", "HTML World Wide Web hypertext file");
365 mode_menu
->Append(TEX_MODE_XLP
, "Output &XLP", "wxHelp hypertext help file");
367 wxMenu
*options_menu
= new wxMenu
;
369 options_menu
->Append(TEX_OPTIONS_CURELY_BRACE
, "Curley brace matching", "Checks for mismatched curley braces",TRUE
);
370 options_menu
->Append(TEX_OPTIONS_SYNTAX_CHECKING
, "Syntax checking", "Syntax checking for common errors",TRUE
);
372 options_menu
->Check(TEX_OPTIONS_CURELY_BRACE
, checkCurleyBraces
);
373 options_menu
->Check(TEX_OPTIONS_SYNTAX_CHECKING
, checkSyntax
);
375 wxMenu
*help_menu
= new wxMenu
;
377 help_menu
->Append(TEX_HELP
, "&Help", "Tex2RTF Contents Page");
378 help_menu
->Append(TEX_ABOUT
, "&About Tex2RTF", "About Tex2RTF");
380 menuBar
= new wxMenuBar
;
381 menuBar
->Append(file_menu
, "&File");
382 menuBar
->Append(macro_menu
, "&Macros");
383 menuBar
->Append(mode_menu
, "&Conversion Mode");
384 menuBar
->Append(options_menu
, "&Options");
385 menuBar
->Append(help_menu
, "&Help");
387 frame
->SetMenuBar(menuBar
);
388 frame
->textWindow
= new wxTextCtrl(frame
, -1, "", wxPoint(-1, -1), wxSize(-1, -1), wxTE_READONLY
|wxTE_MULTILINE
);
390 (*frame
->textWindow
) << "Welcome to Julian Smart's LaTeX to RTF converter.\n";
394 HelpInstance
= new wxHelpController();
395 HelpInstance
->Initialize("tex2rtf");
399 * Read macro/initialisation file
404 if ((path
= TexPathList
.FindValidPath(MacroFile
)) != "")
405 ReadCustomMacros((char*) (const char*) path
);
409 if (winHelp
&& (convertMode
== TEX_RTF
))
410 strcat(buf
, "WinHelp RTF");
411 else if (!winHelp
&& (convertMode
== TEX_RTF
))
412 strcat(buf
, "linear RTF");
413 else if (convertMode
== TEX_HTML
) strcat(buf
, "HTML");
414 else if (convertMode
== TEX_XLP
) strcat(buf
, "XLP");
415 strcat(buf
, " mode.");
416 frame
->SetStatusText(buf
, 1);
425 * Read macro/initialisation file
430 if ((path
= TexPathList
.FindValidPath(MacroFile
)) != "")
431 ReadCustomMacros((char*) (const char*) path
);
446 // Return the main frame window
457 wxNode
*node
= CustomMacroList
.First();
460 CustomMacro
*macro
= (CustomMacro
*)node
->Data();
463 node
= CustomMacroList
.First();
465 MacroDefs
.BeginFind();
466 node
= MacroDefs
.Next();
469 TexMacroDef
* def
= (TexMacroDef
*) node
->Data();
471 node
= MacroDefs
.Next();
475 delete TheTex2RTFServer
;
490 delete currentArgData
;
491 currentArgData
= NULL
;
505 delete TexTmpBibName
;
506 TexTmpBibName
= NULL
;
520 delete TmpContentsName
;
521 TmpContentsName
= NULL
;
523 if (TmpFrameContentsName
)
525 delete TmpFrameContentsName
;
526 TmpFrameContentsName
= NULL
;
528 if (WinHelpContentsFileName
)
530 delete WinHelpContentsFileName
;
531 WinHelpContentsFileName
= NULL
;
555 delete [] BibliographyStyleString
;
556 delete [] DocumentStyleString
;
557 delete [] bitmapMethod
;
558 delete [] backgroundColourString
;
559 delete [] ContentsNameString
;
560 delete [] AbstractNameString
;
561 delete [] GlossaryNameString
;
562 delete [] ReferencesNameString
;
563 delete [] FiguresNameString
;
564 delete [] TablesNameString
;
565 delete [] FigureNameString
;
566 delete [] TableNameString
;
567 delete [] IndexNameString
;
568 delete [] ChapterNameString
;
569 delete [] SectionNameString
;
570 delete [] SubsectionNameString
;
571 delete [] SubsubsectionNameString
;
572 delete [] UpNameString
;
574 delete[] winHelpTitle
;
576 // TODO: this simulates zero-memory leaks!
577 // Otherwise there are just too many...
579 #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
580 wxDebugContext::SetCheckpoint();
587 void ShowOptions(void)
590 sprintf(buf
, "Tex2RTF version %.2f", versionNo
);
592 OnInform("Usage: tex2rtf [input] [output] [switches]\n");
593 OnInform("where valid switches are");
594 OnInform(" -interactive");
595 OnInform(" -bufsize <size in K>");
596 OnInform(" -charset <pc | pca | ansi | mac> (default ansi)");
599 OnInform(" -macros <filename>");
600 OnInform(" -winhelp");
608 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
609 EVT_CLOSE(MyFrame::OnCloseWindow
)
610 EVT_MENU(TEX_QUIT
, MyFrame::OnExit
)
611 EVT_MENU(TEX_GO
, MyFrame::OnGo
)
612 EVT_MENU(TEX_SET_INPUT
, MyFrame::OnSetInput
)
613 EVT_MENU(TEX_SET_OUTPUT
, MyFrame::OnSetOutput
)
614 EVT_MENU(TEX_SAVE_FILE
, MyFrame::OnSaveFile
)
615 EVT_MENU(TEX_VIEW_LATEX
, MyFrame::OnViewLatex
)
616 EVT_MENU(TEX_VIEW_OUTPUT
, MyFrame::OnViewOutput
)
617 EVT_MENU(TEX_VIEW_CUSTOM_MACROS
, MyFrame::OnShowMacros
)
618 EVT_MENU(TEX_LOAD_CUSTOM_MACROS
, MyFrame::OnLoadMacros
)
619 EVT_MENU(TEX_MODE_RTF
, MyFrame::OnModeRTF
)
620 EVT_MENU(TEX_MODE_WINHELP
, MyFrame::OnModeWinHelp
)
621 EVT_MENU(TEX_MODE_HTML
, MyFrame::OnModeHTML
)
622 EVT_MENU(TEX_MODE_XLP
, MyFrame::OnModeXLP
)
623 EVT_MENU(TEX_OPTIONS_CURELY_BRACE
, MyFrame::OnOptionsCurleyBrace
)
624 EVT_MENU(TEX_OPTIONS_SYNTAX_CHECKING
, MyFrame::OnOptionsSyntaxChecking
)
625 EVT_MENU(TEX_HELP
, MyFrame::OnHelp
)
626 EVT_MENU(TEX_ABOUT
, MyFrame::OnAbout
)
629 // My frame constructor
630 MyFrame::MyFrame(wxFrame
*frame
, wxWindowID id
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
):
631 wxFrame(frame
, id
, title
, pos
, size
)
634 void MyFrame::OnCloseWindow(wxCloseEvent
& event
)
636 if (!stopRunning
&& !OkToClose
)
648 void MyFrame::OnExit(wxCommandEvent
& event
)
654 void MyFrame::OnGo(wxCommandEvent
& event
)
658 menuBar
->EnableTop(0, FALSE
);
659 menuBar
->EnableTop(1, FALSE
);
660 menuBar
->EnableTop(2, FALSE
);
661 menuBar
->EnableTop(3, FALSE
);
671 menuBar
->EnableTop(0, TRUE
);
672 menuBar
->EnableTop(1, TRUE
);
673 menuBar
->EnableTop(2, TRUE
);
674 menuBar
->EnableTop(3, TRUE
);
677 void MyFrame::OnSetInput(wxCommandEvent
& event
)
679 ChooseInputFile(TRUE
);
682 void MyFrame::OnSetOutput(wxCommandEvent
& event
)
684 ChooseOutputFile(TRUE
);
687 void MyFrame::OnSaveFile(wxCommandEvent
& event
)
689 wxString s
= wxFileSelector("Save text to file", "", "", "txt", "*.txt");
692 textWindow
->SaveFile(s
);
694 sprintf(buf
, "Saved text to %s", (const char*) s
);
695 frame
->SetStatusText(buf
, 0);
699 void MyFrame::OnViewOutput(wxCommandEvent
& event
)
702 if (OutputFile
&& wxFileExists(OutputFile
))
704 textWindow
->LoadFile(OutputFile
);
706 wxString
str(wxFileNameFromPath(OutputFile
));
707 sprintf(buf
, "Tex2RTF [%s]", (const char*) str
);
708 frame
->SetTitle(buf
);
712 void MyFrame::OnViewLatex(wxCommandEvent
& event
)
715 if (InputFile
&& wxFileExists(InputFile
))
717 textWindow
->LoadFile(InputFile
);
719 wxString
str(wxFileNameFromPath(OutputFile
));
720 sprintf(buf
, "Tex2RTF [%s]", (const char*) str
);
721 frame
->SetTitle(buf
);
725 void MyFrame::OnLoadMacros(wxCommandEvent
& event
)
728 wxString s
= wxFileSelector("Choose custom macro file", wxPathOnly(MacroFile
), wxFileNameFromPath(MacroFile
), "ini", "*.ini");
729 if (s
!= "" && wxFileExists(s
))
731 MacroFile
= copystring(s
);
732 ReadCustomMacros((char*) (const char*) s
);
737 void MyFrame::OnShowMacros(wxCommandEvent
& event
)
744 void MyFrame::OnModeRTF(wxCommandEvent
& event
)
746 convertMode
= TEX_RTF
;
750 SetStatusText("In linear RTF mode.", 1);
753 void MyFrame::OnModeWinHelp(wxCommandEvent
& event
)
755 convertMode
= TEX_RTF
;
759 SetStatusText("In WinHelp RTF mode.", 1);
762 void MyFrame::OnModeHTML(wxCommandEvent
& event
)
764 convertMode
= TEX_HTML
;
768 SetStatusText("In HTML mode.", 1);
771 void MyFrame::OnModeXLP(wxCommandEvent
& event
)
773 convertMode
= TEX_XLP
;
776 SetStatusText("In XLP mode.", 1);
779 void MyFrame::OnOptionsCurleyBrace(wxCommandEvent
& event
)
781 checkCurleyBraces
= !checkCurleyBraces
;
782 if (checkCurleyBraces
)
784 SetStatusText("Checking curley braces: YES", 1);
788 SetStatusText("Checking curley braces: NO", 1);
793 void MyFrame::OnOptionsSyntaxChecking(wxCommandEvent
& event
)
795 checkSyntax
= !checkSyntax
;
798 SetStatusText("Checking syntax: YES", 1);
802 SetStatusText("Checking syntax: NO", 1);
807 void MyFrame::OnHelp(wxCommandEvent
& event
)
810 HelpInstance
->LoadFile();
811 HelpInstance
->DisplayContents();
815 void MyFrame::OnAbout(wxCommandEvent
& event
)
819 char *platform
= " (32-bit)";
822 char *platform
= " (16-bit)";
827 sprintf(buf
, "Tex2RTF Version %.2f%s\nLaTeX to RTF, WinHelp, HTML and wxHelp Conversion\n\n(c) Julian Smart 1999", versionNo
, platform
);
828 wxMessageBox(buf
, "About Tex2RTF");
831 void ChooseInputFile(bool force
)
833 if (force
|| !InputFile
)
835 wxString s
= wxFileSelector("Choose LaTeX input file", wxPathOnly(InputFile
), wxFileNameFromPath(InputFile
), "tex", "*.tex");
838 // Different file, so clear index entries.
840 ResetContentsLevels(0);
844 InputFile
= copystring(s
);
845 wxString str
= wxFileNameFromPath(InputFile
);
847 buf
.Printf("Tex2RTF [%s]", str
.c_str());
848 frame
->SetTitle((char *)buf
.c_str());
854 void ChooseOutputFile(bool force
)
856 char extensionBuf
[10];
858 strcpy(wildBuf
, "*.");
861 path
= wxPathOnly(OutputFile
);
863 path
= wxPathOnly(InputFile
);
869 strcpy(extensionBuf
, "rtf");
870 strcat(wildBuf
, "rtf");
875 strcpy(extensionBuf
, "xlp");
876 strcat(wildBuf
, "xlp");
881 #if defined(__WXMSW__) && defined(__WIN16__)
882 strcpy(extensionBuf
, "htm");
883 strcat(wildBuf
, "htm");
885 strcpy(extensionBuf
, "html");
886 strcat(wildBuf
, "html");
891 if (force
|| !OutputFile
)
893 wxString s
= wxFileSelector("Choose output file", path
, wxFileNameFromPath(OutputFile
),
894 extensionBuf
, wildBuf
);
896 OutputFile
= copystring(s
);
908 if (!InputFile
|| !OutputFile
)
915 wxString str
= wxFileNameFromPath(InputFile
);
917 sprintf(buf
, "Tex2RTF [%s]", (const char*) str
);
918 frame
->SetTitle(buf
);
924 // Find extension-less filename
925 strcpy(FileRoot
, OutputFile
);
926 StripExtension(FileRoot
);
928 if (truncateFilenames
&& convertMode
== TEX_HTML
)
930 // Truncate to five characters. This ensures that
931 // we can generate DOS filenames such as thing999. But 1000 files
932 // may not be enough, of course...
933 char* sName
= wxFileNameFromPath( FileRoot
); // this Julian's method is non-destructive reference
936 if(strlen( sName
) > 5)
937 sName
[5] = '\0'; // that should do!
940 sprintf(ContentsName
, "%s.con", FileRoot
);
941 sprintf(TmpContentsName
, "%s.cn1", FileRoot
);
942 sprintf(TmpFrameContentsName
, "%s.frc", FileRoot
);
943 sprintf(WinHelpContentsFileName
, "%s.cnt", FileRoot
);
944 sprintf(RefName
, "%s.ref", FileRoot
);
946 TexPathList
.EnsureFileAccessible(InputFile
);
949 wxString s
= TexPathList
.FindValidPath("bullet.bmp");
952 wxString str
= wxFileNameFromPath(s
);
953 bulletFile
= copystring(str
);
957 if (wxFileExists(RefName
))
958 ReadTexReferences(RefName
);
960 bool success
= FALSE
;
962 if (InputFile
&& OutputFile
)
964 if (!FileExists(InputFile
))
966 OnError("Cannot open input file!");
974 buf
.Printf("Working, pass %d...Click CLOSE to abort", passNumber
);
975 frame
->SetStatusText((char *)buf
.c_str());
979 OnInform("Reading LaTeX file...");
980 TexLoadFile(InputFile
);
1003 OnInform("*** Aborted by user.");
1005 stopRunning
= FALSE
;
1010 WriteTexReferences(RefName
);
1012 startedSections
= FALSE
;
1016 long tim
= wxGetElapsedTime();
1017 buf
.Printf("Finished PASS #%d in %ld seconds.\n", passNumber
, (long)(tim
/1000.0));
1018 OnInform((char *)buf
.c_str());
1022 buf
.Printf("Errors encountered during this pass: %lu\n", errorCount
);
1023 OnInform((char *)buf
.c_str());
1028 buf
.Printf("Done, %d %s.", passNumber
, (passNumber
> 1) ? "passes" : "pass");
1029 frame
->SetStatusText((char *)buf
.c_str());
1032 buf
.Printf("Done, %d %s.", passNumber
, (passNumber
> 1) ? "passes" : "pass");
1033 OnInform((char *)buf
.c_str());
1036 buf
.Printf("Errors encountered during this pass: %lu\n", errorCount
);
1037 OnInform((char *)buf
.c_str());
1047 startedSections
= FALSE
;
1049 frame
->SetStatusText("Aborted by user.");
1051 OnInform("Sorry, unsuccessful.");
1056 void OnError(char *msg
)
1061 cerr
<< "Error: " << msg
<< "\n";
1064 if (isInteractive
&& frame
)
1065 (*frame
->textWindow
) << "Error: " << msg
<< "\n";
1069 cerr
<< "Error: " << msg
<< "\n";
1081 void OnInform(char *msg
)
1084 cout
<< msg
<< "\n";
1087 if (isInteractive
&& frame
)
1088 (*frame
->textWindow
) << msg
<< "\n";
1089 /* This whole block of code is just wrong I think. It would behave
1090 completely wrong under anything other than MSW due to the ELSE
1091 with no statement, and the cout calls would fail under MSW, as
1092 the code in this block is compiled if !NO_GUI This code has been
1093 here since v1.1 of this file too. - gt
1097 cout << msg << "\n";
1112 void OnMacro(int macroId
, int no_args
, bool start
)
1114 switch (convertMode
)
1118 RTFOnMacro(macroId
, no_args
, start
);
1123 XLPOnMacro(macroId
, no_args
, start
);
1128 HTMLOnMacro(macroId
, no_args
, start
);
1134 bool OnArgument(int macroId
, int arg_no
, bool start
)
1136 switch (convertMode
)
1140 return RTFOnArgument(macroId
, arg_no
, start
);
1145 return XLPOnArgument(macroId
, arg_no
, start
);
1150 return HTMLOnArgument(macroId
, arg_no
, start
);
1160 #if defined(__WXMSW__) && !defined(NO_GUI)
1166 wxConnectionBase
*Tex2RTFServer::OnAcceptConnection(const wxString
& topic
)
1168 if (topic
== "TEX2RTF")
1171 ipc_buffer
= new char[1000];
1173 return new Tex2RTFConnection(ipc_buffer
, 4000);
1183 Tex2RTFConnection::Tex2RTFConnection(char *buf
, int size
):wxDDEConnection(buf
, size
)
1187 Tex2RTFConnection::~Tex2RTFConnection(void)
1191 bool SplitCommand(char *data
, char *firstArg
, char *secondArg
)
1196 int len
= strlen(data
);
1198 // Find first argument (command name)
1201 if (data
[i
] == ' ' || data
[i
] == 0)
1205 firstArg
[i
] = data
[i
];
1212 // Find second argument
1215 while (data
[i
] != 0)
1217 secondArg
[j
] = data
[i
];
1226 bool Tex2RTFConnection::OnExecute(const wxString
& topic
, char *data
, int size
, int format
)
1228 strcpy(Tex2RTFLastStatus
, "OK");
1231 char secondArg
[300];
1232 if (SplitCommand(data
, firstArg
, secondArg
))
1234 bool hasArg
= (strlen(secondArg
) > 0);
1235 if (strcmp(firstArg
, "INPUT") == 0 && hasArg
)
1237 if (InputFile
) delete[] InputFile
;
1238 InputFile
= copystring(secondArg
);
1242 wxString str
= wxFileNameFromPath(InputFile
);
1243 sprintf(buf
, "Tex2RTF [%s]", (const char*) str
);
1244 frame
->SetTitle(buf
);
1247 else if (strcmp(firstArg
, "OUTPUT") == 0 && hasArg
)
1249 if (OutputFile
) delete[] OutputFile
;
1250 OutputFile
= copystring(secondArg
);
1252 else if (strcmp(firstArg
, "GO") == 0)
1254 strcpy(Tex2RTFLastStatus
, "WORKING");
1256 strcpy(Tex2RTFLastStatus
, "CONVERSION ERROR");
1258 strcpy(Tex2RTFLastStatus
, "OK");
1260 else if (strcmp(firstArg
, "EXIT") == 0)
1262 if (frame
) frame
->Close();
1264 else if (strcmp(firstArg
, "MINIMIZE") == 0 || strcmp(firstArg
, "ICONIZE") == 0)
1267 frame
->Iconize(TRUE
);
1269 else if (strcmp(firstArg
, "SHOW") == 0 || strcmp(firstArg
, "RESTORE") == 0)
1273 frame
->Iconize(FALSE
);
1279 // Try for a setting
1280 strcpy(Tex2RTFLastStatus
, RegisterSetting(firstArg
, secondArg
, FALSE
));
1282 if (frame
&& strcmp(firstArg
, "conversionMode") == 0)
1287 if (winHelp
&& (convertMode
== TEX_RTF
))
1288 strcat(buf
, "WinHelp RTF");
1289 else if (!winHelp
&& (convertMode
== TEX_RTF
))
1290 strcat(buf
, "linear RTF");
1291 else if (convertMode
== TEX_HTML
) strcat(buf
, "HTML");
1292 else if (convertMode
== TEX_XLP
) strcat(buf
, "XLP");
1293 strcat(buf
, " mode.");
1294 frame
->SetStatusText(buf
, 1);
1302 char *Tex2RTFConnection::OnRequest(const wxString
& topic
, const wxString
& item
, int *size
, int format
)
1304 return Tex2RTFLastStatus
;
1311 //void wxObject::Dump(ostream& str)
1313 // if (GetClassInfo() && GetClassInfo()->GetClassName())
1314 // str << GetClassInfo()->GetClassName();
1316 // str << "unknown object class";