Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package abcm2ps for openSUSE:Factory checked in at 2026-03-30 18:30:21 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/abcm2ps (Old) and /work/SRC/openSUSE:Factory/.abcm2ps.new.1999 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "abcm2ps" Mon Mar 30 18:30:21 2026 rev:21 rq:1343431 version:8.14.18 Changes: -------- --- /work/SRC/openSUSE:Factory/abcm2ps/abcm2ps.changes 2025-05-07 19:20:03.336134802 +0200 +++ /work/SRC/openSUSE:Factory/.abcm2ps.new.1999/abcm2ps.changes 2026-03-30 18:32:13.865395492 +0200 @@ -1,0 +2,7 @@ +Sun Mar 29 12:16:33 UTC 2026 - Edgar Aichinger <[email protected]> + +- Update to 8.14.18 +- removed abcm2ps-gcc15.patch (fixed upstream) +- removed compiler_flags.patch (handled in specfile) + +------------------------------------------------------------------- Old: ---- abcm2ps-8.14.15.tar.gz abcm2ps-gcc15.patch compiler_flags.patch New: ---- abcm2ps-8.14.18.tar.gz ----------(Old B)---------- Old:- Update to 8.14.18 - removed abcm2ps-gcc15.patch (fixed upstream) - removed compiler_flags.patch (handled in specfile) Old:- removed abcm2ps-gcc15.patch (fixed upstream) - removed compiler_flags.patch (handled in specfile) ----------(Old E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ abcm2ps.spec ++++++ --- /var/tmp/diff_new_pack.X00dTK/_old 2026-03-30 18:32:14.633427602 +0200 +++ /var/tmp/diff_new_pack.X00dTK/_new 2026-03-30 18:32:14.641427937 +0200 @@ -1,7 +1,7 @@ # # spec file for package abcm2ps # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC and contributors # Copyright (c) 2007 by Edgar Aichinger # # All modifications and additions to the file contributed by third parties @@ -18,7 +18,7 @@ Name: abcm2ps -Version: 8.14.15 +Version: 8.14.18 Release: 0 Summary: A program to typeset abc tunes into Postscript License: LGPL-3.0-or-later @@ -32,15 +32,14 @@ Source4: renaissance.fmt Source5: thinlines.fmt # PATCH-FIX-OPENSUSE compiler_flags.patch -- [email protected] -Patch0: compiler_flags.patch -# build with gcc15 -Patch1: abcm2ps-gcc15.patch +# Patch0: compiler_flags.patch BuildRequires: pkgconfig # for rst2man BuildRequires: python3-docutils # for rendering non-latin characters in Postscript output BuildRequires: pkgconfig(cairo) BuildRequires: pkgconfig(freetype2) +BuildRequires: pkgconfig(libpcre2-8) BuildRequires: pkgconfig(pangocairo) %description @@ -56,7 +55,24 @@ sed "s/\/\/#define A4_FORMAT/#define A4_FORMAT/" config.h.sed > config.h.in %build -%configure +LDLIBS="$LDLIBS `pkg-config pangocairo pangoft2 gobject-2.0 freetype2 libpcre2-8 --libs`" \ +./configure \ + --prefix=/usr \ + --bindir=/usr/bin \ + --sbindir=/usr/sbin \ + --sysconfdir=/etc \ + --datadir=/usr/share \ + --includedir=/usr/include \ + --libdir=/usr/lib64 \ + --libexecdir=/usr/libexec \ + --localstatedir=/var \ + --sharedstatedir=/var/lib \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info + +CFLAGS="$RPM_OPT_FLAGS -pipe" \ +CPPFLAGS="$CPPFLAGS -DHAVE_PANGO=1 `pkg-config pango cairo gobject-2.0 freetype2 --cflags`" \ +LDLIBS="$LDLIBS `pkg-config pangocairo pangoft2 gobject-2.0 freetype2 libpcre2-8 --libs`" \ make %{?_smp_mflags} %install @@ -67,7 +83,7 @@ %files %license COPYING %doc README.md *.abc sample3.eps -%{_bindir}/* +%{_bindir}/%{name} %{_datadir}/%{name} %{_mandir}/man1/%{name}* ++++++ abcm2ps-8.14.15.tar.gz -> abcm2ps-8.14.18.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/.gitignore new/abcm2ps-8.14.18/.gitignore --- old/abcm2ps-8.14.15/.gitignore 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/.gitignore 1970-01-01 01:00:00.000000000 +0100 @@ -1,13 +0,0 @@ -# gitignore -# important! -!.gitignore -!.travis.yml -.* -*.o -*.gz -*~ -Out* -abcm2ps -abcm2ps.1 -config.h -Makefile diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/.travis.yml new/abcm2ps-8.14.18/.travis.yml --- old/abcm2ps-8.14.15/.travis.yml 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/.travis.yml 1970-01-01 01:00:00.000000000 +0100 @@ -1,37 +0,0 @@ -language: c -sudo: false -# addons: -# apt: -# sources: -# - extras-precise -# - lucid -# - partner-precise -# packages: -# - pkg-config -# - libpango-1.0-0 -# - libcairo2 -# - libcairo2-dev -# - libpangocairo-1.0-0 -# - libfreetype6 -# - libfreetype6-dev -# - libpangoft2-1.0-0 -branches: - only: - - master - - /^abcm2ps-\\d+\\.\\d+(\\.\\d+)?(-\\S*)?$/ -notifications: - slack: - secure: RCTAGKXARo6MkEXigVVZp4Oc6B0AejbTYZp4YJ155DBp8Ygt42WuLlCxJZ60Ruzyjh5ymAOV1rsAKXPS+UJMWO7+pLJuqZEeWK08hGSL/DpIfa3IMYYSQYHCYDTpKiyqBC0ytEpd077Pv3b3ZVvZO2Tjo3F9806M5fTCFuwWgTxxt45302LiHCSOk4q/d8MT1cSK6k6ZvRarK0LG9cnudqcV6+Y8yDlJUz+ixxmSAg3j0jXwXisdyOFmI9hRc0DtNhkJHMORBigm0Cis5ipWRV9XH13MXgT3Vd61jG816mLUipht88PVcGzSfLUPcXlT0vMADy47WmVnUNqNosNyYXO9YHmNNj7wVIR79U7wrPXL6g3zXYBzs6JQwECPl1eGfnhZeOQ3drY+Pc+Sz+W8XT7q1SefzLhIws6vMM3i9UGQhOb74mMH5mrHaQTPaz6P4pOUQ9QaUOwK0ud6z6rC5uLD5GkQmdTuLpTiC2vvER46DxgzHghdqgeJXSwCkQEgBjTrs+ffc4kfeakFFW73B7x1sCz9katxHpzlajb03YYnPDhpODMazUx1AKmDHSJhsKv8mRm5L/7z24GIFs7m0xDmS4YMo1AqeLpAGu0zdhVE+0jN2s9QDo8pHrmikCdkhbaUKwXHZZY4d0ykK2rovROfBiZOld1TqbbaPOOBEck= -install: ./configure && make clean && make && make test -before_deploy: make dist && make zip-dist -# deploy: -# - provider: releases -# api-key: -# secure: hVfF6MJJuqH9TkOqqyLdPtfERv9YyozoLHX3YaQbUuLcsvAVF2GBZvDAFIyInV4VWqbtVu7faOpZyrOvd3TMHJMNzWGwBjWxAUJmM2gVugjpxAv6G+11ReeF8okqOIQGWdigZ9lb29utwrGb3R1hC2I6qcdlziw2JXMdl2GTBr6/zn0cFnAtfJqzT3REgog2g9HBorzNC+DqQXWI5skz6N4tWEvUfEwKERJkjyz3Lqen86MGHv+wEpqqCSmVbsSpiIkSwvbSm1PIsHhMg2zMbuJoqNsvlhz6Muyk6B5vRxXkJMstS5hAuIYAdWwu+3r42ZxK+TB3QWOO5fWRRBS7r2buvI63b+TvUDgCvHIr4cA1qMvyOCd5Xbv5HdRiZRqiJrUubfm6L1gXZ2Wo7KZVN7NVI9YJRqY9yZi59BZOXI6eDzb5AsjmpqSWBwXKhLUhCNwdqL52DPfL9pOjk9HY1i27BpoyL3X3NI0OJ+fUf6Q/utlv/wTiSbwHjiN+7dpnIlbAe09JQRXi7ApqtO0gV5tCBucBSydv6aAO3h5T0dRWFIB90bo6f1t0qeBO/YicP3qrM2OryhJNlZwFoJYPy2XDAzQ8Q5ubCKCp+C7U97vJwqGiXprKKDz9rGVuPWeIV/tLkcVn2TQt8hNyOqkcn4nv8x0j+ukw1p/Svtb3z54= -# name: $TRAVIS_TAG -# body: $TRAVIS_COMMIT_MESSAGE build $TRAVIS_BUILD_NUMBER -# file_glob: true -# file: abcm2ps-*.zip -# skip_cleanup: true -# on: -# branch: release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/Makefile.in new/abcm2ps-8.14.18/Makefile.in --- old/abcm2ps-8.14.15/Makefile.in 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/Makefile.in 2026-03-14 17:59:15.000000000 +0100 @@ -42,7 +42,6 @@ mkdir -p $(bindir) $(INSTALL_PROGRAM) abcm2ps $(bindir) mkdir -p $(datadir)/abcm2ps - $(INSTALL_DATA) $(srcdir)/abc2svg.ttf $(datadir)/abcm2ps $(INSTALL_DATA) $(srcdir)/*.fmt $(datadir)/abcm2ps mkdir -p $(docdir)/abcm2ps/examples $(INSTALL_DATA) $(srcdir)/README.md $(docdir)/abcm2ps diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/README.md new/abcm2ps-8.14.18/README.md --- old/abcm2ps-8.14.15/README.md 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/README.md 2026-01-28 09:16:09.000000000 +0100 @@ -1,7 +1,10 @@ +<style> +p{margin-left:.5cm;max-width:21cm} +li{margin-left:.5cm;max-width:18cm} +li p{margin-left:0} +</style> # abcm2ps -[](https://travis-ci.org/leesavide/abcm2ps) - ### Overview abcm2ps is a C program which converts music tunes from the ABC music notation @@ -9,10 +12,10 @@ Based on [abc2ps](https://github.com/methf/abc2ps), the Postscript generator for ABC music notation by Michael Methfessel, -it was first developped to print barock organ scores that have independant +abcm2ps was first developped to print barock organ scores that have independant voices played on one or many keyboards and a pedal-board (the 'm' of abcm2ps stands for many or multi staves/voices). -Since this time, it has evolved so it can render many more music kinds. +Since this time, it has evolved so it can render many more music types. Note that this program is at end of life. Its successor is [abc2svg](https://chiselapp.com/user/moinejf/repository/abc2svg). @@ -39,24 +42,25 @@ abcm2ps [options] file1 [file1_options] file2 [file2_options] ... where file1, file2, .. are the ABC input files. -This will generate a Postscript file (default name: `Out.ps`). +This generates a Postscript file (default name: `Out.ps`). + Run `abcm2ps -h` to know the list of the command line options. ### Documentation -- abcm2ps.rst describes all command-line options. +- The file abcm2ps.rst describes all command-line options. - When `abcm2ps` is installed, it may be read by `man abcm2ps`. + When `abcm2ps` is installed, this file may be displayed by `man abcm2ps`. -- the features and format parameters are described in - http://moinejf.free.fr/abcm2ps-doc/index.html +- The features and format parameters are described in + [abcm2ps-doc](http://moinejf.free.fr/abcm2ps-doc/index.html). ### Links -Author's page: http://moinejf.free.fr/ +Author's page: [http://moinejf.free.fr/](http://moinejf.free.fr/) To know more about the ABC music notation, have a look at - http://abcnotation.com/ + [abcnotation](https://abcnotation.com/). Guido Gonzato maintains many abcm2ps binaries and more documentation at - http://abcplus.sourceforge.net/ + [abcplus](https://abcplus.sourceforge.net/). Binary files old/abcm2ps-8.14.15/abc2svg.ttf and new/abcm2ps-8.14.18/abc2svg.ttf differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/abcm2ps.h new/abcm2ps-8.14.18/abcm2ps.h --- old/abcm2ps-8.14.15/abcm2ps.h 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/abcm2ps.h 2026-01-28 09:16:09.000000000 +0100 @@ -64,6 +64,7 @@ #endif #define CM * 37.8 /* factor to transform cm to pt */ +#define MM * 3.78 /* factor to transform mm to pt */ #define PT /* factor to transform pt to pt */ #define IN * 96.0 /* factor to transform inch to pt */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/abcparse.c new/abcm2ps-8.14.18/abcparse.c --- old/abcm2ps-8.14.15/abcparse.c 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/abcparse.c 2026-01-28 09:16:09.000000000 +0100 @@ -3,7 +3,7 @@ * * This file is part of abcm2ps. * - * Copyright (C) 1998-2021 Jean-François Moine (http://moinejf.free.fr) + * Copyright (C) 1998-2025 Jean-François Moine (http://moinejf.free.fr) * Adapted from abc2ps, Copyright (C) 1996-1998 Michael Methfessel * * This program is free software; you can redistribute it and/or modify it @@ -1583,6 +1583,8 @@ d = strtol(p, &q, 10); p = q; } + } else { + d = 256; // assume a temperament equal } if (microscale == 0) { d--; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/build.ninja new/abcm2ps-8.14.18/build.ninja --- old/abcm2ps-8.14.15/build.ninja 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/build.ninja 2026-01-28 09:16:09.000000000 +0100 @@ -33,26 +33,24 @@ default abcm2ps -# GitHub releases +# fossil releases rule version - command = tag=`grep VERSION= configure|cut -d'=' -f2`;$ - if [ $out = minor ]; then$ - m=$${tag#*.};$ - m=$${m%%.*};$ - m=$$((m + 1));$ - newtag="$${tag%%.*}.$$m.0";$ - else$ - p=$${tag##*.};$ - p=$$((p + 1));$ - newtag="$${tag%.*}.$$p";$ + command = v=`fossil changes|wc -l`;$ + if [ $$v -ne 0 ]; then $ + echo "!! There are changes !!";$ + exit 1;$ + fi;$ + v=`fossil describe`;$ + if [ "$$out"="patch" ]; then $ + v=`echo $$v|awk -F. -v OFS=. '{$$3 += 1; print}'`;$ + else $ + v=`echo $$v|awk -F. -v OFS=. '{$$2 += 1; $$3=0; print}'`;$ fi;$ - p=`grep VDATE= configure|cut -d'=' -f2`;$ m=`date +%F`;$ mv configure configure~;$ - sed -e "s/$$tag/$$newtag/;s/$$p/$$m/" configure~ > configure;$ + sed -e "s/^VERSION.*/VERSION=$${v#v}/;s/^VDATE.*/VDATE=$$m/" configure~ > configure;$ chmod +x configure;$ - echo "New release v$$newtag" | git commit -F- configure;$ - git tag -a v$$newtag;$ - echo "Don't forget: git push --follow-tags; ./configure" + fossil commit -m "New release $$v" -tag $$v;$ + echo "Don't forget: ./configure" build minor: version build patch: version diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/config.h.in new/abcm2ps-8.14.18/config.h.in --- old/abcm2ps-8.14.15/config.h.in 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/config.h.in 2026-01-28 09:16:09.000000000 +0100 @@ -10,7 +10,7 @@ #define HAVE_MMAP 1 /* default directory to search for format files */ -#define DEFAULT_FDIR xxx +#define DEFAULT_FDIR "@DEFAULT_FDIR@" -#define VERSION xxx -#define VDATE xxx +#define VERSION "@VERSION@" +#define VDATE "@VDATE@" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/configure new/abcm2ps-8.14.18/configure --- old/abcm2ps-8.14.15/configure 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/configure 2026-03-14 18:02:59.000000000 +0100 @@ -1,17 +1,14 @@ #! /bin/sh +set -e -f -u # (automatic update) -VERSION=8.14.15 -VDATE=2024-01-08 +VERSION=8.14.18 +VDATE=2026-03-14 -: "${CC:=gcc}" -: "${PKG_CONFIG:=pkg-config}" -CFLAGS="-g -O2 -Wall -pipe $CFLAGS" - -srcdir=. -: "${prefix=/usr/local}" - -: "${INSTALL:=/usr/bin/install -c}" +# Variables may be set, by order of precedence: +# * in the environment, +# * in ./custom if it exists, +# * or on the command line. if test -f ./custom; then . ./custom @@ -23,75 +20,57 @@ c="${c#--}" eval "${c%%=*}='${c#*=}'" ;; + *) + echo "$0: unknown argument: $c" + ;; esac done +# Most variables are just passed to sed, but the following ones are +# also expanded by the shell and need a default value. +: "${PKG_CONFIG=${host+$host-}pkg-config}" +: "${prefix=/usr/local}" +: "${srcdir=$(realpath --relative-to=. $(dirname $0))}" + case "$srcdir" in *\ *) echo "srcpath cannot contain spaces" exit 1 esac -if test "x$INSTALL_DATA" = x; then - INSTALL_DATA='${INSTALL} -m 644' -fi -if test "x$INSTALL_PROGRAM" = x; then - INSTALL_PROGRAM='${INSTALL}' -fi - -if test "x$exec_prefix" = x; then - exec_prefix='${prefix}' -fi -if test "x$bindir" = x; then - bindir='${exec_prefix}/bin' -fi -if test "x$datarootdir" = x; then - datarootdir='${prefix}/share' -fi -if test "x$docdir" = x; then - docdir='${prefix}/share/doc' -fi -if test "x$mandir" = x; then - mandir='${prefix}/share/man' -fi -if test "x$DEFAULT_FDIR" = x; then - DEFAULT_FDIR="$prefix/share/abcm2ps" -fi - if ! $PKG_CONFIG --exists freetype2 ; then echo "pkg-config/freetype2 not found - no pango support" elif ! $PKG_CONFIG --exists pangocairo ; then echo "pangocairo not found - no pango support" else - CPPFLAGS="$CPPFLAGS -DHAVE_PANGO=1 `$PKG_CONFIG pango cairo freetype2 --cflags`" - LDLIBS="`$PKG_CONFIG pangocairo pangoft2 freetype2 --libs` $LDLIBS" + pango_cflags="-DHAVE_PANGO=1 `$PKG_CONFIG pango cairo freetype2 --cflags`" + pango_libs="`$PKG_CONFIG pangocairo pangoft2 freetype2 --libs`" fi -CPPFLAGS="$CPPFLAGS -I." -# ./config.h will not be found in srcdir. - -LDLIBS="$LDLIBS -lm" -# Useful on some architectures. - -sed "s+@CC@+$CC+ -s+@CPPFLAGS@+$CPPFLAGS+ -s+@CFLAGS@+$CFLAGS+ -s+@LDFLAGS@+$LDFLAGS+ -s+@LDLIBS@+$LDLIBS+ -s+@INSTALL@+$INSTALL+ -s+@INSTALL_DATA@+$INSTALL_DATA+ -s+@INSTALL_PROGRAM@+$INSTALL_PROGRAM+ +sed " +s+@CC@+${CC-${host+$host-}gcc}+ +# -I.: ./config.h will not be found in srcdir. +s+@CPPFLAGS@+${CPPFLAGS-} ${pango_cflags-} -I.+ +s+@CFLAGS@+-g -O2 -Wall -pipe ${CFLAGS-}+ +s+@LDFLAGS@+${LDFLAGS-}+ +# -lm: useful on some architectures. +s+@LDLIBS@+${pango_libs-} ${LDLIBS-} -lm+ +s+@INSTALL@+${INSTALL-/usr/bin/install -c}+ +s+@INSTALL_DATA@+${INSTALL_DATA-\$(INSTALL) -m 644}+ +s+@INSTALL_PROGRAM@+${INSTALL_PROGRAM-\$(INSTALL)}+ s+@prefix@+$prefix+ -s+@exec_prefix@+$exec_prefix+ +s+@exec_prefix@+${exec_prefix-\$(prefix)}+ s+@srcdir@+$srcdir+ -s+@bindir@+$bindir+ -s+@datarootdir@+$datarootdir+ -s+@mandir@+$mandir+ -s+@docdir@+$docdir+" "$srcdir/Makefile.in" > Makefile +s+@bindir@+${bindir-\$(exec_prefix)/bin}+ +s+@datarootdir@+${datarootdir-\$(prefix)/share}+ +s+@mandir@+${mandir-\$(prefix)/share/man}+ +s+@docdir@+${docdir-\$(prefix)/share/doc}+ +" "$srcdir/Makefile.in" > Makefile echo "Makefile created" -sed "s/define VERSION xxx/\define VERSION \"$VERSION\"/ -s/define VDATE xxx/define VDATE \"$VDATE\"/ -s+define DEFAULT_FDIR xxx+define DEFAULT_FDIR \"$DEFAULT_FDIR\"+ +sed " +s/@VERSION@/$VERSION/ +s/@VDATE@/$VDATE/ +s+@DEFAULT_FDIR@+${DEFAULT_FDIR-$prefix/share/abcm2ps}+ " "$srcdir/config.h.in" > config.h echo "config.h created" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/draw.c new/abcm2ps-8.14.18/draw.c --- old/abcm2ps-8.14.15/draw.c 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/draw.c 2026-01-28 09:16:09.000000000 +0100 @@ -3,7 +3,7 @@ * * This file is part of abcm2ps. * - * Copyright (C) 1998-2020 Jean-François Moine (http://moinejf.free.fr) + * Copyright (C) 1998-2025 Jean-François Moine (http://moinejf.free.fr) * Adapted from abc2ps, Copyright (C) 1996-1998 Michael Methfessel * * This program is free software; you can redistribute it and/or modify it @@ -984,7 +984,8 @@ a2b("%d %s%d ", n, acc_tb[acc & 0x07], d); } else { if (acc >> 3 != 0 - && cfmt.nedo) // %%MIDI temperamentequal <nedo> + && cfmt.nedo // %%MIDI temperamentequal <nedo> + && (n & 255) == 255) // short accidental: "|" | "^" n (d == nedo) n = ((((n >> 8) + 1) * 12) - 1) * 256 + cfmt.nedo - 1; a2b("%s%d ", acc_tb[acc & 0x07], n); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/format.c new/abcm2ps-8.14.18/format.c --- old/abcm2ps-8.14.15/format.c 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/format.c 2026-01-28 09:16:09.000000000 +0100 @@ -13,6 +13,7 @@ */ #include <stdlib.h> +#include <stdbool.h> #include <string.h> #include <ctype.h> @@ -622,6 +623,8 @@ } if (!strncasecmp(str, "pt", 2)) return a PT; + if (!strncasecmp(str, "mm", 2)) + return type ? a MM : a * 2.835; if (!strncasecmp(str, "cm", 2)) return type ? a CM : a * 28.35; if (!strncasecmp(str, "in", 2)) @@ -1158,13 +1161,13 @@ } if (strcmp(w, "writehistory") == 0) { /* compatibility */ struct SYMBOL *s; - int bool; + bool boolv; unsigned u; - bool = get_bool(p); + boolv = get_bool(p); for (s = info['I' - 'A']; s != 0; s = s->next) { u = s->text[0] - 'A'; - if (bool) + if (boolv) cfmt.fields[0] |= (1 << u); else cfmt.fields[0] &= ~(1 << u); @@ -1215,7 +1218,7 @@ } break; case 1: { /* %%writefields */ - int bool; + bool boolv; unsigned u; q = p; @@ -1223,7 +1226,7 @@ p++; while (isspace((unsigned char) *p)) p++; - bool = get_bool(p); + boolv = get_bool(p); while (*q != '\0' && !isspace((unsigned char) *q)) { u = *q - 'A'; if (u < 26) { @@ -1235,7 +1238,7 @@ else break; /*fixme: error */ } - if (bool) + if (boolv) cfmt.fields[i] |= (1 << u); else cfmt.fields[i] &= ~(1 << u); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/glyph.c new/abcm2ps-8.14.18/glyph.c --- old/abcm2ps-8.14.15/glyph.c 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/glyph.c 2026-01-28 09:16:09.000000000 +0100 @@ -223,7 +223,7 @@ while (isspace(*p)) p++; i3 = i4 = -1; - if (val < 0x0400) { + if (val < 0x0800) { i1 = (val >> 6) - 2; i2 = val & 0x3f; } else if (val < 0x10000) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/gscanf.c new/abcm2ps-8.14.18/gscanf.c --- old/abcm2ps-8.14.15/gscanf.c 1970-01-01 01:00:00.000000000 +0100 +++ new/abcm2ps-8.14.18/gscanf.c 2026-03-14 18:07:34.000000000 +0100 @@ -0,0 +1,371 @@ +#include <stdarg.h> + +/* ------------------------------------------------------------------ * + * Utilities interne * + * ------------------------------------------------------------------ */ + +static int b_isspace(char c) { + return c == ' ' || c == '\t' || c == '\n' || + c == '\r' || c == '\f' || c == '\v'; +} + +static int b_isdigit(char c) { return c >= '0' && c <= '9'; } + +static int b_isxdigit(char c) { + return (c >= '0' && c <= '9') || + (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F'); +} + +static int b_tolower(char c) { + return (c >= 'A' && c <= 'Z') ? c + 32 : c; +} + +/* Salta spazi bianchi, restituisce il numero di caratteri saltati */ +static int skip_whitespace(const char *s) { + int n = 0; + while (b_isspace(s[n])) n++; + return n; +} + +/* ------------------------------------------------------------------ * + * Parser per i singoli tipi * + * ------------------------------------------------------------------ */ + +/* Legge un intero con segno in base `base` (8, 10, 16). + Restituisce il numero di caratteri consumati, 0 se fallisce. */ +static int parse_long(const char *s, int width, int base, + long *out, int *negative_out) { + int i = 0; + int neg = 0; + long val = 0; + + if (s[i] == '+') { i++; } + else if (s[i] == '-') { neg = 1; i++; } + + /* Prefisso automatico 0x / 0 */ + if (base == 16 && s[i] == '0' && + (s[i+1] == 'x' || s[i+1] == 'X')) { + i += 2; + } else if (base == 8 && s[i] == '0') { + i++; + } + + int digits = 0; + while ((width == 0 || i < width) && s[i] != '\0') { + int d; + if (base == 16 && b_isxdigit(s[i])) { + char lc = b_tolower(s[i]); + d = (lc >= 'a') ? lc - 'a' + 10 : lc - '0'; + } else if (b_isdigit(s[i]) && (s[i] - '0') < base) { + d = s[i] - '0'; + } else { + break; + } + val = val * base + d; + digits++; + i++; + } + if (digits == 0) return 0; + *out = neg ? -val : val; + if (negative_out) *negative_out = neg; + return i; +} + +/* Legge un unsigned long */ +static int parse_ulong(const char *s, int width, int base, + unsigned long *out) { + long tmp = 0; + int n = parse_long(s, width, base, &tmp, 0); + if (n) *out = (unsigned long)tmp; + return n; +} + +/* Legge un double (formato: [±] cifre [. cifre] [e/E [±] cifre]) */ +static int parse_double(const char *s, int width, double *out) { + int i = 0; + double val = 0.0; + int neg = 0; + + if (s[i] == '+') { i++; } + else if (s[i] == '-') { neg = 1; i++; } + + int digits = 0; + while ((width == 0 || i < width) && b_isdigit(s[i])) { + val = val * 10.0 + (s[i] - '0'); + digits++; i++; + } + + /* Parte frazionaria */ + if ((width == 0 || i < width) && s[i] == '.') { + i++; + double frac = 0.1; + while ((width == 0 || i < width) && b_isdigit(s[i])) { + val += (s[i] - '0') * frac; + frac *= 0.1; + digits++; i++; + } + } + if (digits == 0) return 0; + + /* Esponente */ + if ((width == 0 || i < width) && + (s[i] == 'e' || s[i] == 'E')) { + i++; + int eneg = 0; + if (s[i] == '+') { i++; } + else if (s[i] == '-') { eneg = 1; i++; } + int exp = 0; + while ((width == 0 || i < width) && b_isdigit(s[i])) { + exp = exp * 10 + (s[i] - '0'); + i++; + } + /* Applica esponente tramite moltiplicazione iterativa */ + double factor = 1.0; + for (int e = 0; e < exp; e++) factor *= 10.0; + val = eneg ? val / factor : val * factor; + } + + *out = neg ? -val : val; + return i; +} + +/* ------------------------------------------------------------------ * + * gscanf() * + * ------------------------------------------------------------------ */ + +/** + * gscanf() — equivalente a sscanf(), senza dipendenze. + * + * Specificatori supportati: + * %d %i %u %o %x/%X %f/%e/%g %s %c %[...] %n %% + * Modificatori: h l (width numerico) + * Flag: * (soppressione assegnamento) + */ +int gscanf(const char *buf, const char *fmt, ...) { + va_list ap; + va_start(ap, fmt); + + const char *b = buf; /* cursore sul buffer */ + const char *f = fmt; /* cursore sul formato */ + int assigned = 0; /* numero di assegnamenti riusciti */ + + while (*f != '\0') { + + /* --- Spazio nel formato: salta whitespace nel buffer --- */ + if (b_isspace(*f)) { + b += skip_whitespace(b); + while (b_isspace(*f)) f++; + continue; + } + + /* --- Carattere letterale --- */ + if (*f != '%') { + if (*b != *f) break; /* mismatch → stop */ + b++; f++; + continue; + } + + /* --- Specifier '%' --- */ + f++; /* salta '%' */ + + /* Flag di soppressione */ + int suppress = 0; + if (*f == '*') { suppress = 1; f++; } + + /* Larghezza massima */ + int width = 0; + while (b_isdigit(*f)) { width = width * 10 + (*f - '0'); f++; } + + /* Modificatore di lunghezza */ + int mod_l = 0, mod_h = 0; + if (*f == 'l') { mod_l = 1; f++; } + else if (*f == 'h') { mod_h = 1; f++; } + + char spec = *f++; + + /* %% */ + if (spec == '%') { + if (*b != '%') break; + b++; + continue; + } + + /* Tutti gli specificatori numerici/stringa saltano whitespace */ + if (spec != 'c' && spec != '[' && spec != 'n') { + b += skip_whitespace(b); + } + + if (*b == '\0' && spec != 'n') break; /* EOF */ + + /* -------------------------------------------------------- */ + if (spec == 'n') { + /* Numero di caratteri letti finora */ + if (!suppress) { + int *p = va_arg(ap, int *); + *p = (int)(b - buf); + } + continue; /* %n non conta come assegnamento */ + } + + /* -------------------------------------------------------- */ + if (spec == 'c') { + int cnt = (width == 0) ? 1 : width; + if (!suppress) { + char *p = va_arg(ap, char *); + for (int i = 0; i < cnt && *b != '\0'; i++) *p++ = *b++; + assigned++; + } else { + for (int i = 0; i < cnt && *b != '\0'; i++) b++; + } + continue; + } + + /* -------------------------------------------------------- */ + if (spec == 's') { + int cnt = 0; + char *p = suppress ? 0 : va_arg(ap, char *); + while (*b != '\0' && !b_isspace(*b) && + (width == 0 || cnt < width)) { + if (!suppress) *p++ = *b; + b++; cnt++; + } + if (cnt == 0) break; + if (!suppress) { *p = '\0'; assigned++; } + continue; + } + + /* -------------------------------------------------------- */ + if (spec == '[') { + /* Costruisce il set di caratteri accettati */ + int negate = 0; + char set[256]; + int in_set[256]; + /* Azzera il set */ + for (int i = 0; i < 256; i++) in_set[i] = 0; + + if (*f == '^') { negate = 1; f++; } + + int si = 0; + /* ']' come primo carattere è letterale */ + if (*f == ']') { set[si++] = ']'; in_set[(unsigned char)']'] = 1; f++; } + while (*f != ']' && *f != '\0') { + /* Range a-z */ + if (*(f+1) == '-' && *(f+2) != ']' && *(f+2) != '\0') { + for (char c = *f; c <= *(f+2); c++) { + set[si++] = c; + in_set[(unsigned char)c] = 1; + } + f += 3; + } else { + set[si++] = *f; + in_set[(unsigned char)*f] = 1; + f++; + } + } + if (*f == ']') f++; + + char *p = suppress ? 0 : va_arg(ap, char *); + int cnt = 0; + while (*b != '\0' && (width == 0 || cnt < width)) { + int match = in_set[(unsigned char)*b]; + if (negate) match = !match; + if (!match) break; + if (!suppress) *p++ = *b; + b++; cnt++; + } + if (cnt == 0) break; + if (!suppress) { *p = '\0'; assigned++; } + continue; + } + + /* -------------------------------------------------------- */ + if (spec == 'd' || spec == 'i') { + int base = 10; + if (spec == 'i') { + /* Determina la base dal prefisso */ + if (*b == '0') { + if (b[1] == 'x' || b[1] == 'X') base = 16; + else base = 8; + } + } + long val = 0; + int n = parse_long(b, width, base, &val, 0); + if (n == 0) break; + b += n; + if (!suppress) { + if (mod_l) { *va_arg(ap, long *) = val; } + else if (mod_h) { *va_arg(ap, short *) = (short)val; } + else { *va_arg(ap, int *) = (int)val; } + assigned++; + } + continue; + } + + /* -------------------------------------------------------- */ + if (spec == 'u') { + unsigned long val = 0; + int n = parse_ulong(b, width, 10, &val); + if (n == 0) break; + b += n; + if (!suppress) { + if (mod_l) { *va_arg(ap, unsigned long *) = val; } + else if (mod_h) { *va_arg(ap, unsigned short *) = (unsigned short)val; } + else { *va_arg(ap, unsigned int *) = (unsigned int)val; } + assigned++; + } + continue; + } + + /* -------------------------------------------------------- */ + if (spec == 'o') { + unsigned long val = 0; + int n = parse_ulong(b, width, 8, &val); + if (n == 0) break; + b += n; + if (!suppress) { + if (mod_l) { *va_arg(ap, unsigned long *) = val; } + else if (mod_h) { *va_arg(ap, unsigned short *) = (unsigned short)val; } + else { *va_arg(ap, unsigned int *) = (unsigned int)val; } + assigned++; + } + continue; + } + + /* -------------------------------------------------------- */ + if (spec == 'x' || spec == 'X') { + unsigned long val = 0; + int n = parse_ulong(b, width, 16, &val); + if (n == 0) break; + b += n; + if (!suppress) { + if (mod_l) { *va_arg(ap, unsigned long *) = val; } + else if (mod_h) { *va_arg(ap, unsigned short *) = (unsigned short)val; } + else { *va_arg(ap, unsigned int *) = (unsigned int)val; } + assigned++; + } + continue; + } + + /* -------------------------------------------------------- */ + if (spec == 'f' || spec == 'e' || spec == 'E' || + spec == 'g' || spec == 'G') { + double val = 0.0; + int n = parse_double(b, width, &val); + if (n == 0) break; + b += n; + if (!suppress) { + if (mod_l) { *va_arg(ap, double *) = val; } + else { *va_arg(ap, float *) = (float)val; } + assigned++; + } + continue; + } + + /* Specificatore sconosciuto: stop */ + break; + } + + va_end(ap); + return assigned; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/music.c new/abcm2ps-8.14.18/music.c --- old/abcm2ps-8.14.15/music.c 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/music.c 2026-01-28 09:16:09.000000000 +0100 @@ -3,7 +3,7 @@ * * This file is part of abcm2ps. * - * Copyright (C) 1998-2021 Jean-François Moine (http://moinejf.free.fr) + * Copyright (C) 1998-2024 Jean-François Moine (http://moinejf.free.fr) * Adapted from abc2ps, Copyright (C) 1996-1998 Michael Methfessel * * This program is free software; you can redistribute it and/or modify it @@ -516,8 +516,7 @@ /* -- try to combine voices */ static void combine_voices(void) { - struct SYMBOL *s, *s2, *g; - int i, r; + struct SYMBOL *s, *s2; for (s = tsfirst; s->ts_next; s = s->ts_next) { if (s->combine < 0) @@ -525,41 +524,7 @@ // if (s->combine == 0 // && s->abc_type != ABC_T_REST) // continue; - if (s->sflags & S_IN_TUPLET) { - g = s->extra; - if (!g) - continue; /* tuplet already treated */ - r = 0; - for ( ; g; g = g->next) { - if (g->type == TUPLET - && g->u.tuplet.r_plet > r) - r = g->u.tuplet.r_plet; - } - if (r == 0) - continue; - i = r; - for (s2 = s; s2; s2 = s2->next) { - if (!s2->ts_next) - break; - if (s2->type != NOTEREST) - continue; - if (!may_combine(s2)) - break; - if (--i <= 0) - break; - } - if (i > 0) - continue; - for (s2 = s; /*s2*/; s2 = s2->next) { - if (s2->type != NOTEREST) - continue; - do_combine(s2); - if (--r <= 0) - break; - } - continue; - - } + if (s->type != NOTEREST) continue; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/parse.c new/abcm2ps-8.14.18/parse.c --- old/abcm2ps-8.14.15/parse.c 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/parse.c 2026-03-14 17:58:09.000000000 +0100 @@ -20,6 +20,7 @@ #include <regex.h> #include "abcm2ps.h" +#include "gscanf.c" /* options = external formatting */ struct symsel_s { /* symbol selection */ @@ -1503,8 +1504,8 @@ if (antype == '@') { int n; float xo, yo; - - if (sscanf(p, "%f,%f%n", &xo, &yo, &n) != 2) { + // !!! MODIFIED + if (gscanf(p, "%f,%f%n", &xo, &yo, &n) != 2) { error(1, s, "Error in annotation \"@\""); } else { p += n; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abcm2ps-8.14.15/subs.c new/abcm2ps-8.14.18/subs.c --- old/abcm2ps-8.14.15/subs.c 2024-01-08 08:15:18.000000000 +0100 +++ new/abcm2ps-8.14.18/subs.c 2026-01-28 09:16:09.000000000 +0100 @@ -3,7 +3,7 @@ * * This file is part of abcm2ps. * - * Copyright (C) 1998-2019 Jean-François Moine (http://moinejf.free.fr) + * Copyright (C) 1998-2025 Jean-François Moine (http://moinejf.free.fr) * Adapted from abc2ps, Copyright (C) 1996-1998 Michael Methfessel * * This program is free software; you can redistribute it and/or modify it @@ -353,6 +353,8 @@ if (!desc_tb[fnum]) { p = font_name; q = fontnames[fnum]; + if(0) // don't change the font names + // because other font when only ASCII for (i = 0; i < sizeof bad_tb / sizeof bad_tb[0]; i++) { if (strncmp(q, bad_tb[i], strlen(bad_tb[i])) == 0) { p += sprintf(p, "%s", good_tb[i]);
