From 7f1eaa10544c6936bb002e605e5318d99d7ac3b9 Mon Sep 17 00:00:00 2001 From: fred Date: Tue, 26 Mar 2002 21:28:08 +0000 Subject: [PATCH] lilypond-1.0.17 --- BUGS | 5 + Documentation/tex/colorado.bib | 630 ++++++++-------- Documentation/tex/fonts.doc | 16 + Documentation/topdocs/AUTHORS.yo | 16 +- Documentation/topdocs/INSTALL.yo | 77 +- Documentation/topdocs/index.yo | 4 - TODO | 47 +- buildscripts/lilypond-login.sh | 13 + buildscripts/lilypond-profile.sh | 2 +- buildscripts/set-lily.sh | 2 +- debian/control | 8 +- flower/hash.cc | 33 + flower/include/dictionary-iter.hh | 49 +- flower/include/dictionary.hh | 181 ++++- init/engraver.ly | 9 +- lily/include/key-item.hh | 16 +- lily/include/local-key-item.hh | 3 +- lily/include/notename-table.hh | 2 +- lily/include/slur-engraver.hh | 2 - lily/key-engraver.cc | 2 +- lily/key-item.cc | 53 +- lily/local-key-item.cc | 25 +- lily/main.cc | 28 +- lily/music-iterator.cc | 2 +- lily/notename-table.cc | 4 +- lily/paper-def.cc | 7 +- lily/parser.yy | 2 +- lily/scope.cc | 8 +- lily/slur-engraver.cc | 22 +- lily/symtable.cc | 13 +- lily/ties-engraver.cc | 16 +- lily/translator-group.cc | 40 +- make/mutopia-rules.make | 4 +- mf/GNUmakefile | 4 +- scripts/convert-mudela.py | 52 +- scripts/ly2dvi-old.sh | 1005 ++++++++++++++++++++++++++ scripts/ly2dvi.py | 1117 +++++++++++++++++++++++++++++ scripts/mudela-book.py | 37 +- stepmake/TODO | 2 + test/hash.cc | 39 + 40 files changed, 3001 insertions(+), 596 deletions(-) create mode 100644 buildscripts/lilypond-login.sh create mode 100644 flower/hash.cc create mode 100644 scripts/ly2dvi-old.sh create mode 100644 scripts/ly2dvi.py create mode 100644 test/hash.cc diff --git a/BUGS b/BUGS index 36b24a234a..054d425246 100644 --- a/BUGS +++ b/BUGS @@ -3,6 +3,11 @@ This documents serious bugs ******** +[Linux Intel, EGCS-1.1b] + +Compiling with -O2 -finline-functions will cause crashes during +parsing stage. + [All platforms] diff --git a/Documentation/tex/colorado.bib b/Documentation/tex/colorado.bib index 9aa8871ac4..6d7cf51200 100644 --- a/Documentation/tex/colorado.bib +++ b/Documentation/tex/colorado.bib @@ -7,500 +7,498 @@ % TODO: fix the labelling. @Book {6, -author ={Jacob, Archibald}, -year={1947}, -title = {Musical handwriting : or, How to put music on paper : A handbook for all musicians, professional and amateur}, -address ={London}, -publisher ={Oxford University Press}, -note = {subject: Musical notation}, + author ={Jacob, Archibald}, + year={1947}, + title = {Musical handwriting : or, How to put music on paper : A handbook for all musicians, professional and amateur}, + address ={London}, + publisher ={Oxford University Press}, + note = {subject: Musical notation}, } @Book {15, -author ={Carl Brandt and Clinton Roemer}, -title = {Standardized Chord Symbol Notation}, -address={Sherman Oaks, CA}, -publisher={Roerick Music Co.}, -note ={subject: musical notation}, + author ={Carl Brandt and Clinton Roemer}, + title = {Standardized Chord Symbol Notation}, + address={Sherman Oaks, CA}, + publisher={Roerick Music Co.}, + note ={subject: musical notation}, } @Book {22, -author = {Johnson, Harold M}, -year = {1946}, -title = {How to write music manuscript an exercise-method handbook for the music student, copyist, arranger, composer, teacher}, -publisher={Carl Fischer, Inc.}, -address= {New York}, -note = {subject: Musical notation --Handbooks, manuals}, + author = {Johnson, Harold M}, + year = {1946}, + title = {How to write music manuscript an exercise-method handbook for the music student, copyist, arranger, composer, teacher}, + publisher={Carl Fischer, Inc.}, + address= {New York}, + note = {subject: Musical notation --Handbooks, manuals}, } @Book {31, -title = {Music Printing & Publishing}, -author ={Donald W. Krummel \& Stanley Sadie}, -year = {1990}, -publisher= {Macmillan Press}, -note ={subject: musical notation}, + title = {Music Printing & Publishing}, + author ={Donald W. Krummel \& Stanley Sadie}, + year = {1990}, + publisher= {Macmillan Press}, + note ={subject: musical notation}, } %series={The Norton/Grove Handbooks in Music.}, % publisher={W.W. Norton}, @Book {40, -author={Foss, Hubert}, -title = {Music Printing}, -series = {Practical Printing and Binding}, -address={London}, -publisher={Oldhams Press Ltd., Long Acre}, -note ={subject: musical notation}, + author={Foss, Hubert}, + title = {Music Printing}, + series = {Practical Printing and Binding}, + address={London}, + publisher={Oldhams Press Ltd., Long Acre}, + note ={subject: musical notation}, } @Book {48, -author = {Steele, Robert}, -year = {1903}, -title = {The Earliest English Music Printing}, -address={London}, -note= {subject: history of music printing and engraving}, + author = {Steele, Robert}, + year = {1903}, + title = {The Earliest English Music Printing}, + address={London}, + note= {subject: history of music printing and engraving}, } @Book {54, -author={Austin, Ernest}, -title = {The Story of Music Printing}, -address={London}, -publisher={Lowe and Brydone Printers, Ltd.}, -note= {subject: history of music printing and engraving}, + author={Austin, Ernest}, + title = {The Story of Music Printing}, + address={London}, + publisher={Lowe and Brydone Printers, Ltd.}, + note= {subject: history of music printing and engraving}, } @Book {63, -author={?}, -title = {Pictoral History of Music Printing}, -address={Elhardt, Indiana}, -publisher={H. and A. Selmer, Inc.}, -note= {subject: history of music printing and engraving}, + author={?}, + title = {Pictoral History of Music Printing}, + address={Elhardt, Indiana}, + publisher={H. and A. Selmer, Inc.}, + note= {subject: history of music printing and engraving}, } @Book {77, -author = {Wintermitz, Emmanuel}, -year = {1955}, -title = {Musical Autographs from Monteverdi to Hindemith}, -address={Princeton}, -publisher={Princeton University Press}, -note= {subject: history of music printing and engraving}, + author = {Wintermitz, Emmanuel}, + year = {1955}, + title = {Musical Autographs from Monteverdi to Hindemith}, + address={Princeton}, + publisher={Princeton University Press}, + note= {subject: history of music printing and engraving}, } @Book {92, -author = {Novello, A}, -year = {1847}, -title = {Some Account of the Methods of Musick Printing, with Specimens of the Various Sizes of Moveable Types and of Other Matters}, -address={London}, -note={ subject: history of music printing and engraving}, + author = {Novello, A}, + year = {1847}, + title = {Some Account of the Methods of Musick Printing, with Specimens of the Various Sizes of Moveable Types and of Other Matters}, + address={London}, + note={ subject: history of music printing and engraving}, } @Book {100, -author={Chrsander, F.}, -year={18??}, -title={A Sketch of the HIstory of Music printing, from the 15th to the 16th century}, -note={ subject: history of music printing and engraving}, + author={Chrsander, F.}, + year={18??}, + title={A Sketch of the HIstory of Music printing, from the 15th to the 16th century}, + note={ subject: history of music printing and engraving}, } @Article {squire1897, -author = {Squire, W}, -year = {1897}, -title = {Notes on Early Music Printing}, -journal = {Bibliographica}, -volume={iii}, -number={99}, -note={ subject: history of music printing and engraving}, + author = {Squire, W}, + year = {1897}, + title = {Notes on Early Music Printing}, + journal = {Bibliographica}, + volume={iii}, + number={99}, + note={ subject: history of music printing and engraving}, } @Article{113, -author = {Meyer, K. and O'Meara, J}, -year = {1935}, -title = {The Printing of Music, 1473-1934}, -journal = {The Dolphin}, -volume={ ii}, -pages={ 171--207}, -note={ subject: history of music printing and engraving}, + author = {Meyer, K. and O'Meara, J}, + year = {1935}, + title = {The Printing of Music, 1473-1934}, + journal = {The Dolphin}, + volume={ ii}, + pages={ 171--207}, + note={ subject: history of music printing and engraving}, } %% 4th ver., @Article {120, -author = {Pattison, B}, -year = {1939}, -title = {Notes on Early Music Printing}, -journal = {The Library}, -note={subject: history of music printing and engraving}, -volume={xix}, -pages={389-421}, + author = {Pattison, B}, + year = {1939}, + title = {Notes on Early Music Printing}, + journal = {The Library}, + note={subject: history of music printing and engraving}, + volume={xix}, + pages={389-421}, } @Book {136, -author = {King, H}, -year = {1964}, -title = {Four Hundred Years of Music Printing}, -address={London}, -note={ subject: history of music printing and engraving}, + author = {King, H}, + year = {1964}, + title = {Four Hundred Years of Music Printing}, + address={London}, + note={ subject: history of music printing and engraving}, } %(Rev.1961). @Book{150, -author={Deutsch, O.F.}, -year ={1946}, -title = {Music Publishers' Numbers}, -address={London}, -note={ subject: history of music printing and engraving}, + author={Deutsch, O.F.}, + year ={1946}, + title = {Music Publishers' Numbers}, + address={London}, + note={ subject: history of music printing and engraving}, } @Book {151, -author = {Marco, G.A}, -year = {1962}, -title = {The Earliest Music Printers of Continental Europe: a Checklist of Facsimiles Illustrating Their Work}, -address={Charlottesville, Virginia}, -note={ subject: history of music printing and engraving}, + author = {Marco, G.A}, + year = {1962}, + title = {The Earliest Music Printers of Continental Europe: a Checklist of Facsimiles Illustrating Their Work}, + address={Charlottesville, Virginia}, + note={ subject: history of music printing and engraving}, } @Article {158, -author = {Kinkeldey, O}, -year = {1932}, -title = {Music And Music Printing in Incunabula}, -journal = {Papers of the Bibliographical Society of America}, -volume={ xxvi}, -pages={89-118}, -note={ subject: history of music printing and engraving}, + author = {Kinkeldey, O}, + year = {1932}, + title = {Music And Music Printing in Incunabula}, + journal = {Papers of the Bibliographical Society of America}, + volume={ xxvi}, + pages={89-118}, + note={ subject: history of music printing and engraving}, } @Book {166, -author = {Oldman, C.B}, -year = {1934}, -title = {Collecting Musical First Editions}, -address={London}, -note={ subject: history of music printing and engraving}, + author = {Oldman, C.B}, + year = {1934}, + title = {Collecting Musical First Editions}, + address={London}, + note={ subject: history of music printing and engraving}, } @Book{170, -author={Carter, J}, -year={1934}, -title = {New Paths in Book Collecting}, -address={London}, -note={ subject: history of music printing and engraving}, + author={Carter, J}, + year={1934}, + title = {New Paths in Book Collecting}, + address={London}, + note={ subject: history of music printing and engraving}, } @Book {179, -author={Krummel, D.W.}, -year={1958}, -month={9}, -title = {Graphic Analysis in Application to Early American Engraved Music}, -journal = {Notes}, -volume={xvi}, -pages={213}, -note={ subject: history of music printing and engraving}, + author={Krummel, D.W.}, + year={1958}, + month={9}, + title = {Graphic Analysis in Application to Early American Engraved Music}, + journal = {Notes}, + volume={xvi}, + pages={213}, + note={ subject: history of music printing and engraving}, } @Book {189, -author = {Krummel, D.W}, -year = {1971}, -title = {Oblong Format in Early Music Books}, -journal = {The Library}, -volume={5th ser., xxvi}, -pages={312}, -note={ subject: history of music printing and engraving}, + author = {Krummel, D.W}, + year = {1971}, + title = {Oblong Format in Early Music Books}, + journal = {The Library}, + volume={5th ser., xxvi}, + pages={312}, + note={ subject: history of music printing and engraving}, } @Book {198, -author = {King, A.H}, -year = {1973}, -title = {The 50th Anniversary of Music Printing}, + author = {King, A.H}, + year = {1973}, + title = {The 50th Anniversary of Music Printing}, } @Book {204, -author={Rastall, Richard}, -year={1982}, + author={Rastall, Richard}, + year={1982}, title = {The notation of Western music : an introduction}, -address={New York, N.Y.}, -publisher={St. Martin's Press}, -note = {Musical notation}, + address={New York, N.Y.}, + publisher={St. Martin's Press}, + note = {Musical notation}, } @Book {215, -author = {Tappolet, Willy}, -year = {1947}, -title = {La Notation Musicale}, -address={Paris}, -note={subject: general notation}, -publisher={Neuch\^atel}, + author = {Tappolet, Willy}, + year = {1947}, + title = {La Notation Musicale}, + address={Paris}, + note={subject: general notation}, + publisher={Neuch\^atel}, } @Book {223, -author = {Williams, C.F. Abdy}, -year = {1903}, -title = {The Story of Notation}, -address={New York}, -publisher={Charles Scribner's Sons}, -note={subject: general notation}, + author = {Williams, C.F. Abdy}, + year = {1903}, + title = {The Story of Notation}, + address={New York}, + publisher={Charles Scribner's Sons}, + note={subject: general notation}, } @Book {239, -author={Apel, Willi}, -year={1953}, -title = {The notation of polyphonic music, 900-1600}, -address={Cambridge, Mass}, -institution={Mediaeval Academy of America}, -note = {Musical notation}, + author={Apel, Willi}, + year={1953}, + title = {The notation of polyphonic music, 900-1600}, + address={Cambridge, Mass}, + institution={Mediaeval Academy of America}, + note = {Musical notation}, } @Book {248, -author={Berger, Anna Maria Busse}, -year={1993}, -title = {Mensuration and proportion signs : origins and evolution}, -address={Oxford, England}, -publisher={Clarendon Press}, -scnd_address={New York}, -scnd_publisher={Oxford University Press }, -note={subject: early notation}, + author={Berger, Anna Maria Busse}, + year={1993}, + title = {Mensuration and proportion signs : origins and evolution}, + address={Oxford, England}, + publisher={Clarendon Press}, + scnd_address={New York}, + scnd_publisher={Oxford University Press }, + note={subject: early notation}, } @Book {258, -author={Parrish, Carl}, -year={1957}, + author={Parrish, Carl}, + year={1957}, title = {The notation of medieval music}, -address={New York}, -publisher={Norton}, -note = {Musical notation}, + address={New York}, + publisher={Norton}, + note = {Musical notation}, } @Book {269, -author = {Parrish, Carl}, -year = {1946}, -title = {The Notation of Medieval Music}, -address={New York}, -publisher={Carl Fischer, Inc.}, -note={subject: early notation}, + author = {Parrish, Carl}, + year = {1946}, + title = {The Notation of Medieval Music}, + address={New York}, + publisher={Carl Fischer, Inc.}, + note={subject: early notation}, } @Book {277, -author = {Patch, Harry}, -year = {1949}, -title = {Genesis of a Music}, -address={Madison}, -publisher={University of Wisconsin Press}, -note={subject: early notation}, + author = {Patch, Harry}, + year = {1949}, + title = {Genesis of a Music}, + address={Madison}, + publisher={University of Wisconsin Press}, + note={subject: early notation}, } @Book {285, -author={Cage, John}, -year={1969}, + author={Cage, John}, + year={1969}, title = {Notations}, -address={New York}, -publisher={Something Else Press}, -note = {Music, Manuscripts, Facsimiles. + address={New York}, + publisher={Something Else Press}, + note = {Music, Manuscripts, Facsimiles. -Facsimiles of holographs from the Foundation for Contemporary -Performance Arts, with text by 269 composers, but rearranged using -chance operations.,V)} }, + Facsimiles of holographs from the Foundation for Contemporary + Performance Arts, with text by 269 composers, but rearranged using + chance operations.,V)} }, @Book {295, -author = {Gaburo, Virginia}, -year = {1977}, -title = {Notation}, -address={publisher= {Lingua Press}, -publisher={La Jolla, California}}, -note = {A Lecture about notation, new ideas about}, + author = {Gaburo, Virginia}, + year = {1977}, + title = {Notation}, + address={publisher= {Lingua Press}, + publisher={La Jolla, California}}, + note = {A Lecture about notation, new ideas about}, } @Book {306, -author = {Risatti, Howard}, -year = {1975}, -title = {New Music Vocabulary}, -address={Urbana, Illinois}, -publisher={University of Illinois Press}, -note = {A Guide to Notational Signs for Contemporary Music}, + author = {Risatti, Howard}, + year = {1975}, + title = {New Music Vocabulary}, + address={Urbana, Illinois}, + publisher={University of Illinois Press}, + note = {A Guide to Notational Signs for Contemporary Music}, } @Book {325, -author = {Cowell, Henry}, -year = {1930}, -title = {New Musical Resources}, -address={New York}, -publisher={Alfred A. Knopf, Inc.}, -note={subject: 20th century notation}, + author = {Cowell, Henry}, + year = {1930}, + title = {New Musical Resources}, + address={New York}, + publisher={Alfred A. Knopf, Inc.}, + note={subject: 20th century notation}, } @Article {333, -author = {Cowell, Henry}, -year = {1927}, -title = {Our Inadequate Notation}, -journal = {Modern Music}, -volume={4}, -number={3}, -note={subject: 20th century notation}, + author = {Cowell, Henry}, + year = {1927}, + title = {Our Inadequate Notation}, + journal = {Modern Music}, + volume={4}, + number={3}, + note={subject: 20th century notation}, } @Book {342, -author = {Bowers, Roger}, -year = {1992}, -title = {Music & Letters}, -volume={73}, -number={3}, -month={August}, -pages={347(52)}, -note={Some reflection upon notation and proportion in Monteverdi's mass and vespers}, + author = {Bowers, Roger}, + year = {1992}, + title = {Music & Letters}, + volume={73}, + number={3}, + month={August}, + pages={347(52)}, + note={Some reflection upon notation and proportion in Monteverdi's mass and vespers}, } @Book {353, -author = {Brainard, Paul}, -year = {1992}, -title = {Current Musicology}, -number={50}, -month={July-Dec}, -pages={21(26)}, -note={Proportional notation in the music of Schutz and his contemporaries in the 17th Century}, + author = {Brainard, Paul}, + year = {1992}, + title = {Current Musicology}, + number={50}, + month={July-Dec}, + pages={21(26)}, + note={Proportional notation in the music of Schutz and his contemporaries in the 17th Century}, } @Book {362, -author = {Monelle, Raymond}, -year = {1989}, -title = {Comparative Literature}, -volume={41}, number={3}, -month={Summer}, -pages={252(18)}, + author = {Monelle, Raymond}, + year = {1989}, + title = {Comparative Literature}, + volume={41}, number={3}, + month={Summer}, + pages={252(18)}, -note={Music notation and the poetic foot}, + note={Music notation and the poetic foot}, } @Book {373, -author = {Pinegar, Sandra}, -year = {1993}, -title = {Current Musicology}, -number={53}, -month={July}, -pages={99(10)}, -note={The seeds of notation and music paleography.}, + author = {Pinegar, Sandra}, + year = {1993}, + title = {Current Musicology}, + number={53}, + month={July}, + pages={99(10)}, + note={The seeds of notation and music paleography.}, } @Book {382, -author = {Smith, Norman E}, -year = {1990}, -title = {Current Musicology}, -number={45-47}, -month={Jan-Dec}, -pages={283(22)}, -note={The notation of fractio modi.}, + author = {Smith, Norman E}, + year = {1990}, + title = {Current Musicology}, + number={45-47}, + month={Jan-Dec}, + pages={283(22)}, + note={The notation of fractio modi.}, } @Book {392, -author = {Treitler, Leo}, -year = {1992}, -title = {The Journal of Musicology}, -volume={10}, -number={2}, -month={Spring}, -pages={131(61)}, + author = {Treitler, Leo}, + year = {1992}, + title = {The Journal of Musicology}, + volume={10}, + number={2}, + month={Spring}, + pages={131(61)}, -note={ The unwritten and written transmission, of medieval chant -and the start-up of musical notation. + note={ The unwritten and written transmission, of medieval chant + and the start-up of musical notation. -Notational practice developed in medieval music to address the written tradition for chant which interacted with the unwritten vocal tradition.}, + Notational practice developed in medieval music to address the written tradition for chant which interacted with the unwritten vocal tradition.}, } @Book {407, -author = {West, M.L}, -year = {1994}, -title = {Music & Letters}, -volume={75}, -number={2}, -month={May}, -pages={161(19)}, -note={The Babylonian musical notation and the Hurrian melodic texts. + author = {West, M.L}, + year = {1994}, + title = {Music & Letters}, + volume={75}, + number={2}, + month={May}, + pages={161(19)}, + note={The Babylonian musical notation and the Hurrian melodic texts. -A new way of deciphering the ancient Babylonian musical notation. + A new way of deciphering the ancient Babylonian musical notation. } } @Book {418, -author = {Brown, Earle}, -year = {1986}, -title = {Musical Quarterly}, -volume={72}, -month={Spring}, -pages={180(22)}, -note={The notation and performance of new music.}, + author = {Brown, Earle}, + year = {1986}, + title = {Musical Quarterly}, + volume={72}, + month={Spring}, + pages={180(22)}, + note={The notation and performance of new music.}, } @Book {426, -author = {Eggleston, Suzanne}, -year = {1994}, -title = {Notes}, -volume={51}, -number={2}, -month={Dec}, -pages={657(7)}, -journal={New periodicals}, -note={A list of new music periodicals covering the period -Jun.-Dec. 1994. Includes aims, formats and a description of the -contents of each listed periodical. Includes Music Notation News}, + author = {Eggleston, Suzanne}, + year = {1994}, + title = {Notes}, + volume={51}, + number={2}, + month={Dec}, + pages={657(7)}, + journal={New periodicals}, + note={A list of new music periodicals covering the period + Jun.-Dec. 1994. Includes aims, formats and a description of the + contents of each listed periodical. Includes Music Notation News}, } @Book {441, -author = {Fuller, David}, -year = {1989}, -title = {The Journal of Musicology}, -volume={7}, -number={1}, -month={Winter}, -pages={21(8)}, -note={ -Notes and inegales unjoined: defending a definition. (written-out inequalities in music notation). + author = {Fuller, David}, + year = {1989}, + title = {The Journal of Musicology}, + volume={7}, + number={1}, + month={Winter}, + pages={21(8)}, + note={ + Notes and inegales unjoined: defending a definition. (written-out inequalities in music notation). }}, @Book {454, -author = {Jones, David Evan}, -year = {1990}, -title = {Perspectives of New Music}, -note={ -Speech extrapolated. (includes notation) -} + author = {Jones, David Evan}, + year = {1990}, + title = {Perspectives of New Music}, + note={Speech extrapolated. (includes notation)} } @Book {464, -author = {Lependorf, Jeffrey}, -year = {1989}, -journal={Perspectives of New Music}, -volume={27}, + author = {Lependorf, Jeffrey}, + year = {1989}, + journal={Perspectives of New Music}, + volume={27}, number={2}, -month={Summer}, -pages={232(20)}, -note={ -Contemporary notation for the shakuhachi: a primer for composers. (Tradition and Renewal in the Music of Japan) }, + month={Summer}, + pages={232(20)}, + note={ + Contemporary notation for the shakuhachi: a primer for composers. (Tradition and Renewal in the Music of Japan) }, } @Book {478, -author = {Rastall, Richard}, -year = {1993}, -title = {Music & Letters}, -volume={74}, number={4}, -month={November}, -pages={639(2)}, + author = {Rastall, Richard}, + year = {1993}, + title = {Music & Letters}, + volume={74}, number={4}, + month={November}, + pages={639(2)}, -note={Equal Temperament Music Notation: The Ailler-Brennink -Chromatic Notation. Results and Conclusions of the Music Notation -Refor by the Chroma Foundation (book reviews). }, + note={Equal Temperament Music Notation: The Ailler-Brennink + Chromatic Notation. Results and Conclusions of the Music Notation + Refor by the Chroma Foundation (book reviews). }, } @Article {Francois92, @@ -515,7 +513,7 @@ Refor by the Chroma Foundation (book reviews). }, computer is used to write down music with accuracy never before achieved, the range of modern sounds has surpassed the relevance of the computer...}, -title={Writing without representation, and unreadable notation.}, + title={Writing without representation, and unreadable notation.}, } @Book {501, diff --git a/Documentation/tex/fonts.doc b/Documentation/tex/fonts.doc index c66fa3bfbd..bc5bce8640 100644 --- a/Documentation/tex/fonts.doc +++ b/Documentation/tex/fonts.doc @@ -4,6 +4,8 @@ \def\kdots{,\ldots,} \title{Not the Font-En-Tja font} \author{HWN \& JCN} +\def\preMudelaExample{} +\def\postMudelaExample{} \begin{document} \maketitle @@ -22,6 +24,14 @@ Ross\cite{ross} quite some of their insights were used. Although it is a matter of taste, I'd say that B\"arenreiter has the finest typography of all. +% +% stupid test to check convert-mudela.py. +% +% (so sue me) +\begin{mudela}[fragment,center] + \clef bass; c1 \clef alto; c'2 \clef treble; c''4 +\end{mudela} + \section{Bezier curves for slurs} @@ -290,6 +300,12 @@ position that remains is for the upper beam to hang. \end{eqnarray*} +\section{Layout of the source files} + +The main font (with the fixed size music glyphs) uses a the \TeX\ +logfile as a communication device. Use the specialised macros to +create and export glyphs. + \bibliographystyle{plain} \bibliography{engraving} diff --git a/Documentation/topdocs/AUTHORS.yo b/Documentation/topdocs/AUTHORS.yo index 99a54a24a9..ad2ad26ed5 100644 --- a/Documentation/topdocs/AUTHORS.yo +++ b/Documentation/topdocs/AUTHORS.yo @@ -7,7 +7,7 @@ itemize( it()nemail(Tom Cato Amundsen)(tomcato@xoommail.com), cembalo-partita in mudela. it()nemail(Mats Bengtsson)(matsb@s3.kth.se), - lurl(http://www.s3.kth.se/~matsb) + lurl(http://www.s3.kth.se/~matsb/) clef stuff, key stuff, swedish notenames, testing, general comments. it()nemail(Eric Bullinger)(eric@aut.ee.ethz.ch), @@ -18,24 +18,22 @@ it()nemail(Anthony Fok)(foka@debian.org), debian package: debian/* it()nemail(Neil Jerram)(nj104@cus.cam.ac.uk). parts of Documentation/Vocab* -it()Donald Ervin Knuth, lurl(http://www.cs-staff.stanford.edu/~knuth) +it()Donald Ervin Knuth, lurl(http://www.cs-staff.stanford.edu/~knuth/) mf/ital-*.mf (these were taken from the CM fonts) it()nemail(Werner Lemberg)(xlwy01@uxp1.hrz.uni-dortmund.de), misc bugfixes, some Beam and Stem code. it()nemail(David R. Linn)(drl@vuse.vanderbilt.edu), Mailing list maintenance. -it()nemail(Adrian Moriano)() - Documentation fixes, glossary. +it()nemail(Adrian Mariano)() + Reference manual, tutorial fixes, glossary. it()nemail(Han-Wen Nienhuys)(hanwen@cs.uu.nl), - lurl(http://www.cs.uu.nl/~hanwen) - nl() + lurl(http://www.cs.uu.nl/~hanwen/) Main author (initials: HWN). it()nemail(Jan Nieuwenhuizen)(janneke@gnu.org), - lurl(http://www.xs4all.nl/~jantien) - nl() + lurl(http://www.xs4all.nl/~jantien/) Main author (initials: JCN). it()nemail(Alexandre Oliva)(oliva@dcc.unicamp.br), - lurl(http://sunsite.unicamp.br/~oliva) + lurl(http://sunsite.unicamp.br/~oliva/) testing it()nemail(Franc,ois Pinard)(pinard@iro.umontreal.ca), parts of Documentation/Vocab*, started internationalization stuff diff --git a/Documentation/topdocs/INSTALL.yo b/Documentation/topdocs/INSTALL.yo index c1cee4ed6b..75bc165155 100644 --- a/Documentation/topdocs/INSTALL.yo +++ b/Documentation/topdocs/INSTALL.yo @@ -39,7 +39,8 @@ it() Python 1.5 (Strictly speaking, you shouldn't need Python for sect(RUNNING) -GNU LilyPond does use a lot of resources. For operation you need the following: +GNU LilyPond does use a lot of resources. For operation you need the +following: itemize( it()TeX @@ -48,6 +49,21 @@ it()A PostScript printer and/or viewer (such as Ghostscript) is strongly Ghostscript installed. ) + +For running LilyPond successfully you have to help TeX and MetaFont +find various files. The recommended way of doing so is adjusting the +environment variables in the start-up scripts of your shell. An +example is given here for the Bourne shell: +verb(export MFINPUTS="/usr/local/share/lilypond/mf:" +export TEXINPUTS="/usr/local/share/lilypond/tex:" +) +The empty path component +represents TeX() and MetaFont's default search paths. Scripts with +the proper paths for the bourne and C-shell respectively are generated in +file(buildscripts/out/lilypond-profile) and +file(buildscripts/out/lilypond-login) during compilation. + + sect(RECOMMENDED) Although not strictly necessary, these are recommended to have. @@ -64,6 +80,9 @@ it()Bison (version 1.25 or newer). Check out lurl(ftp://ftp.gnu.org) or any mirror of this site. +it()GUILE (version 1.2) +Check out lurl(http://www.gnu.org/programs/guile.html) + it()Python (version 1.5 or newer). Check out lurl(ftp://ftp.python.org) or lurl(ftp://ftp.cwi.nl/pub/python). @@ -101,11 +120,26 @@ man2html can be had from lurl(http://askdonald.ask.uni-karlsruhe.de/hppd/hpux/Ne TeTeX users should not forget to rerun texhash. ) +Building the website requires pnmtopng. The version of file(pnmtopng) +that is distributed with RedHat 5.1 contains a bug (pnmtopng is +dynamically linked to the wrong version of libpng). Recompile it from +source, and make sure that the pnmtopng binary is linked statically to +the libpng that is included in libgr. + +verb( tar xzf libgr-2.0.13.tar.gz + make + cd png + rm libpng.so* + make pnmtopng +) + +You can then install the new pnmtopng into /usr/local/bin/ + sect(CONFIGURING and COMPILING) to install GNU LilyPond, simply type: verb( - configure --enable-tex-dir=XXXX --enable-mf-dir=YYYY + configure make make install ) @@ -120,17 +154,12 @@ verb( /usr/local/bin/mi2mu /usr/local/share/lilypond/* /usr/local/share/locale/{it,nl}/LC_MESSAGES/lilypond.mo - /usr/lib/texmf/texmf/tex/lilypond/* ) -You should specify directories that are in TeX()'s and MetaFont's -include path with the options (--enable-tex-dir) and -bf(--enable-mf-dir). If you don't specify any directories, the TeX() -include directory is detected dynamically, which is unreliable. The -above assumes that you are root and have the GNU development tools, -and your make is GNU make. If this is not the case, you can adjust -your environment variables to your taste: +The above assumes that you are root and have the GNU development +tools, and your make is GNU make. If this is not the case, you can +adjust your environment variables to your taste: verb( export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR" @@ -149,13 +178,6 @@ verb( In this case, you will have to set up MFINPUTS, and TEXINPUTS accordingly. -If you want to install GNU LilyPond in file(/usr/local), and your TeX has -no default hooks for local stuff, you can do: - -verb( - configure --prefix=/usr/local --enable-tex-prefix=/usr/lib/texmf -) - Since GNU LilyPond currently is beta, you are advised to also use verb( @@ -163,29 +185,18 @@ verb( --enable-checking ) -Other options include: +Options to configure include: description( -dit(bf(--enable-shared)) - Make a shared library (gnu/linux, solaris (?) only ) (TEMPORARILY -OUT OF ORDER) - +dit(bf(--enable-guile)) + Link in GUILE (experimental) dit(bf(--enable-printing)) Enable debugging print routines (lilypond bf(-D) option) dit(bf(--enable-optimise)) - Set maximum optimisation: compile with bf(-O2) + Set maximum optimisation: compile with bf(-O2). This can be +unreliable on some compiler/platform combinations (eg, DEC Alpha and PPC) dit(bf(--enable-profiling)) Compile with support for profiling. -dit(bf(--enable-tex-prefix)) - Set the directory where TeX and Metafont live. -dit(bf(--enable-tex-dir)) - Set then directory TeX input is in (detected as a subdir of - tex-prefix). This should be a directory that is reachable both for - tex and latex. On my system the best choice would be - file(/usr/lib/texmf/texmf/tex/generic//). -dit(bf(--enable-mf-dir)) - Set the directory metafont input is in (idem). On my system the best - choice would be file(/usr/lib/texmf/texmf/fonts/source/public/). dit(bf(--enable-config)) Output to a different configuration file. Needed for multi-platform builds diff --git a/Documentation/topdocs/index.yo b/Documentation/topdocs/index.yo index 734dbab853..1307c60e3b 100644 --- a/Documentation/topdocs/index.yo +++ b/Documentation/topdocs/index.yo @@ -31,9 +31,6 @@ nsubsect(Introduction) This is not a Fanmail/Hype page. These pages were entirely created from the LilyPond package-sources. -A document on LilyPond's music description language Mudela is -url(in the making)(DOEXPAND(docdir)/tex/DOEXPAND(outdir)/tutorial.html). - Note: These pages are created from the latest bf(development snapshots) of LilyPond, specifically, this page was made from LilyPond @TOPLEVEL_VERSION@.tar.gz @@ -42,7 +39,6 @@ nsect(Sites) description( dit(lurl(http://www.cs.uu.nl/people/hanwen/lilypond/))Han-Wen's site. -dit(lurl(http://www.xs4all.nl/~jantien/lilypond/))Jan's site. dit(lurl(http://www.realtime.net/~daboys/lilypond/))Jeff's Windows NT Distribution site. ) diff --git a/TODO b/TODO index 79b6623e1a..6c18aa1a12 100644 --- a/TODO +++ b/TODO @@ -9,10 +9,10 @@ grep for TODO and ugh/ugr/urg BUGS: - - * egcs-1.1 -O2 -finline-functions causes crash + * document new TeX/mf layout + * egcs-1.1 -O2 -finline-functions causes crash * formatting of input stuff. @@ -28,12 +28,6 @@ BUGS: * [/3 c8 c16 c c c]/1 - * I see that \prallprall and \prallmordent are identical. I think this is a - mistake, that \prallprall should not have the vertical line. - This can be fixed by removing the line - draw_mordent(twidth-0.5toverlap); - from the definition of \prallprall in mf/feta-slag.mf (see below) - * fix singleStaffBracket * repeat bars: need distance after ":|" and before "|:" @@ -65,8 +59,6 @@ BUGS: portato= \script { "portato" 0 -1 0 1 0 } - * MIDI spelling. - * Align_element::padding ? * uniformise property names. @@ -108,8 +100,6 @@ BUGS: * install TeX stuff into tex/generic directory. - * /etc/profile.d support for RPM. - * percussion note heads * mi2mu empty staffs. @@ -118,12 +108,6 @@ BUGS: * make GNU style webpages. - * There seems to be an install error in lilypond-1.0.0. Most of the - files in the "init" directory don't get installed in the - /usr/local/share/lilypond directory. The files installed are of - the form feta*.ly. In particular init.ly doesn't get installed. - I installed the files by hand and then the system seems to work. - * midi_instrument -> midiInstrument * horizontal centering of dynamics @@ -237,8 +221,6 @@ ydirection and hshift preset - abbreviation-beam -> (measured/unmeasured) tremolo - partial -> anacrouse - * libtoolize flowerlib - * shared lib * robustify Beam (in case of no stems, 32nd notes) @@ -250,12 +232,7 @@ ydirection and hshift preset * check for groff / troff/ nroff et * more intelligent file searching - - use kpsepath - - make LilyPond fully relocatable - - * use kpsepath to find all TeX dirs - - configure.in - - clean-fonts.sh + - make LilyPond RPM fully relocatable * nicen examples: - break-up heavily-nested score blocks @@ -287,15 +264,6 @@ ydirection and hshift preset * clefs (AG): The "8" should appear closer to the actual clef, touching it. - * scoping for properties? - - { c4 - \multi 2 < { \stemup .. } { \stemdown .. } > - c2 - } - - this modifies \stem for the c2 - * put errorlevel in Input class * junk nesting slurs @@ -341,12 +309,6 @@ ydirection and hshift preset * redhat (v?) graphical install bomb-out? - * egcs-1.03 ice: stem.cc:327; should localize bug (mine's still 10K) - - * gcc 2.8.1: see ice and RESIZE_ICE - - * xdvi: PS in magnifying glass. - * GNU diff 2.7: diff -rN does not see a new directory with empty file * GNU patch 2.1: if patch chokes on a @@ -363,8 +325,6 @@ ydirection and hshift preset * GNU indent: handle C++ - * GNU make: move hardcoded builtin rules to runtime ? - * GNU patch - 'double-fix' mode: ignore identical fix, rather than suggest to revert patch direction when (more or less? exactly) the same @@ -498,7 +458,6 @@ PROJECTS - Move all Score_elems, into libmutype.a - SGML - * Documentation - Doc (C) stuff of sheet music - a better format? SGML? TeX? Info? diff --git a/buildscripts/lilypond-login.sh b/buildscripts/lilypond-login.sh new file mode 100644 index 0000000000..d4a482ebe6 --- /dev/null +++ b/buildscripts/lilypond-login.sh @@ -0,0 +1,13 @@ +#!/bin/csh + +# env. vars for the C-shell. + +# set environment for LilyPond. To be installed in /etc/profile.d/ +setenv GS_LIB "@datadir@/afm" +setenv GS_FONTPATH "@datadir@/ps" +setenv LILYINCLUDE "@datadir@/ly:@datadir@/afm" + +# include an empty path component for the system wide includes. +setenv MFINPUTS "@datadir@/mf:"${MFINPUTS:=":"} +setenv TEXINPUTS "@datadir@/tex:"${TEXINPUTS:=":"} + diff --git a/buildscripts/lilypond-profile.sh b/buildscripts/lilypond-profile.sh index c20fa45672..176f63629e 100644 --- a/buildscripts/lilypond-profile.sh +++ b/buildscripts/lilypond-profile.sh @@ -4,7 +4,7 @@ # set environment for LilyPond. To be installed in /etc/profile.d/ GS_LIB="@datadir@/afm" GS_FONTPATH="@datadir@/ps" -LILYINCLUDE="@datadir@/ly" +LILYINCLUDE="@datadir@/ly:@datadir@/afm" # include an empty path component for the system wide includes. MFINPUTS="@datadir@/mf:"${MFINPUTS:=":"} diff --git a/buildscripts/set-lily.sh b/buildscripts/set-lily.sh index 087ad63182..d44317dc8e 100644 --- a/buildscripts/set-lily.sh +++ b/buildscripts/set-lily.sh @@ -52,5 +52,5 @@ then ln ../.dstreamrc . fi -./configure --prefix=$prefix --enable-debugging --enable-printing --enable-checking --disable-optimise +./configure --prefix=$prefix --enable-debugging --enable-printing --enable-checking --disable-optimise --enable-guile diff --git a/debian/control b/debian/control index 08a7805a9e..14be2746a9 100644 --- a/debian/control +++ b/debian/control @@ -7,8 +7,9 @@ Standards-Version: 2.4.1.0 Package: lilypond Architecture: any Depends: ${shlibs:Depends}, tetex-base (>= 0.9-5) +Recommends: python-base (>= 1.5.1) Conflicts: musixtex-fonts, tetex-base (<< 0.9) -Description: The GNU Project music typesetter. +Description: The GNU Project music typesetter. LilyPond is the GNU Project music typesetter. This program can print beautiful sheet music from a music definition file. It can also play mechanical performances to a MIDI file. Features include multiple @@ -16,7 +17,8 @@ Description: The GNU Project music typesetter. beams, slurs, triplets, formatting scores, part extraction. It includes a nice font of musical symbols. . - URL: http://www.cs.ruu.nl/people/hanwen/lilypond - http://sca.uwaterloo.ca/~praetzel/lilypond/ + URLs: http://www.cs.uu.nl/~hanwen/lilypond/ + http://www.xs4all.nl/~jantien/lilypond/ + http://sca.uwaterloo.ca/~praetzel/lilypond/ Authors: Han-Wen Nienhuys Jan Nieuwenhuizen diff --git a/flower/hash.cc b/flower/hash.cc new file mode 100644 index 0000000000..1e2debd13b --- /dev/null +++ b/flower/hash.cc @@ -0,0 +1,33 @@ +#include "string.hh" +#include "array.hh" +#include "dictionary.hh" + + +// Note: assumes long is at least 32 bits. +const unsigned long my_prime_list[] = +{ + 53, 97, 193, 389, 769, + 1543, 3079, 6151, 12289, 24593, + 49157, 98317, 196613, 393241, 786433, + 1572869, 3145739, 6291469, 12582917, 25165843, + 50331653, 100663319, 201326611, 402653189u, 805306457u, + 1610612741u, 3221225473u, 4294967291u +}; + +unsigned long prime_list (int idx) +{ + return my_prime_list [idx]; +} + +unsigned int hash (String s) +{ + const char* str = s.ch_C (); + unsigned int result = 0; + while (1) { + char c = *str++; + if (c == 0) break; + result += (result<<3) + c; + } + return result; +} + diff --git a/flower/include/dictionary-iter.hh b/flower/include/dictionary-iter.hh index 9183c5d585..da6e64b391 100644 --- a/flower/include/dictionary-iter.hh +++ b/flower/include/dictionary-iter.hh @@ -1,5 +1,5 @@ /* - dictionary-iter.hh -- declare + dictionary-iter.hh -- declare Dictionary_iter source file of the Flower Library @@ -10,18 +10,51 @@ #ifndef DICTIONARY_ITER_HH #define DICTIONARY_ITER_HH -#include "string.hh" -#include "assoc-iter.hh" +#include "dictionary.hh" + + + #include "dictionary.hh" template -class Dictionary_iter : public Assoc_iter +class Dictionary_iter { + Dictionary *dict_l_; + int i; public: - Dictionary_iter (Dictionary const &d) - : Assoc_iter (d) - { - } + Dictionary_iter(Dictionary const &dict) + { + i =0; + dict_l_ =(Dictionary *) & dict; + next_used (); + } + + bool ok () + { + return i < dict_l_->fixed_p_->dict_arr_.size (); + } + + void next_used () + { + while (ok () && dict_l_->fixed_p_->dict_arr_[i].free_b_) + { + i ++; + } + } + void operator ++(int) + { + i++; + next_used (); + } + + String key () + { + return dict_l_->fixed_p_->dict_arr_[i].name_; + } + V val () + { + return dict_l_->fixed_p_->dict_arr_[i].value_; + } }; #endif // DICTIONARY_ITER_HH diff --git a/flower/include/dictionary.hh b/flower/include/dictionary.hh index b25fc84b49..55f0e4fedd 100644 --- a/flower/include/dictionary.hh +++ b/flower/include/dictionary.hh @@ -11,28 +11,185 @@ #define DICTIONARY_HH #include "string.hh" -#include "assoc.hh" +#include "array.hh" + +unsigned long prime_list (int idx); +template +struct Dict_entry +{ + String name_; + V value_; + bool free_b_; + + Dict_entry() { + free_b_ = true; + } + Dict_entry (String s, V v) + { + name_ = s; + value_ = v; + free_b_ = false; + } +}; + +unsigned int hash (String); /** - UGH: write a String_hash template, + A hash table of prime size. - SEE: - - #include + We use quadratic probing. + */ +template +class Fixed_size_dictionary +{ +public: + Array > dict_arr_; + int size_idx_; + Fixed_size_dictionary (int size_idx) + { + size_idx_ = size_idx; + int sz = prime_list(size_idx_); + dict_arr_.set_size (sz); + } + + /// find #s#, or find first empty entry corresponding to #s# + int lookup (String s) + { + int sz =dict_arr_.size (); + int i = hash (s) % sz; + int j = 0; + while (j <= sz/2) { + if (dict_arr_[i].free_b_) + return i; + + if (dict_arr_[i].name_ == s) + return i; - ENTRY *hsearch(ENTRY item, ACTION action); + j++; + i = (i + j*j) % sz; + } - int hcreate (unsigned nel); + return -1; + } - void hdestroy (void); + /// remove #s# from the hash table. + V remove (String s) + { + assert (false); // Untested routine. + int sz =dict_arr_.size (); + int i = hash (s) % sz; + int j = 0; + V retval; + while (j <= sz/2 && dict_arr_[i].name_ != s) + { + assert (!dict_arr_[i].free_b_); + + + j ++; + i = (i + j*j) % sz; + } - (should be frobnified to allow multiple hashes) + j++; + int nexti = (i + j*j) % sz; + + while (j <= sz/2 && !dict_arr_[i].free_b_) + { + dict_arr_[i] = dict_arr_[nexti]; + j++; + i = nexti; + nexti = (nexti + j*j)%sz; + } + + finish: + return retval; + } +}; + +/** + Hash table with sliding sizes. */ -template -class Dictionary : public Assoc +template +class Dictionary { + Fixed_size_dictionary * fixed_p_; + + /// set size to next prime, and copy contents + void enlarge () + { + Fixed_size_dictionary *f = new Fixed_size_dictionary (fixed_p_->size_idx_ +1); + for (int i=0; i < fixed_p_->dict_arr_.size(); i++) + { + if (fixed_p_->dict_arr_[i].free_b_) + continue; + + String nm (fixed_p_->dict_arr_[i].name_); + int nl = f->lookup (nm); + + f->dict_arr_[nl] = Dict_entry (nm, fixed_p_->dict_arr_[i].value_); + } + delete fixed_p_; + fixed_p_ = f; + } public: - + Dictionary () + { + fixed_p_ = new Fixed_size_dictionary (0); + } + ~Dictionary () + { + delete fixed_p_; + } + void operator = (Dictionary const &src) + { + if (&src == this) + return; + + delete fixed_p_; + fixed_p_ = new Fixed_size_dictionary (*src.fixed_p_); + } + Dictionary (Dictionary const &src) + { + fixed_p_ = new Fixed_size_dictionary (*src.fixed_p_); + } + bool elem_b (String s) const + { + int l = fixed_p_->lookup (s); + + return (l >= 0 && !fixed_p_->dict_arr_[l].free_b_) ; + } + + /** + Find and return element. If #s# is not in the table, create an entry in the table, and init + */ + V& elem (String s) + { + int l; + while ((l= fixed_p_->lookup (s)) <0) + { + enlarge (); + } + + + fixed_p_->dict_arr_[l].free_b_ = false; + fixed_p_->dict_arr_[l].name_ = s; + return fixed_p_->dict_arr_[l].value_; + } + V& operator [] (String k) + { + return elem (k); + } + + V operator [] (String k) const + { + return elem (k); + } + + V remove (String s) + { + return fixed_p_->remove (s); + } + friend class Dictionary_iter; }; + #endif // DICTIONARY_HH diff --git a/init/engraver.ly b/init/engraver.ly index 54c737dd61..09df595038 100644 --- a/init/engraver.ly +++ b/init/engraver.ly @@ -176,12 +176,11 @@ ScoreWithNumbers = \translator { }; -\translator { +StupidScore = \translator { \type "Score_engraver"; - \name StupidScore; - - \consists "Staff_sym_engraver"; -} + \name Score; + \consists "Note_heads_engraver"; +}; diff --git a/lily/include/key-item.hh b/lily/include/key-item.hh index 9056db33b8..f8e3747b58 100644 --- a/lily/include/key-item.hh +++ b/lily/include/key-item.hh @@ -13,11 +13,14 @@ /// An item which places accidentals at the start of the line struct Key_item : Item { - Array pitch; - Array acc; - Array old_pitch; - Array old_acc; + Array pitch_arr_; + Array acc_arr_; + Array old_pitch_arr_; + Array old_acc_arr_; + + // ugh. Naming int c_position; + // see above. int c0_position; bool default_b_; bool multi_octave_b_; @@ -30,7 +33,10 @@ struct Key_item : Item { void add (const Musical_pitch&); void add_old (int pitch, int acc); void add_old (const Musical_pitch&); - void read (const Key_engraver&); + void set (bool multi_octave_b, + Array const &idx_arr, + Array const &old_idx_arr); + void set_c_position (int); int Key_item::calculate_position(int p, int a) const; diff --git a/lily/include/local-key-item.hh b/lily/include/local-key-item.hh index d08ca2b490..7da65e532f 100644 --- a/lily/include/local-key-item.hh +++ b/lily/include/local-key-item.hh @@ -24,10 +24,9 @@ class Local_key_item : public Item { public: DECLARE_MY_RUNTIME_TYPEINFO; - Array accs; + Array accidental_pitch_arr_; Link_array support_items_; int c0_position_i_; - Local_key_item (); void add_support (Item*); void add (Musical_pitch); diff --git a/lily/include/notename-table.hh b/lily/include/notename-table.hh index 7338f05bf1..1d0fcf687e 100644 --- a/lily/include/notename-table.hh +++ b/lily/include/notename-table.hh @@ -16,7 +16,7 @@ #include "dictionary.hh" #include "musical-pitch.hh" -class Notename_table : public Dictionary< Musical_pitch >{ +class Notename_table : public Dictionary{ public: String get_name (Musical_pitch) const; }; diff --git a/lily/include/slur-engraver.hh b/lily/include/slur-engraver.hh index 75c21d07f2..8665ee6e8d 100644 --- a/lily/include/slur-engraver.hh +++ b/lily/include/slur-engraver.hh @@ -15,7 +15,6 @@ class Slur_engraver :public Engraver { Array new_slur_req_l_arr_; Array slur_l_stack_; Array end_slur_l_arr_; - Direction dir_; protected: virtual bool do_try_request (Request*); @@ -27,7 +26,6 @@ protected: public: TRANSLATOR_CLONE(Slur_engraver); - Slur_engraver(); DECLARE_MY_RUNTIME_TYPEINFO; }; diff --git a/lily/key-engraver.cc b/lily/key-engraver.cc index be1cedace1..83fd6ec6db 100644 --- a/lily/key-engraver.cc +++ b/lily/key-engraver.cc @@ -29,7 +29,7 @@ Key_engraver::create_key () kit_p_ = new Key_item; kit_p_->break_priority_i_ = -1; // ugh announce_element (Score_element_info (kit_p_,keyreq_l_)); - kit_p_->read (*this); + kit_p_->set (key_.multi_octave_b_, accidental_idx_arr_, old_accidental_idx_arr_); } } diff --git a/lily/key-item.cc b/lily/key-item.cc index 58a91cac61..80e470f10f 100644 --- a/lily/key-item.cc +++ b/lily/key-item.cc @@ -14,8 +14,7 @@ #include "molecule.hh" #include "paper-def.hh" #include "lookup.hh" - -#include "key-engraver.hh" +#include "musical-pitch.hh" const int FLAT_TOP_PITCH=2; /* fes,ges,as and bes typeset in lower octave */ const int SHARP_TOP_PITCH=4; /* ais and bis typeset in lower octave */ @@ -28,19 +27,21 @@ Key_item::Key_item () } void -Key_item::read (Key_engraver const & key_grav_r) +Key_item::set (bool multi_octave_b, + Array const &idx_arr, + Array const &old_idx_arr) { - multi_octave_b_ = key_grav_r.key_.multi_octave_b_; - const Array &idx_arr = key_grav_r.accidental_idx_arr_; + multi_octave_b_ =multi_octave_b; + for (int i = 0; i < idx_arr.size(); i++) { Musical_pitch m_l =idx_arr[i]; if (multi_octave_b_) - add (m_l); + add (m_l); else add (m_l.notename_i_, m_l.accidental_i_); } - const Array &old_idx_arr = key_grav_r.old_accidental_idx_arr_; + for (int i = 0 ; i< old_idx_arr.size(); i++) { Musical_pitch m_l =old_idx_arr[i]; @@ -66,29 +67,29 @@ Key_item::set_c_position (int c0) void Key_item::add (int p, int a) { - pitch.push (p); - acc.push (a); + pitch_arr_.push (p); + acc_arr_.push (a); } void Key_item::add (const Musical_pitch& pitch_r) { - pitch.push (pitch_r.steps()); - acc.push (pitch_r.accidental_i_); + pitch_arr_.push (pitch_r.steps()); + acc_arr_.push (pitch_r.accidental_i_); } void Key_item::add_old (int p, int a) { - old_pitch.push (p); - old_acc.push (a); + old_pitch_arr_.push (p); + old_acc_arr_.push (a); } void Key_item::add_old (const Musical_pitch& pitch_r) { - old_pitch.push (pitch_r.steps()); - old_acc.push (pitch_r.accidental_i_); + old_pitch_arr_.push (pitch_r.steps()); + old_acc_arr_.push (pitch_r.accidental_i_); } int @@ -120,18 +121,20 @@ Key_item::brew_molecule_p() const int j; if ((break_status_dir_ == LEFT || break_status_dir_ == CENTER) - || old_pitch.size ()) + || old_pitch_arr_.size ()) { - for (int i =0; i < old_pitch.size(); i++) + for (int i =0; i < old_pitch_arr_.size(); i++) { - for (j =0; (j < pitch.size()) && (old_pitch[i] != pitch[j]); j++) + for (j =0; (j < pitch_arr_.size()) + && (old_pitch_arr_[i] != pitch_arr_[j]); j++) ; - if (j == pitch.size() - || (old_pitch[i] == pitch[j] && old_acc[i] != acc[j])) + if (j == pitch_arr_.size() + || (old_pitch_arr_[i] == pitch_arr_[j] + && old_acc_arr_[i] != acc_arr_[j])) { Atom a =lookup_l ()->accidental (0); - a.translate_axis (calculate_position(old_pitch[i], old_acc[i]) * inter, Y_AXIS); + a.translate_axis (calculate_position(old_pitch_arr_[i], old_acc_arr_[i]) * inter, Y_AXIS); Molecule m (a); output->add_at_edge (X_AXIS, RIGHT, m); } @@ -148,14 +151,14 @@ Key_item::brew_molecule_p() const output->add_at_edge (X_AXIS, RIGHT, lookup_l()->fill (Box(x,y))); } - for (int i =0; i < pitch.size(); i++) + for (int i =0; i < pitch_arr_.size(); i++) { - Atom a =lookup_l ()->accidental (acc[i]); - a.translate_axis (calculate_position(pitch[i], acc[i]) * inter, Y_AXIS); + Atom a =lookup_l ()->accidental (acc_arr_[i]); + a.translate_axis (calculate_position(pitch_arr_[i], acc_arr_[i]) * inter, Y_AXIS); Molecule m (a); output->add_at_edge (X_AXIS, RIGHT, m); } - if (pitch.size()) + if (pitch_arr_.size()) { Molecule m (lookup_l ()->fill (Box ( Interval (0, paper()->note_width ()), diff --git a/lily/local-key-item.cc b/lily/local-key-item.cc index 564b66ea9a..2b2d0dd5db 100644 --- a/lily/local-key-item.cc +++ b/lily/local-key-item.cc @@ -16,7 +16,7 @@ Local_key_item::Local_key_item () { - c0_position_i_ = 0; + c0_position_i_ = 0; } void @@ -31,17 +31,17 @@ Local_key_item::add_support (Item*head_l) void Local_key_item::add (Musical_pitch p) { - for (int i=0; i< accs.size(); i++) - if (!Musical_pitch::compare (p, accs[i])) + for (int i=0; i< accidental_pitch_arr_.size(); i++) + if (!Musical_pitch::compare (p, accidental_pitch_arr_[i])) return; - accs.push (p); + accidental_pitch_arr_.push (p); } void Local_key_item::do_pre_processing() { - accs.sort (Musical_pitch::compare); + accidental_pitch_arr_.sort (Musical_pitch::compare); } Molecule* @@ -51,10 +51,10 @@ Local_key_item::brew_molecule_p() const Molecule *octave_mol_p = 0; int lastoct = -100; - for (int i = 0; i < accs.size(); i++) + for (int i = 0; i < accidental_pitch_arr_.size(); i++) { // do one octave - if (accs[i].octave_i_ != lastoct) + if (accidental_pitch_arr_[i].octave_i_ != lastoct) { if (octave_mol_p) { @@ -65,9 +65,12 @@ Local_key_item::brew_molecule_p() const } octave_mol_p= new Molecule; } - lastoct = accs[i].octave_i_; - Real dy = (accs[i].notename_i_ + c0_position_i_) * paper()->internote_f (); - Atom a (lookup_l ()->accidental (accs[i].accidental_i_)); + + lastoct = accidental_pitch_arr_[i].octave_i_; + Real dy = + (c0_position_i_ + accidental_pitch_arr_[i].notename_i_) + * paper()->internote_f (); + Atom a (lookup_l ()->accidental (accidental_pitch_arr_[i].accidental_i_)); a.translate_axis (dy, Y_AXIS); Molecule m(a); @@ -82,7 +85,7 @@ Local_key_item::brew_molecule_p() const delete octave_mol_p; } - if (accs.size()) + if (accidental_pitch_arr_.size()) { Box b(Interval (0, paper()->internote_f ()), Interval (0,0)); Molecule m (lookup_l ()->fill (b)); diff --git a/lily/main.cc b/lily/main.cc index 87af66cfe9..5b541eb29f 100644 --- a/lily/main.cc +++ b/lily/main.cc @@ -194,11 +194,10 @@ guile_init () #endif } -int -main_prog (int argc, char **argv) + +void +setup_paths () { - guile_init (); - // facilitate binary distributions char const *env_lily = getenv ("LILYPONDPREFIX"); String prefix_directory; @@ -221,10 +220,6 @@ main_prog (int argc, char **argv) textdomain (name.ch_C ()); #endif - identify (); - call_constructors (); - debug_init (); // should be first - global_path.add (""); // must override (come before) "/usr/local/share/lilypond"! char const *env_sz = getenv ("LILYINCLUDE"); @@ -239,11 +234,24 @@ main_prog (int argc, char **argv) global_path.add (String (DIR_DATADIR) + "/ly/"); global_path.add (String (DIR_DATADIR) + "/afm/"); +} - Getopt_long oparser (argc, argv,theopts); - String init_str; + +int +main_prog (int argc, char **argv) +{ + guile_init (); + identify (); + call_constructors (); + debug_init (); // should be first + + setup_paths (); + + String init_str; String outname_str; + + Getopt_long oparser (argc, argv,theopts); while (Long_option_init const * opt = oparser ()) { switch (opt->shortname) diff --git a/lily/music-iterator.cc b/lily/music-iterator.cc index b19215f512..2b329815d6 100644 --- a/lily/music-iterator.cc +++ b/lily/music-iterator.cc @@ -167,7 +167,7 @@ Music_iterator::static_get_iterator_p (Music const *m, Translator_group *report_ } void -Music_iterator::inherit_info(Music_iterator const *parent) +Music_iterator::inherit_info(Music_iterator const *) { } diff --git a/lily/notename-table.cc b/lily/notename-table.cc index 9b08369db0..bf32cb7ee2 100644 --- a/lily/notename-table.cc +++ b/lily/notename-table.cc @@ -9,13 +9,13 @@ #include "notename-table.hh" #include "pointer.tcc" #include "musical-request.hh" -#include "assoc-iter.hh" +#include "dictionary-iter.hh" String Notename_table::get_name (Musical_pitch m) const { - for (Assoc_iter ai (*this); ai.ok (); ai++) + for (Dictionary_iter ai (*this); ai.ok (); ai++) { if (ai.val () == m) return ai.key (); diff --git a/lily/paper-def.cc b/lily/paper-def.cc index d3d4a67954..8593add910 100644 --- a/lily/paper-def.cc +++ b/lily/paper-def.cc @@ -21,8 +21,7 @@ #include "identifier.hh" #include "main.hh" #include "scope.hh" -#include "assoc.hh" -#include "assoc-iter.hh" +#include "dictionary-iter.hh" Paper_def::Paper_def () { @@ -214,7 +213,7 @@ String Paper_def::ps_output_settings_str () const { String s ("\n "); - for (Assoc_iter i (*scope_p_); i.ok (); i++) + for (Dictionary_iter i (*scope_p_); i.ok (); i++) s += String ("/mudelapaper") + i.key () + "{" + i.val ()->str () + "} bind def\n"; s += *scope_p_->elem ("pssetting")->access_String (); @@ -225,7 +224,7 @@ String Paper_def::tex_output_settings_str () const { String s ("\n "); - for (Assoc_iter i (*scope_p_); i.ok (); i++) + for (Dictionary_iter i (*scope_p_); i.ok (); i++) s += String ("\\def\\mudelapaper") + i.key () + "{" + i.val ()->str () + "}\n"; s += *scope_p_->elem ("texsetting")->access_String (); diff --git a/lily/parser.yy b/lily/parser.yy index 428fff3c37..bf82af8ec4 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -1442,7 +1442,7 @@ symtable: symtable_body: { $$ = new Symtable; } | symtable_body STRING symboldef { - $$->add (*$2, *$3); + $$->elem (*$2) = *$3; delete $2; delete $3; } diff --git a/lily/scope.cc b/lily/scope.cc index 5918dc92fd..7ff133cc28 100644 --- a/lily/scope.cc +++ b/lily/scope.cc @@ -8,7 +8,7 @@ */ #include "scope.hh" -#include "assoc-iter.hh" +#include "dictionary-iter.hh" #include "debug.hh" #include "identifier.hh" @@ -16,7 +16,7 @@ void Scope::print () const { bool init_b = false; // ugh - for (Assoc_iter ai (*this); ai.ok(); ai++) + for (Dictionary_iter ai (*this); ai.ok(); ai++) { if (ai.val()->init_b_ == init_b) { @@ -28,7 +28,7 @@ Scope::print () const Scope::~Scope () { - for (Assoc_iter ai (*this); ai.ok(); ai++) + for (Dictionary_iter ai (*this); ai.ok(); ai++) { DOUT << "deleting: " << ai.key() << '\n'; delete ai.val (); @@ -38,7 +38,7 @@ Scope::~Scope () Scope::Scope (Scope const&s) : Dictionary (s) { - for (Assoc_iter ai (s); ai.ok(); ai++) + for (Dictionary_iter ai (s); ai.ok(); ai++) { (*this)[ai.key ()] = ai.val ()->clone (); } diff --git a/lily/slur-engraver.cc b/lily/slur-engraver.cc index 768d8c42b1..8c43bfddfb 100644 --- a/lily/slur-engraver.cc +++ b/lily/slur-engraver.cc @@ -50,13 +50,6 @@ Slur_engraver::do_removal_processing () } } -/* - abracadabra - */ -Slur_engraver::Slur_engraver() -{ - dir_ =CENTER; -} void Slur_engraver::do_process_requests() { @@ -98,17 +91,16 @@ Slur_engraver::do_pre_move_processing() { Scalar dir (get_property ("slurydirection")); Scalar dir2 (get_property ("ydirection")); - if (dir.length_i ()) - { - dir_ = (Direction) sign (int(dir)); - } - else if (dir2.length_i ()) - dir_ = (Direction) sign (int (dir2)); + + Direction slurdir = CENTER; + if (dir.length_i () && dir.isnum_b ()) + slurdir = (Direction) sign (int(dir)); + else if (dir2.length_i () && dir2.isnum_b ()) + slurdir = (Direction) sign (int (dir2)); for (int i = 0; i < end_slur_l_arr_.size(); i++) { - if (dir_) - end_slur_l_arr_[i]->dir_ = dir_; + end_slur_l_arr_[i]->dir_ = slurdir; typeset_element (end_slur_l_arr_[i]); } end_slur_l_arr_.clear(); diff --git a/lily/symtable.cc b/lily/symtable.cc index 94aba34bea..cc3cecff23 100644 --- a/lily/symtable.cc +++ b/lily/symtable.cc @@ -10,8 +10,7 @@ #include "debug.hh" #include "real.hh" #include "atom.hh" -#include "assoc.hh" -#include "assoc-iter.hh" +#include "dictionary-iter.hh" #include "symtable.hh" Symtables::Symtables() @@ -24,7 +23,7 @@ Symtables::Symtables (Symtables const &s) { font_ = s.font_; font_path_ = s.font_path_; - for (Assoc_iter i (s); i.ok(); i++) + for (Dictionary_iter< Symtable*> i (s); i.ok(); i++) { add (i.key(), new Symtable (*i.val ())); } @@ -32,7 +31,7 @@ Symtables::Symtables (Symtables const &s) Symtables::~Symtables() { - for (Assoc_iter i (*this); i.ok(); i++) + for (Dictionary_iter< Symtable*> i (*this); i.ok(); i++) { delete i.val(); } @@ -71,7 +70,7 @@ Symtables::operator()(String s) void Symtables::print() const { - for (Assoc_iter i (*this); i.ok(); i++) + for (Dictionary_iter i (*this); i.ok(); i++) { DOUT << "table \'" << i.key () << "\' {\n"; i.val()->print (); @@ -81,7 +80,7 @@ Symtables::print() const void Symtable::print() const { - for (Assoc_iter i (*this); i.ok(); i++) + for (Dictionary_iter i (*this); i.ok(); i++) { DOUT << "\'" << i.key() << "\'->" << i.val ().str () << '\n'; } @@ -91,5 +90,5 @@ void Symtables::add (String s, Symtable*p) { p-> id_str = s; - Dictionary::add (s,p); + Dictionary::elem (s) = p; } diff --git a/lily/ties-engraver.cc b/lily/ties-engraver.cc index 54e604d572..9ed1ef3b04 100644 --- a/lily/ties-engraver.cc +++ b/lily/ties-engraver.cc @@ -105,14 +105,14 @@ Ties_engraver::do_pre_move_processing() { Scalar tie_dir (get_property ("tieYDirection")); Scalar y_dir (get_property ("ydirection")); - Direction dir; - if (tie_dir.length_i ()) - dir = (Direction) sign (int(tie_dir)); - else if (y_dir.length_i ()) - dir = (Direction) sign (int (y_dir)); - - end_tie_p_arr_[i]->dir_ = dir; - typeset_element (end_tie_p_arr_[i]); + Direction dir = CENTER; + if (tie_dir.length_i () && tie_dir.isnum_b ()) + dir = (Direction) sign (int (tie_dir)); + else if (y_dir.length_i () && y_dir.isnum_b ()) + dir = (Direction) sign (int (y_dir)); + + end_tie_p_arr_[i]->dir_ = dir; + typeset_element (end_tie_p_arr_[i]); } end_tie_p_arr_ = tie_p_arr_; diff --git a/lily/translator-group.cc b/lily/translator-group.cc index 3d5a6ff2d0..77d0f18b6e 100644 --- a/lily/translator-group.cc +++ b/lily/translator-group.cc @@ -35,13 +35,13 @@ Translator_group::Translator_group() void Translator_group::check_removal() { - for (int i =0; i < group_l_arr ().size();) + Link_array groups (group_l_arr ()); + + for (int i =0; i < groups.size(); i++) { - group_l_arr ()[i]->check_removal(); - if (group_l_arr ()[i]->removable_b()) - terminate_translator (group_l_arr ()[i]); - else - i++; + groups[i]->check_removal(); + if (groups[i]->removable_b()) + terminate_translator (groups[i]); } } @@ -86,7 +86,13 @@ Translator_group::set_element (String s, bool add) bool Translator_group::removable_b() const { - return !(iterator_count_ || group_l_arr ().size()); + for (PCursor i (trans_p_list_.top ()); i.ok (); i++) + { + if (i->access_Translator_group ()) + return false; + } + + return !iterator_count_; } Translator_group * @@ -94,10 +100,12 @@ Translator_group::find_existing_translator_l (String n, String id) { if (is_alias_b (n) && (id_str_ == id || id.empty_b ())) return this; + + Link_array groups (group_l_arr ()); Translator_group* r = 0; - for (int i =0; !r && i < group_l_arr ().size(); i++) + for (int i =0; !r && i < groups.size(); i++) { - r = group_l_arr ()[i]->find_existing_translator_l (n,id); + r = groups[i]->find_existing_translator_l (n,id); } return r; @@ -182,8 +190,11 @@ bool Translator_group::do_try_request (Request* req_l) { bool hebbes_b =false; - for (int i =0; !hebbes_b && i < nongroup_l_arr ().size() ; i++) - hebbes_b =nongroup_l_arr ()[i]->try_request (req_l); + + Link_array nongroups (nongroup_l_arr ()); + + for (int i =0; !hebbes_b && i < nongroups.size() ; i++) + hebbes_b =nongroups[i]->try_request (req_l); if (!hebbes_b && daddy_trans_l_) hebbes_b = daddy_trans_l_->try_request (req_l); return hebbes_b ; @@ -258,10 +269,11 @@ Translator_group::remove_translator_p (Translator*trans_l) Translator* Translator_group::get_simple_translator (char const *type) const { - for (int i=0; i < nongroup_l_arr ().size(); i++) + Link_array nongroups (nongroup_l_arr ()); + for (int i=0; i < nongroups.size(); i++) { - if (nongroup_l_arr ()[i]->name() == type) - return nongroup_l_arr ()[i]; + if (nongroups[i]->name() == type) + return nongroups[i]; } if (daddy_trans_l_) return daddy_trans_l_->get_simple_translator (type); diff --git a/make/mutopia-rules.make b/make/mutopia-rules.make index 1905f1f4dd..74072fb462 100644 --- a/make/mutopia-rules.make +++ b/make/mutopia-rules.make @@ -23,9 +23,9 @@ $(outdir)/%.fly.txt: %.fly .PRECIOUS: $(outdir)/%.dvi $(outdir)/%.dvi: %.ly - $(PYTHON) $(depth)/scripts/ly2dvi32.py -o $(outdir) $< + $(PYTHON) $(depth)/scripts/ly2dvi.py -o $(outdir) $< -mv $(basename $<).midi $(outdir) $(outdir)/%.dvi: %.fly - $(PYTHON) $(depth)/scripts/ly2dvi32.py -o $(outdir) $< + $(PYTHON) $(depth)/scripts/ly2dvi.py -o $(outdir) $< -mv $(basename $<).midi $(outdir) diff --git a/mf/GNUmakefile b/mf/GNUmakefile index 363f3229dd..dfc37de8c9 100644 --- a/mf/GNUmakefile +++ b/mf/GNUmakefile @@ -31,9 +31,9 @@ $(outdir)/%.afm $(outdir)/%.ly $(outdir)/%.tex $(outdir)/%.dep: $(outdir)/%.log TEXINSTALL=$(MAKE) INSTALLATION_OUT_DIR=$(datadir)/tex/ depth=.. INSTALLATION_OUT_FILES="$(TEXTABLES)" -f $(stepdir)/install-outfiles.sub.make $@ -AFMINSTALL=$(MAKE) depth=.. INSTALLATION_OUT_DIR=$(datadir)/ INSTALLATION_OUT_FILES="$(AFM_FILES)" -f $(stepdir)/install-outfiles.sub.make $@ +AFMINSTALL=$(MAKE) depth=.. INSTALLATION_OUT_DIR=$(datadir)/afm/ INSTALLATION_OUT_FILES="$(AFM_FILES)" -f $(stepdir)/install-outfiles.sub.make $@ -LYINSTALL=$(MAKE) depth=.. INSTALLATION_OUT_DIR=$(datadir) INSTALLATION_OUT_FILES="$(LYTABLES)" -f $(stepdir)/install-outfiles.sub.make $@ +LYINSTALL=$(MAKE) depth=.. INSTALLATION_OUT_DIR=$(datadir)/ly/ INSTALLATION_OUT_FILES="$(LYTABLES)" -f $(stepdir)/install-outfiles.sub.make $@ localinstall: $(ALL_GEN_FILES) $(TEXINSTALL) diff --git a/scripts/convert-mudela.py b/scripts/convert-mudela.py index a51f700c67..ee6d05a229 100644 --- a/scripts/convert-mudela.py +++ b/scripts/convert-mudela.py @@ -22,11 +22,11 @@ import sys import __main__ import getopt from string import * -import regex -import regsub +import re + import time -mudela_version_re_str ='\\\\version *\"\(.*\)\"' -mudela_version_re = regex.compile(mudela_version_re_str) +mudela_version_re_str = '\\\\version *\"(.*)\"' +mudela_version_re = re.compile(mudela_version_re_str) def program_id (): return '%s version %s' %(program_name, version); @@ -65,8 +65,9 @@ def version_cmp (t1, t2): def guess_mudela_version(filename): s = gulp_file (filename) - if mudela_version_re.search(s) <> -1: - return mudela_version_re.group(1) + m = mudela_version_re.search (s) + if m: + return m.group(1) else: return '' @@ -97,7 +98,7 @@ if 1: # need new a namespace def conv (lines): found =0 for x in lines: - if regex.search ('\\\\octave', x) <> -1: + if re.search ('\\\\octave', x): found = 1 break if found: @@ -114,9 +115,9 @@ if 1: # need new a namespace def conv (lines): newlines = [] for x in lines: - x = regsub.gsub ('\\\\textstyle\\([^;]+\\);', + x = re.sub ('\\\\textstyle([^;]+);', '\\\\property Lyrics . textstyle = \\1', x) - x = regsub.gsub ('\\\\key\\([^;]+\\);', '\\\\accidentals \\1;', x) + x = re.sub ('\\\\key([^;]+);', '\\\\accidentals \\1;', x) newlines.append (x) return newlines @@ -129,9 +130,9 @@ if 1: # need new a namespace def conv (lines): newlines = [] for x in lines: - x = regsub.gsub ('\\\\musical_pitch', + x = re.sub ('\\\\musical_pitch', '\\\\musicalpitch',x) - x = regsub.gsub ('\\\\meter', + x = re.sub ('\\\\meter', '\\\\time',x) newlines.append (x) return newlines @@ -153,11 +154,11 @@ if 1: # need new a namespace def conv (lines): newlines = [] for x in lines: - x = regsub.gsub ('\\\\accidentals', - '\\\\keysignature',x) - x = regsub.gsub ('specialaccidentals *= *1', + x = re.sub ('\\\\accidentals', + '\\\\keysignature',x) + x = re.sub ('specialaccidentals *= *1', 'keyoctaviation = 0',x) - x = regsub.gsub ('specialaccidentals *= *0', + x = re.sub ('specialaccidentals *= *0', 'keyoctaviation = 1',x) newlines.append (x) return newlines @@ -171,7 +172,7 @@ if 1: def conv(lines): found = 0 for x in lines: - if regex.search ('\\\\header', x) <> -1: + if re.search ('\\\\header', x): found = 1 break if found: @@ -184,7 +185,7 @@ if 1: def conv(lines): newlines =[] for x in lines: - x = regsub.gsub ('\\\\melodic', '\\\\notes',x) + x = re.sub ('\\\\melodic', '\\\\notes',x) newlines.append (x) return newlines @@ -194,8 +195,8 @@ if 1: def conv(lines): newlines =[] for x in lines: - x = regsub.gsub ('default_paper *=', '',x) - x = regsub.gsub ('default_midi *=', '',x) + x = re.sub ('default_paper *=', '',x) + x = re.sub ('default_midi *=', '',x) newlines.append (x) return newlines @@ -205,8 +206,8 @@ if 1: def conv(lines): newlines =[] for x in lines: - x = regsub.gsub ('ChoireStaff', 'ChoirStaff',x) - x = regsub.gsub ('\\output', 'output = ',x) + x = re.sub ('ChoireStaff', 'ChoirStaff',x) + x = re.sub ('\\output', 'output = ',x) newlines.append (x) return newlines @@ -215,9 +216,9 @@ if 1: if 1: def conv(lines): newlines =[] - found = 0 + found = None for x in lines: - found = regex.search ('[a-zA-Z]+ = *\\translator',x) <> -1 + found = re.search ('[a-zA-Z]+ = *\\translator',x) newlines.append (x) if found: break if found: @@ -232,7 +233,7 @@ if 1: def conv(lines): newlines =[] for x in lines: - x = regsub.gsub ('\\\\lyric', '\\\\lyrics',x) + x = re.sub ('\\\\lyric', '\\\\lyrics',x) newlines.append (x) return newlines @@ -270,7 +271,7 @@ def do_conversion (infile, from_version, outfile, to_version): for x in lines: if last_conversion: - x = regsub.sub (mudela_version_re_str, '\\version \"%s\"' % tup_to_str (last_conversion), x) + x = re.sub (mudela_version_re_str, '\\\\version \"%s\"' % tup_to_str (last_conversion), x) outfile.write(x) class UnknownVersion: @@ -322,6 +323,7 @@ def do_one_file (infile_name): os.rename (infile_name + '.NEW', infile_name) sys.stderr.write ('\n') + sys.stderr.flush () edit = 0 to_version = () diff --git a/scripts/ly2dvi-old.sh b/scripts/ly2dvi-old.sh new file mode 100644 index 0000000000..2020a40541 --- /dev/null +++ b/scripts/ly2dvi-old.sh @@ -0,0 +1,1005 @@ +#!/bin/sh +# +# Script to make a LaTeX file for Lilypond +# +# Written by Jan Arne Fagertun +# Sat Nov 22 22:26:43 CET 1997 +# +# $Id: ly2dvi-old.sh,v 1.1 1998/10/19 10:09:06 fred Exp $ +# +# Original LaTeX file made by Mats Bengtsson, 17/8 1997 +# + +VERSION="0.12.jcn1" +NAME=ly2dvi.sh +IDENTIFICATION="$NAME $VERSION" +NOW=`date` +echo "$IDENTIFICATION" 1>&2 + +# TODO: +# prevent orphaned "Lily is here" strings + +# NEWS + +# 0.12.jcn1 +# - mudelaDefs really fixed (sorry, PC) + +# 0.12 +# - -S/--sourcedir switch + +# +#0.11.jcn3 +# - mudelaDefs fixes, (thanks PC) +#0.11.jcn2 +# - pass -I, --include to Lily +# - bf: split $LILYINCLUDE and try all dirs +# - bf: geometry left/top +# +#0.11.pc +# - fix backslash gobbling, reduce number of separate processes used +# - require readable rc files, allow rc file in /usr/local/share/lilypond/lilyrc +# - use latex path, not tex path +# - Don't override if kpsepath returns non-NULL +# - Don't clobber x.tex if it wasn't created by ly2dvi +# +# +#0.11.jcn1 +# - find .fly files too +# +#0.11.hwn1 +# - height vs heigth +# - robustification: give \nonstopmode as LaTeX arg; no hanging if no TeX file. +# - robustification: notice failed cp. + +#0.11 +# - more papersizes (thanks Han-Wen) - don't expect LaTeX to accept all... +# - -W,--Width= : set paper width (points) +# - -H,--Height= : set paper height (points) +# - -H and -W is used only when an unknown papersize is to be specified, +# and has to be combined with a papersize option known to LaTeX +#NB! - -F,--headers= : name of additional LaTeX headers input file. +#NB! Changed from -H to -F +# - -d,--dependencies : passed to lilypond + + +#0.10.jcn1 +# - HEIGHT -> HEIGHT +# - vertical margins (for a4), same on both sides +# - textheight from lilypond output file (mudelapapertextheight) +# - piece titling +# - mudelapiece, mudelaopus +# +#0.10 +# - -K,--keeplilypond : Keep lilypond output files (default delete) +# - -k,--keeply2dvi : Keep ly2dvi output files (default delete) +# - -L,--landscape : Set landscape orientation +# - -N,--nonumber : Turn off page numbering (\pagestyle{empty}) +# - Could not reinsert "\usepackage[T1]{fontenc}" because +# "los-toros" won't work with it +# - Ekstra LaTeX headers from input file +#0.9.hwn1 +# - option to remove output of lily +# 0.9 +# - Trap Lilypond abort +# - Replaced "\usepackage[T1]{fontenc}" with +# \usepackage[latin1]{inputenc} (takk, Mats) +# - Removed "()" around "\LilyIdString" (Janne didn't want it) +# 0.8 - Trap Lilypond segmentation fault +# - Function for cleanup +# - Trap line +# - More human-readable variables +# - Some logics concerning rc-files +# 0.7 +# - Improved Lilypond error checking +# - Output orientation (landscape...). Overrides mudela file +# variable orientation="landscape"; +# - Paper width and height put into variables (only A4!) +# - Adjusted top margin to default..... +# +#TODO +# - Include more papersizes. +# - Manual page....... +# 0.6.jaf2 +# - LILYINCLUDE update +# +# 0.6.hwn1 +# - handle LILYINCLUDE +# - --output +# +# 0.6 +# - Source rc-files, if present. Files are: +# /usr/local/share/lilyrc /etc/lilyrc $HOME/.lilyrc ./.lilyrc +# - tee output from Lilypond +# - Handles margins for A4 paper (equal on both sides) +# - new option -s (--separate) for one LaTeX run per file, +# else all files are run together +# +# 0.5 +# - More useful ("two-level") debug. +# - The Q&D hack to find file names and not handling \include +# is replaced by grabbing output file names from Lilypond. +# = Detects multiple output files - adds them when running +# LaTeX. +# - Works with multiple input files - no matter if they are +# (a mix of) input to or output from Lilypond. +# +#TODO +# - Still no margins handling. +# - We have to discuss how to handle multiple output files +# from Lilypond - 'ly2dvi standchen' gives a rather odd +# result.... + +# 0.4.1 +# - Always exit after printing help info +# 0.4 +# - Changes to ensure for more strict grep'ing of parameters +# Thanks to from G.B.Stott@bolton.ac.uk +# - More efficient use of sed -e 's///' -e 's///' +# Thanks to Johan Vromans and GBS +# - Ask tex for location of titledefs.tex (Thanks to JV) +# - Accept only exact match of "\def\mudelacomposer{" +# (or whatever mudela* defined in titledefs.tex) +# - Even more efficient use of sed (Thanks to JV) +# - Default file name for single output file implemented. +# - Moved help into function - finally included from 0.1.jcn1 +# +#TODO +# - Still doesn't handle \include +# - The Q&D for finding output file name from the sequence of +# \paper \output \midi \output really needs to be looked at. +# I have improved it a lot, but it's only capable of finding +# one (the last) file name. +# Well, I have to rewrite this entirely to handle \include, +# then I can fix it. +# - Still no margins handling. +# +#WARNING +# - Some lines of output from lilypond do NOT start +# at first character position, therefore I have removed "^" +# in sed'ing and grep'ing. + +# 0.3.hwn1 +# - add "Creator: " line to output +# +# 0.3 +# - multiple input files to make score from several files +# (extra files assumed to be Lilypond output) +# - cp dvi-file instead of mv, to allow for xdvi reload +# - check for illegal long options +# - put in pt in text width, if not given +# - put in \nonstopmode in LaTeX file +# - restored LaTeX exit value check + +# 0.2.1 +# - temporarily omit LaTeX exit value check +# - remove ALL temporary files + +# 0.2 +# - fix for solaris - included from 0.1.jcn1 +# - long option hack - included from 0.1.jcn1 - modified +# - moved help into function - NOT included from 0.1.jcn1 yet +# - various improvements - included from 0.1.jcn1 +# - find mudela definitions from titledefs.tex +# - find papersize from lilypond output file (mudelapapersize), +# overridden by option '-p size' or '--papersize=size' +# - option -l lang or --language=lang overrides +# lilypond output file definition (mudelalanguage) +# - textwidth from lilypond output file (mudelapaperlinewidth) + +# 0.1.jcn1 +# - fix for solaris +# - long option hack +# - moved help into function + +# +# Clean up +# +cleanup() { + if [ "$KEEP_LY2DVI_OUTPUT" != "Y" ] + then + [ -n "$LatF" -a -f "$LatF" ] && rm -f $LatF + [ -n "$LOGFILE" -a -f "$LOGFILE" ] && rm -f $LOGFILE + [ -n "$FN" ] && rm -f $FN.* + for F in *$$* $TMP/*$$* + do + rm -f $F + done + fi + if [ "$KEEP_LILY_OUTPUT" != "Y" ] + then + for F in $LILY_OUTPUT_FILES + do + [ -f $F ] && rm -f $F + done + fi +} + +# +# print usage +# +help() { + cat << EOF +Generate dvi file from mudela or lilypond output +Usage: $0 [OPTION]... [FILE]... + +Options: + -D,--debug increase verbosity + -F,--headers= name of additional LaTeX headers file + -H,--Height= set paper height (points) (see manual page) + -I,--include=DIR add DIR to search path of LilyPond + -K,--keeplilypond keep lilypond output files + -L,--landscape set landscape orientation + -N,--nonumber switch off page numbering + -O,--orientation= set orientation (obsolete - use -L instead) + -W,--Width= set paper width (points) (see manual page) + -d,--dependencies tell lilypond make a dependencies file + -h,--help this help text + -k,--keeply2dvi keep ly2dvi output files + -l,--language= give LaTeX language (babel) + -o,--output= set output directory + -p,--papersize= give LaTeX papersize (eg. a4) + -s,--separate run all files separately through LaTeX + -S,--sourcedir set sourcedir + + files may be (a mix of) input to or output from lilypond(1) +EOF +} + + +# +# SVr4 echo swallows backslashes, and there's no way to turn it off. +# Therefore use Echo whenever backslashes may be important. +# printf is in the posix.2 standard -- which means it's in +# all modern shells. +# +Echo() { + printf "%s\n" "$@" +} + +# +setPaperZize() { +case "$PAPERSIZE" in + a0*) + PWIDTH=2389 + PHEIGHT=3381 + PAPERSIZE=a0paper + ;; + a1|a1p*) + PWIDTH=1690 + PHEIGHT=2389 + PAPERSIZE=a1paper + ;; + a2*) + PWIDTH=1194 + PHEIGHT=1690 + PAPERSIZE=a2paper + ;; + a3*) + PWIDTH=845 + PHEIGHT=1194 + PAPERSIZE=a3paper + ;; + a4*) + PWIDTH=597 + PHEIGHT=845 + PAPERSIZE=a4paper + ;; + a5*) + PWIDTH=423 + PHEIGHT=597 + PAPERSIZE=a5paper + ;; + a6*) + PWIDTH=298 + PHEIGHT=423 + PAPERSIZE=a6paper + ;; + a7*) + PWIDTH=211 + PHEIGHT=298 + PAPERSIZE=a7paper + ;; + a8*) + PWIDTH=305 + PHEIGHT=211 + PAPERSIZE=a8paper + ;; + a9*) + PWIDTH=105 + PHEIGHT=305 + PAPERSIZE=a9paper + ;; + a10*) + PWIDTH=74 + PHEIGHT=105 + PAPERSIZE=a10paper + ;; + b0*) + PWIDTH=2847 + PHEIGHT=4023 + PAPERSIZE=b0paper + ;; + b1*) + PWIDTH=2012 + PHEIGHT=2847 + PAPERSIZE=b1paper + ;; + b2*) + PWIDTH=1423 + PHEIGHT=2012 + PAPERSIZE=b2paper + ;; + b3*) + PWIDTH=1006 + PHEIGHT=1423 + PAPERSIZE=b3paper + ;; + b4*) + PWIDTH=712 + PHEIGHT=1006 + PAPERSIZE=b4paper + ;; + b5*) + PWIDTH=503 + PHEIGHT=712 + PAPERSIZE=b5paper + ;; + archA) + PWIDTH=650 + PHEIGHT=867 + ;; + archB) + PWIDTH=867 + PHEIGHT=1301 + ;; + archC) + PWIDTH=1301 + PHEIGHT=1734 + ;; + archD) + PWIDTH=1734 + PHEIGHT=2602 + ;; + archE) + PWIDTH=2602 + PHEIGHT=3469 + ;; + flsa|flse) + PWIDTH=614 + PHEIGHT=940 + ;; + halfletter) + PWIDTH=397 + PHEIGHT=614 + ;; + ledger) + PWIDTH=1229 + PHEIGHT=795 + ;; + legal) + PWIDTH=614 + PHEIGHT=1012 + ;; + letter) + PWIDTH=614 + PHEIGHT=795 + ;; + note) + PWIDTH=542 + PHEIGHT=723 + ;; + *) + echo "" + echo $0": unknown papersize -- "$PAPERSIZE + echo "" + ;; +esac +} + +doRcFiles() +{ +# +# RC-files ? +# +for D in /usr/local/share/ /usr/local/share/lilypond/ /etc/ $HOME/. ./. +do + RCfile=$D"lilyrc" + [ -r $RCfile ] && . $RCfile +done +fORI=$ORIENTATION +fLNG=$LANGUAGE +fPSZ=$PAPERSIZE +fLHF=$LATEXHF +unset ORIENTATION LANGUAGE PAPERSIZE LATEXHF +} + + + +# +# Trap function (cleanup) +# + + + +trap cleanup 0 9 15 + + + +# +# Various defaults +# +[ -z "$TMP" ] && TMP=/tmp +if [ ! -d $TMP ] +then + $debug_echo $IDENTIFICATION": temporary directory "$TMP" not found, set to /tmp" + TMP=/tmp +fi +LOGFILE=$TMP/lilylog.$$ # Logfile for lilypond +PAPERSIZE=a4 # Default papersize name +PWIDTH=597 # Default paperwidth +PHEIGHT=845 # Default paperheight +PNUM="%" # Page numbering on +LILYOPTS="" # Options to lilypond +SOURCEDIR="" +LILYPOND_EXECUTABLE=lilypond +doRcFiles + + + +# Keywords defined in titledefs.tex +# +TF="`kpsewhich -n latex tex titledefs.tex`" +MU_DEF="" +if [ -r "${TF:=/usr/local/share/texmf/tex/lilypond/titledefs.tex}" ] +then + MU_DEF=`sed -n -e 's/.*newcommand\*{.\(mudela[^}]*\)}.*$/\1/p' "$TF"` +fi + +: "${MU_DEF:=mudelatitle mudelasubtitle mudelacomposer \ + mudelameter mudelaopus mudelaarranger mudelapiece \ + mudelapoet mudelainstrument \ + }" + +# +# debugging +# +debug_echo=: +# +# All files in one LaTeX run +# +SEPFILE=N +# +# Find command line options and switches +# +# "x:" x takes argument +# +switches="DF:H:I:KLNO:W:dhkl:o:p:S:s\?" +options="" +# +# ugh, "\-" is a hack to support long options +# while getopts \-:$options$switches O +# must be in double quotes for bash-2.0 +while getopts "\-:$options$switches" O +do + $debug_echo "O: \`$O'" + $debug_echo "arg: \`$OPTARG'" + case $O in + D ) + [ $debug_echo = echo ] && set -x + debug_echo=echo + ;; + F ) + LATEXHF=$OPTARG + ;; + H ) + PHEIGHT=$OPTARG + ;; + I ) + LILYOPTS="$LILYOPTS -I $OPTARG" + LILYINCLUDE="$LILYINCLUDE:$OPTARG" + ;; + K ) + KEEP_LILY_OUTPUT=Y + ;; + L ) + ORIENTATION=landscape + ;; + O ) + ORIENTATION=$OPTARG + ;; + N ) + PNUM="\pagestyle{empty}" + ;; + W ) + PWIDTH=$OPTARG + ;; + d ) + LILYOPTS=$LILYOPTS" -d" + ;; + h ) + help; + exit 0 + ;; + k ) + KEEP_LY2DVI_OUTPUT=Y + ;; + l ) + LANGUAGE=$OPTARG + ;; + o ) + OUTPUTDIR=$OPTARG + ;; + p ) + PAPERSIZE=$OPTARG + ;; + s ) + SEPFILE=Y + ;; + S ) + SOURCEDIR=$OPTARG + ;; + \? ) + help; + exit -1 + ;; + # a long option! + -) + $debug_echo "long option: \`$OPTARG'" + case "$OPTARG" in + He*|-He*) + PHEIGHT"`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`"= + ;; + W*|-W*) + PWIDTH="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`" + ;; + dep*|-dep*) + LILYOPTS="$LILYOPTS -d" + ;; + d*|-d*) + [ $debug_echo = echo ] && set -x + debug_echo=echo + ;; + hea*|-hea*) + LATEXHF="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`" + ;; + h*|-h*) + help; + exit 0 + ;; + i*|-i*) + dir="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`" + LILYOPTS="$LILYOPTS --include=$dir" + LILYINCLUDE="$LILYINCLUDE:$dir" + ;; + keepli*|-keepli*) + KEEP_LILY_OUTPUT=Y + ;; + k*|-k*) + KEEP_LY2DVI_OUTPUT=Y + ;; + land*|-land*) + ORIENTATION=landscape + ;; + lang*|-lang*) + LANGUAGE="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`" + ;; + n*|-n*) + PNUM="\pagestyle{empty}" + ;; + or*|-or*) + ORIENTATION="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`" + ;; + ou*|-ou*) + OUTPUTDIR="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`" + ;; + p*|-p*) + PAPERSIZE="`expr \"$OPTARG\" ':' '[^=]*=\(.*\)'`" + ;; + separa*|-sep*) + SEPFILE=Y + ;; + sourcedir*|-sourcedir*) + SOURCEDIR=$OPTARG + ;; + *|-*) + echo "$0: illegal option -- \"$OPTARG\"" + help; + exit -1 + ;; + esac + esac +done +shift `expr $OPTIND - 1` + +if [ "$SOURCEDIR" != "" ]; then +# apparently MakeTeXTFM can't handle relative dirs + SOURCEDIR=`cd $SOURCEDIR; pwd` + LILYINCLUDE="$SOURCEDIR/init:$SOURCEDIR/mf/out:$LILYINCLUDE" + TEXINPUTS="$SOURCEDIR/tex:$TEXINPUTS:" + MFINPUTS="$SOURCEDIR/mf:$MFINPUTS:" + LILYPOND_EXECUTABLE="$SOURCEDIR/lily/out/lilypond" + export MFINPUTS LILYPOND_EXECUTABLE TEXINPUTS SOURCEDIR +fi + +# +# Input file name +# +if [ "$1" = "" ] +then + help + $debug_echo "$IDENTIFICATION: No input file name given" + exit 1 +fi +# regexp_quote -- quote a string as a regular expression for egrep or sed +regexp_quote(){ + Echo "$@" | sed 's/\([]\[\.*?+^$]\)/\\\1/g' +} +# +# +mudelaDefs(){ +# Include \def\mudela-definitions +# The aim here is to pick up the definition for the +# current file, then any other file. +# +mudelatmp=$TMP/mudelaDefs$$ +# Use `cat' to prevent filenames being prepended +# +cat "$File" $OF | fgrep "$MU_DEF" > $mudelatmp +for L in $MU_DEF +do + # This converts \def\mudelatitle{fred} + # to \mudelatitle{fred} or to + # \def\mudelatitle{fred} + # and stops after the first one found. + sed -n '/\\def\\'"$L"'{\([^}]*\)}.*$/{ + s//'"`regexp_quote \"$1\"`"'\\'"$L"'{\1}%/p + q + }' $mudelatmp >> $LatF +done +rm -f $mudelatmp +} +# +# +startFile(){ +# +# LaTeX file name +# +BN=`basename "$File" .tex` +FN="$BN.$$" +if [ "$KEEP_LY2DVI_OUTPUT" != "Y" ] +then + LatF="$TMP/$FN.tex" +else + LatF="$FN.tex" +fi +# +# Find: +# paper size (PAPERSIZE, overridden by command line option -p) +# paper orientation (ORIENTATION, overridden by option -o) +# language (LANGUAGE, overridden by option -l) +# textwidth +# +eval `sed -n \\ + -e 's/\\\\def\\\\mudelalanguage{\([^}]*\).*$/fLNG=\1;/p' \\ + -e 's/\\\\def\\\\mudelalatexheaders{\([^}]*\).*$/fLHF=\1;/p' \\ + -e 's/\\\\def\\\\mudelaorientation{\([^}]*\).*$/fORI=\1;/p' \\ + -e 's/\\\\def\\\\mudelapaperlinewidth{\([^}]*\).*$/TWN=\1;/p' \\ + -e 's/\\\\def\\\\mudelapapertextheight{\([^}]*\).*$/THN=\1;/p' \\ + -e 's/\\\\def\\\\mudelapapersize{\([^}]*\).*$/fPSZ=\1;/p' \\ + "$File"` +# +if [ -z "$LATEXHF" ] +then + LATEXHF="$fLHF" +fi +LLHF="%" +if [ -n "$LATEXHF" ] +then + [ -f "$LATEXHF" ] && LLHF="\input{$LATEXHF}" +fi +# +if [ -z "$PAPERSIZE" ] +then + PAPERSIZE="$fPSZ" +fi +if [ -n "$PAPERSIZE" ] +then + setPaperZize + PAPEROPT="$PAPERSIZE" +fi +# +if [ -z "$ORIENTATION" ] +then + ORIENTATION="$fORI" +fi +if [ -n "$ORIENTATION" ] +then + if [ -z "$PAPEROPT" ] + then + PAPEROPT="$ORIENTATION" + else + PAPEROPT="$PAPEROPT,$ORIENTATION" + fi +fi +# +if [ -n "$PAPEROPT" ] +then + PAPER="[$PAPEROPT]" +fi +# +if [ -z "$LANGUAGE" ] +then + LANGUAGE="$fLNG" +fi +if [ -n "$LANGUAGE" ] +then + LLNG="\usepackage[$LANGUAGE]{babel}" +else + LLNG="%" +fi + +# +# Find textwidth +# +if [ -n "$TWN" ] +then + TW="$TWN" + case "$TW" in + *mm) + ;; + *cm) + ;; + *pt) + ;; + *) + TW="${TW}pt" + ;; + esac + $debug_echo "Text width = $TW" +fi +TWp=`Echo $TW | sed -e 's/\..*$//'` +PWp="$PWIDTH" +# +# Find textheight +# +if [ -n "$THN" ] +then + TH=$THN + case $TH in + *mm) + ;; + *cm) + ;; + *pt) + ;; + *) + TH="${TH}pt" + ;; + esac + $debug_echo "Text height = $TH" +fi +THp="`echo $TH | sed -e 's/\..*$//'`" +PHp="$PHEIGHT" +if [ "$ORIENTATION" = "landscape" ] +then + PWp="$PHEIGHT" + PHp="$PWIDTH" +fi +HMARG="`expr '(' $PWp - $TWp ')' / 2`"pt +$debug_echo "Text left = $HMARG" +VMARG="`expr '(' $PHp - $THp ')' / 2`"pt +$debug_echo "Text top = $VMARG" +# +# Geometry: /var/lib/texmf/latex/geometry/geometry.dvi +# +# +# Write LaTeX file +# +cat << EOF > $LatF +% Creator: $IDENTIFICATION +% Automatically generated from $IF, $NOW + +\documentclass$PAPER{article} + +$LLNG +\usepackage{geometry} +\usepackage[latin1]{inputenc} +%\usepackage[T1]{fontenc} +$PNUM +%\addtolength{\oddsidemargin}{-1cm} +%\addtolength{\topmargin}{-1cm} +%\setlength{\textwidth}{$TW} +%\setlength{\textheight}{$TH} +\geometry{width=$TW, left=$HMARG, height=$TH, top=$VMARG} +\input lilyponddefs +\input titledefs +$LLHF +\begin{document} +EOF +mudelaDefs +cat << EOF >> $LatF +\cmrtwenty% ugh +\makelilytitle +EOF +} +nextFile(){ +cat << EOF >> $LatF +\def\theopus{}% +\def\thepiece{}% +\def\mudelaopus{}% +\def\mudelapiece{}% +EOF +mudelaDefs "\\def" +cat << EOF >> $LatF +\def\theopus{\mudelaopus}% ugh +\def\thepiece{\mudelapiece}% +\makelilypiecetitle +EOF +} +# +# Conclusion +# +endFile(){ +cat << EOF >> $LatF +\vfill\hfill{\LilyIdString} +\end{document} +EOF +# +# Run LaTeX +# +latex '\nonstopmode \input '$LatF || exit 5 +# +# Rename dvi file +# +if [ -f $FN.dvi ] +then + RESULT="$BN.dvi" + [ -n "$OUTPUTDIR" ] && RESULT="$OUTPUTDIR/$RESULT" + + cp "$FN.dvi" "$RESULT" || exit 5 +fi +# +# Output some info +# +cat << EOF + +$IDENTIFICATION: dvi file name is $RESULT + +EOF +} + +# ugh. GF is side-effect. +findInput() { +# should check for LILYINCLUDE + OIFS="$IFS" + IFS=':' + x=`echo $LILYINCLUDE | sed "s!:! !g"` + IFS="$OIFS" + for lypath in . $x + do + if [ -f "$lypath/$1" ] + then + GF="$lypath/$1" + return + fi + + if [ -f "$lypath/$1.ly" ] + then + GF="$lypath/$1.ly" + return + fi + if [ -f "$lypath/$1.fly" ] + then + GF="$lypath/$1.fly" + return + fi + done + $debug_echo "$IDENTIFICATION: Input file \"$GF\" not found" + echo "$NAME: Input file \"$GF\" not found" 1>&2 + exit 2 +} +# +# Loop through all files +# + +LILY_OUTPUT_FILES= + +for GF +do + findInput $GF + + # + # Check whether the file is input to or output from lilypond + # + L1=`head -1 $GF` + OP=`echo $L1 | grep "^% Creator: GNU LilyPond"` + if [ -n "$OP" ] + then + # + # OK - it's the output from lilypond. + # + # Get lilypond source file name + # + OF=$GF + IFL=`grep mudelafilename $OF` + if [ "$IFL" != "" ] + then + IF=`echo $IFL | sed -e 's/.*{//' -e 's/}*.$//'` + # + # Check if source file exists + # + if [ ! -f $IF ] + then + $debug_echo $IDENTIFICATION": Mudela file not found." + TW=15.5cm + TH=25.0cm + fi + else + $debug_echo $IDENTIFICATION": Mudela file name not found." + TW=15.5cm + TH=25.0cm + fi + else + # + # I have to assume this is the lilypond input file + # Find output file name, if defined + # + IF=$GF + # + # Run lilypond + # Grab output file names + # + $debug_echo "lilypond "$LILYOPTS $IF + + $LILYPOND_EXECUTABLE $LILYOPTS $IF 2>&1 | tee $LOGFILE + OF="`sed -n -e 's/TeX output to \([^\.]*\.tex\)\.\.\.$/\1/p' $LOGFILE`" + $debug_echo "==> $OF" + LILY_OUTPUT_FILES="$LILY_OUTPUT_FILES $OF" + STATUS=`egrep -i "error|segmentation|abort" $LOGFILE` + echo $STATUS + if [ ! -z "$STATUS" ] + then + exit 10 + fi + fi + # + # "Spin through" all the files + # + for File in $OF + do + $debug_echo "--- "$File + # + # Check if output file is generated + # + if [ ! -f "$File" ] + then + $debug_echo "$IDENTIFICATION: hmm, I could not find the output file $File" + exit 4 + fi + # + # Is this the first file? + # + if [ -z "$FFile" ] + then + FFile="$File" + startFile + else + nextFile + fi + cat << EOF >> $LatF +\input{$File} +EOF + if [ $SEPFILE = Y ] + then + FFile="" + endFile + fi + done +done +if [ $SEPFILE = N ] +then + endFile +fi +# +# OK - finished +# diff --git a/scripts/ly2dvi.py b/scripts/ly2dvi.py new file mode 100644 index 0000000000..74c5495c08 --- /dev/null +++ b/scripts/ly2dvi.py @@ -0,0 +1,1117 @@ +#!@PYTHON@ + +""" +======================================================================= +LilyPond to dvi converter + +Features include Title information, paper size specification, and image +orientation. + +Usage: ly2dvi.py [OPTION]... [FILE]... +Input: LilyPond source or LilyPond generated TeX files +Output: DVI file +======================================================================= +""" + +name = 'ly2dvi' +version = '0.0.5' +errorlog = '' + +import sys +import os +import getopt +import re +import string +import time +import glob + + +class Input: + """ + This class handles all ly2dvi.py input file methods + + Public methods: + + __init__() Constructor + open(file) Open a .ly file or .tex file using lilyinclude path + close() Close current file + type() Determine file type .ly (input) or .tex (output) + setVars() Set title definitions found in .tex (output) file + """ + + # + # Constructors + # + + def __init__(this): + this.__fd = None + + # + # open + # + def open(this,file): + """ + open file and set private class variable __fd. The search + sequence is: current directory followed by the directories + found in include property list. Each directory is searched + for file, file.ly, and file.fly. + + input: file filename + output: void + error: ExitNotFound Exception + """ + + for i in [''] + Props.get('include')[0:]: + ifile = os.path.join(i,file) + for j in ['','.ly','.fly']: + jfile = ifile+j + try: + this.__fd = open( jfile, 'r' ) + return + except: + pass + sys.exit('ExitNotFound', file) + + + # + # close + # + def close(this): + """ + close file object __fd + + input: void + output: void + error: None + """ + this.__fd.close() + + + # + # type + # + def type(this): + """ + Determine input file type. LilyPond source is 'input' type + and LilyPond generated TeX file is 'output' type + + input: void + output: 'input' | 'output' + error: None + """ + + firstline = this.__fd.readline() + this.__fd.seek(0) + if re.match('% Creator: GNU LilyPond [0-9]+[.0-9]+',firstline ): + return 'output' + else: + return 'source' + + + # + # setVars + # + def setVars(this): + """ + Search for properties in the current input file and set the + appropriate values. The supported properties names are in + local variable varTable along with the property list + titledefs. + + input: void + output: None + error: None + """ + + varTable = [ + # regexp set method + # ------ ---------- + ( 'language', Props.setLanguage ), + ( 'latexheaders', Props.setHeader ), + ( 'orientation', Props.setOrientation ), + ( 'paperpapersize', Props.setPaperZize ), + ( 'papertextheight', Props.setTextHeight ), + ( 'paperlinewidth', Props.setLineWidth ), + ( 'filename', Props.setFilename ), + ] + + titles={} + for line in this.__fd.readlines(): + m=re.match('\\\\def\\\\mudela([\w]+){(.*)}',line) + if m: + for var in varTable: + if m.group(1) == var[0]: + var[1](m.group(2),'file') + break + for var in Props.get('titledefs'): + if m.group(1) == var: + titles[var]=m.group(2) + break + Props.setTitles(titles,'file') + this.__fd.seek(0) + + + +class TeXOutput: + """ + This class handles all ly2dvi.py output file methods + + private methods: + __mudelaDefs(opt) Send title info to output file + + Public methods: + __init__() Constructor + write(str) Write a string to output file + start(file) Start the latex file + next() Process next output file + end() Finish latex file and run latex + """ + + # + # constructor + # + def __init__(this): + this.__fd = None + this.__base = '' + this.__outfile = '' + + # + # __medelaDefs + # + def __mudelaDefs(this,opt): + """ + Write titles to output + + input: opt Supports header and subheader output + output: None + error: None + """ + + titles = Props.get('titles') + for key in titles.keys(): + this.write('%s\\mudela%s{%s}%%\n' % (opt,key,titles[key])) + + # + # write + # + def write(this,str): + """ + Write str to current output file + + input: str String to write + output: None + error: None + """ + + this.__fd.write(str) + + # + # start + # + def start(this,file): + """ + Start LaTeX file. Calculates the horizontal and vertical + margin using pagewidth, pageheight, linewidth, and textheight. + Creates temporary output filename and opens it for write. + Sends the LaTeX header information to output. Lastly sends + the title information to output. + + input: file output file name + output: None + error: None + """ + + now=time.asctime(time.localtime(time.time())) + linewidth = Props.get('linewidth') + textheight = Props.get('textheight') + + if Props.get('orientation') == 'landscape': + pagewidth = Props.get('pageheight') + pageheight = Props.get('pagewidth') + else: + pageheight = Props.get('pageheight') + pagewidth = Props.get('pagewidth') + + horizontalMarginArg = ( (pagewidth - linewidth)/2 ) + verticalMarginArg = ( (pageheight - textheight)/2 ) + + top="""\ +%% Creator: %s +%% Automatically generated from %s, %s + +\\documentclass[%s]{article} + +%s +\\usepackage{geometry} +\\usepackage[latin1]{inputenc} +%%\\usepackage[T1]{fontenc} +%s +%%\\addtolength{\\oddsidemargin}{-1cm} +%%\\addtolength{\\topmargin}{-1cm} +%%\\setlength{\\textwidth}{%s} +%%\\setlength{\\textheight}{%s} +\\geometry{width=%spt, left=%spt, height=%spt, top=%spt} +\\input lilyponddefs +\\input titledefs +%s +\\begin{document} +""" % ( program_id(), Props.get('filename'), now, Props.get('papersize'), + Props.get('language'), Props.get('pagenumber'), linewidth, textheight, + linewidth, horizontalMarginArg, textheight, verticalMarginArg, + Props.get('header') ) + + pathcomp = os.path.splitext(file) + this.__base = pathcomp[0] + this.__outfile = '%s.%d%s' % (pathcomp[0], os.getpid(), pathcomp[1]) + try: + this.__fd = open(this.__outfile,"w") + except: + sys.exit('ExitNoWrite', this.__outfile) + this.write(top) + this.__mudelaDefs('') + this.write("""\ +\\cmrtwenty% ugh +\\makelilytitle +""") + + # + # next + # + def next(this): + """ + Write LaTeX subheader information to support more than one + score in a document. Lastly send current title information to + output. + + input: None + output: None + error: None + """ + + this.write("""\ +\\def\\theopus{}% +\\def\\thepiece{}% +\\def\\mudelaopus{}% +\\def\\mudelapiece{}% +""") + this.__mudelaDefs("\\def") + this.write("""\ +\\def\\theopus{\\mudelaopus}% ugh +\\def\\thepiece{\\mudelapiece}% +\\makelilypiecetitle +""") + + + # + # end + # + def end(this): + """ + Close output file and run latex on it. + + input: None + output: None + error: ExitBadLatex Exception + """ + + outfile=this.__base + '.dvi' + if Props.get('output') != '': + outfile = os.path.join(Props.get('output'), outfile ) + + this.write("""\ +\\vfill\\hfill{\\LilyIdString} +\\end{document} +""") + this.__fd.close() + if ( os.name == 'posix' ): + stat = os.system('latex \'\\nonstopmode \\input %s\'' % + (this.__outfile)) + else: # Windows shells don't eat the single quotes + stat = os.system('latex \\nonstopmode \\input %s' % + (this.__outfile)) + if stat: + sys.exit('ExitBadLatex') + if os.path.isfile(outfile): + os.remove(outfile) + os.rename(this.__base + '.' + str(os.getpid()) + '.dvi', outfile) + sys.stderr.write( '\n' + program_id() + ': dvi file name is %s\n\n' + % (outfile)) + + if Props.get('postscript'): + psoutfile=this.__base + '.ps' + if Props.get('output') != '': + psoutfile = os.path.join(Props.get('output'), psoutfile ) + stat = os.system('dvips -o %s %s 2>&1' % (psoutfile,outfile)) + if stat: + sys.exit('ExitBadPostscript') + + + + +class Properties: + """ + This class handles all ly2dvi.py property manipulation + + Public methods: + + __init__() Constructor + set methods + """ + + def __init__(this): + + # + # Following is the order of priority for property assignment. The + # list is organized from lowest to highest priority. Each + # assignment is overridden by the next requester in the list. + # + # Requester Description + # --------- ----------- + # init Initial default values + # file The values found in the lilypond generated TeX files + # environment Envrionment variables LILYINCLUDE, LILYPONDPREFIX + # rcfile $LILYPONDPREFIX/share/lilypond/.lilyrc + # rcfile $HOME/.lilyrc + # rcfile ./.lilyrc + # commandline command line arguments + # + this.__overrideTable = { + 'init' : 0, + 'file' : 1, + 'environment' : 2, + 'rcfile' : 3, + 'commandline' : 4, + 'program' : 5 + } + + this.__roverrideTable = {} # reverse lookup used for debug + for i in this.__overrideTable.items(): + this.__roverrideTable[i[1]]=i[0] + + this.__data = { + 'pagewidth' : [597, this.__overrideTable['init']], + 'pageheight' : [845, this.__overrideTable['init']], + 'papersize' : ['a4paper', this.__overrideTable['init']], + 'textheight' : [0, this.__overrideTable['init']], + 'linewidth' : [0, this.__overrideTable['init']], + 'orientation' : ['portrait', this.__overrideTable['init']], + 'language' : ['%', this.__overrideTable['init']], + 'include' : [[], this.__overrideTable['init']], + 'debug' : [0, this.__overrideTable['init']], + 'keeplilypond' : [0, this.__overrideTable['init']], + 'keeply2dvi' : [0, this.__overrideTable['init']], + 'pagenumber' : ['%', this.__overrideTable['init']], + 'separate' : [0, this.__overrideTable['init']], + 'output' : ['', this.__overrideTable['init']], + 'header' : ['%', this.__overrideTable['init']], + 'dependencies' : [0, this.__overrideTable['init']], + 'root' : ['', this.__overrideTable['init']], + 'tmp' : ['d:\tmp', this.__overrideTable['init']], + 'filename' : ['', this.__overrideTable['init']], + 'titledefs' : [[], this.__overrideTable['init']], + 'titles' : [{}, this.__overrideTable['init']], + 'lilyOutputFiles' : [[], this.__overrideTable['init']], + 'postscript' : [0, this.__overrideTable['init']], + } + + # + # Try to set root and HOME first before calling rcfile + # + if os.environ.has_key('LILYPONDPREFIX'): + this.setRoot(os.environ['LILYPONDPREFIX'], 'environment') + else: + p=os.path.split(sys.argv[0]) + p=os.path.split(p[0]) + this.setRoot(p[0],'init') + + if not os.environ.has_key('HOME'): + if os.environ.has_key('HOMEDRIVE') and \ + os.environ.has_key('HOMEPATH'): + os.environ['HOME'] = os.environ['HOMEDRIVE'] + \ + os.environ['HOMEPATH'] + else: + os.environ['HOME'] = os.curdir + + this.rcfile() # Read initialization file(s) + + if os.environ.has_key('LILYINCLUDE'): + tmp=this.get('include') + for s in string.split(os.environ['LILYINCLUDE'],os.pathsep): + tmp.append(s) + this.__set('include', tmp, 'environment') + + + t='' + if os.environ.has_key ('TEXINPUTS'): + t = os.pathsep + os.environ['TEXINPUTS'] + os.environ['TEXINPUTS'] = os.path.join(this.get('root'), 'texmf', + 'tex', 'lilypond' ) + t + + t='' + if os.environ.has_key ('MFINPUTS'): + t = os.pathsep + os.environ['MFINPUTS'] + os.environ['MFINPUTS'] = os.path.join(this.get('root'), 'texmf', + 'mf', 'public', 'lilypond' ) + t + + if os.environ.has_key('TMP'): + this.__set('tmp',os.environ['TMP'],'environment') + + + fd=this.get_texfile_path ('titledefs.tex') + mudefs=[] + + for line in fd.readlines(): + m=re.match('\\\\newcommand\*{\\\\mudela([\w]+)}',line) + if m: + mudefs.append(m.group(1)) + fd.close + this.__set('titledefs', mudefs, 'init') + + # + # __set + # + def __set(this,var,value,requester): + """ + All of the set methods call this to set a property. If the value + was last set by a requestor of lesser priority the new value is + assigned, else the old value has priority and is unchanged. + """ + + if this.__overrideTable[requester] < this.__data[var][1]: + return 0 + else: + this.__data[var] = [value, this.__overrideTable[requester]] + + # + # get + # + def get(this,var): + """ + All of the get methods call this to get a property value. List + variable types are return by value to facilitate an append operation. + """ + + if var == 'include' or var == 'lilyOutputFiles': + return this.__data[var][0][0:] # return a copy not a ref + else: + return this.__data[var][0] + + # + # get_texfile_path + # + def get_texfile_path (this, var): + """ + locate and open titledefs.tex file + """ + + if os.name == 'nt': + path = os.path.join(this.get('root'), 'texmf', 'tex', + 'lilypond', var) + else: + path ='' + cmd =('kpsewhich tex %s %s' % (var,errorlog)) + pipe = os.popen (cmd, 'r') + path = pipe.readline ()[:-1] # chop off \n + return_status = pipe.close() + if return_status and not path: + path = os.path.join(this.get('root'), 'texmf', 'tex', + 'lilypond', var) + fd = open(path, 'r') + return fd + + + # + # Read rc file + # + def rcfile(this): + """ + Read initialization file(s) + """ + varTable = [ + # name set method + # ---- ---------- + ( 'DEBUG', this.setDebug ), + ( 'DEPENDENCIES', this.setDependencies ), + ( 'KEEPLILYPOND', this.setKeeplilypond ), + ( 'KEEPLY2DVI', this.setKeeply2dvi ), + ( 'LANGUAGE', this.setLanguage ), + ( 'LATEXHF', this.setHeader ), + ( 'LILYINCLUDE', this.setInclude ), + ( 'LILYPONDPREFIX', this.setRoot ), + ( 'NONUMBER', this.setNonumber ), + ( 'ORIENTATION', this.setOrientation ), + ( 'OUTPUTDIR', this.setOutput ), + ( 'PAPERSIZE', this.setPaperZize ), + ( 'PHEIGHT', this.setTextHeight ), + ( 'POSTSCRIPT', this.setPostscript ), + ( 'PWIDTH', this.setLineWidth ), + ( 'SEPARATE', this.setSeparate ), + ( 'TMP', this.setTmp ), + ] + + if ( os.name == 'posix' ): + dotFilename='.lilyrc' + else: # Windows apps like edit choke on .lilyrc + dotFilename='_lilyrc' + + for d in [os.path.join(this.get('root'),'share','lilypond'), \ + os.environ['HOME'], os.curdir ]: + file=os.path.join(d,dotFilename) + try: + fd = open( file, 'r' ) + except: + continue + + for line in fd.readlines(): + if re.match('#.*',line): + continue + m=re.search('([\w]+)=(.*)',line) + if m: + for var in varTable: + if m.group(1) == var[0]: + var[1](m.group(2),'rcfile') + break + fd.close + + # + # setPaperZize + # + def setPaperZize(this,size,requester): + """ + Set paper size properties + """ + + paperTable = [ + # regex width height name + # ----- ----- ------ ---- + ( 'a0.*', 2389, 3381, 'a0paper' ), + ( 'a1$|a1p.*', 1690, 2389, 'a1paper' ), + ( 'a2.*', 1194, 1690, 'a2paper' ), + ( 'a3.*', 845, 1194, 'a3paper' ), + ( 'a4.*', 597, 845, 'a4paper' ), + ( 'a5.*', 423, 597, 'a5paper' ), + ( 'a6.*', 298, 423, 'a6paper' ), + ( 'a7.*', 211, 298, 'a7paper' ), + ( 'a8.*', 305, 211, 'a8paper' ), + ( 'a9.*', 105, 305, 'a9paper' ), + ( 'a10.*', 74, 105, 'a10paper' ), + ( 'b0.*', 2847, 4023, 'b0paper' ), + ( 'b1.*', 2012, 2847, 'b1paper' ), + ( 'b2.*', 1423, 2012, 'b2paper' ), + ( 'b3.*', 1006, 1423, 'b3paper' ), + ( 'b4.*', 712, 1006, 'b4paper' ), + ( 'b5.*', 503, 712, 'b5paper' ), + ( 'archA$', 650, 867, 'archApaper' ), + ( 'archB$', 867, 1301, 'archBpaper' ), + ( 'archC$', 1301, 1734, 'archCpaper' ), + ( 'archD$', 1734, 2602, 'archDpaper' ), + ( 'archE$', 2602, 3469, 'archEpaper' ), + ( 'flsa$|flse$', 614, 940, 'flsapaper' ), + ( 'halfletter$', 397, 614, 'halfletterpaper' ), + ( 'ledger$', 1229, 795, 'ledgerpaper' ), + ( 'legal$', 614, 1012, 'legalpaper' ), + ( 'letter$', 614, 795, 'letterpaper' ), + ( 'note$', 542, 723, 'notepaper' ) + ] + + found=0 + for paper in paperTable: + if re.match(paper[0],size): + found=1 + this.__set('pagewidth',paper[1],requester) + this.__set('pageheight',paper[2],requester) + this.__set('papersize',paper[3],requester) + break + + if not found: + sys.exit('ExitBadPaper',size) + + # + # setTextHeight + # + def setTextHeight(this,size,requester): + """ + Set textheight property + """ + + m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size) + if m: + if m.group(2) == 'cm': + this.__set('textheight',\ + float(m.group(1)) * 72.27/2.54, requester ) + elif m.group(2) == 'mm': + this.__set('textheight',\ + float(m.group(1)) * 72.27/25.4, requester ) + elif m.group(2) == 'pt': + this.__set('textheight', float(m.group(1)), requester ) + elif m.group(2) == '': + this.__set('textheight', float(m.group(1)), requester ) + else: + sys.exit('ExitBadHeight', m.group(2)) + else: + sys.exit('ExitBadHeight', size) + + # + # setLineWidth + # + def setLineWidth(this,size,requester): + """ + Set linewidth propery + """ + + m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size) + if m: + if m.group(2) == 'cm': + this.__set('linewidth', \ + float(m.group(1)) * 72.27/2.54, requester ) + elif m.group(2) == 'mm': + this.__set('linewidth', \ + float(m.group(1)) * 72.27/25.4, requester ) + elif m.group(2) == 'pt': + this.__set('linewidth', float(m.group(1)), requester ) + elif m.group(2) == '': + this.__set('linewidth', float(m.group(1)), requester ) + else: + sys.exit('ExitBadWidth', m.group(2)) + else: + sys.exit('ExitBadWidth', size) + + # + # setOrientation + # + def setOrientation(this,orient,requester): + """ + Set orientation property + """ + + if orient == 'landscape' or orient == 'portrait': + this.__set('orientation', orient, requester ) + else: + sys.exit('ExitBadOrient', orient) + + # + # setLanguage + # + def setLanguage(this,lang,requester): + """ + Set language property + """ + + this.__set('language', '\\usepackage[%s]{babel}' % (lang), requester ) + + # + # setInclude + # + def setInclude(this,inc, requester): + """ + Append an include path + """ + + tmp = this.get('include') + tmp.append(inc) + this.__set('include', tmp, requester ) + + # + # setDebug + # + def setDebug(this,value,requester): + """ + Set or Clear debug flag + """ + + if int(value) == 1: + this.__set('debug',1,requester) + else: + this.__set('debug',0,requester) + + # + # setKeeplilypond + # + def setKeeplilypond(this, value, requester): + """ + Set or Clear keeplilypond flag + """ + + if int(value) == 1: + this.__set('keeplilypond',1,requester) + else: + this.__set('keeplilypond',0,requester) + + # + # setKeeply2dvi + # + def setKeeply2dvi(this, value, requester): + """ + Set or Clear keeply2dvi flag + """ + + if int(value) == 1: + this.__set('keeply2dvi',1,requester) + else: + this.__set('keeply2dvi',0,requester) + + # + # setNonumber + # + def setNonumber(this, value, requester): + """ + Set nonumber flag + """ + + if int(value) == 1: + this.__set('pagenumber',1,requester) + else: + this.__set('pagenumber',0,requester) + + # + # setSeparate + # + def setSeparate(this, value, requester): + """ + Set or Clear separate flag + """ + + if int(value) == 1: + this.__set('separate',1,requester) + else: + this.__set('separate',0,requester) + + # + # Set output directory name + # + def setOutput(this,out,requester): + this.__set('output',out,requester) + + # + # Set latex header name + # + def setHeader(this,head, requester): + this.__set('header',head,requester) + + # + # Set or Clear Dependencies flag to generate makefile dependencies + # + def setDependencies(this, requester): + """ + Set or Clear dependencies flag + """ + + if int(value) == 1: + this.__set('dependencies',1,requester) + else: + this.__set('dependencies',0,requester) + + # + # Set tmp directory + # + def setTmp(this,dir, requester): + this.__set('tmp',dir,requester) + + # + # Set mudela source file name + # + def setFilename(this,file, requester): + this.__set('filename',file,requester) + + # + # Set title commands + # + def setTitles(this,titles, requester): + this.__set('titles',titles,requester) + + # + # Set title commands + # + def addLilyOutputFiles(this,filelist,requester): + """ + Add a to the lily output list + """ + + tmp = this.get('lilyOutputFiles') + tmp = tmp + filelist + this.__set('lilyOutputFiles',tmp,requester) + + # + # Set/Clear postscript flag + # + def setPostscript(this,value,requester): + """ + Set postscript flag + """ + + if int(value) == 1: + this.__set('postscript',1,requester) + else: + this.__set('postscript',0,requester) + + # + # Set root + # + def setRoot(this,path, requester): + """ + Set lilypond root directory + """ + + os.environ['LILYPONDPREFIX'] = path + this.__set('root',path,requester) + + # + # printProps + # + def printProps(this): + """ + Print properties + """ + + for key in this.__data.keys(): + print "%s <%s>:<%s>" % (key,this.get(key), + this.__roverrideTable[this.__data[key][1]]) + + + +# +# Misc functions +# + +def getLilyopts(): + inc = '' + if len(Props.get('include')) > 0: + inc = '-I ' + string.join(Props.get('include'),os.pathsep) + else: + + if Props.get('dependencies'): + dep=' -d' + else: + dep='' + return inc + dep + return inc + +def writeLilylog(contents): + if Props.get('keeplilypond'): + file='lilylog.' + str(os.getpid()) + output = Props.get('output') + if output != '': + file = os.path.join( output, file ) + try: + fd = open( file, 'w' ) + except: + sys.exit('ExitNoWrite', file) + fd.write(contents) + fd.close() + +def getTeXFile(contents): + texfiles=[] + for line in string.split(contents,'\n'): + m = re.search('^TeX output to (.+)\.\.\.', line) + if m: + texfiles.append(m.group(1)) + + if texfiles == []: + sys.exit('ExitNoTeXName') + else: + return texfiles + +def program_id (): + return name + ' ' + version; + + +def mailaddress(): + try: + return os.environ['MAILADDRESS'] + except KeyError: + return '(address unknown)' + + +def identify (): + sys.stderr.write (program_id () + '\n') + +def help (): + sys.stderr.write ( + 'Generate dvi file from mudela or lilypond output\n' + 'Usage: ' + name + ' [OPTION]... [FILE]...\n' + '\n' + 'Options:\n' + ' -D,--debug increase verbosity\n' + ' -F,--headers= name of additional LaTeX headers file\n' + ' -H,--Height= set paper height (points) (see manual page)\n' + ' -I,--include=DIR add DIR to LilyPond\'s search path\n' + ' -K,--keeplilypond keep lilypond output files\n' + ' -L,--landscape set landscape orientation\n' + ' -N,--nonumber switch off page numbering\n' + ' -O,--orientation= set orientation (obsolete - use -L instead)\n' + ' -P,--postscript generate postscript file\n' + ' -W,--Width= set paper width (points) (see manual page)\n' + ' -d,--dependencies tell lilypond make a dependencies file\n' + ' -h,--help this help text\n' + ' -k,--keeply2dvi keep ly2dvi output files\n' + ' -l,--language= give LaTeX language (babel)\n' + ' -o,--output= set output directory\n' + ' -p,--papersize= give LaTeX papersize (eg. a4)\n' + ' -s,--separate run all files separately through LaTeX\n' + '\n' + 'files may be (a mix of) input to or output from lilypond(1)\n' + ) + + + +# +# main +# + +def main(): + """Generate dvi files from lilypond source/output""" + + infile = Input() + outfile = TeXOutput() + texInputFiles=[] + + (options, files) = getopt.getopt (sys.argv[1:], + 'DF:H:I:KLNPW:dhkl:o:p:s', + ['debug', 'headers=', 'Height=', + 'include=', 'keeplilypond', 'landscape', + 'nonumber', 'Width=', 'dependencies', + 'help', 'keeply2dvi', 'language=', + 'output=', 'papersize=', 'separate', + 'postscript']) + for opt in options: + o = opt[0] + a = opt[1] + if o == '--debug' or o == '-D': + Props.setDebug(1,'commandline') + elif o == '--headers' or o == '-F': + Props.setHeader(a,'commandline') + elif o == '--include' or o == '-I': + Props.setInclude(a,'commandline') + elif o == '--Height' or o == '-H': + Props.setTextHeight(a,'commandline') + elif o == '--keeplilypond' or o == '-K': + Props.setKeeplilypond(1,'commandline') + elif o == '--landscape' or o == '-L': + Props.setOrientation('landscape','commandline') + elif o == '--nonumber' or o == '-N': + Props.setNonumber('commandline') + elif o == '--Width' or o == '-W': + Props.setLineWidth(a,'commandline') + elif o == '--dependencies' or o == '-d': + Props.setDependencies(1,'commandline') + elif o == '--help' or o == '-h': + help() + return 0 + elif o == '--keeply2dvi' or o == '-k': + Props.setKeeply2dvi(1,'commandline') + elif o == '--language' or o == '-l': + Props.setLanguage(a,'commandline') + elif o == '--output' or o == '-o': + Props.setOutput(a,'commandline') + elif o == '--papersize' or o == '-p': + Props.setPaperZize(a,'commandline') + elif o == '--separate' or o == '-s': + Props.setSeparate(1,'commandline') + elif o == '--postscript' or o == '-P': + Props.setPostscript(1,'commandline') + + if len(files): + for file in files: + infile.open(file) + type = infile.type() + infile.close() + if type == 'source': + cmd = 'lilypond %s %s 2>&1' % (getLilyopts(), file) + fd = os.popen( cmd , 'r' ) + log = '' + line=fd.readline() + while line: + log = log + line + sys.stderr.write( line ) + line=fd.readline() + stat = fd.close() + if stat: + sys.exit('ExitBadLily', cmd ) + texFiles=getTeXFile(log) + writeLilylog(log) + Props.addLilyOutputFiles(texFiles,'program') + texInputFiles = texInputFiles + texFiles + else: + texInputFiles.append(file) + + firstfile=1 + for file in texInputFiles: + infile.open(file) + infile.setVars() # first pass set variables + infile.close() + if Props.get('debug'): + Props.printProps() + if firstfile: + outfile.start(file) + else: + outfile.next() + outfile.write("""\ +\\input{%s} +""" % (file)) + if Props.get('separate'): + outfile.end() + else: + firstfile=0 + if not Props.get('separate'): + outfile.end() + else: + help() + sys.exit('ExitBadArgs','No files specified') + +# +# Exit values +# +ExitTable = { + 'ExitInterupt' : ['Ouch!', 1 ], + 'ExitBadArgs' : ['Wrong number of arguments', 2 ], + 'ExitNotFound' : ['File not found', 3 ], + 'ExitBadPaper' : ['Unknown papersize', 4 ], + 'ExitBadHeight' : ['Invalid Height specification', 5 ], + 'ExitBadWidth' : ['Invalid Width specification', 6 ], + 'ExitBadOrient' : ['Invalid Orientation specification', 7 ], + 'ExitNoWrite' : ['Permission denied', 8 ], + 'ExitNoTeXName' : ['hmm, I could not find an output file name', 9 ], + 'ExitBadLily' : ['Lilypond failed', 10 ], + 'ExitBadLatex' : ['Latex failed', 11 ], + 'ExitBadPostscript' : ['Postscript failed', 12 ], + 'ExitUnknown' : ['Unknown Exit Code', 20 ], + } + +def cleanup(): + lilyfiles = [] + tmpfiles = [] + if not Props.get('keeplilypond'): + lilyfiles = Props.get('lilyOutputFiles') + if not Props.get('keeply2dvi'): + tmpfiles = glob.glob('*.' + str(os.getpid()) + '.*' ) + for file in lilyfiles + tmpfiles: + if os.path.isfile(file): + os.remove(file) + + +identify() +Props = Properties() + +try: + main() + +except KeyboardInterrupt: + print ExitTable['ExitInterupt'][0] + cleanup() + sys.exit(ExitTable['ExitInterupt'][1]) + +except SystemExit, errno: + if ExitTable.has_key(errno.args[0]): + msg = ExitTable[errno.args[0]] + else: + msg = ExitTable['ExitUnknown'] + if len(errno.args) > 1: + sys.stderr.write( '%s: %s: %s\n' % (name, msg[0], errno.args[1])) + else: + sys.stderr.write( '%s %s\n' % (name, msg[0])) + if Props.get('debug'): + Props.printProps() + cleanup() + sys.exit(msg[1]) +else: + cleanup() diff --git a/scripts/mudela-book.py b/scripts/mudela-book.py index 359d68b326..596119c3dd 100644 --- a/scripts/mudela-book.py +++ b/scripts/mudela-book.py @@ -9,10 +9,9 @@ import os import string -import regex +import re import getopt import sys -import regsub outdir = 'out/' program_version = '0.3' @@ -70,7 +69,7 @@ class Mudela_output: self.file.write ('default_paper = \\paper { \\paper_%s\n linewidth = -15.\\cm; }\n' % s) if self.fragment: - self.file.write ('\\score { \\melodic { ') + self.file.write ('\\score { \\notes { ') def write (self,s): self.file.write (s) @@ -133,16 +132,16 @@ class Tex_output: -begin_mudela_re = regex.compile ('^ *\\\\begin{mudela}') -begin_mudela_opts_re = regex.compile ('^ *\\\\begin{mudela}\[\(.*\)\]') -end_mudela_re = regex.compile ('^ *\\\\end{mudela}') -section_re = regex.compile ('\\\\section') -chapter_re = regex.compile ('\\\\chapter') -input_re = regex.compile ('^\\\\input[ \t\n]+\\(.*\\)$') +begin_mudela_re = re.compile ('^ *\\\\begin{mudela}') +begin_mudela_opts_re = re.compile ('^ *\\\\begin{mudela}\[(.*)\]') +end_mudela_re = re.compile ('^ *\\\\end{mudela}') +section_re = re.compile ('\\\\section') +chapter_re = re.compile ('\\\\chapter') +input_re = re.compile ('^\\\\input[ \t\n]+(.*)$') class Tex_input: def __init__ (self,name): - if regex.search ('\\.[^/\\\\]+',name) == -1: + if not re.search ('\\.[^/\\\\]+',name): name = name + '.tex' print 'opening %s' % name self.filename = name @@ -152,8 +151,9 @@ class Tex_input: lines = self.infile.readlines () (retlines, retdeps) = ([],[self.filename]) for line in lines: - if input_re.search (line) <> -1: - t = Tex_input (input_re.group (1)) + m = input_re.search (line) + if m: + t = Tex_input (m.group (1)) ls =t.get_lines () retlines = retlines + ls[0] retdeps = retdeps + ls[1] @@ -175,9 +175,9 @@ class Main_tex_input(Tex_input): self.mudela = None self.deps = [] def set_sections (self, l): - if section_re.search (l) <> -1: + if section_re.search (l): self.section = self.section + 1 - if chapter_re.search (l) <> -1: + if chapter_re.search (l): self.section = 0 self.chapter = self.chapter + 1 @@ -191,9 +191,10 @@ class Main_tex_input(Tex_input): def do_it(self): (lines, self.deps) = self.get_lines () for line in lines: - if begin_mudela_re.search (line) <> -1: - if begin_mudela_opts_re.search (line) <> -1: - opts = begin_mudela_opts_re.group (1) + if begin_mudela_re.search (line): + m =begin_mudela_opts_re.search (line) + if m: + opts = m.group (1) else: opts = '' optlist = string.split (opts, ',') @@ -214,7 +215,7 @@ class Main_tex_input(Tex_input): continue - elif end_mudela_re.search (line) <> -1: + elif end_mudela_re.search (line): self.mudela.close () self.mudtex.close_mudela () self.mudela = None diff --git a/stepmake/TODO b/stepmake/TODO index a6c1c38b98..e828ae4961 100644 --- a/stepmake/TODO +++ b/stepmake/TODO @@ -1,5 +1,7 @@ * urg, fix flower.py dirname, tarball etc. (package-diff, release) + * use RE iso REG{SUB,EX} for python stuff. + * (re-)enable use outside of make system, e.g. - /usr/bin/make-patch for direct use on tarballs diff --git a/test/hash.cc b/test/hash.cc new file mode 100644 index 0000000000..ee67572b76 --- /dev/null +++ b/test/hash.cc @@ -0,0 +1,39 @@ +#include +#include +#include "dictionary-iter.hh" + + + +main () +{ + Dictionary *dict = new Dictionary; + + char s[1000]; + + dict->elem("foo") = "bar"; + dict->elem("bla") = "ba"; + dict->elem("blo") = "bar"; + + while (gets (s)) + { + String str (s); + + int l = str.length_i (); + + dict->elem (str.left_str (l/2)) = str.right_str (l/2); + } + + int i=1000; + while (i--) + { + Dictionary *dict2=new Dictionary (*dict); + delete dict; + dict = dict2; + } + + for (Dictionary_iter i (*dict); i.ok (); i++) + { + cout << i.key () << " == " << i.val () << endl; + cout << "elem_b: " << dict->elem_b (i.key ()) << ", key " << i.key () << " val " << dict->elem (i.key ()) <