From 7c65f58f12f74cba51c5b2393da6090da2900fb0 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Sun, 16 Mar 2003 22:54:43 +0000 Subject: [PATCH] * lily/parser.yy (scalar): DIGIT is also a scalar. * lily/scm-hash.cc (remove): prevent underflow of elt_count_. This fixes crashes while dumping MIDI. * ly/performer-init.ly (FiguredBassContext): add Figured bass for midi --- ChangeLog | 10 ++++ aclocal.m4 | 129 +++++++++++++++++++++++-------------------- lily/parser.yy | 1 + lily/scm-hash.cc | 31 +++++++---- ly/performer-init.ly | 76 ++++++++++++------------- 5 files changed, 135 insertions(+), 112 deletions(-) diff --git a/ChangeLog b/ChangeLog index 083bdd8ea0..1163a06348 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2003-03-16 Han-Wen Nienhuys + + * lily/parser.yy (scalar): DIGIT is also a scalar. + + * lily/scm-hash.cc (remove): prevent underflow of elt_count_. This + fixes crashes while dumping MIDI. + + * ly/performer-init.ly (FiguredBassContext): add Figured bass for + midi + 2003-03-11 Han-Wen Nienhuys * Documentation/user/refman.itely (Printing named chords): add diff --git a/aclocal.m4 b/aclocal.m4 index d9e1e9e964..7da2945085 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -88,15 +88,14 @@ AC_DEFUN(STEPMAKE_CHECK_SEARCH_RESULT, [ # add entry to missing-list ($2, one of 'OPTIONAL', 'REQUIRED'). AC_DEFUN(STEPMAKE_CHECK_VERSION, [ r="`eval echo '$'"$1"`" - AC_MSG_CHECKING("$r version") - #exe=`STEPMAKE_GET_EXECUTABLE($r)` + AC_MSG_CHECKING([$r version]) exe=`STEPMAKE_GET_EXECUTABLE($r)` ver=`STEPMAKE_GET_VERSION($exe)` num=`STEPMAKE_NUMERIC_VERSION($ver)` req=`STEPMAKE_NUMERIC_VERSION($3)` - AC_MSG_RESULT("$ver") + AC_MSG_RESULT([$ver]) if test "$num" -lt "$req"; then - STEPMAKE_ADD_ENTRY($2, "$r $3 (installed: $ver)") + STEPMAKE_ADD_ENTRY($2, ["$r $3 (installed: $ver)"]) fi ]) @@ -207,7 +206,7 @@ AC_DEFUN(STEPMAKE_COMPILE, [ ]) AC_DEFUN(STEPMAKE_CXX, [ - AC_LANG_CPLUSPLUS + AC_LANG([C++]) AC_PROG_CXX STEPMAKE_OPTIONAL_REQUIRED(CXX, c++, $1) @@ -225,12 +224,10 @@ AC_DEFUN(STEPMAKE_CXX, [ AC_DEFUN(STEPMAKE_CXXTEMPLATE, [ AC_CACHE_CHECK([whether explicit instantiation is needed], lily_cv_need_explicit_instantiation, - AC_TRY_LINK([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ template struct foo { static int baz; }; template int foo::baz = 1; - ], [ return foo::baz; ], - lily_cv_need_explicit_instantiation=no, - lily_cv_need_explicit_instantiation=yes)) + ]], [[ return foo::baz; ]])],[lily_cv_need_explicit_instantiation=no],[lily_cv_need_explicit_instantiation=yes])) if test x"$lily_cv_need_explicit_instantiation"x = x"yes"x; then AC_DEFINE(NEED_EXPLICIT_INSTANTIATION) fi @@ -246,23 +243,33 @@ AC_DEFUN(STEPMAKE_DATADIR, [ presome=${ac_default_prefix} fi - package_datadir=$datadir/$package - local_package_datadir=$package_datadir/$FULL_VERSION - build_package_datadir=$builddir/share/$package + build_package_datadir=$ugh_ugh_autoconf250_builddir/share/$package DATADIR=`echo ${datadir} | sed "s!\\\${prefix}!$presome!"` - PACKAGE_DATADIR=`echo ${package_datadir} | sed "s!\\\${prefix}!$presome!"` - LOCAL_PACKAGE_DATADIR=`echo ${local_package_datadir} | sed "s!\\\${prefix}!$presome!"` BUILD_PACKAGE_DATADIR=`echo ${build_package_datadir} | sed "s!\\\${prefix}!$presome!"` AC_SUBST(datadir) - AC_SUBST(package_datadir) - AC_SUBST(local_package_datadir) AC_SUBST(build_package_datadir) - AC_DEFINE_UNQUOTED(DATADIR, "${DATADIR}") - AC_DEFINE_UNQUOTED(PACKAGE_DATADIR, "${PACKAGE_DATADIR}") - AC_DEFINE_UNQUOTED(LOCAL_PACKAGE_DATADIR, "${LOCAL_PACKAGE_DATADIR}") - AC_DEFINE_UNQUOTED(BUILD_PACKAGE_DATADIR, "${BUILD_PACKAGE_DATADIR}") + AC_DEFINE_UNQUOTED(DATADIR, ["${DATADIR}"]) + AC_DEFINE_UNQUOTED(BUILD_PACKAGE_DATADIR, ["${BUILD_PACKAGE_DATADIR}"]) +]) + +## ugh: cut & paste programming from datadir. +AC_DEFUN(STEPMAKE_LIBDIR, [ + + if test "$libdir" = "\${exec_prefix}/lib"; then + libdir='${exec_prefix}/lib' + fi + presome=$exec_prefix + build_package_libdir=$ugh_ugh_autoconf250_builddir/lib/$package + + LIBDIR=`echo ${libdir} | sed "s!\\\${exec_prefix}!$presome!"` + BUILD_PACKAGE_LIBDIR=`echo ${build_package_libdir} | sed "s!\\\${exec_prefix}!$presome!"` + + AC_SUBST(libdir) + AC_SUBST(build_package_libdir) + AC_DEFINE_UNQUOTED(LIBDIR, ["${LIBDIR}"]) + AC_DEFINE_UNQUOTED(BUILD_PACKAGE_LIBDIR, ["${BUILD_PACKAGE_LIBDIR}"]) ]) @@ -270,7 +277,8 @@ AC_DEFUN(STEPMAKE_END, [ AC_SUBST(OPTIONAL) AC_SUBST(REQUIRED) - AC_OUTPUT($CONFIGFILE.make:config.make.in) + AC_CONFIG_FILES([$CONFIGFILE.make:config.make.in]) +AC_OUTPUT if test -n "$OPTIONAL"; then @@ -313,7 +321,7 @@ AC_DEFUN(STEPMAKE_FLEX, [ # AC_PROG_LEX # urg: automake 1.3: hope this doesn't break 1.2 ac_cv_pro_lex_root hack... - # AC_DECL_YYTEXT + # AC_PROG_LEX() # ugh, ugh ac_cv_prog_lex_root=lex.yy STEPMAKE_PROGS(FLEX, flex, $1) @@ -321,7 +329,7 @@ AC_DEFUN(STEPMAKE_FLEX, [ AC_DEFUN(STEPMAKE_FLEXLEXER, [ - AC_HAVE_HEADERS(FlexLexer.h, true, false) + AC_CHECK_HEADERS([FlexLexer.h],[true],[false]) if test $? -ne 0; then warn='FlexLexer.h (flex package)' STEPMAKE_ADD_ENTRY($1, $warn) @@ -347,7 +355,7 @@ AC_DEFUN(STEPMAKE_GETTEXT, [ LOCALEDIR=`echo ${localedir} | sed "s!\\\${prefix}!$presome!"` AC_SUBST(localedir) - AC_DEFINE_UNQUOTED(LOCALEDIR, "${LOCALEDIR}") + AC_DEFINE_UNQUOTED(LOCALEDIR, ["${LOCALEDIR}"]) AC_CHECK_LIB(intl, gettext) AC_CHECK_FUNCS(gettext) ]) @@ -379,10 +387,10 @@ AC_DEFUN(STEPMAKE_GUILE, [ AC_DEFUN([STEPMAKE_GUILE_FLAGS], [ exe=`STEPMAKE_GET_EXECUTABLE($guile_config)` if test -x $exe; then - AC_MSG_CHECKING("guile compile flags") + AC_MSG_CHECKING([guile compile flags]) GUILE_CFLAGS="`$guile_config compile`" AC_MSG_RESULT($GUILE_CFLAGS) - AC_MSG_CHECKING("guile link flags") + AC_MSG_CHECKING([guile link flags]) GUILE_LDFLAGS="`$guile_config link`" AC_MSG_RESULT($GUILE_LDFLAGS) fi @@ -393,12 +401,12 @@ AC_DEFUN([STEPMAKE_GUILE_FLAGS], [ AC_DEFUN(STEPMAKE_GUILE_DEVEL, [ ## First, let's just see if we can find Guile at all. - AC_MSG_CHECKING("for guile-config") + AC_MSG_CHECKING([for guile-config]) for guile_config in guile-config $target-guile-config $build-guile-config; do - AC_MSG_RESULT("$guile_config") + AC_MSG_RESULT([$guile_config]) if ! $guile_config --version > /dev/null 2>&1 ; then - AC_MSG_WARN("cannot execute $guile_config") - AC_MSG_CHECKING("if we are cross compiling") + AC_MSG_WARN([cannot execute $guile_config]) + AC_MSG_CHECKING([if we are cross compiling]) GUILE_CONFIG='echo no guile-config' else GUILE_CONFIG=$guile_config @@ -443,6 +451,7 @@ AC_DEFUN(STEPMAKE_GXX, [ AC_DEFUN(STEPMAKE_INIT, [ + AC_PREREQ(2.50) . $srcdir/VERSION FULL_VERSION=$MAJOR_VERSION.$MINOR_VERSION.$PATCH_LEVEL if test x$MY_PATCH_LEVEL != x; then @@ -478,32 +487,33 @@ AC_DEFUN(STEPMAKE_INIT, [ AC_MSG_CHECKING(builddir) - builddir="`pwd`" - + ugh_ugh_autoconf250_builddir="`pwd`" + if test "$srcdir" = "."; then srcdir_build=yes else srcdir_build=no - package_builddir="`dirname $builddir`" + package_builddir="`dirname $ugh_ugh_autoconf250_builddir`" package_srcdir="`dirname $srcdir`" fi - AC_MSG_RESULT($builddir) + AC_MSG_RESULT($ugh_ugh_autoconf250_builddir) (cd stepmake 2>/dev/null || mkdir stepmake) (cd stepmake; rm -f bin; ln -s ../$srcdir/bin .) - AC_CONFIG_AUX_DIR(bin) +# only possible with autoconf < 2.50 -- hardcoded in configure.in +# AC_CONFIG_AUX_DIR(bin) stepmake=stepmake else AC_MSG_RESULT($PACKAGE) AC_MSG_CHECKING(builddir) - builddir="`pwd`" + ugh_ugh_autoconf250_builddir="`pwd`" if test "$srcdir" = "."; then srcdir_build=yes else srcdir_build=no fi - AC_MSG_RESULT($builddir) + AC_MSG_RESULT($ugh_ugh_autoconf250_builddir) AC_MSG_CHECKING(for stepmake) # Check for installed stepmake @@ -511,30 +521,28 @@ AC_DEFUN(STEPMAKE_INIT, [ AC_MSG_RESULT($stepmake) else stepmake="`cd $srcdir/stepmake; pwd`" - AC_MSG_RESULT($srcdir/stepmake ($datadir/stepmake not found)) + AC_MSG_RESULT([$srcdir/stepmake ($datadir/stepmake not found)]) fi - AC_CONFIG_AUX_DIR(\ - $HOME/usr/local/share/stepmake/bin\ - $HOME/usr/local/lib/stepmake/bin\ - $HOME/usr/share/stepmake/bin\ - $HOME/usr/lib/stepmake/bin\ - /usr/local/share/stepmake/bin\ - /usr/local/lib/stepmake/bin\ - /usr/share/stepmake/bin\ - /usr/lib/stepmake/bin\ - stepmake/bin\ - $srcdir/stepmake/bin\ - ) - fi - - AC_SUBST(builddir) +# only possible with autoconf < 2.50 -- hardcoded in configure.in +# AC_CONFIG_AUX_DIR(\ +# stepmake/bin\ +# $srcdir/stepmake/bin\ +# ) + fi + + AC_SUBST(ugh_ugh_autoconf250_builddir) AC_SUBST(stepmake) AC_SUBST(package) AC_SUBST(PACKAGE) AC_SUBST(PACKAGE_NAME) - AC_DEFINE_UNQUOTED(PACKAGE, "${PACKAGE_NAME}") - AC_DEFINE_UNQUOTED(TOPLEVEL_VERSION, "${FULL_VERSION}") + # We don't need the upper case variant, + # so stick to macros are uppercase convention. + # AC_DEFINE_UNQUOTED(package, ["${package}"]) + # AC_DEFINE_UNQUOTED(PACKAGE, ["${PACKAGE}"]) + AC_DEFINE_UNQUOTED(PACKAGE, ["${package}"]) + AC_DEFINE_UNQUOTED(PACKAGE_NAME, ["${PACKAGE_NAME}"]) + AC_DEFINE_UNQUOTED(TOPLEVEL_VERSION, ["${FULL_VERSION}"]) if test -z "$package_depth"; then package_depth="." @@ -612,13 +620,14 @@ AC_DEFUN(STEPMAKE_INIT, [ AC_SUBST(LN) AC_SUBST(LN_S) AC_SUBST(INSTALL) - AC_DEFINE_UNQUOTED(DIRSEP, '${DIRSEP}') - AC_DEFINE_UNQUOTED(PATHSEP, '${PATHSEP}') + AC_DEFINE_UNQUOTED(DIRSEP, ['${DIRSEP}']) + AC_DEFINE_UNQUOTED(PATHSEP, ['${PATHSEP}']) AC_SUBST(DIRSEP) AC_SUBST(PATHSEP) AC_SUBST(ROOTSEP) STEPMAKE_DATADIR + STEPMAKE_LIBDIR ]) @@ -652,13 +661,13 @@ AC_DEFUN(STEPMAKE_KPATHSEA, [ [kpathsea_b=$with_kpathsea]) if test "$kpathsea_b" != "no"; then - AC_HAVE_HEADERS(kpathsea/kpathsea.h) + AC_CHECK_HEADERS([kpathsea/kpathsea.h]) AC_CHECK_LIB(kpathsea, kpse_find_file) AC_CHECK_FUNCS(kpse_find_file,,kpathsea_b=no) if test "$kpathsea_b" = "no"; then warn='kpathsea (libkpathsea-dev or kpathsea-devel package) Else, please specify the location of your kpathsea using - --with-kpathea-include and --with-kpathsea-lib options. You should + --with-kpathsea-include and --with-kpathsea-lib options. You should install kpathsea; see INSTALL.txt. Rerun ./configure --without-kpathsea only if kpathsea is not available for your platform.' @@ -813,7 +822,7 @@ AC_DEFUN(STEPMAKE_PERL, [ AC_DEFUN(STEPMAKE_PYTHON_DEVEL, [ - AC_HAVE_HEADERS(python2.2/Python.h python2.1/Python.h python2.0/Python.h python2/Python.h python/Python.h python1.5/Python.h Python.h, PYTHON_HEADER=yes) + AC_CHECK_HEADERS([python2.2/Python.h python2.1/Python.h python2.0/Python.h python2/Python.h python/Python.h python1.5/Python.h Python.h],[PYTHON_HEADER=yes]) if test -z "$PYTHON_HEADER"; then warn='python.h (python-devel, python-dev or libpython-dev package)' STEPMAKE_ADD_ENTRY($1, $warn) diff --git a/lily/parser.yy b/lily/parser.yy index 6c4d70ee54..44cc51660e 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -1162,6 +1162,7 @@ scalar: string { $$ = $1; } | bare_int { $$ = gh_int2scm ($1); } | embedded_scm { $$ = $1; } + | DIGIT { $$ = gh_int2scm ($1); } ; diff --git a/lily/scm-hash.cc b/lily/scm-hash.cc index a8d0488002..1a49a39b54 100644 --- a/lily/scm-hash.cc +++ b/lily/scm-hash.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1999--2002 Han-Wen Nienhuys + (c) 1999--2003 Han-Wen Nienhuys */ #include @@ -11,14 +11,20 @@ #include "scm-hash.hh" #include "ly-smobs.icc" -void +/* + Return: number of objects. + */ +int copy_scm_hashes (SCM dest, SCM src) { - for (int i = SCM_SYMBOL_LENGTH (src); i--;) + int k = 0; + for (int i = SCM_VECTOR_LENGTH (src); i--;) for (SCM s = scm_vector_ref (src, SCM_MAKINUM (i)); ly_pair_p(s); s = ly_cdr (s)) { scm_hashq_set_x (dest, ly_caar (s), ly_cdar (s)); + k++; } + return k ; } @@ -35,11 +41,11 @@ Scheme_hash_table::Scheme_hash_table (Scheme_hash_table const &src) { hash_tab_ = SCM_EOL; - elt_count_ = src.elt_count_; + elt_count_ = 0; smobify_self (); hash_tab_ = scm_make_vector (gh_int2scm (src.elt_count_ >? 11 ), SCM_EOL); - copy_scm_hashes (hash_tab_, src.hash_tab_); + elt_count_ = copy_scm_hashes (hash_tab_, src.hash_tab_); } void @@ -48,9 +54,8 @@ Scheme_hash_table::operator = (Scheme_hash_table const & src) if (&src == this) return; - elt_count_ = src.elt_count_; hash_tab_ = scm_make_vector (gh_int2scm (src.elt_count_ >? 11), SCM_EOL); - copy_scm_hashes (hash_tab_, src.hash_tab_); + elt_count_ = copy_scm_hashes (hash_tab_, src.hash_tab_); } SCM @@ -108,13 +113,12 @@ Scheme_hash_table::set (SCM k, SCM v) /* resize if getting too large. */ - if (elt_count_ > 2 * SCM_SYMBOL_LENGTH (hash_tab_)) + if (elt_count_ > 2 * SCM_VECTOR_LENGTH (hash_tab_)) { SCM nh = scm_make_vector (gh_int2scm (3* elt_count_+1), SCM_EOL); - copy_scm_hashes (nh, hash_tab_); + elt_count_ = copy_scm_hashes (nh, hash_tab_); hash_tab_ = nh; } - } // UGH. @@ -131,7 +135,10 @@ void Scheme_hash_table::remove (SCM k) { scm_hashq_remove_x (hash_tab_, k); - elt_count_ --; + /* + don't decrease elt_count_ , as this may cause underflow. The exact + value of elt_count_ is not important. + */ } Scheme_hash_table::~Scheme_hash_table () @@ -142,7 +149,7 @@ SCM Scheme_hash_table::to_alist () const { SCM l = SCM_EOL; - for (int i = SCM_SYMBOL_LENGTH (hash_tab_); i--;) + for (int i = SCM_VECTOR_LENGTH (hash_tab_); i--;) for (SCM s = scm_vector_ref (hash_tab_, gh_int2scm (i)); ly_pair_p(s); s = ly_cdr (s)) { l = scm_acons (ly_caar (s), ly_cdar (s), l); diff --git a/ly/performer-init.ly b/ly/performer-init.ly index 0735bce8f1..6b94d3d504 100644 --- a/ly/performer-init.ly +++ b/ly/performer-init.ly @@ -12,11 +12,6 @@ StaffContext = \translator { \consists "Time_signature_performer" } -\translator { \StaffContext } -\translator { \StaffContext - \name RhythmicStaff -} - VoiceContext = \translator { \type "Performer_group_performer" @@ -26,7 +21,6 @@ VoiceContext = \translator { \consists "Piano_pedal_performer" \accepts "Thread" } -\translator { \VoiceContext } ThreadContext = \translator { \type "Performer_group_performer" @@ -34,19 +28,11 @@ ThreadContext = \translator { \consists "Note_performer" \consists "Tie_performer" } -\translator { \ThreadContext } - -% retain for compatibility reasons (FIXME: convert-ly) -\translator { - \type "Performer_group_performer" - \name Grace -} -\translator -{ +FiguredBassContext = \translator { \type "Performer_group_performer" - \name VoiceTwo\consists "Note_performer" - + \name FiguredBass + \consists "Swallow_performer" } GrandStaffContext = \translator { @@ -55,14 +41,37 @@ GrandStaffContext = \translator { \accepts RhythmicStaff \accepts Staff } -\translator { \GrandStaffContext } PianoStaffContext = \translator { \type "Performer_group_performer" \name "PianoStaff" \accepts Staff } -\translator { \PianoStaffContext } + +ScoreContext = \translator { + \type "Score_performer" + + \name Score + \alias Timing + instrument = #"bright acoustic" + \accepts Staff + \accepts GrandStaff + \accepts PianoStaff + \accepts Lyrics + \accepts StaffGroup + \accepts ChoirStaff + \accepts RhythmicStaff + \accepts ChordNames + \accepts FiguredBass + + \alias "Timing" + \consists "Timing_translator" + \consists "Swallow_performer" + + dynamicAbsoluteVolumeFunction = #default-dynamic-absolute-volume + instrumentEqualizer = #default-instrument-equalizer +} + \translator { \type "Performer_group_performer" @@ -102,26 +111,13 @@ PianoStaffContext = \translator { \accepts Staff } -ScoreContext = \translator { - \type "Score_performer" - \name Score - \alias Timing - instrument = #"bright acoustic" - \accepts Staff - \accepts GrandStaff - \accepts PianoStaff - \accepts Lyrics - \accepts StaffGroup - \accepts ChoirStaff - \accepts RhythmicStaff - \accepts ChordNames - \alias "Timing" - \consists "Timing_translator" - \consists "Swallow_performer" - - dynamicAbsoluteVolumeFunction = #default-dynamic-absolute-volume - instrumentEqualizer = #default-instrument-equalizer -} -\translator { \ScoreContext } +\translator { \ScoreContext } +\translator { \StaffContext } +\translator { \StaffContext \name RhythmicStaff } +\translator { \VoiceContext } +\translator { \ThreadContext } +\translator { \PianoStaffContext } +\translator { \GrandStaffContext } +\translator { \FiguredBassContext } -- 2.39.5