os:: patch from Ruurd + bindings display fix

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2005 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jean-Marc Lasgouttes 2001-05-17 15:11:01 +00:00
parent 97c5ea56cf
commit cdcb9b2cc0
38 changed files with 721 additions and 177 deletions

View File

@ -1,3 +1,7 @@
2001-05-16 Ruurd Reitsma <r.a.reitsma@wbmt.tudelft.nl>
* Added README.Win32
2001-04-15 Allan Rae <rae@lyx.org> 2001-04-15 Allan Rae <rae@lyx.org>
* Makefile.am (sourcedoc/Doxyfile): ensure modifications to doxygen * Makefile.am (sourcedoc/Doxyfile): ensure modifications to doxygen

39
README.Win32 Normal file
View File

@ -0,0 +1,39 @@
================================================================
README for Win32 by Ruurd Reitsma (R.A.Reitsma@wbmt.tudelft.nl)
================================================================
Lyx has been ported to Win32 using the Cygwin environement. The port
consists of a few small tweaks to deal with DOS-style pathnames, so
LyX can use Win32 TeX distros like fptex and MiKTeX. There's also a
cygwin TeTeX port, but the native Win32 ports have a definite speed
advantage. Besides that, nothing fancy.
The prerequisites are (obviously?):
* cygwin installation (http://www.cygwin.com/).
* decent X server; eXceed, X-Win32, or maybe even Cygwin/XFree86.
* working TeX installation; fpTex, MikTex.
It should compile out of the box, but there might be some libraries
missing in the final link step. You'll have to add them to the Makefile
by hand. Be sure to include -lregex, because cygwin's builtin regex is
sortof weird (filedialogs will turn up empty...)
If you want to run lyx with no console windows open, there's a small
program in development/Win32 that will set the proper environment vars
and start lyx.
Compile with:
gcc lyxwin32.C -O2 -o lyxwin32 -static -Wall -Wno-format \
-Wstrict-prototypes -Wmissing-prototypes -mwindows -e _mainCRTStartup
Also make sure the latex binaries are in your Windows path. Windvi and
Yap are auto detected, and you might want to make a symlink to Adobe
Acrobat so it's detected too:
ln -s //c/Program\ Files/adobe/Acrobat\ 4.0/Reader/AcroRd32.exe \
/usr/bin/acroread
Many thanks to Steven van Dijk, Claus Hentschel and Miyata Shigeru for
starting the porting business.

View File

@ -1,3 +1,7 @@
2001-05-16 Ruurd Reitsma <r.a.reitsma@wbmt.tudelft.nl>
* progtest.m4: added OS2 detection
2001-04-04 Lars Gullik Bjønnes <larsbj@birdstep.com> 2001-04-04 Lars Gullik Bjønnes <larsbj@birdstep.com>
* lyxinclude.m4: remove support for gcc 2.97 simplify calling for * lyxinclude.m4: remove support for gcc 2.97 simplify calling for

View File

@ -11,6 +11,19 @@
dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
AC_DEFUN(AM_PATH_PROG_WITH_TEST, AC_DEFUN(AM_PATH_PROG_WITH_TEST,
[case "`uname -s 2> /dev/null`" in
OS/2)
PATH=`echo -E "$PATH" | sed 's+\\\\+/+g'`
PATH_IFS=';'
EXE_EXT='.exe'
CMD_EXT='.cmd'
;;
*)
PATH_IFS=':'
EXE_EXT=''
CMD_EXT=''
;;
esac]
[# Extract the first word of "$2", so it can be a program name with args. [# Extract the first word of "$2", so it can be a program name with args.
set dummy $2; ac_word=[$]2 set dummy $2; ac_word=[$]2
AC_MSG_CHECKING([for $ac_word]) AC_MSG_CHECKING([for $ac_word])
@ -20,10 +33,12 @@ AC_CACHE_VAL(ac_cv_path_$1,
ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
;; ;;
*) *)
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}$PATH_IFS"
for ac_dir in ifelse([$5], , $PATH, [$5]); do for ac_dir in ifelse([$5], , $PATH, [$5]); do
test -z "$ac_dir" && ac_dir=. test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then if test -f $ac_dir/$ac_word \
-o -f $ac_dir/$ac_word$EXE_EXT \
-o -f $ac_dir/$ac_word$CMD_EXT; then
if [$3]; then if [$3]; then
ac_cv_path_$1="$ac_dir/$ac_word" ac_cv_path_$1="$ac_dir/$ac_word"
break break

View File

@ -1,3 +1,7 @@
2001-05-16 Ruurd Reitsma <r.a.reitsma@wbmt.tudelft.nl>
* Win32/lyxwin32.C added.
2001-04-17 Allan Rae <rae@lyx.org> 2001-04-17 Allan Rae <rae@lyx.org>
* tools/makeLyXsigc.sh: put the important local changes into sed * tools/makeLyXsigc.sh: put the important local changes into sed

View File

@ -0,0 +1,27 @@
PATH="/usr/local/lyx/bin:/usr/local/bin:/usr/X11R6/bin:/usr/bin:/bin:$PATH"
unset DOSDRIVE
unset DOSDIR
unset TMPDIR
unset TMP
USER="`id -un`"
# Set up USER's home directory; no spaces allowed in the path!
export HOME=//c/Docs/Lyx
export USER PATH
for i in /etc/profile.d/*.sh ; do
if [ -f $i ]; then
. $i
fi
done
export DISPLAY=localhost:0
export MAKE_MODE=unix
cd "$HOME"
test -f ./.bashrc && . ./.bashrc

View File

@ -0,0 +1,32 @@
#include <stdio.h> /* standard io library */
#include <stdlib.h> /* standard library */
#include <unistd.h> /* sleep , fork & exec */
#include <string.h> /* standard string library */
#include <errno.h>
int main ( int argc, char *argv[] )
{
/*char cmd [32000] = "lyx " ; */ /* user command */
char cmd [32000] = "lyx " ;
char *nargs [4 ] = { "/bin/bash", "-c" , cmd , NULL } ; /* execute with login /bin/bash */
int i=1;
putenv ( "BASH_ENV=/etc/lyxprofile" ) ; /* ensure bash reads my global env changes */
while ( i < argc ) /* do for all "real" args */
{
strcat ( cmd , "\"" ) ; /* add quote before */
strcat ( cmd , argv [ i ] ) ; /* add the argument */
strcat ( cmd , "\" " ) ; /* add closing quote */
i ++ ;
}
strcat ( cmd, "</dev/null 2>/dev/null");
fprintf ( stderr , "Command is: |%s|\n" , cmd );
execv ( "/bin/bash" , nargs ) ; /* exec sub command */
/* we should never reach here */
fprintf ( stderr , "Execute failed, error = %d\n" , errno ) ;
return ( 0 ) ; /* exit with no error */
}

View File

@ -1,3 +1,10 @@
2001-05-16 Ruurd Reitsma <r.a.reitsma@wbmt.tudelft.nl>
* configure.m4: detect cygwin, windvi and yap
* reLyX/acinclude.m4 :
* reLyX/configure.in : OS/2 fixes
2001-05-17 Lars Gullik Bjønnes <larsbj@birdstep.com> 2001-05-17 Lars Gullik Bjønnes <larsbj@birdstep.com>
* bind/latinkeys.bind: fixup more bindings. * bind/latinkeys.bind: fixup more bindings.

10
lib/configure vendored
View File

@ -72,6 +72,12 @@ if test ! -r ${srcdir}/chkconfig.ltx ; then
exit 1 exit 1
fi fi
#### Adjust PATH for Win32 (Cygwin)
if test "x$OSTYPE" = xcygwin; then
echo "configure: cygwin detected; path correction"
srcdir=`cygpath -w "${srcdir}" | tr '\\\\' /`
echo "srcdir=${srcdir}"
fi
#### Create the build directories if necessary #### Create the build directories if necessary
for dir in bind clipart doc examples images kbd layouts reLyX \ for dir in bind clipart doc examples images kbd layouts reLyX \
@ -522,9 +528,9 @@ fi
# Search something to preview dvi # Search something to preview dvi
echo $ac_n "checking for a DVI previewer""... $ac_c" echo $ac_n "checking for a DVI previewer""... $ac_c"
echo "$ac_t""(xdvi)" echo "$ac_t""(xdvi windvi yap)"
DVI_VIEWER= DVI_VIEWER=
for ac_prog in xdvi for ac_prog in xdvi windvi yap
do do
# Extract the first word of "$ac_prog", so it can be a program name with args. # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog ; ac_word=$2 set dummy $ac_prog ; ac_word=$2

View File

@ -148,6 +148,12 @@ if test ! -r ${srcdir}/chkconfig.ltx ; then
exit 1 exit 1
fi fi
#### Adjust PATH for Win32 (Cygwin)
if test "x$OSTYPE" = xcygwin; then
echo "configure: cygwin detected; path correction"
srcdir=`cygpath -w "${srcdir}" | tr '\\\\' /`
echo "srcdir=${srcdir}"
fi
#### Create the build directories if necessary #### Create the build directories if necessary
for dir in bind clipart doc examples images kbd layouts reLyX \ for dir in bind clipart doc examples images kbd layouts reLyX \
@ -219,7 +225,7 @@ SEARCH_PROG([for a Postscript previewer],GHOSTVIEW,gv ghostview)
SEARCH_PROG([for a PDF preview],PDF_VIEWER,acroread gv ghostview xpdf) SEARCH_PROG([for a PDF preview],PDF_VIEWER,acroread gv ghostview xpdf)
# Search something to preview dvi # Search something to preview dvi
SEARCH_PROG([for a DVI previewer],DVI_VIEWER, xdvi) SEARCH_PROG([for a DVI previewer],DVI_VIEWER, xdvi windvi yap)
# Search something to preview html # Search something to preview html
SEARCH_PROG([for a HTML previewer],HTML_VIEWER, netscape) SEARCH_PROG([for a HTML previewer],HTML_VIEWER, netscape)

View File

@ -10,15 +10,24 @@ relyx_warning=yes])
dnl RELYX_SEARCH_PROG(VARIABLE-NAME,PROGRAMS-LIST,ACTION-IF-FOUND) dnl RELYX_SEARCH_PROG(VARIABLE-NAME,PROGRAMS-LIST,ACTION-IF-FOUND)
dnl dnl
define(RELYX_SEARCH_PROG,[dnl define(RELYX_SEARCH_PROG,[dnl
case "`uname -s 2> /dev/null`" in
OS/2)
PATH=`echo -E "$PATH" | sed 's+\\\\+/+g'`
PATH_IFS=';'
;;
*)
PATH_IFS=':'
;;
esac
for ac_prog in $2 ; do for ac_prog in $2 ; do
# Extract the first word of "$ac_prog", so it can be a program name with # Extract the first word of "$ac_prog", so it can be a program name with
# args. # args.
set dummy $ac_prog ; ac_word=$[2] set dummy $ac_prog ; ac_word=$[2]
if test ! -n "[$]$1"; then if test ! -n "[$]$1"; then
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}$PATH_IFS"
for ac_dir in $PATH; do for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=. test -z "$ac_dir" && ac_dir=.
if test -f [$ac_dir/$ac_word]; then if test -f [$ac_dir/$ac_word] -o -f [$ac_dir/$ac_word$ac_exeext]; then
$1="$ac_prog" $1="$ac_prog"
break break
fi fi

View File

@ -2,6 +2,7 @@ dnl Process with autoconf to generate configure script -*- sh -*-
AC_INIT(reLyX.in) AC_INIT(reLyX.in)
AC_PREREQ(2.13) dnl We want to use autoconf 2.13 AC_PREREQ(2.13) dnl We want to use autoconf 2.13
AC_CONFIG_AUX_DIR(../../config) AC_CONFIG_AUX_DIR(../../config)
AC_EXEEXT
dnl PACKAGE=reLyX dnl PACKAGE=reLyX
dnl Do this to install in $datadir/lyx/reLyX instead of $datadir/reLyX/reLyX dnl Do this to install in $datadir/lyx/reLyX instead of $datadir/reLyX/reLyX

View File

@ -10,8 +10,8 @@ src/CutAndPaste.C
src/debug.C src/debug.C
src/exporter.C src/exporter.C
src/ext_l10n.h src/ext_l10n.h
src/figure_form.C
src/figureForm.C src/figureForm.C
src/figure_form.C
src/FontLoader.C src/FontLoader.C
src/frontends/controllers/ButtonController.h src/frontends/controllers/ButtonController.h
src/frontends/controllers/character.C src/frontends/controllers/character.C
@ -90,67 +90,67 @@ src/frontends/qt2/paragraphdlgimpl.C
src/frontends/qt2/tabularcreatedlgimpl.C src/frontends/qt2/tabularcreatedlgimpl.C
src/frontends/xforms/combox.C src/frontends/xforms/combox.C
src/frontends/xforms/FileDialog.C src/frontends/xforms/FileDialog.C
src/frontends/xforms/form_bibitem.C
src/frontends/xforms/FormBibitem.C src/frontends/xforms/FormBibitem.C
src/frontends/xforms/form_bibtex.C src/frontends/xforms/form_bibitem.C
src/frontends/xforms/FormBibtex.C src/frontends/xforms/FormBibtex.C
src/frontends/xforms/form_bibtex.C
src/frontends/xforms/form_browser.C src/frontends/xforms/form_browser.C
src/frontends/xforms/form_character.C
src/frontends/xforms/FormCharacter.C src/frontends/xforms/FormCharacter.C
src/frontends/xforms/form_citation.C src/frontends/xforms/form_character.C
src/frontends/xforms/FormCitation.C src/frontends/xforms/FormCitation.C
src/frontends/xforms/form_copyright.C src/frontends/xforms/form_citation.C
src/frontends/xforms/FormCopyright.C src/frontends/xforms/FormCopyright.C
src/frontends/xforms/form_credits.C src/frontends/xforms/form_copyright.C
src/frontends/xforms/FormCredits.C src/frontends/xforms/FormCredits.C
src/frontends/xforms/form_document.C src/frontends/xforms/form_credits.C
src/frontends/xforms/FormDocument.C src/frontends/xforms/FormDocument.C
src/frontends/xforms/form_error.C src/frontends/xforms/form_document.C
src/frontends/xforms/FormError.C src/frontends/xforms/FormError.C
src/frontends/xforms/form_external.C src/frontends/xforms/form_error.C
src/frontends/xforms/FormExternal.C src/frontends/xforms/FormExternal.C
src/frontends/xforms/form_filedialog.C src/frontends/xforms/form_external.C
src/frontends/xforms/FormFiledialog.C src/frontends/xforms/FormFiledialog.C
src/frontends/xforms/form_graphics.C src/frontends/xforms/form_filedialog.C
src/frontends/xforms/FormGraphics.C src/frontends/xforms/FormGraphics.C
src/frontends/xforms/form_include.C src/frontends/xforms/form_graphics.C
src/frontends/xforms/FormInclude.C src/frontends/xforms/FormInclude.C
src/frontends/xforms/form_index.C src/frontends/xforms/form_include.C
src/frontends/xforms/FormIndex.C src/frontends/xforms/FormIndex.C
src/frontends/xforms/form_index.C
src/frontends/xforms/FormLog.C src/frontends/xforms/FormLog.C
src/frontends/xforms/FormMathsBitmap.C src/frontends/xforms/FormMathsBitmap.C
src/frontends/xforms/form_maths_deco.C
src/frontends/xforms/FormMathsDeco.C src/frontends/xforms/FormMathsDeco.C
src/frontends/xforms/form_maths_delim.C src/frontends/xforms/form_maths_deco.C
src/frontends/xforms/FormMathsDelim.C src/frontends/xforms/FormMathsDelim.C
src/frontends/xforms/form_maths_matrix.C src/frontends/xforms/form_maths_delim.C
src/frontends/xforms/FormMathsMatrix.C src/frontends/xforms/FormMathsMatrix.C
src/frontends/xforms/form_maths_panel.C src/frontends/xforms/form_maths_matrix.C
src/frontends/xforms/FormMathsPanel.C src/frontends/xforms/FormMathsPanel.C
src/frontends/xforms/form_maths_space.C src/frontends/xforms/form_maths_panel.C
src/frontends/xforms/FormMathsSpace.C src/frontends/xforms/FormMathsSpace.C
src/frontends/xforms/form_minipage.C src/frontends/xforms/form_maths_space.C
src/frontends/xforms/FormMinipage.C src/frontends/xforms/FormMinipage.C
src/frontends/xforms/form_paragraph.C src/frontends/xforms/form_minipage.C
src/frontends/xforms/FormParagraph.C src/frontends/xforms/FormParagraph.C
src/frontends/xforms/form_preamble.C src/frontends/xforms/form_paragraph.C
src/frontends/xforms/FormPreamble.C src/frontends/xforms/FormPreamble.C
src/frontends/xforms/form_preferences.C src/frontends/xforms/form_preamble.C
src/frontends/xforms/FormPreferences.C src/frontends/xforms/FormPreferences.C
src/frontends/xforms/form_print.C src/frontends/xforms/form_preferences.C
src/frontends/xforms/FormPrint.C src/frontends/xforms/FormPrint.C
src/frontends/xforms/form_ref.C src/frontends/xforms/form_print.C
src/frontends/xforms/FormRef.C src/frontends/xforms/FormRef.C
src/frontends/xforms/form_search.C src/frontends/xforms/form_ref.C
src/frontends/xforms/FormSearch.C src/frontends/xforms/FormSearch.C
src/frontends/xforms/form_tabular.C src/frontends/xforms/form_search.C
src/frontends/xforms/FormTabular.C src/frontends/xforms/FormTabular.C
src/frontends/xforms/form_tabular_create.C src/frontends/xforms/form_tabular.C
src/frontends/xforms/FormTabularCreate.C src/frontends/xforms/FormTabularCreate.C
src/frontends/xforms/form_toc.C src/frontends/xforms/form_tabular_create.C
src/frontends/xforms/FormToc.C src/frontends/xforms/FormToc.C
src/frontends/xforms/form_url.C src/frontends/xforms/form_toc.C
src/frontends/xforms/FormUrl.C src/frontends/xforms/FormUrl.C
src/frontends/xforms/form_url.C
src/frontends/xforms/FormVCLog.C src/frontends/xforms/FormVCLog.C
src/frontends/xforms/input_validators.C src/frontends/xforms/input_validators.C
src/frontends/xforms/Menubar_pimpl.C src/frontends/xforms/Menubar_pimpl.C

View File

@ -1,3 +1,19 @@
2001-05-16 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
* kbmap.C (findbinding): clean it up and make it work correctly.
* lyx_main.C (init): do not pass argc and argv as parameters
2001-05-16 Ruurd Reitsma <r.a.reitsma@wbmt.tudelft.nl>
* buffer.C: fix path for OS/2 & Win32
* lyx_gui.C
* lyx_main
* lyx_main.C: Added os:: class.
* os2_defines.h: update
2001-05-17 Lars Gullik Bjønnes <larsbj@birdstep.com> 2001-05-17 Lars Gullik Bjønnes <larsbj@birdstep.com>
* lyxfunc.[Ch] (processKeySym): return void. Handle unknown actions * lyxfunc.[Ch] (processKeySym): return void. Handle unknown actions

View File

@ -80,6 +80,7 @@
#include "insets/insetfloatlist.h" #include "insets/insetfloatlist.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/path.h" #include "support/path.h"
#include "support/os.h"
#include "LaTeX.h" #include "LaTeX.h"
#include "Chktex.h" #include "Chktex.h"
#include "LyXView.h" #include "LyXView.h"
@ -1341,7 +1342,7 @@ bool Buffer::save() const
s = fileName() + '~'; s = fileName() + '~';
if (!lyxrc.backupdir_path.empty()) if (!lyxrc.backupdir_path.empty())
s = AddName(lyxrc.backupdir_path, s = AddName(lyxrc.backupdir_path,
subst(CleanupPath(s),'/','!')); subst(os::slashify_path(s),'/','!'));
// Rename is the wrong way of making a backup, // Rename is the wrong way of making a backup,
// this is the correct way. // this is the correct way.
@ -1769,7 +1770,7 @@ void Buffer::makeLaTeXFile(string const & fname,
if (!original_path.empty()) { if (!original_path.empty()) {
ofs << "\\makeatletter\n" ofs << "\\makeatletter\n"
<< "\\def\\input@path{{" << "\\def\\input@path{{"
<< original_path << "/}}\n" << os::external_path(original_path) << "/}}\n"
<< "\\makeatother\n"; << "\\makeatother\n";
texrow.newline(); texrow.newline();
texrow.newline(); texrow.newline();

View File

@ -1,3 +1,8 @@
2001-05-16 Ruurd Reitsma <r.a.reitsma@wbmt.tudelft.nl>
* figinset.C
* insetbib.C: fix path for OS/2 & Win32
2001-05-10 Lars Gullik Bjønnes <larsbj@birdstep.com> 2001-05-10 Lars Gullik Bjønnes <larsbj@birdstep.com>
* insetfoot.C (Latex): don't use % after footnote. * insetfoot.C (Latex): don't use % after footnote.

View File

@ -57,6 +57,7 @@
#include "lyx_gui_misc.h" // CancelCloseBoxCB #include "lyx_gui_misc.h" // CancelCloseBoxCB
#include "support/FileInfo.h" #include "support/FileInfo.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/os.h"
#include "Painter.h" #include "Painter.h"
#include "font.h" #include "font.h"
#include "bufferview_funcs.h" #include "bufferview_funcs.h"
@ -1919,7 +1920,7 @@ void InsetFig::Preview(string const & p)
if (GetExtension(tfname).empty()) if (GetExtension(tfname).empty())
tfname += ".eps"; tfname += ".eps";
string buf1 = OnlyPath(owner->fileName()); string buf1 = OnlyPath(owner->fileName());
string buf2 = MakeAbsPath(tfname, buf1); string buf2 = os::external_path(MakeAbsPath(tfname, buf1));
if (!formats.View(owner, buf2, "eps")) if (!formats.View(owner, buf2, "eps"))
lyxerr << "Can't view " << buf2 << endl; lyxerr << "Can't view " << buf2 << endl;
} }

View File

@ -17,6 +17,7 @@
#include "lyxtext.h" #include "lyxtext.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/path.h" #include "support/path.h"
#include "support/os.h"
#include "lyxrc.h" #include "lyxrc.h"
#include "font.h" #include "font.h"
#include "LyXView.h" #include "LyXView.h"
@ -141,7 +142,7 @@ int InsetBibtex::Latex(Buffer const * buffer, ostream & os,
while(!adb.empty()) { while(!adb.empty()) {
if (!buffer->niceFile && if (!buffer->niceFile &&
IsFileReadable(MakeAbsPath(adb, buffer->filepath)+".bib")) IsFileReadable(MakeAbsPath(adb, buffer->filepath)+".bib"))
adb = MakeAbsPath(adb, buffer->filepath); adb = os::external_path(MakeAbsPath(adb, buffer->filepath));
db_out += adb; db_out += adb;
db_out += ','; db_out += ',';

View File

@ -234,7 +234,7 @@ string const kb_keymap::keyname(kb_key const & k)
// Finds a key for a keyaction, if possible // Finds a key for a keyaction, if possible
string const kb_keymap::findbinding(int act) const string const kb_keymap::findbinding(int act, string const & prefix) const
{ {
string res; string res;
if (table.empty()) return res; if (table.empty()) return res;
@ -243,17 +243,13 @@ string const kb_keymap::findbinding(int act) const
for (Table::const_iterator cit = table.begin(); for (Table::const_iterator cit = table.begin();
cit != end; ++cit) { cit != end; ++cit) {
if ((*cit).table.get()) { if ((*cit).table.get()) {
string suffix = (*cit).table->findbinding(act); res += (*cit).table->findbinding(act,
suffix = strip(suffix, ' '); prefix
suffix = strip(suffix, ']'); + keyname((*cit))
suffix = frontStrip(suffix, '['); + " ");
if (!suffix.empty()) {
res += "[" + keyname((*cit)) + " "
+ suffix + "] ";
}
} else if ((*cit).action == act) { } else if ((*cit).action == act) {
res += "["; res += "[";
res += keyname((*cit)); res += prefix + keyname((*cit));
res += "] "; res += "] ";
} }
} }

View File

@ -36,7 +36,8 @@ public:
unsigned int mod, kb_sequence * seq) const; unsigned int mod, kb_sequence * seq) const;
/// Given an action, find all keybindings. /// Given an action, find all keybindings.
string const findbinding(int action) const; string const findbinding(int action,
string const & prefix = string()) const;
private: private:
/// ///
struct kb_key { struct kb_key {

View File

@ -19,6 +19,7 @@
#include "lyx_gui.h" #include "lyx_gui.h"
#include FORMS_H_LOCATION #include FORMS_H_LOCATION
#include "support/filetools.h" #include "support/filetools.h"
#include "support/os.h"
#include "figure_form.h" #include "figure_form.h"
#include "print_form.h" #include "print_form.h"
#include "tex-strings.h" #include "tex-strings.h"
@ -117,6 +118,7 @@ LyXGUI::LyXGUI(LyX * owner, int * argc, char * argv[], bool GUI)
Display * display = fl_get_display(); Display * display = fl_get_display();
if (!display) { if (!display) {
lyxerr << "LyX: unable to access X display, exiting" << endl; lyxerr << "LyX: unable to access X display, exiting" << endl;
os::warn("Unable to access X display, exiting");
exit(1); exit(1);
} }
fcntl(ConnectionNumber(display), F_SETFD, FD_CLOEXEC); fcntl(ConnectionNumber(display), F_SETFD, FD_CLOEXEC);

View File

@ -41,6 +41,7 @@
#include "encoding.h" #include "encoding.h"
#include "converter.h" #include "converter.h"
#include "language.h" #include "language.h"
#include "support/os.h"
using std::endl; using std::endl;
@ -106,7 +107,7 @@ LyX::LyX(int * argc, char * argv[])
// Initialization of LyX (reads lyxrc and more) // Initialization of LyX (reads lyxrc and more)
lyxerr[Debug::INIT] << "Initializing LyX::init..." << endl; lyxerr[Debug::INIT] << "Initializing LyX::init..." << endl;
init(argc, argv, gui); init(gui);
lyxerr[Debug::INIT] << "Initializing LyX::init...done" << endl; lyxerr[Debug::INIT] << "Initializing LyX::init...done" << endl;
lyxGUI->init(); lyxGUI->init();
@ -184,7 +185,7 @@ LyX::~LyX()
extern "C" void error_handler(int err_sig); extern "C" void error_handler(int err_sig);
void LyX::init(int */*argc*/, char **argv, bool gui) void LyX::init(bool gui)
{ {
// Install the signal handlers // Install the signal handlers
signal(SIGHUP, error_handler); signal(SIGHUP, error_handler);
@ -198,27 +199,9 @@ void LyX::init(int */*argc*/, char **argv, bool gui)
// //
string fullbinpath; string fullbinpath;
string binpath = subst(argv[0], '\\', '/'); string binpath = os::binpath();
string binname = OnlyFilename(argv[0]); string binname = os::binname();
// Sorry for system specific code. (SMiyata)
if (suffixIs(binname, ".exe"))
binname.erase(binname.length()-4, string::npos);
binpath = ExpandPath(binpath); // This expands ./ and ~/
if (!AbsolutePath(binpath)) {
string binsearchpath = GetEnvPath("PATH");
// This will make "src/lyx" work always :-)
binsearchpath += ";.";
binpath = FileOpenSearch(binsearchpath, argv[0]);
}
fullbinpath = binpath; fullbinpath = binpath;
binpath = MakeAbsPath(OnlyPath(binpath));
// In case we are running in place and compiled with shared libraries
if (suffixIs(binpath, "/.libs/"))
binpath.erase(binpath.length()-6, string::npos);
if (binpath.empty()) { if (binpath.empty()) {
lyxerr << _("Warning: could not determine path of binary.") lyxerr << _("Warning: could not determine path of binary.")
@ -444,7 +427,8 @@ void LyX::init(int */*argc*/, char **argv, bool gui)
} }
// Create temp directory // Create temp directory
system_tempdir = CreateLyXTmpDir(lyxrc.tempdir_path); os::setTmpDir(CreateLyXTmpDir(lyxrc.tempdir_path));
system_tempdir = os::getTmpDir();
if (lyxerr.debugging(Debug::INIT)) { if (lyxerr.debugging(Debug::INIT)) {
lyxerr << "LyX tmp dir: `" << system_tempdir << '\'' << endl; lyxerr << "LyX tmp dir: `" << system_tempdir << '\'' << endl;
} }

View File

@ -61,7 +61,7 @@ private:
/// ///
void runtime(); void runtime();
/// ///
void init(int * argc, char * argv[], bool); void init(bool);
/// ///
void defaultKeyBindings(kb_keymap * kbmap); void defaultKeyBindings(kb_keymap * kbmap);
/// ///

View File

@ -14,11 +14,13 @@
#include "gettext.h" #include "gettext.h"
#include "LString.h" #include "LString.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "support/os.h"
#include "frontends/GUIRunTime.h" #include "frontends/GUIRunTime.h"
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
os::init(&argc, &argv);
int const val = GUIRunTime::initApplication(argc, argv); int const val = GUIRunTime::initApplication(argc, argv);
if (val) if (val)
return val; return val;
@ -33,10 +35,6 @@ int main(int argc, char * argv[])
locale_init(); locale_init();
gettext_init(lyx_localedir); gettext_init(lyx_localedir);
#ifdef __EMX__
_wildcard(&argc, &argv);
#endif
LyX lyx(&argc, argv); LyX lyx(&argc, argv);
return 0; // SUCCESS return 0; // SUCCESS
} }

View File

@ -13,16 +13,22 @@
#ifndef OS2_DEFINES_H #ifndef OS2_DEFINES_H
#define OS2_DEFINES_H #define OS2_DEFINES_H
#if defined (__cplusplus)
#include <cctype> #include <cctype>
#include <process.h>
#include <cstdlib> #include <cstdlib>
extern "C" inline int readlink(const char *, char *, size_t) {return -1;}
#else
#include <ctype.h>
#include <stdlib.h>
#define readlink(s, t, l) (-1)
#endif
#include <process.h>
#include <unistd.h> #include <unistd.h>
#include <X11/Xlocale.h> #include <X11/Xlocale.h>
/* #include <malloc.h> */ /* #include <malloc.h> */
#define lstat stat #define lstat stat
#define S_ISLNK(x) false #define S_ISLNK(x) false
#define S_ISBLK(x) false #define S_ISBLK(x) false
#define readlink(s, t, l) (strcpy(t, s), strlen(t))
/*#define mkfifo(p, m) (0) *//* LyXserver is temporary disabled. */ /*#define mkfifo(p, m) (0) *//* LyXserver is temporary disabled. */
#define chdir _chdir2 #define chdir _chdir2
#define strcasecmp stricmp #define strcasecmp stricmp

View File

@ -1,3 +1,20 @@
2001-05-16 Ruurd Reitsma <r.a.reitsma@wbmt.tudelft.nl>
* FileInfo.h: X_OK workaround for cygwin
* Makefile.am:
* os.C:
* os.h:
* os_os2.C:
* os_unix.C:
* os_win32.C:
* filetools.C:
* filetools.h: Added os:: class.
* rename.C:
* syscall.C:
* tempname.C: OS/2 fixes
2001-05-03 Lars Gullik Bjønnes <larsbj@birdstep.com> 2001-05-03 Lars Gullik Bjønnes <larsbj@birdstep.com>
* textutils.h: remvoe !NEW_INSETS cruft * textutils.h: remvoe !NEW_INSETS cruft

View File

@ -24,6 +24,11 @@
#include <boost/utility.hpp> #include <boost/utility.hpp>
#include "LString.h" #include "LString.h"
#if defined(__CYGWIN__) //Cygwin has it's own concept of X_OK ???
#undef X_OK
#define X_OK 1
#endif
/** Use objects of this class to get information about files. /** Use objects of this class to get information about files.
*/ */
class FileInfo : boost::noncopyable { class FileInfo : boost::noncopyable {

View File

@ -29,6 +29,8 @@ libsupport_la_SOURCES = \
LRegex.h \ LRegex.h \
LSubstring.C \ LSubstring.C \
LSubstring.h \ LSubstring.h \
os.C \
os.h \
StrPool.C \ StrPool.C \
StrPool.h \ StrPool.h \
abort.C \ abort.C \

View File

@ -34,6 +34,7 @@
#include "support/path.h" // I know it's OS/2 specific (SMiyata) #include "support/path.h" // I know it's OS/2 specific (SMiyata)
#include "gettext.h" #include "gettext.h"
#include "lyxlib.h" #include "lyxlib.h"
#include "os.h"
// Which part of this is still necessary? (JMarc). // Which part of this is still necessary? (JMarc).
#if HAVE_DIRENT_H #if HAVE_DIRENT_H
@ -103,12 +104,9 @@ string const MakeLatexName(string const & file)
// Substitutes spaces with underscores in filename (and path) // Substitutes spaces with underscores in filename (and path)
string const QuoteName(string const & name) string const QuoteName(string const & name)
{ {
// CHECK Add proper emx support here! return (os::shell() == os::UNIX) ?
#ifndef __EMX__ "\'" + name + "\'":
return "\'" + name + "\'"; "\"" + name + "\"";
#else
return name;
#endif
} }
@ -172,7 +170,7 @@ string const FileOpenSearch (string const & path, string const & name,
string tmppath = split(path, path_element, ';'); string tmppath = split(path, path_element, ';');
while (notfound && !path_element.empty()) { while (notfound && !path_element.empty()) {
path_element = CleanupPath(path_element); path_element = os::slashify_path(path_element);
if (!suffixIs(path_element, '/')) if (!suffixIs(path_element, '/'))
path_element+= '/'; path_element+= '/';
path_element = subst(path_element, "$$LyX", system_lyxdir); path_element = subst(path_element, "$$LyX", system_lyxdir);
@ -249,7 +247,6 @@ string const FileSearch(string const & path, string const & name,
// Expand Environmentvariables in 'name' // Expand Environmentvariables in 'name'
string const tmpname = ReplaceEnvironmentPath(name); string const tmpname = ReplaceEnvironmentPath(name);
string fullname = MakeAbsPath(tmpname, path); string fullname = MakeAbsPath(tmpname, path);
// search first without extension, then with it. // search first without extension, then with it.
if (IsFileReadable(fullname)) if (IsFileReadable(fullname))
return fullname; return fullname;
@ -321,7 +318,7 @@ string const GetEnvPath(string const & name)
#ifndef __EMX__ #ifndef __EMX__
string const pathlist = subst(GetEnv(name), ':', ';'); string const pathlist = subst(GetEnv(name), ':', ';');
#else #else
string const pathlist = subst(GetEnv(name), '\\', '/'); string const pathlist = os::slashify_path(GetEnv(name));
#endif #endif
return strip(pathlist, ';'); return strip(pathlist, ';');
} }
@ -469,7 +466,18 @@ int DestroyTmpDir(string const & tmpdir, bool Allfiles)
string const CreateBufferTmpDir(string const & pathfor) string const CreateBufferTmpDir(string const & pathfor)
{ {
return CreateTmpDir(pathfor, "lyx_tmpbuf"); static int count = 0;
static string const tmpdir(pathfor.empty() ? os::getTmpDir() : pathfor);
// We are in our own directory. Why bother to mangle name?
// In fact I wrote this code to circumvent a problematic behaviour (bug?)
// of EMX mkstemp().
string tmpfl = tmpdir + "/lyx_tmpbuf" + tostr(count++);
if (lyx::mkdir(tmpfl, 0777)) {
WriteFSAlert(_("Error! Couldn't create temporary directory:"),
tmpdir);
return string();
}
return tmpfl;
} }
@ -509,7 +517,7 @@ int DestroyLyXTmpDir(string const & tmpdir)
// Creates directory. Returns true if succesfull // Creates directory. Returns true if succesfull
bool createDirectory(string const & path, int permission) bool createDirectory(string const & path, int permission)
{ {
string temp(strip(CleanupPath(path), '/')); string temp(strip(os::slashify_path(path), '/'));
if (temp.empty()) { if (temp.empty()) {
WriteAlert(_("Internal error!"), WriteAlert(_("Internal error!"),
@ -546,31 +554,20 @@ string const MakeAbsPath(string const & RelPath, string const & BasePath)
{ {
// checks for already absolute path // checks for already absolute path
if (AbsolutePath(RelPath)) if (AbsolutePath(RelPath))
#ifdef __EMX__
if (RelPath[0]!= '/' && RelPath[0]!= '\\')
#endif
return RelPath; return RelPath;
// Copies given paths // Copies given paths
string TempRel(CleanupPath(RelPath)); string TempRel(os::slashify_path(RelPath));
lyxerr << "TempRel=" << TempRel <<endl;
// Since TempRel is NOT absolute, we can safely replace "//" with "/"
TempRel = subst(TempRel, "//", "/");
string TempBase; string TempBase;
if (!BasePath.empty()) { if (AbsolutePath(BasePath))
#ifndef __EMX__
TempBase = BasePath; TempBase = BasePath;
#else else
char * with_drive = new char[_MAX_PATH]; TempBase = AddPath(lyx::getcwd(), BasePath);
_abspath(with_drive, BasePath.c_str(), _MAX_PATH);
TempBase = with_drive;
delete[] with_drive;
#endif
} else
TempBase = lyx::getcwd(); //GetCWD();
#ifdef __EMX__
if (AbsolutePath(TempRel))
return TempBase.substr(0, 2) + TempRel;
#endif
// Handle /./ at the end of the path // Handle /./ at the end of the path
while(suffixIs(TempBase, "/./")) while(suffixIs(TempBase, "/./"))
@ -600,6 +597,9 @@ string const MakeAbsPath(string const & RelPath, string const & BasePath)
TempBase.erase(i, string::npos); TempBase.erase(i, string::npos);
else else
TempBase += '/'; TempBase += '/';
} else if (Temp.empty() && !RTemp.empty()) {
TempBase = os::current_root() + RTemp;
RTemp.erase();
} else { } else {
// Add this piece to TempBase // Add this piece to TempBase
if (!suffixIs(TempBase, '/')) if (!suffixIs(TempBase, '/'))
@ -609,7 +609,7 @@ string const MakeAbsPath(string const & RelPath, string const & BasePath)
} }
// returns absolute path // returns absolute path
return TempBase; return os::slashify_path(TempBase);
} }
@ -624,7 +624,7 @@ string const AddName(string const & path, string const & fname)
string buf; string buf;
if (path != "." && path != "./" && !path.empty()) { if (path != "." && path != "./" && !path.empty()) {
buf = CleanupPath(path); buf = os::slashify_path(path);
if (!suffixIs(path, '/')) if (!suffixIs(path, '/'))
buf += '/'; buf += '/';
} }
@ -654,7 +654,7 @@ bool AbsolutePath(string const & path)
#ifndef __EMX__ #ifndef __EMX__
return (!path.empty() && path[0] == '/'); return (!path.empty() && path[0] == '/');
#else #else
return (!path.empty() && (path[0] == '/' || (isalpha(static_cast<unsigned char>(path[0])) && path.length()>1 && path[1] == ':'))); return (!path.empty() && isalpha(static_cast<unsigned char>(path[0])) && path.length() > 1 && path[1] == ':');
#endif #endif
} }
@ -726,18 +726,6 @@ string const NormalizePath(string const & path)
} }
string const CleanupPath(string const & path)
{
#ifdef __EMX__ /* SMiyata: This should fix searchpath bug. */
string temppath = subst(path, '\\', '/');
temppath = subst(temppath, "//", "/");
return lowercase(temppath);
#else // On unix, nothing to do
return path;
#endif
}
string const GetFileContents(string const & fname) string const GetFileContents(string const & fname)
{ {
FileInfo finfo(fname); FileInfo finfo(fname);
@ -849,33 +837,16 @@ string const ReplaceEnvironmentPath(string const & path)
// Make relative path out of two absolute paths // Make relative path out of two absolute paths
string const MakeRelPath(string const & abspath0, string const & basepath0) string const MakeRelPath(string const & abspath, string const & basepath)
// Makes relative path out of absolute path. If it is deeper than basepath, // Makes relative path out of absolute path. If it is deeper than basepath,
// it's easy. If basepath and abspath share something (they are all deeper // it's easy. If basepath and abspath share something (they are all deeper
// than some directory), it'll be rendered using ..'s. If they are completely // than some directory), it'll be rendered using ..'s. If they are completely
// different, then the absolute path will be used as relative path. // different, then the absolute path will be used as relative path.
{ {
// This is a hack. It should probaly be done in another way. Lgb.
string const abspath = CleanupPath(abspath0);
string const basepath = CleanupPath(basepath0);
if (abspath.empty())
return "<unknown_path>";
string::size_type const abslen = abspath.length(); string::size_type const abslen = abspath.length();
string::size_type const baselen = basepath.length(); string::size_type const baselen = basepath.length();
// Find first different character string::size_type i = os::common_path(abspath, basepath);
string::size_type i = 0;
while (i < abslen && i < baselen && abspath[i] == basepath[i]) ++i;
// Go back to last /
if (i < abslen && i < baselen
|| (i < abslen && abspath[i] != '/' && i == baselen)
|| (i < baselen && basepath[i] != '/' && i == abslen))
{
if (i) --i; // here was the last match
while (i && abspath[i] != '/') --i;
}
if (i == 0) { if (i == 0) {
// actually no match - cannot make it relative // actually no match - cannot make it relative
@ -912,17 +883,20 @@ string const MakeRelPath(string const & abspath0, string const & basepath0)
string const AddPath(string const & path, string const & path_2) string const AddPath(string const & path, string const & path_2)
{ {
string buf; string buf;
string const path2 = CleanupPath(path_2); string const path2 = os::slashify_path(path_2);
if (!path.empty() && path != "." && path != "./") { if (!path.empty() && path != "." && path != "./") {
buf = CleanupPath(path); buf = os::slashify_path(path);
if (path[path.length() - 1] != '/') if (path[path.length() - 1] != '/')
buf += '/'; buf += '/';
} }
if (!path2.empty()) if (!path2.empty()) {
buf += frontStrip(strip(path2, '/'), '/') + '/'; string::size_type const p2start = path2.find_first_not_of('/');
string::size_type const p2end = path2.find_last_not_of('/');
string const tmp = path2.substr(p2start, p2end - p2start + 1);
buf += tmp + '/';
}
return buf; return buf;
} }
@ -947,7 +921,7 @@ ChangeExtension(string const & oldname, string const & extension)
else else
ext = extension; ext = extension;
return CleanupPath(oldname.substr(0, last_dot) + ext); return os::slashify_path(oldname.substr(0, last_dot) + ext);
} }

View File

@ -182,9 +182,6 @@ string const OnlyFilename(string const & fname);
/// Get the contents of a file as a huge string /// Get the contents of a file as a huge string
string const GetFileContents(string const & fname); string const GetFileContents(string const & fname);
/// Cleanup a path if necessary. Currently only useful with OS/2
string const CleanupPath(string const & path);
/** Check and Replace Environmentvariables ${NAME} in Path. /** Check and Replace Environmentvariables ${NAME} in Path.
Replaces all occurences of these, if they are found in the Replaces all occurences of these, if they are found in the
environment. environment.

11
src/support/os.C Normal file
View File

@ -0,0 +1,11 @@
#ifdef __GNUG__
#pragma implementation
#endif
#ifdef __EMX__
#include "os_os2.C"
#elif defined(__CYGWIN__) || defined( __CYGWIN32__)
#include "os_win32.C"
#else
#include "os_unix.C"
#endif

66
src/support/os.h Normal file
View File

@ -0,0 +1,66 @@
// os.h copyright "Ruurd A. Reitsma" <R.A.Reitsma@wbmt.tudelft.nl>
#ifndef OS_H
#define OS_H
#ifdef __GNUG__
#pragma interface
#endif
#include "LString.h"
/// Do we need a base class for this?
class os {
public:
//
enum shell_type {
UNIX, // Do we have to distinguish sh and csh?
CMD_EXE
};
//
static void init(int * argc, char ** argv[]);
//
static string binpath() {return binpath_;};
//
static string binname() {return binname_;};
// system_tempdir actually doesn't belong here.
// I put it here only to avoid a global variable.
static void setTmpDir(string p) {tmpdir_ = p;};
//
static string getTmpDir() {return tmpdir_;};
//
static string current_root();
//
static os::shell_type shell() {return _shell;};
// DBCS aware!
static string::size_type common_path(string const &p1, string const &p2);
// no-op on UNIX, '\\'->'/' on OS/2 and Win32, ':'->'/' on MacOS, etc.
static string slashify_path(string p);
static string external_path(string p);
static void warn(string mesg);
private:
static string binpath_;
static string binname_;
static string tmpdir_;
static os::shell_type _shell;
static unsigned long cp_; // Used only on OS/2 to determine file system encoding.
// Never initialize static variables in the header!
// Anyway I bet this class will never be constructed.
os() {};
// Ignore warning!
~os() {};
};
#endif

160
src/support/os_os2.C Normal file
View File

@ -0,0 +1,160 @@
// os_os2.C
// Various OS specific functions
#include <config.h>
#ifdef __GNUG__
#pragma implementation "os.h"
#endif
#include "os.h"
#include "support/filetools.h"
#define INCL_DOSFILEMGR
#define INCL_DOSMODULEMGR
#define INCL_DOSPROCESS
#define INCL_DOSNLS
#define INCL_DOSERRORS
#include <os2.h>
string os::binpath_ = string();
string os::binname_ = string();
string os::tmpdir_ = string();
os::shell_type os::_shell = os::UNIX;
unsigned long os::cp_ = 0;
void os::init(int * argc, char ** argv[]) {
if (argc != 0 /* This is a hack! */) {
_wildcard(argc, argv);
PTIB ptib = new TIB[1];
PPIB ppib = new PIB[1];
APIRET rc = DosGetInfoBlocks(&ptib, &ppib);
if (rc != NO_ERROR)
exit(rc);
char* tmp = new char[256];
// This is the only reliable way to retrieve the executable name.
rc = DosQueryModuleName(ppib->pib_hmte, 256L, tmp);
if (rc != NO_ERROR)
exit(rc);
string p(tmp);
p = slashify_path(p);
binname_ = OnlyFilename(p);
binname_.erase(binname_.length()-4, string::npos);
binpath_ = OnlyPath(p);
// OS/2 cmd.exe has another use for '&'
string sh = OnlyFilename(GetEnvPath("EMXSHELL"));
if (sh.empty()) {
// COMSPEC is set, unless user unsets
sh = OnlyFilename(GetEnvPath("COMSPEC"));
if (sh.empty())
sh = "cmd.exe";
}
sh = lowercase(sh); // DosMapCase() is an overkill here
if (contains(sh, "cmd.exe")
|| contains(sh, "4os2.exe"))
_shell = os::CMD_EXE;
else
_shell = os::UNIX;
}
static bool initialized = false;
if (initialized) return;
initialized = true;
ULONG CPList[3] = {0}, CPList_size;
APIRET rc = DosQueryCp(3 * sizeof(ULONG), CPList, &CPList_size);
if (rc != NO_ERROR)
exit(rc);
// CPList[0] == process current codepage,
// CPList[1] == system default codepage, the rest are auxilary.
// Once cp_ is correctly set, you can call other routines.
cp_ = CPList[1];
}
void os::warn(string /*mesg*/) {
return;
}
string os::current_root() {
APIRET rc;
ULONG drv_num, drv_map;
rc = DosQueryCurrentDisk(&drv_num, &drv_map);
if (rc != NO_ERROR)
exit(rc);
char drive = 'A' + drv_num -1;
string tmp(1, drive);
tmp += ":/";
return tmp;
}
string::size_type os::common_path(string const &p1, string const &p2) {
static bool initialized = false;
if (!initialized) {
init(0, 0);
initialized = true;
}
COUNTRYCODE cntry;
cntry.country = 0;
cntry.codepage = cp_;
string temp1 = slashify_path(p1);
string temp2 = slashify_path(p2);
char * tmp1 = const_cast<char*> (temp1.c_str());
char * tmp2 = const_cast<char*> (temp2.c_str());
/* rc = */ DosMapCase(p1.length(), &cntry, tmp1);
// if (rc != NO_ERROR)
// exit(rc);
/* rc = */ DosMapCase(p2.length(), &cntry, tmp2);
// if (rc != NO_ERROR)
// exit(rc);
// This algorithm works only if paths are slashified on DBCS systems.
string::size_type i = 0,
p1_len = p1.length(),
p2_len = p2.length();
while (i < p1_len && i < p2_len && tmp1[i] == tmp2[i]) ++i;
if ((i < p1_len && i < p2_len)
|| (i < p1_len && tmp1[i] != '/' && i == p2_len)
|| (i < p2_len && tmp2[i] != '/' && i == p1_len)) {
if (i) --i; // here was the last match
while (i && tmp1[i] != '/') --i;
}
return i;
}
string os::slashify_path(string p) {
static bool initialized = false;
static bool leadbyte[256] = {false};
if (!initialized) {
init(0, 0);
COUNTRYCODE cntry;
cntry.country = 0;
cntry.codepage = cp_;
unsigned char *DBCSinfo = new unsigned char[12];
/* rc = */ DosQueryDBCSEnv(12, &cntry, (char*) DBCSinfo);
// if (rc != NO_ERROR)
// exit(rc);
for (int j = 1; j < 12; j += 2)
DBCSinfo[j]++;
unsigned char i = 0;
bool isLeadByte = false;
while (*DBCSinfo != 0) {
if (i == *DBCSinfo) {
isLeadByte = !isLeadByte;
DBCSinfo++;
}
leadbyte[i++] = isLeadByte;
}
initialized = true;
}
string::iterator lit = p.begin();
string::iterator end = p.end();
for (; lit < end; ++lit) {
if (leadbyte[(*lit)])
lit += 2;
if ((*lit) == '\\')
(*lit) = '/';
}
p = subst(p, "//", "/");
return p;
}
string os::external_path(string p) {
return p;
}

69
src/support/os_unix.C Normal file
View File

@ -0,0 +1,69 @@
// os_unix.C
// Various OS specific functions
#include <config.h>
#include "os.h"
#include "support/filetools.h"
string os::binpath_ = string();
string os::binname_ = string();
string os::tmpdir_ = string();
os::shell_type os::_shell = os::UNIX;
unsigned long os::cp_ = 0;
void os::init(int * /*argc*/, char ** argv[]) /* :cp_(0), _shell(os::UNIX) */ {
static bool initialized = false;
if (initialized)
return;
initialized = true;
string tmp = *argv[0];
binname_ = OnlyFilename(tmp);
tmp = ExpandPath(tmp); // This expands ./ and ~/
if (!AbsolutePath(tmp)) {
string binsearchpath = GetEnvPath("PATH");
// This will make "src/lyx" work always :-)
binsearchpath += ";.";
tmp = FileOpenSearch(binsearchpath, tmp);
}
tmp = MakeAbsPath(OnlyPath(tmp));
// In case we are running in place and compiled with shared libraries
if (suffixIs(tmp, "/.libs/"))
tmp.erase(tmp.length()-6, string::npos);
binpath_ = tmp;
}
void os::warn(string /*mesg*/) {
return;
}
string os::current_root() {
return string("/");
}
string::size_type os::common_path(string const &p1, string const &p2) {
string::size_type i = 0,
p1_len = p1.length(),
p2_len = p2.length();
while (i < p1_len && i < p2_len && p1[i] == p2[i]) ++i;
if ((i < p1_len && i < p2_len)
|| (i < p1_len && p1[i] != '/' && i == p2_len)
|| (i < p2_len && p2[i] != '/' && i == p1_len)) {
if (i) --i; // here was the last match
while (i && p1[i] != '/') --i;
}
return i;
}
string os::slashify_path(string p) {
return p;
}
string os::external_path(string p) {
return p;
}

83
src/support/os_win32.C Normal file
View File

@ -0,0 +1,83 @@
// os_win32.C copyright "Ruurd A. Reitsma" <R.A.Reitsma@wbmt.tudelft.nl>
// Various OS specific functions
#include <config.h>
#include "os.h"
#include "support/filetools.h"
#include <windows.h>
#include <io.h>
#include <sys/cygwin.h>
string os::binpath_ = string();
string os::binname_ = string();
string os::tmpdir_ = string();
os::shell_type os::_shell = os::UNIX;
unsigned long os::cp_ = 0;
void os::init(int * argc, char ** argv[]) {
static bool initialized = false;
if (initialized) return;
initialized = true;
string tmp = *argv[0];
binname_ = OnlyFilename(tmp);
tmp = ExpandPath(tmp); // This expands ./ and ~/
if (!AbsolutePath(tmp)) {
string binsearchpath = GetEnvPath("PATH");
// This will make "src/lyx" work always :-)
binsearchpath += ";.";
tmp = *argv[0];
tmp = FileOpenSearch(binsearchpath, tmp);
}
tmp = MakeAbsPath(OnlyPath(tmp));
// In case we are running in place and compiled with shared libraries
if (suffixIs(tmp, "/.libs/"))
tmp.erase(tmp.length()-6, string::npos);
binpath_ = tmp;
}
void os::warn(string mesg) {
MessageBox(0, mesg.c_str(), "LyX error",
MB_OK|MB_ICONSTOP|MB_SYSTEMMODAL);
}
string os::current_root() {
return string("/");
}
string::size_type os::common_path(string const &p1, string const &p2) {
string::size_type i = 0,
p1_len = p1.length(),
p2_len = p2.length();
while (i < p1_len && i < p2_len && uppercase(p1[i]) == uppercase(p2[i])) ++i;
if ((i < p1_len && i < p2_len)
|| (i < p1_len && p1[i] != '/' && i == p2_len)
|| (i < p2_len && p2[i] != '/' && i == p1_len)) {
if (i) --i; // here was the last match
while (i && p1[i] != '/') --i;
}
return i;
}
string os::slashify_path(string p) {
return subst(p, '\\', '/');
}
string os::external_path(string p) {
string dos_path=p;
if (AbsolutePath(p)) {
char dp[255];
cygwin_conv_to_full_win32_path(p.c_str(), dp);
dos_path=subst(dp,'\\','/');
}
lyxerr[Debug::LATEX]
<< "<Win32 path correction> ["
<< p << "]->>["
<< dos_path << "]" << endl;
return dos_path;
}

View File

@ -6,6 +6,9 @@
bool lyx::rename(string const & from, string const & to) bool lyx::rename(string const & from, string const & to)
{ {
#ifdef __EMX__
lyx::unlink(to.c_str());
#endif
if (::rename(from.c_str(), to.c_str()) == -1) if (::rename(from.c_str(), to.c_str()) == -1)
if (lyx::copy(from, to)) { if (lyx::copy(from, to)) {
lyx::unlink(from); lyx::unlink(from);

View File

@ -15,6 +15,8 @@
#include "syscontr.h" #include "syscontr.h"
#include "support/lstrings.h" #include "support/lstrings.h"
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/filetools.h"
#include "support/os.h"
using std::endl; using std::endl;
@ -137,8 +139,10 @@ void Systemcalls::waitForChild() {
pid_t Systemcalls::fork() pid_t Systemcalls::fork()
{ {
#ifndef __EMX__
pid_t cpid= ::fork(); pid_t cpid= ::fork();
if (cpid == 0) { // child if (cpid == 0) { // child
#endif
// TODO: Consider doing all of this before the fork, otherwise me // TODO: Consider doing all of this before the fork, otherwise me
// might have troubles with multi-threaded access. (Baruch 20010228) // might have troubles with multi-threaded access. (Baruch 20010228)
string childcommand(command); // copy string childcommand(command); // copy
@ -169,10 +173,15 @@ pid_t Systemcalls::fork()
} }
argv[index] = 0; argv[index] = 0;
// replace by command. Expand using PATH-environment-var. // replace by command. Expand using PATH-environment-var.
#ifndef __EMX__
execvp(syscmd, argv); execvp(syscmd, argv);
// If something goes wrong, we end up here: // If something goes wrong, we end up here:
lyxerr << "LyX: execvp failed: " << strerror(errno) << endl; lyxerr << "LyX: execvp failed: " << strerror(errno) << endl;
} else if (cpid < 0) { // error } else if (cpid < 0) { // error
#else
pid_t cpid = spawnvp(P_SESSION|P_DEFAULT|P_MINIMIZE|P_BACKGROUND, syscmd, argv);
if (cpid < 0) { // error
#endif
lyxerr << "LyX: Could not fork: " << strerror(errno) << endl; lyxerr << "LyX: Could not fork: " << strerror(errno) << endl;
} else { // parent } else { // parent
return cpid; return cpid;
@ -193,25 +202,8 @@ int Systemcalls::startscript(Starttype how, string const & what,
retval = 0; retval = 0;
if (how == SystemDontWait) { if (how == SystemDontWait) {
#ifndef __EMX__ (os::shell() == os::UNIX) ? command += " &"
command += " &"; : command = "start /min/n " + command;
#else
// OS/2 cmd.exe has another use for '&'
// This is not NLS safe, but it's OK, I think.
string sh = OnlyFilename(GetEnvPath("EMXSHELL"));
if (sh.empty()) {
// COMSPEC is set, unless user unsets
sh = OnlyFilename(GetEnvPath("COMSPEC"));
if (sh.empty())
sh = "cmd.exe";
}
sh = lowercase(sh);
if (contains(sh, "cmd.exe")
|| contains(sh, "4os2.exe"))
command = "start /min/n " + command;
else
command += " &";
#endif
} }
return startscript(); return startscript();

View File

@ -7,10 +7,10 @@
#include "support/lyxlib.h" #include "support/lyxlib.h"
#include "support/filetools.h" #include "support/filetools.h"
#include "debug.h" #include "debug.h"
#include "os.h"
using std::endl; using std::endl;
extern string system_tempdir;
namespace { namespace {
@ -23,7 +23,7 @@ int make_tempfile(char * templ)
#ifdef HAVE_MKTEMP #ifdef HAVE_MKTEMP
// This probably just barely works... // This probably just barely works...
::mktemp(templ); ::mktemp(templ);
return ::open(templ, O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); return ::open(templ, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR);
#else #else
#ifdef WITH_WARNINGS #ifdef WITH_WARNINGS
#warning FIX FIX FIX #warning FIX FIX FIX
@ -37,7 +37,7 @@ int make_tempfile(char * templ)
string const lyx::tempName(string const & dir, string const & mask) string const lyx::tempName(string const & dir, string const & mask)
{ {
string const tmpdir(dir.empty() ? system_tempdir : dir); string const tmpdir(dir.empty() ? os::getTmpDir() : dir);
string tmpfl(AddName(tmpdir, mask)); string tmpfl(AddName(tmpdir, mask));
tmpfl += tostr(getpid()); tmpfl += tostr(getpid());
tmpfl += "XXXXXX"; tmpfl += "XXXXXX";