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(" -checkcurleybraces");
600 OnInform(" -checksyntax");
601 OnInform(" -macros <filename>");
602 OnInform(" -winhelp");
610 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
611 EVT_CLOSE(MyFrame::OnCloseWindow
)
612 EVT_MENU(TEX_QUIT
, MyFrame::OnExit
)
613 EVT_MENU(TEX_GO
, MyFrame::OnGo
)
614 EVT_MENU(TEX_SET_INPUT
, MyFrame::OnSetInput
)
615 EVT_MENU(TEX_SET_OUTPUT
, MyFrame::OnSetOutput
)
616 EVT_MENU(TEX_SAVE_FILE
, MyFrame::OnSaveFile
)
617 EVT_MENU(TEX_VIEW_LATEX
, MyFrame::OnViewLatex
)
618 EVT_MENU(TEX_VIEW_OUTPUT
, MyFrame::OnViewOutput
)
619 EVT_MENU(TEX_VIEW_CUSTOM_MACROS
, MyFrame::OnShowMacros
)
620 EVT_MENU(TEX_LOAD_CUSTOM_MACROS
, MyFrame::OnLoadMacros
)
621 EVT_MENU(TEX_MODE_RTF
, MyFrame::OnModeRTF
)
622 EVT_MENU(TEX_MODE_WINHELP
, MyFrame::OnModeWinHelp
)
623 EVT_MENU(TEX_MODE_HTML
, MyFrame::OnModeHTML
)
624 EVT_MENU(TEX_MODE_XLP
, MyFrame::OnModeXLP
)
625 EVT_MENU(TEX_OPTIONS_CURELY_BRACE
, MyFrame::OnOptionsCurleyBrace
)
626 EVT_MENU(TEX_OPTIONS_SYNTAX_CHECKING
, MyFrame::OnOptionsSyntaxChecking
)
627 EVT_MENU(TEX_HELP
, MyFrame::OnHelp
)
628 EVT_MENU(TEX_ABOUT
, MyFrame::OnAbout
)
631 // My frame constructor
632 MyFrame::MyFrame(wxFrame
*frame
, wxWindowID id
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
):
633 wxFrame(frame
, id
, title
, pos
, size
)
636 void MyFrame::OnCloseWindow(wxCloseEvent
& event
)
638 if (!stopRunning
&& !OkToClose
)
650 void MyFrame::OnExit(wxCommandEvent
& event
)
656 void MyFrame::OnGo(wxCommandEvent
& event
)
660 menuBar
->EnableTop(0, FALSE
);
661 menuBar
->EnableTop(1, FALSE
);
662 menuBar
->EnableTop(2, FALSE
);
663 menuBar
->EnableTop(3, FALSE
);
673 menuBar
->EnableTop(0, TRUE
);
674 menuBar
->EnableTop(1, TRUE
);
675 menuBar
->EnableTop(2, TRUE
);
676 menuBar
->EnableTop(3, TRUE
);
679 void MyFrame::OnSetInput(wxCommandEvent
& event
)
681 ChooseInputFile(TRUE
);
684 void MyFrame::OnSetOutput(wxCommandEvent
& event
)
686 ChooseOutputFile(TRUE
);
689 void MyFrame::OnSaveFile(wxCommandEvent
& event
)
691 wxString s
= wxFileSelector("Save text to file", "", "", "txt", "*.txt");
694 textWindow
->SaveFile(s
);
696 sprintf(buf
, "Saved text to %s", (const char*) s
);
697 frame
->SetStatusText(buf
, 0);
701 void MyFrame::OnViewOutput(wxCommandEvent
& event
)
704 if (OutputFile
&& wxFileExists(OutputFile
))
706 textWindow
->LoadFile(OutputFile
);
708 wxString
str(wxFileNameFromPath(OutputFile
));
709 sprintf(buf
, "Tex2RTF [%s]", (const char*) str
);
710 frame
->SetTitle(buf
);
714 void MyFrame::OnViewLatex(wxCommandEvent
& event
)
717 if (InputFile
&& wxFileExists(InputFile
))
719 textWindow
->LoadFile(InputFile
);
721 wxString
str(wxFileNameFromPath(OutputFile
));
722 sprintf(buf
, "Tex2RTF [%s]", (const char*) str
);
723 frame
->SetTitle(buf
);
727 void MyFrame::OnLoadMacros(wxCommandEvent
& event
)
730 wxString s
= wxFileSelector("Choose custom macro file", wxPathOnly(MacroFile
), wxFileNameFromPath(MacroFile
), "ini", "*.ini");
731 if (s
!= "" && wxFileExists(s
))
733 MacroFile
= copystring(s
);
734 ReadCustomMacros((char*) (const char*) s
);
739 void MyFrame::OnShowMacros(wxCommandEvent
& event
)
746 void MyFrame::OnModeRTF(wxCommandEvent
& event
)
748 convertMode
= TEX_RTF
;
752 SetStatusText("In linear RTF mode.", 1);
755 void MyFrame::OnModeWinHelp(wxCommandEvent
& event
)
757 convertMode
= TEX_RTF
;
761 SetStatusText("In WinHelp RTF mode.", 1);
764 void MyFrame::OnModeHTML(wxCommandEvent
& event
)
766 convertMode
= TEX_HTML
;
770 SetStatusText("In HTML mode.", 1);
773 void MyFrame::OnModeXLP(wxCommandEvent
& event
)
775 convertMode
= TEX_XLP
;
778 SetStatusText("In XLP mode.", 1);
781 void MyFrame::OnOptionsCurleyBrace(wxCommandEvent
& event
)
783 checkCurleyBraces
= !checkCurleyBraces
;
784 if (checkCurleyBraces
)
786 SetStatusText("Checking curley braces: YES", 1);
790 SetStatusText("Checking curley braces: NO", 1);
795 void MyFrame::OnOptionsSyntaxChecking(wxCommandEvent
& event
)
797 checkSyntax
= !checkSyntax
;
800 SetStatusText("Checking syntax: YES", 1);
804 SetStatusText("Checking syntax: NO", 1);
809 void MyFrame::OnHelp(wxCommandEvent
& event
)
812 HelpInstance
->LoadFile();
813 HelpInstance
->DisplayContents();
817 void MyFrame::OnAbout(wxCommandEvent
& event
)
821 char *platform
= " (32-bit)";
824 char *platform
= " (16-bit)";
829 sprintf(buf
, "Tex2RTF Version %.2f%s\nLaTeX to RTF, WinHelp, HTML and wxHelp Conversion\n\n(c) Julian Smart 1999", versionNo
, platform
);
830 wxMessageBox(buf
, "About Tex2RTF");
833 void ChooseInputFile(bool force
)
835 if (force
|| !InputFile
)
837 wxString s
= wxFileSelector("Choose LaTeX input file", wxPathOnly(InputFile
), wxFileNameFromPath(InputFile
), "tex", "*.tex");
840 // Different file, so clear index entries.
842 ResetContentsLevels(0);
846 InputFile
= copystring(s
);
847 wxString str
= wxFileNameFromPath(InputFile
);
849 buf
.Printf("Tex2RTF [%s]", str
.c_str());
850 frame
->SetTitle((char *)buf
.c_str());
856 void ChooseOutputFile(bool force
)
858 char extensionBuf
[10];
860 strcpy(wildBuf
, "*.");
863 path
= wxPathOnly(OutputFile
);
865 path
= wxPathOnly(InputFile
);
871 strcpy(extensionBuf
, "rtf");
872 strcat(wildBuf
, "rtf");
877 strcpy(extensionBuf
, "xlp");
878 strcat(wildBuf
, "xlp");
883 #if defined(__WXMSW__) && defined(__WIN16__)
884 strcpy(extensionBuf
, "htm");
885 strcat(wildBuf
, "htm");
887 strcpy(extensionBuf
, "html");
888 strcat(wildBuf
, "html");
893 if (force
|| !OutputFile
)
895 wxString s
= wxFileSelector("Choose output file", path
, wxFileNameFromPath(OutputFile
),
896 extensionBuf
, wildBuf
);
898 OutputFile
= copystring(s
);
910 if (!InputFile
|| !OutputFile
)
917 wxString str
= wxFileNameFromPath(InputFile
);
919 sprintf(buf
, "Tex2RTF [%s]", (const char*) str
);
920 frame
->SetTitle(buf
);
926 // Find extension-less filename
927 strcpy(FileRoot
, OutputFile
);
928 StripExtension(FileRoot
);
930 if (truncateFilenames
&& convertMode
== TEX_HTML
)
932 // Truncate to five characters. This ensures that
933 // we can generate DOS filenames such as thing999. But 1000 files
934 // may not be enough, of course...
935 char* sName
= wxFileNameFromPath( FileRoot
); // this Julian's method is non-destructive reference
938 if(strlen( sName
) > 5)
939 sName
[5] = '\0'; // that should do!
942 sprintf(ContentsName
, "%s.con", FileRoot
);
943 sprintf(TmpContentsName
, "%s.cn1", FileRoot
);
944 sprintf(TmpFrameContentsName
, "%s.frc", FileRoot
);
945 sprintf(WinHelpContentsFileName
, "%s.cnt", FileRoot
);
946 sprintf(RefName
, "%s.ref", FileRoot
);
948 TexPathList
.EnsureFileAccessible(InputFile
);
951 wxString s
= TexPathList
.FindValidPath("bullet.bmp");
954 wxString str
= wxFileNameFromPath(s
);
955 bulletFile
= copystring(str
);
959 if (wxFileExists(RefName
))
960 ReadTexReferences(RefName
);
962 bool success
= FALSE
;
964 if (InputFile
&& OutputFile
)
966 if (!FileExists(InputFile
))
968 OnError("Cannot open input file!");
976 buf
.Printf("Working, pass %d...Click CLOSE to abort", passNumber
);
977 frame
->SetStatusText((char *)buf
.c_str());
981 OnInform("Reading LaTeX file...");
982 TexLoadFile(InputFile
);
1005 OnInform("*** Aborted by user.");
1007 stopRunning
= FALSE
;
1012 WriteTexReferences(RefName
);
1014 startedSections
= FALSE
;
1018 long tim
= wxGetElapsedTime();
1019 buf
.Printf("Finished PASS #%d in %ld seconds.\n", passNumber
, (long)(tim
/1000.0));
1020 OnInform((char *)buf
.c_str());
1024 buf
.Printf("Errors encountered during this pass: %lu\n", errorCount
);
1025 OnInform((char *)buf
.c_str());
1030 buf
.Printf("Done, %d %s.", passNumber
, (passNumber
> 1) ? "passes" : "pass");
1031 frame
->SetStatusText((char *)buf
.c_str());
1034 buf
.Printf("Done, %d %s.", passNumber
, (passNumber
> 1) ? "passes" : "pass");
1035 OnInform((char *)buf
.c_str());
1038 buf
.Printf("Errors encountered during this pass: %lu\n", errorCount
);
1039 OnInform((char *)buf
.c_str());
1049 startedSections
= FALSE
;
1052 frame
->SetStatusText("Aborted by user.");
1055 OnInform("Sorry, unsuccessful.");
1060 void OnError(char *msg
)
1065 cerr
<< "Error: " << msg
<< "\n";
1068 if (isInteractive
&& frame
)
1069 (*frame
->textWindow
) << "Error: " << msg
<< "\n";
1073 cerr
<< "Error: " << msg
<< "\n";
1085 void OnInform(char *msg
)
1088 cout
<< msg
<< "\n";
1091 if (isInteractive
&& frame
)
1092 (*frame
->textWindow
) << msg
<< "\n";
1093 /* This whole block of code is just wrong I think. It would behave
1094 completely wrong under anything other than MSW due to the ELSE
1095 with no statement, and the cout calls would fail under MSW, as
1096 the code in this block is compiled if !NO_GUI This code has been
1097 here since v1.1 of this file too. - gt
1101 cout << msg << "\n";
1116 void OnMacro(int macroId
, int no_args
, bool start
)
1118 switch (convertMode
)
1122 RTFOnMacro(macroId
, no_args
, start
);
1127 XLPOnMacro(macroId
, no_args
, start
);
1132 HTMLOnMacro(macroId
, no_args
, start
);
1138 bool OnArgument(int macroId
, int arg_no
, bool start
)
1140 switch (convertMode
)
1144 return RTFOnArgument(macroId
, arg_no
, start
);
1149 return XLPOnArgument(macroId
, arg_no
, start
);
1154 return HTMLOnArgument(macroId
, arg_no
, start
);
1164 #if defined(__WXMSW__) && !defined(NO_GUI)
1170 wxConnectionBase
*Tex2RTFServer::OnAcceptConnection(const wxString
& topic
)
1172 if (topic
== "TEX2RTF")
1175 ipc_buffer
= new char[1000];
1177 return new Tex2RTFConnection(ipc_buffer
, 4000);
1187 Tex2RTFConnection::Tex2RTFConnection(char *buf
, int size
):wxDDEConnection(buf
, size
)
1191 Tex2RTFConnection::~Tex2RTFConnection(void)
1195 bool SplitCommand(char *data
, char *firstArg
, char *secondArg
)
1200 int len
= strlen(data
);
1202 // Find first argument (command name)
1205 if (data
[i
] == ' ' || data
[i
] == 0)
1209 firstArg
[i
] = data
[i
];
1216 // Find second argument
1219 while (data
[i
] != 0)
1221 secondArg
[j
] = data
[i
];
1230 bool Tex2RTFConnection::OnExecute(const wxString
& topic
, char *data
, int size
, int format
)
1232 strcpy(Tex2RTFLastStatus
, "OK");
1235 char secondArg
[300];
1236 if (SplitCommand(data
, firstArg
, secondArg
))
1238 bool hasArg
= (strlen(secondArg
) > 0);
1239 if (strcmp(firstArg
, "INPUT") == 0 && hasArg
)
1241 if (InputFile
) delete[] InputFile
;
1242 InputFile
= copystring(secondArg
);
1246 wxString str
= wxFileNameFromPath(InputFile
);
1247 sprintf(buf
, "Tex2RTF [%s]", (const char*) str
);
1248 frame
->SetTitle(buf
);
1251 else if (strcmp(firstArg
, "OUTPUT") == 0 && hasArg
)
1253 if (OutputFile
) delete[] OutputFile
;
1254 OutputFile
= copystring(secondArg
);
1256 else if (strcmp(firstArg
, "GO") == 0)
1258 strcpy(Tex2RTFLastStatus
, "WORKING");
1260 strcpy(Tex2RTFLastStatus
, "CONVERSION ERROR");
1262 strcpy(Tex2RTFLastStatus
, "OK");
1264 else if (strcmp(firstArg
, "EXIT") == 0)
1266 if (frame
) frame
->Close();
1268 else if (strcmp(firstArg
, "MINIMIZE") == 0 || strcmp(firstArg
, "ICONIZE") == 0)
1271 frame
->Iconize(TRUE
);
1273 else if (strcmp(firstArg
, "SHOW") == 0 || strcmp(firstArg
, "RESTORE") == 0)
1277 frame
->Iconize(FALSE
);
1283 // Try for a setting
1284 strcpy(Tex2RTFLastStatus
, RegisterSetting(firstArg
, secondArg
, FALSE
));
1286 if (frame
&& strcmp(firstArg
, "conversionMode") == 0)
1291 if (winHelp
&& (convertMode
== TEX_RTF
))
1292 strcat(buf
, "WinHelp RTF");
1293 else if (!winHelp
&& (convertMode
== TEX_RTF
))
1294 strcat(buf
, "linear RTF");
1295 else if (convertMode
== TEX_HTML
) strcat(buf
, "HTML");
1296 else if (convertMode
== TEX_XLP
) strcat(buf
, "XLP");
1297 strcat(buf
, " mode.");
1298 frame
->SetStatusText(buf
, 1);
1306 char *Tex2RTFConnection::OnRequest(const wxString
& topic
, const wxString
& item
, int *size
, int format
)
1308 return Tex2RTFLastStatus
;
1315 //void wxObject::Dump(ostream& str)
1317 // if (GetClassInfo() && GetClassInfo()->GetClassName())
1318 // str << GetClassInfo()->GetClassName();
1320 // str << "unknown object class";