# HG changeset patch # User jwe # Date 886493482 0 # Node ID 292ff0bf484b22492bb14888f57d369cf1f1da9e # Parent 990ea337e950d147fbe2b01951c26b23ce0fce8e [project @ 1998-02-03 08:11:07 by jwe] diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Tue Feb 3 00:24:01 1998 John W. Eaton + + * Makeconf.in (do-subst-vals): Substitute $(libexecdir) too. + +Mon Feb 2 22:42:27 1998 John W. Eaton + + * configure.in: Define octlibdir. + * Makeconf.in: Substitute value. + (do-subst-config-vals): Set LIBDIR to $(octlibdir). + (do-subst-default-vals): Substitute OCTLIBDIR too. + Sat Jan 31 19:29:56 1998 John W. Eaton * acconfig.h: Add #undefs for HAVE_GAMMA and HAVE_LGAMMA to avoid diff --git a/Makeconf.in b/Makeconf.in --- a/Makeconf.in +++ b/Makeconf.in @@ -160,10 +160,11 @@ # and ${localfcnfiledir} are subdirectories of this. datadir = @datadir@ +libdir = @libdir@ + # Where to install and expect libraries like libcruft.a, liboctave.a, -# and libreadline.a and other architecture-dependent data. The -# directory ${archlibdir} is a subdirectory of this. -libdir = @libdir@ +# and other architecture-dependent data. +octlibdir = @octlibdir@ # Where to install and expect executable programs to be run by Octave # rather than directly by users. @@ -326,7 +327,7 @@ -e "s;%LDFLAGS%;\"${LDFLAGS}\";" \ -e "s;%LEXLIB%;\"${LEXLIB}\";" \ -e "s;%LIBDLFCN%;\"${LIBDLFCN}\";" \ - -e "s;%LIBFLAGS%;\"-L${libdir}\";" \ + -e "s;%LIBFLAGS%;\"-L${octlibdir}\";" \ -e "s;%LIBPLPLOT%;\"${LIBPLPLOT}\";" \ -e "s;%LIBS%;\"${LIBS}\";" \ -e "s;%RLD_FLAG%;\"${RLD_FLAG}\";" \ @@ -349,6 +350,7 @@ -e "s;%OCTAVE_ARCHLIBDIR%;\"${archlibdir}\";" \ -e "s;%OCTAVE_BINDIR%;\"${bindir}\";" \ -e "s;%OCTAVE_DATADIR%;\"${datadir}\";" \ + -e "s;%OCTAVE_LIBEXECDIR%;\"${libexecdir}\";" \ -e "s;%OCTAVE_EXEC_PREFIX%;\"${exec_prefix}\";" \ -e "s;%OCTAVE_FCNFILEDIR%;\"${fcnfiledir}\";" \ -e "s;%OCTAVE_FCNFILEPATH%;\"${fcnfilepath}\";" \ @@ -356,6 +358,7 @@ -e "s;%OCTAVE_INFODIR%;\"${infodir}\";" \ -e "s;%OCTAVE_INFOFILE%;\"${infofile}\";" \ -e "s;%OCTAVE_LIBDIR%;\"${libdir}\";" \ + -e "s;%OCTAVE_OCTLIBDIR%;\"${octlibdir}\";" \ -e "s;%OCTAVE_LOCALARCHLIBDIR%;\"${localarchlibdir}\";" \ -e "s;%OCTAVE_LOCALFCNFILEDIR%;\"${localfcnfiledir}\";" \ -e "s;%OCTAVE_LOCALFCNFILEPATH%;\"${localfcnfilepath}\";" \ @@ -382,3 +385,20 @@ $(LN_S) $$src octave; \ fi endef + +# Make a relative symbolic link from $libdir/octave to $octlibdir. + +# XXX FIXME XXX -- this assumes that $octlibdir is a subdirectory +# of $libdir. + +define mk-libdir-link +src=`echo $(octlibdir) | sed 's|^$(libdir)/*||'` ; \ +echo $$src ; \ +if [ "$$src" = "octave" ] ; then \ + true ; \ +else \ + cd $(libdir) ; \ + rm -f octave ; \ + $(LN_S) $$src octave ; \ +fi +endef diff --git a/PROJECTS b/PROJECTS --- a/PROJECTS +++ b/PROJECTS @@ -106,6 +106,10 @@ other faster method.d Possibly just switch to this method if the dataset is larger than some value. + * Make QR more memory efficient for large matrices when not all the + columns of Q are required (apparently this is not handled by the + lapack code yet). + * Consider making the behavior of the / and \ operators for non-square systems compatible with Matlab. diff --git a/aclocal.m4 b/aclocal.m4 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -83,6 +83,8 @@ f77_output=`$F77 -v 2>&1 | grep "GNU F77"` if test -n "$f77_output"; then octave_cv_f77_is_g77=yes + else + octave_cv_f77_is_g77=no fi fi]) ]) diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in @@ -21,7 +21,7 @@ ### Software Foundation, 59 Temple Place - Suite 330, Boston, MA ### 02111-1307, USA. -AC_REVISION($Revision: 1.295 $) +AC_REVISION($Revision: 1.296 $) AC_PREREQ(2.9) AC_INIT(src/octave.cc) AC_CONFIG_HEADER(config.h) @@ -39,6 +39,7 @@ OCTAVE_SET_DEFAULT(fcnfiledir, '$(datadir)/octave/$(version)/m') OCTAVE_SET_DEFAULT(localfcnfiledir, '$(datadir)/octave/site/m') OCTAVE_SET_DEFAULT(localfcnfilepath, '$(localfcnfiledir)//') +OCTAVE_SET_DEFAULT(octlibdir, '$(libdir)/octave-$(version)') OCTAVE_SET_DEFAULT(archlibdir, '$(libexecdir)/octave/$(version)/exec/$(canonical_host_type)') OCTAVE_SET_DEFAULT(localarchlibdir, diff --git a/doc/interpreter/matrix.texi b/doc/interpreter/matrix.texi --- a/doc/interpreter/matrix.texi +++ b/doc/interpreter/matrix.texi @@ -653,18 +653,6 @@ The following functions return famous matrix forms. -@deftypefn {Function File} {} hadamard (@var{k}) -Return the Hadamard matrix of order -@iftex -@tex -$n = 2^k$. -@end tex -@end iftex -@ifinfo -n = 2^k. -@end ifinfo -@end deftypefn - @deftypefn {Function File} {} hankel (@var{c}, @var{r}) Return the Hankel matrix constructed given the first column @var{c}, and (optionally) the last row @var{r}. If the last element of @var{c} is @@ -725,6 +713,18 @@ finite precision of your computer's floating point arithmetic. @end deftypefn +@deftypefn {Function File} {} sylvester_matrix (@var{k}) +Return the Sylvester matrix of order +@iftex +@tex +$n = 2^k$. +@end tex +@end iftex +@ifinfo +n = 2^k. +@end ifinfo +@end deftypefn + @deftypefn {Function File} {} toeplitz (@var{c}, @var{r}) Return the Toeplitz matrix constructed given the first column @var{c}, and (optionally) the first row @var{r}. If the first element of @var{c} diff --git a/install-octave b/install-octave --- a/install-octave +++ b/install-octave @@ -76,19 +76,20 @@ # and ${localfcnfiledir} are subdirectories of this. datadir="$prefix/share" -# Where to install and expect libraries like libcruft.a, liboctave.a, -# and libreadline.a, executable files to be run by Octave rather than -# directly by users, and other architecture-dependent data. -# ${archlibdir} is a subdirectory of this. libdir="$exec_prefix/lib" +# Where to install and expect libraries like libcruft.a and liboctave.a. +octlibdir="$libdir/octave-$version" + # Where to install and expect executable programs to be run by Octave # rather than directly by users. libexecdir="$exec_prefix/libexec" +includedir="$prefix/include" + # Where to install Octave's include files. The default is -# ${prefix}/include/octave -includedir="$prefix/include" +# ${prefix}/include/octave-$version +octincludedir=$includedir/octave-$version # Where to install Octave's man pages, and what extension they should # have. The default is ${prefix}/man/man1 @@ -159,7 +160,9 @@ bindir: `echo $bindir | sed "s,^$prefix/,,"` datadir: `echo $datadir | sed "s,^$prefix/,,"` libdir: `echo $libdir | sed "s,^$prefix/,,"` + octlibdir: `echo $octlibdir | sed "s,^$prefix/,,"` includedir: `echo $includedir | sed "s,^$prefix/,,"` + octincludedir: `echo $octincludedir | sed "s,^$prefix/,,"` mandir: `echo $mandir | sed "s,^$prefix/,,"` infodir: `echo $infodir | sed "s,^$prefix/,,"` fcnfiledir: `echo $fcnfiledir | sed "s,^$prefix/,,"` @@ -184,8 +187,9 @@ ;; esac -DIRS_TO_MAKE="$bindir $datadir $libdir $libexecdir $includedir $mandir \ - $infodir $fcnfiledir $localfcnfiledir $archlibdir $localarchlibdir \ +DIRS_TO_MAKE="$bindir $datadir $libdir $octlibdir $libexecdir \ + $includedir $octincludedir $mandir $infodir $fcnfiledir \ + $localfcnfiledir $archlibdir $localarchlibdir \ $octfiledir $localoctfiledir $imagedir" ./mkinstalldirs $DIRS_TO_MAKE @@ -197,7 +201,7 @@ chmod 755 $bindir/octave else echo "installing octave-sh as $bindir/octave" - sed "s|@OCTAVE_HOME@|$prefix|; s|@LD_LIBRARY_PATH@|$libdir|" octave-sh \ + sed "s|@OCTAVE_HOME@|$prefix|; s|@LD_LIBRARY_PATH@|$octlibdir|" octave-sh \ > $bindir/octave chmod 755 $bindir/octave @@ -210,13 +214,17 @@ cp octave-bug $bindir/octave-bug chmod 755 $bindir/octave-bug +echo "installing info as $archlibdir/info" +cp info/info $archlibdir/info +chmod 755 $archlibdir/info + if test -f LIBRARIES; then - echo "installing shared libraries in $libdir" + echo "installing shared libraries in $octlibdir" for f in `cat LIBRARIES` do file=`basename $f` - cp $f $libdir/$file - chmod 644 $libdir/$file + cp $f $octlibdir/$file + chmod 644 $octlibdir/$file done fi @@ -260,7 +268,10 @@ cd $distdir echo "creating ls-R file in $datadir/octave" -ls -LR $datadir/octave $libexecdir/octave > $datadir/octave/ls-R +ls -LR $datadir/octave > $datadir/octave/ls-R + +echo "creating ls-R file in $libexecdir/octave" +ls -LR $libexecdir/octave > $libexecdir/octave/ls-R echo "installing info files in $infodir" for f in doc/interpreter/octave.info* diff --git a/libcruft/ChangeLog b/libcruft/ChangeLog --- a/libcruft/ChangeLog +++ b/libcruft/ChangeLog @@ -1,5 +1,8 @@ Sun Feb 1 12:39:10 1998 John W. Eaton + * Makefile.in (install, uninstall): Use $(octlibdir), not $(libdir). + Use $(mk-libdir-link). + * quadpack/dqagi.f, quadpack/dqagie.f, quadpack/dqagp.f, quadpack/dqagpe.f, quadpack/dqk15i.f, quadpack/dqk21.f: Make user-supplied code a subroutine instead of a function. diff --git a/libcruft/Makefile.in b/libcruft/Makefile.in --- a/libcruft/Makefile.in +++ b/libcruft/Makefile.in @@ -90,28 +90,30 @@ @$(subdir-for-command) install:: - $(top_srcdir)/mkinstalldirs $(libdir) + $(top_srcdir)/mkinstalldirs $(octlibdir) if $(STATIC_LIBS); then \ - rm -f $(libdir)/libcruft.$(LIBEXT) ; \ - $(INSTALL_DATA) libcruft.$(LIBEXT) $(libdir)/libcruft.$(LIBEXT) ; \ - $(RANLIB) $(libdir)/libcruft.$(LIBEXT) ; \ + rm -f $(octlibdir)/libcruft.$(LIBEXT) ; \ + $(INSTALL_DATA) libcruft.$(LIBEXT) \ + $(octlibdir)/libcruft.$(LIBEXT) ; \ + $(RANLIB) $(octlibdir)/libcruft.$(LIBEXT) ; \ fi if $(SHARED_LIBS); then \ - rm -f $(libdir)/libcruft.$(SHLEXT_VER); \ + rm -f $(octlibdir)/libcruft.$(SHLEXT_VER); \ $(INSTALL_PROGRAM) \ - libcruft.$(SHLEXT_VER) $(libdir)/libcruft.$(SHLEXT_VER); \ - cd $(libdir); \ + libcruft.$(SHLEXT_VER) $(octlibdir)/libcruft.$(SHLEXT_VER); \ + cd $(octlibdir); \ rm -f libcruft.$(SHLEXT); \ $(LN_S) libcruft.$(SHLEXT_VER) libcruft.$(SHLEXT); \ fi + $(mk-libdir-link) install-strip:: $(MAKE) INSTALL_PROGRAM="$(INSTALL_PROGRAM) -s" install uninstall:: - rm -f $(libdir)/libcruft.$(LIBEXT) - rm -f $(libdir)/libcruft.$(SHLEXT) - rm -f $(libdir)/libcruft.$(SHLEXT_VER) + rm -f $(octlibdir)/libcruft.$(LIBEXT) + rm -f $(octlibdir)/libcruft.$(SHLEXT) + rm -f $(octlibdir)/libcruft.$(SHLEXT_VER) tags TAGS:: $(SOURCES) $(SUBDIR_FOR_COMMAND) diff --git a/libcruft/slatec-fn/Makefile b/libcruft/slatec-fn/Makefile deleted file mode 100644 --- a/libcruft/slatec-fn/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -# Generated automatically from Makefile.in by configure. -# -# Makefile for octave's libcruft/slatec-fn directory -# -# John W. Eaton -# jwe@bevo.che.wisc.edu -# University of Wisconsin-Madison -# Department of Chemical Engineering - -TOPDIR = ../.. - -srcdir = . -top_srcdir = ../.. - -EXTERNAL_DISTFILES = $(DISTFILES) - -include $(TOPDIR)/Makeconf - -include ../Makerules diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,15 @@ +Mon Feb 2 01:42:56 1998 John W. Eaton + + * Makefile.in (install, uninstall): Use $(octlibdir), not $(libdir). + Use $(mk-libdir-link). + + * file-stat.cc (file_stat::update_internal): Use stat and lstat, + not SAFE_STAT and SAFE_LSTAT. + (lstat): New function, defined if HAVE_LSTAT is not defined. + * safe-xstat.hin, safe-xstat.cin: Delete. + * Makefile.in: Delete rules for safe-stat.h, safe-stat.c, + safe-lstat.h, and safe-lstat.cc. + Fri Jan 30 23:48:43 1998 John W. Eaton * chMatrix.cc (charMatrix::all, charMatrix::any): New functions. diff --git a/liboctave/Makefile.in b/liboctave/Makefile.in --- a/liboctave/Makefile.in +++ b/liboctave/Makefile.in @@ -93,8 +93,7 @@ INCLUDES_FOR_INSTALL := $(INCLUDES) $(TEMPLATE_SRC) $(EXTRAS) -DISTFILES := Makefile.in ChangeLog safe-xstat.cin safe-xstat.hin \ - $(SOURCES) $(INCLUDES) $(EXTRAS) +DISTFILES := Makefile.in ChangeLog $(SOURCES) $(INCLUDES) $(EXTRAS) ifeq ($(SHARED_LIBS), true) BINDISTFILES = liboctave.$(SHLEXT_VER) @@ -117,12 +116,9 @@ LIBOCTAVE_DEPEND := $(patsubst %, liboctave.$(LIBEXT)(%), $(OBJECTS)) -all: stamp-prereq libraries +all: libraries .PHONY: all -stamp-prereq: pic safe-stat.h safe-lstat.h - touch stamp-prereq - pic: @if [ -d pic ]; then \ true; \ @@ -157,31 +153,7 @@ liboctave.$(SHLEXT_VER): $(PICOBJ) $(SH_LD) $(SH_LDFLAGS) $(SONAME_FLAGS) -o $@ $^ -extract_stat = sed 's/@l@//g; s/@L@//g; /@LSTAT_ONLY@/d' -extract_lstat = sed 's/@l@/l/g; s/@L@/L/g; s/ *@LSTAT_ONLY@//' - -safe-lstat.c: safe-xstat.cin - @echo "making $@ from $<" - @$(extract_lstat) $< > $@.tmp - @$(top_srcdir)/move-if-change $@.tmp $@ - -safe-lstat.h: safe-xstat.hin - @echo "making $@ from $<" - @$(extract_lstat) $< > $@.tmp - @$(top_srcdir)/move-if-change $@.tmp $@ - -safe-stat.c: safe-xstat.cin - @echo "making $@ from $<" - @$(extract_stat) $< > $@.tmp - @$(top_srcdir)/move-if-change $@.tmp $@ - -safe-stat.h: safe-xstat.hin - @echo "making $@ from $<" - @$(extract_stat) $< > $@.tmp - @$(top_srcdir)/move-if-change $@.tmp $@ - -safe-stat.o: safe-stat.h -safe-lstat.o: safe-lstat.h safe-stat.h +$(PICOBJ): pic check: all .PHONY: check @@ -194,20 +166,22 @@ .PHONY: install-strip install-lib: - $(top_srcdir)/mkinstalldirs $(libdir) + $(top_srcdir)/mkinstalldirs $(octlibdir) if $(STATIC_LIBS); then \ - rm -f $(libdir)/liboctave.$(LIBEXT); \ - $(INSTALL_DATA) liboctave.$(LIBEXT) $(libdir)/liboctave.$(LIBEXT); \ - $(RANLIB) $(libdir)/liboctave.$(LIBEXT); \ + rm -f $(octlibdir)/liboctave.$(LIBEXT); \ + $(INSTALL_DATA) liboctave.$(LIBEXT) \ + $(octlibdir)/liboctave.$(LIBEXT); \ + $(RANLIB) $(octlibdir)/liboctave.$(LIBEXT); \ fi if $(SHARED_LIBS); then \ - rm -f $(libdir)/liboctave.$(SHLEXT_VER); \ + rm -f $(octlibdir)/liboctave.$(SHLEXT_VER); \ $(INSTALL_PROGRAM) \ - liboctave.$(SHLEXT_VER) $(libdir)/liboctave.$(SHLEXT_VER); \ - cd $(libdir); \ + liboctave.$(SHLEXT_VER) $(octlibdir)/liboctave.$(SHLEXT_VER); \ + cd $(octlibdir); \ rm -f liboctave.$(SHLEXT); \ $(LN_S) liboctave.$(SHLEXT_VER) liboctave.$(SHLEXT); \ fi + $(mk-libdir-link) .PHONY: install-lib install-inc: @@ -220,9 +194,9 @@ .PHONY: install-inc uninstall: - rm -f $(libdir)/liboctave.$(LIBEXT) - rm -f $(libdir)/liboctave.$(SHLEXT) - rm -f $(libdir)/liboctave.$(SHLEXT_VER) + rm -f $(octlibdir)/liboctave.$(LIBEXT) + rm -f $(octlibdir)/liboctave.$(SHLEXT) + rm -f $(octlibdir)/liboctave.$(SHLEXT_VER) for f in $(INCLUDES); do rm -f $(octincludedir)/$$f; done .PHONY: uninstall @@ -233,7 +207,8 @@ etags $(SOURCES) clean: - rm -f safe-stat.h safe-lstat.h *.$(LIBEXT) *.o *.d pic/*.o + rm -f *.$(LIBEXT) *.o *.d pic/*.o + -rmdir pic if $(SHARED_LIBS); then rm -f *.$(SHLEXT_VER) *.$(SHLEXT); fi .PHONY: clean @@ -241,8 +216,7 @@ .PHONY: mostlyclean distclean: clean - rm -f Makefile so_locations stamp-prereq - -rmdir pic + rm -f Makefile so_locations .PHONY: distclean maintainer-clean: distclean @@ -262,11 +236,6 @@ fi .PHONY: bin-dist -# If missing, GNU make attempts to create them in the reverse of the -# order in which they are listed here. We rely on that fact to ensure -# that the safe-stat.h and safe-lstat.h files are created before trying -# to create the .d files. Hmm. I wonder if we can count on that... - ifndef omit_deps --include $(MAKEDEPS) stamp-prereq +-include $(MAKEDEPS) endif diff --git a/liboctave/file-stat.cc b/liboctave/file-stat.cc --- a/liboctave/file-stat.cc +++ b/liboctave/file-stat.cc @@ -37,10 +37,13 @@ #include "file-stat.h" #include "statdefs.h" -// These must come after and . - -#include -#include +#if !defined (HAVE_LSTAT) +static inline int +lstat (const char *name, struct stat *buf) +{ + return stat (name, buf); +} +#endif // XXX FIXME XXX -- the is_* and mode_as_string functions are only valid // for initialized objects. If called for an object that is not @@ -155,8 +158,7 @@ struct stat buf; - int status = follow_links - ? SAFE_STAT (cname, &buf) : SAFE_LSTAT (cname, &buf); + int status = follow_links ? stat (cname, &buf) : lstat (cname, &buf); if (status < 0) { diff --git a/octave-bug.in b/octave-bug.in --- a/octave-bug.in +++ b/octave-bug.in @@ -15,7 +15,7 @@ config_opts=%config_opts% VERSION=%VERSION% -MACHINE=%TARGET_HOST_TYPE% +MACHINE=%CANONICAL_HOST_TYPE% F77=%F77% FFLAGS=%FFLAGS% FPICFLAG=%FPICFLAG% diff --git a/scripts/ChangeLog b/scripts/ChangeLog --- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,14 @@ +Tue Feb 3 00:18:40 1998 John W. Eaton + + * special-matrix/sylvester_matrix.m: Rename from hadamard.m + + * miscellaneous/bug_report.m: Don't try to get smart with + OCTAVE_HOME. Assume octave-bug can be found in EXEC_PATH. + + * Makefile.in (install): Create separate ls-R files for + $(datadir) and $(libexecdir). + (uninstall): Remove both ls-R files. + Sat Jan 31 01:09:32 1998 John W. Eaton * signal/fftshift.m: New file. diff --git a/scripts/Makefile.in b/scripts/Makefile.in --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -50,10 +50,11 @@ .PHONY: clean mostlyclean distclean maintainer-clean install install-strip:: - ls -LR $(datadir)/octave $(libexecdir)/octave > $(datadir)/octave/ls-R + ls -LR $(datadir)/octave > $(datadir)/octave/ls-R + ls -LR $(libexecdir)/octave > $(libexecdir)/octave/ls-R uninstall:: - rm -f $(datadir)/octave/ls-R + rm -f $(datadir)/octave/ls-R $(libexecdir)/octave/ls-R tags TAGS:: $(SOURCES) $(SUBDIR_FOR_COMMAND) diff --git a/scripts/linear-algebra/orth.m b/scripts/linear-algebra/orth.m --- a/scripts/linear-algebra/orth.m +++ b/scripts/linear-algebra/orth.m @@ -33,30 +33,36 @@ function retval = orth (A, tol) - [U, S, V] = svd (A); + if (nargin == 1 || nargin == 2) - [rows, cols] = size (A); + [U, S, V] = svd (A); - [S_nr, S_nc] = size (S); + [rows, cols] = size (A); - if (S_nr == 1 || S_nc == 1) - s = S(1); - else - s = diag (S); - endif + [S_nr, S_nc] = size (S); + + if (S_nr == 1 || S_nc == 1) + s = S(1); + else + s = diag (S); + endif - if (nargin == 1) - tol = max (size (A)) * s (1) * eps; - elseif (nargin != 2) - usage ("orth (A [, tol])"); - endif + if (nargin == 1) + tol = max (size (A)) * s (1) * eps; + endif + + rank = sum (s > tol); - rank = sum (s > tol); + if (rank > 0) + retval = -U (:, 1:rank); + else + retval = zeros (rows, 0); + endif - if (rank > 0) - retval = -U (:, 1:rank); else - retval = zeros (rows, 0); + + usage ("orth (a [, tol]"); + endif endfunction diff --git a/scripts/miscellaneous/bug_report.m b/scripts/miscellaneous/bug_report.m --- a/scripts/miscellaneous/bug_report.m +++ b/scripts/miscellaneous/bug_report.m @@ -49,7 +49,7 @@ endif endif - cmd = strcat (OCTAVE_HOME, "/bin/octave-bug"); + cmd = "octave-bug"; if (length (subject) > 0) cmd = sprintf ("%s -s \"%s\"", cmd, subject); diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,39 @@ +Tue Feb 3 00:24:44 1998 John W. Eaton + + * defaults.cc (exec_path): Append Vbin_dir to std_path. + + * octave.cc (initialize_pathsearch): Set TEXMFDBS, not TEXMF. + Look for OCTAVE_DB_PATH in environment. + Simplify using Vdata_dir and Vlibexec_dir. + + * defaults.h.in (Vdata_dir, Vlibexecdir): Declare new vars. + defaults.cc: Define them. + (set_default_data_dir, set_default_libexecdir): New functions. + (install_defaults): Call them. + + * defaults.h.in (OCTAVE_LIBEXECDIR): Define. + +Mon Feb 2 02:43:16 1998 John W. Eaton + + * Makefile.in (install, uninstall): Use $(octlibdir), not $(libdir). + Use mk-libdir-link. + + * defaults.h.in (OCTAVE_OCTLIBDIR): Substitute value. + (Vlib_dir): Delete declaration. + * defaults.cc (Vlib_dir): Delete. + (set_default_lib_dir): Delete. + (install_defaults): Don't call set_default_lib_dir. + (set_default_info_prog): If oct_info_prog is empty, set default to + "info" -- we expect it to be somewhere in the user's path. + + * defun.h (DEFCONST, DEFCONSTX): Eliminate inst_as_fcn and chg_fcn + args. Always pass true for inst_as_fcn and 0 for chg_fcn to + DEFVAR when creating built-in values like `e' or `stderr' that can + be redefined. Change all uses. + + * help.cc (Ftype): Handle script files too. + (Fwhich): Likewise. + Sat Jan 31 00:00:26 1998 John W. Eaton * ov-ch-mat.cc (octave_char_matrix::is_true): Make it work. diff --git a/src/Makefile.in b/src/Makefile.in --- a/src/Makefile.in +++ b/src/Makefile.in @@ -196,7 +196,7 @@ fi touch stamp-oct-links -stamp-prereq: pic defaults.h oct-conf.h +stamp-prereq: defaults.h oct-conf.h touch stamp-prereq octave: octave.o builtins.o ops.o $(DLD_STATIC_OBJ) libraries @@ -240,6 +240,8 @@ liboctinterp.$(SHLEXT_VER): $(PICOBJ) $(SH_LD) $(SH_LDFLAGS) $(SONAME_FLAGS) -o $@ $^ +$(PICOBJ): pic + builtins.cc: $(DEF_FILES) mkbuiltins @echo making $@ @echo DEF_FILES = $(DEF_FILES) @@ -290,21 +292,22 @@ .PHONY: install-oct install-lib: - $(top_srcdir)/mkinstalldirs $(libdir) + $(top_srcdir)/mkinstalldirs $(octlibdir) if $(STATIC_LIBS); then \ - rm -f $(libdir)/liboctinterp.$(LIBEXT); \ + rm -f $(octlibdir)/liboctinterp.$(LIBEXT); \ $(INSTALL_DATA) liboctinterp.$(LIBEXT) \ - $(libdir)/liboctinterp.$(LIBEXT); \ - $(RANLIB) $(libdir)/liboctinterp.$(LIBEXT); \ + $(octlibdir)/liboctinterp.$(LIBEXT); \ + $(RANLIB) $(octlibdir)/liboctinterp.$(LIBEXT); \ fi if $(SHARED_LIBS); then \ - rm -f $(libdir)/liboctinterp.$(SHLEXT_VER); \ - $(INSTALL_PROGRAM) \ - liboctinterp.$(SHLEXT_VER) $(libdir)/liboctinterp.$(SHLEXT_VER); \ - cd $(libdir); \ + rm -f $(octlibdir)/liboctinterp.$(SHLEXT_VER); \ + $(INSTALL_PROGRAM) liboctinterp.$(SHLEXT_VER) \ + $(octlibdir)/liboctinterp.$(SHLEXT_VER); \ + cd $(octlibdir); \ rm -f liboctinterp.$(SHLEXT); \ $(LN_S) liboctinterp.$(SHLEXT_VER) liboctinterp.$(SHLEXT); \ fi + $(mk-libdir-link) .PHONY: install-lib install-inc: @@ -326,9 +329,9 @@ uninstall: rm -f $(bindir)/octave$(EXE) - rm -f $(libdir)/liboctinterp.$(LIBEXT) - rm -f $(libdir)/liboctinterp.$(SHLEXT) - rm -f $(libdir)/liboctinterp.$(SHLEXT_VER) + rm -f $(octlibdir)/liboctinterp.$(LIBEXT) + rm -f $(octlibdir)/liboctinterp.$(SHLEXT) + rm -f $(octlibdir)/liboctinterp.$(SHLEXT_VER) for f in $(INCLUDES) defaults.h oct-conf.h; do \ rm -f $(octincludedir)/$$f; \ done @@ -343,23 +346,23 @@ clean: rm -f *.$(LIBEXT) *.o *.d *.df *.oct pic/*.o rm -f builtins.cc ops.cc defaults.h oct-conf.h def-files var-files + -rmdir pic if $(SHARED_LIBS); then rm -f *.$(SHLEXT_VER) *.$(SHLEXT); fi .PHONY: clean mostlyclean: rm -f *.o pic/*.o + -rmdir pic .PHONY: mostlyclean distclean: clean rm -f Makefile octave .fname so_locations rm -f stamp-prereq - -rmdir pic .PHONY: distclean maintainer-clean: distclean rm -f tags TAGS y.tab.c y.tab.h y.output yy.lex.c lex.cc parse.cc rm -f oct-gperf.h stamp-prereq - -rmdir pic .PHONY: maintainer-clean dist: parse.cc lex.cc oct-gperf.h diff --git a/src/data.cc b/src/data.cc --- a/src/data.cc +++ b/src/data.cc @@ -1115,16 +1115,16 @@ void symbols_of_data (void) { - DEFCONST (I, Complex (0.0, 1.0), 0, 0, + DEFCONST (I, Complex (0.0, 1.0), "sqrt (-1)"); - DEFCONST (Inf, octave_Inf, 0, 0, + DEFCONST (Inf, octave_Inf, "infinity"); - DEFCONST (J, Complex (0.0, 1.0), 0, 0, + DEFCONST (J, Complex (0.0, 1.0), "sqrt (-1)"); - DEFCONST (NaN, octave_NaN, 0, 0, + DEFCONST (NaN, octave_NaN, "not a number"); #if defined (M_E) @@ -1133,22 +1133,22 @@ double e_val = exp (1.0); #endif - DEFCONST (e, e_val, 0, 0, + DEFCONST (e, e_val, "exp (1)"); - DEFCONST (eps, DBL_EPSILON, 0, 0, + DEFCONST (eps, DBL_EPSILON, "machine precision"); - DEFCONST (i, Complex (0.0, 1.0), 1, 0, + DEFCONST (i, Complex (0.0, 1.0), "sqrt (-1)"); - DEFCONST (inf, octave_Inf, 0, 0, + DEFCONST (inf, octave_Inf, "infinity"); - DEFCONST (j, Complex (0.0, 1.0), 1, 0, + DEFCONST (j, Complex (0.0, 1.0), "sqrt (-1)"); - DEFCONST (nan, octave_NaN, 0, 0, + DEFCONST (nan, octave_NaN, "not a number"); #if defined (M_PI) @@ -1157,13 +1157,13 @@ double pi_val = 4.0 * atan (1.0); #endif - DEFCONST (pi, pi_val, 0, 0, + DEFCONST (pi, pi_val, "ratio of the circumference of a circle to its diameter"); - DEFCONST (realmax, DBL_MAX, 0, 0, + DEFCONST (realmax, DBL_MAX, "realmax (): return largest representable floating point number"); - DEFCONST (realmin, DBL_MIN, 0, 0, + DEFCONST (realmin, DBL_MIN, "realmin (): return smallest representable floating point number"); DEFVAR (treat_neg_dim_as_zero, 0.0, 0, treat_neg_dim_as_zero, diff --git a/src/defaults.cc b/src/defaults.cc --- a/src/defaults.cc +++ b/src/defaults.cc @@ -53,8 +53,9 @@ string Voctave_home; string Vbin_dir; -string Vlib_dir; string Vinfo_dir; +string Vdata_dir; +string Vlibexec_dir; string Varch_lib_dir; string Vlocal_arch_lib_dir; string Vfcn_file_dir; @@ -113,6 +114,18 @@ } static void +set_default_data_dir (void) +{ + Vdata_dir = subst_octave_home (OCTAVE_DATADIR); +} + +static void +set_default_libexec_dir (void) +{ + Vlibexec_dir = subst_octave_home (OCTAVE_LIBEXECDIR); +} + +static void set_default_arch_lib_dir (void) { Varch_lib_dir = subst_octave_home (OCTAVE_ARCHLIBDIR); @@ -137,12 +150,6 @@ } static void -set_default_lib_dir (void) -{ - Vlib_dir = subst_octave_home (OCTAVE_LIBDIR); -} - -static void set_default_exec_path (void) { string octave_exec_path = octave_env::getenv ("OCTAVE_EXEC_PATH"); @@ -192,10 +199,7 @@ string oct_info_prog = octave_env::getenv ("OCTAVE_INFO_PROGRAM"); if (oct_info_prog.empty ()) - { - Vinfo_prog = Varch_lib_dir; - Vinfo_prog.append ("/info"); - } + Vinfo_prog = "info"; else Vinfo_prog = string (oct_info_prog); } @@ -258,6 +262,10 @@ set_default_info_dir (); + set_default_data_dir (); + + set_default_libexec_dir (); + set_default_arch_lib_dir (); set_default_local_arch_lib_dir (); @@ -266,8 +274,6 @@ set_default_bin_dir (); - set_default_lib_dir (); - set_default_exec_path (); set_default_path (); @@ -317,9 +323,8 @@ { Vexec_path = s; - string std_path = Vlocal_arch_lib_dir; - std_path.append (SEPCHAR_STR); - std_path.append (Varch_lib_dir); + string std_path = Vlocal_arch_lib_dir + string (SEPCHAR_STR) + + Varch_lib_dir + string (SEPCHAR_STR) + Vbin_dir; string path; @@ -405,10 +410,10 @@ DEFVAR (IMAGEPATH, OCTAVE_IMAGEPATH, 0, imagepath, "colon separated list of directories to search for image files"); - DEFCONST (OCTAVE_HOME, Voctave_home, 0, 0, + DEFCONST (OCTAVE_HOME, Voctave_home, "top-level Octave installation directory"); - DEFCONSTX ("OCTAVE_VERSION", SBV_OCTAVE_VERSION, OCTAVE_VERSION, 0, 0, + DEFCONSTX ("OCTAVE_VERSION", SBV_OCTAVE_VERSION, OCTAVE_VERSION, "Octave version"); } diff --git a/src/defaults.h.in b/src/defaults.h.in --- a/src/defaults.h.in +++ b/src/defaults.h.in @@ -42,10 +42,18 @@ #define OCTAVE_DATADIR %OCTAVE_DATADIR% #endif +#ifndef OCTAVE_LIBEXECDIR +#define OCTAVE_LIBEXECDIR %OCTAVE_LIBEXECDIR% +#endif + #ifndef OCTAVE_LIBDIR #define OCTAVE_LIBDIR %OCTAVE_LIBDIR% #endif +#ifndef OCTAVE_OCTLIBDIR +#define OCTAVE_OCTLIBDIR %OCTAVE_OCTLIBDIR% +#endif + #ifndef OCTAVE_BINDIR #define OCTAVE_BINDIR %OCTAVE_BINDIR% #endif @@ -109,8 +117,9 @@ extern string Voctave_home; extern string Vbin_dir; -extern string Vlib_dir; extern string Vinfo_dir; +extern string Vdata_dir; +extern string Vlibexec_dir; extern string Varch_lib_dir; extern string Vlocal_arch_lib_dir; extern string Vfcn_file_dir; diff --git a/src/defun.h b/src/defun.h --- a/src/defun.h +++ b/src/defun.h @@ -35,7 +35,7 @@ // // defn is the initial value for the variable. // -// ins_as_fcn is a flag that says whether to install the variable as +// inst_as_fcn is a flag that says whether to install the variable as // if it were a function (allowing the name to also be used as a // variable by users, but recover its original definition if cleared). // @@ -53,27 +53,26 @@ // doc is the simple help text for this variable. #define DEFVAR(name, defn, inst_as_fcn, chg_fcn, doc) \ - DEFVAR_INTERNAL (#name, SBV_ ## name, defn, inst_as_fcn, 0, chg_fcn, doc) + DEFVAR_INTERNAL (#name, SBV_ ## name, defn, inst_as_fcn, false, chg_fcn, doc) -// Define a builtin-constant, and a corresponding variable that can be -// redefined. This is just the same as DEFVAR, except that it defines -// `name' as a variable, and `__name__' as a constant that cannot be -// redefined. +// Define a builtin-constant `__name__', and a corresponding variable +// `name' that can be redefined. (The variable is actually installed +// in the symbol table as a function, so that it doesn't work like a +// global variable when redefined.) -#define DEFCONST(name, defn, inst_as_fcn, chg_fcn, doc) \ - DEFVAR_INTERNAL (#name, SBV_ ## name, defn, inst_as_fcn, false, \ - chg_fcn, doc); \ +#define DEFCONST(name, defn, doc) \ + DEFVAR_INTERNAL (#name, SBV_ ## name, defn, true, false, 0, doc); \ DEFVAR_INTERNAL ("__" ## #name ## "__", XSBV_ ## name, defn, false, \ - true, chg_fcn, doc) + true, 0, doc) // This one can be used when `name' cannot be used directly (if it is // already defined as a macro). In that case, name is already a // quoted string, and the name of the structure has to be passed too. -#define DEFCONSTX(name, sname, defn, inst_as_fcn, chg_fcn, doc) \ - DEFVAR_INTERNAL (name, sname, defn, inst_as_fcn, false, chg_fcn, doc); \ +#define DEFCONSTX(name, sname, defn, doc) \ + DEFVAR_INTERNAL (name, sname, defn, true, false, 0, doc); \ DEFVAR_INTERNAL ("__" ## name ## "__", X ## sname, defn, false, true, \ - chg_fcn, doc) + 0, doc) // Define a builtin function. // diff --git a/src/error.cc b/src/error.cc --- a/src/error.cc +++ b/src/error.cc @@ -326,7 +326,7 @@ DEFVAR (beep_on_error, 0.0, 0, beep_on_error, "if true, beep before printing error messages"); - DEFCONST (error_text, "", 0, 0, + DEFCONST (error_text, "", "the text of error messages that would have been printed in the\n\ body of the most recent unwind_protect statement or the TRY part of\n\ the most recent eval() command. Outside of unwind_protect and\n\ diff --git a/src/file-io.cc b/src/file-io.cc --- a/src/file-io.cc +++ b/src/file-io.cc @@ -1380,22 +1380,22 @@ // NOTE: the values of SEEK_SET, SEEK_CUR, and SEEK_END have to be // this way for Matlab compatibility. - DEFCONST (SEEK_SET, -1.0, 0, 0, + DEFCONST (SEEK_SET, -1.0, "used with fseek to position file relative to the beginning"); - DEFCONST (SEEK_CUR, 0.0, 0, 0, + DEFCONST (SEEK_CUR, 0.0, "used with fseek to position file relative to the current position"); - DEFCONST (SEEK_END, 1.0, 0, 0, + DEFCONST (SEEK_END, 1.0, "used with fseek to position file relative to the end"); - DEFCONSTX ("stdin", SBV_stdin, stdin_file, 0, 0, + DEFCONSTX ("stdin", SBV_stdin, stdin_file, "file number of the standard input stream"); - DEFCONSTX ("stdout", SBV_stdout, stdout_file, 0, 0, + DEFCONSTX ("stdout", SBV_stdout, stdout_file, "file number of the standard output stream"); - DEFCONSTX ("stderr", SBV_stderr, stderr_file, 0, 0, + DEFCONSTX ("stderr", SBV_stderr, stderr_file, "file number of the standard error stream"); } diff --git a/src/help.cc b/src/help.cc --- a/src/help.cc +++ b/src/help.cc @@ -453,7 +453,7 @@ if (print) os << name - << " is the function defined from:\n" + << " is the function defined from: " << ff << "\n"; else retval = ff; @@ -724,7 +724,7 @@ if (! h.empty ()) { - octave_stdout << argv[i] << " is the file:\n" + octave_stdout << argv[i] << " is the file: " << path << "\n\n" << h << "\n"; continue; @@ -831,7 +831,7 @@ symbol_record *sym_rec = lookup_by_name (id, 0); - if (sym_rec) + if (sym_rec && sym_rec->is_defined ()) { if (sym_rec->is_user_function ()) { @@ -851,7 +851,7 @@ { if (nargout == 0 && ! quiet) output_buf << argv[i] - << " is the function defined from:\n" + << " is the function defined from: " << ff << "\n\n"; char ch; @@ -927,7 +927,31 @@ output_buf << "type: `" << argv[i] << "' has unknown type!\n"; } else - output_buf << "type: `" << argv[i] << "' undefined\n"; + { + string ff = fcn_file_in_path (argv[i]); + + if (! ff.empty ()) + { + ifstream fs (ff.c_str (), ios::in); + + if (fs) + { + if (nargout == 0 && ! quiet) + output_buf << argv[i] << " is the script file: " + << ff << "\n\n"; + + char ch; + + while (fs.get (ch)) + output_buf << ch; + } + else + output_buf << "unable to open `" << ff + << "' for reading!\n"; + } + else + output_buf << "type: `" << argv[i] << "' undefined\n"; + } } output_buf << ends; @@ -971,7 +995,7 @@ { symbol_record *sym_rec = lookup_by_name (argv[i], 0); - if (sym_rec) + if (sym_rec && sym_rec->is_defined ()) { int print = (nargout == 0); @@ -982,10 +1006,25 @@ } else { - if (nargout == 0) - octave_stdout << "which: `" << argv[i] << "' is undefined\n"; + string path = fcn_file_in_path (argv[i]); + + if (! path.empty ()) + { + if (nargout == 0) + octave_stdout << "which: `" << argv[i] + << "' is the script file: " + << path << "\n"; + else + retval(i) = path; + } else - retval(i) = "undefined"; + { + if (nargout == 0) + octave_stdout << "which: `" << argv[i] + << "' is undefined\n"; + else + retval(i) = "undefined"; + } } } } diff --git a/src/octave.cc b/src/octave.cc --- a/src/octave.cc +++ b/src/octave.cc @@ -170,22 +170,17 @@ // This may seem odd, but doing it this way means that we don't have // to modify the kpathsea library... - string odb = octave_env::getenv ("OCTAVE_DB_DIR"); + string odb = octave_env::getenv ("OCTAVE_DB_PATH"); + + // For backward compatibility. if (odb.empty ()) - { - string oh = octave_env::getenv ("OCTAVE_HOME"); + odb = octave_env::getenv ("OCTAVE_DB_DIR"); - if (oh.empty ()) - octave_env::putenv ("TEXMF", OCTAVE_DATADIR "/octave"); - else - { - oh.append ("/lib/octave"); - octave_env::putenv ("TEXMF", oh); - } - } - else - octave_env::putenv ("TEXMF", odb); + if (odb.empty ()) + odb = Vdata_dir + string ("/octave:") + Vlibexec_dir + string ("/octave"); + + octave_env::putenv ("TEXMFDBS", odb); } // Initialize by reading startup files. diff --git a/src/syscalls.cc b/src/syscalls.cc --- a/src/syscalls.cc +++ b/src/syscalls.cc @@ -723,77 +723,77 @@ symbols_of_syscalls (void) { #if defined (F_DUPFD) - DEFCONST (F_DUPFD, static_cast (F_DUPFD), 0, 0, + DEFCONST (F_DUPFD, static_cast (F_DUPFD), ""); #endif #if defined (F_GETFD) - DEFCONST (F_GETFD, static_cast (F_GETFD), 0, 0, + DEFCONST (F_GETFD, static_cast (F_GETFD), ""); #endif #if defined (F_GETFL) - DEFCONST (F_GETFL, static_cast (F_GETFL), 0, 0, + DEFCONST (F_GETFL, static_cast (F_GETFL), ""); #endif #if defined (F_SETFD) - DEFCONST (F_SETFD, static_cast (F_SETFD), 0, 0, + DEFCONST (F_SETFD, static_cast (F_SETFD), ""); #endif #if defined (F_SETFL) - DEFCONST (F_SETFL, static_cast (F_SETFL), 0, 0, + DEFCONST (F_SETFL, static_cast (F_SETFL), ""); #endif #if defined (O_APPEND) - DEFCONST (O_APPEND, static_cast (O_APPEND), 0, 0, + DEFCONST (O_APPEND, static_cast (O_APPEND), ""); #endif #if defined (O_ASYNC) - DEFCONST (O_ASYNC, static_cast (O_ASYNC), 0, 0, + DEFCONST (O_ASYNC, static_cast (O_ASYNC), ""); #endif #if defined (O_CREAT) - DEFCONST (O_CREAT, static_cast (O_CREAT), 0, 0, + DEFCONST (O_CREAT, static_cast (O_CREAT), ""); #endif #if defined (O_EXCL) - DEFCONST (O_EXCL, static_cast (O_EXCL), 0, 0, + DEFCONST (O_EXCL, static_cast (O_EXCL), ""); #endif #if defined (O_NONBLOCK) - DEFCONST (O_NONBLOCK, static_cast (O_NONBLOCK), 0, 0, + DEFCONST (O_NONBLOCK, static_cast (O_NONBLOCK), ""); #endif #if defined (O_RDONLY) - DEFCONST (O_RDONLY, static_cast (O_RDONLY), 0, 0, + DEFCONST (O_RDONLY, static_cast (O_RDONLY), ""); #endif #if defined (O_RDWR) - DEFCONST (O_RDWR, static_cast (O_RDWR), 0, 0, + DEFCONST (O_RDWR, static_cast (O_RDWR), ""); #endif #if defined (O_SYNC) - DEFCONST (O_SYNC, static_cast (O_SYNC), 0, 0, + DEFCONST (O_SYNC, static_cast (O_SYNC), ""); #endif #if defined (O_TRUNC) - DEFCONST (O_TRUNC, static_cast (O_TRUNC), 0, 0, + DEFCONST (O_TRUNC, static_cast (O_TRUNC), ""); #endif #if defined (O_WRONLY) - DEFCONST (O_WRONLY, static_cast (O_WRONLY), 0, 0, + DEFCONST (O_WRONLY, static_cast (O_WRONLY), ""); #endif } diff --git a/src/toplev.cc b/src/toplev.cc --- a/src/toplev.cc +++ b/src/toplev.cc @@ -541,6 +541,8 @@ Octave_map m; + // XXX FIXME XXX -- should we perform OCTAVE_HOME substitution on these? + m ["default_pager"] = DEFAULT_PAGER; m ["prefix"] = OCTAVE_PREFIX; m ["exec_prefix"] = OCTAVE_EXEC_PREFIX; @@ -646,15 +648,15 @@ void symbols_of_toplev (void) { - DEFCONST (argv, , 0, 0, + DEFCONST (argv, , "the command line arguments this program was invoked with"); DEFCONST (program_invocation_name, - octave_env::get_program_invocation_name (), 0, 0, + octave_env::get_program_invocation_name (), "the full name of the current program or script, including the\n\ directory specification"); - DEFCONST (program_name, octave_env::get_program_name (), 0, 0, + DEFCONST (program_name, octave_env::get_program_name (), "the name of the current program or script"); } diff --git a/src/version.h b/src/version.h --- a/src/version.h +++ b/src/version.h @@ -1,6 +1,6 @@ /* -Copyright (C) 1996, 1997 John W. Eaton +Copyright (C) 1996, 1997, 1998 John W. Eaton This file is part of Octave. @@ -26,7 +26,7 @@ #define OCTAVE_VERSION "2.1.4" #define OCTAVE_COPYRIGHT \ - "Copyright (C) 1996, 1997 John W. Eaton." + "Copyright (C) 1996, 1997, 1998 John W. Eaton." #define OCTAVE_NAME_AND_VERSION \ "Octave, version " OCTAVE_VERSION " (" TARGET_HOST_TYPE ")" diff --git a/test/octave.test/system/pwd-2.m b/test/octave.test/system/pwd-2.m deleted file mode 100644 --- a/test/octave.test/system/pwd-2.m +++ /dev/null @@ -1,1 +0,0 @@ -