lilypond-1.0.17
authorfred <fred>
Tue, 26 Mar 2002 21:28:08 +0000 (21:28 +0000)
committerfred <fred>
Tue, 26 Mar 2002 21:28:08 +0000 (21:28 +0000)
40 files changed:
BUGS
Documentation/tex/colorado.bib
Documentation/tex/fonts.doc
Documentation/topdocs/AUTHORS.yo
Documentation/topdocs/INSTALL.yo
Documentation/topdocs/index.yo
TODO
buildscripts/lilypond-login.sh [new file with mode: 0644]
buildscripts/lilypond-profile.sh
buildscripts/set-lily.sh
debian/control
flower/hash.cc [new file with mode: 0644]
flower/include/dictionary-iter.hh
flower/include/dictionary.hh
init/engraver.ly
lily/include/key-item.hh
lily/include/local-key-item.hh
lily/include/notename-table.hh
lily/include/slur-engraver.hh
lily/key-engraver.cc
lily/key-item.cc
lily/local-key-item.cc
lily/main.cc
lily/music-iterator.cc
lily/notename-table.cc
lily/paper-def.cc
lily/parser.yy
lily/scope.cc
lily/slur-engraver.cc
lily/symtable.cc
lily/ties-engraver.cc
lily/translator-group.cc
make/mutopia-rules.make
mf/GNUmakefile
scripts/convert-mudela.py
scripts/ly2dvi-old.sh [new file with mode: 0644]
scripts/ly2dvi.py [new file with mode: 0644]
scripts/mudela-book.py
stepmake/TODO
test/hash.cc [new file with mode: 0644]

diff --git a/BUGS b/BUGS
index 36b24a234a9ddebfa81bd49e02d02e33ce658096..054d425246941e3b94db75c303ab66b7b7458f03 100644 (file)
--- 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] 
 
index 9aa8871ac40bc5a95ef2114d999e5ec7bec70e86..6d7cf5120046978627ee79843bcc7b681330d35a 100644 (file)
 % 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,
index c66fa3bfbd48082e8bab55015556713ffc9d1e3f..bc5bce86401f65961b747b39130ba9d48ce8b0af 100644 (file)
@@ -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}
 
index 99a54a24a9220467b98df36833110fcd90c19576..ad2ad26ed5fb9d6bdebe693e0dbf647c0f03dc3a 100644 (file)
@@ -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
index c1cee4ed6b850711d349377f1f51a13165ab1ee5..75bc165155203c59ffb02057ddfa7974c6925017 100644 (file)
@@ -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
index 734dbab853da3948fb5de7893c59eca949f05b38..1307c60e3bc888c29ac3c615e2c30e74cd3baf72 100644 (file)
@@ -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 79b6623e1a3c665c19efa4c5c2adbdfd60f97224..6c18aa1a12005c94c03c95b129be1fc09aa21e76 100644 (file)
--- 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: <must find simple example> 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 (file)
index 0000000..d4a482e
--- /dev/null
@@ -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:=":"}
+
index c20fa45672fde52ad3f27ca3ab0822e5734c510a..176f63629ea2d57172ee5698dbf5b948aa24f0f1 100644 (file)
@@ -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:=":"}
index 087ad631826e91a0bb08d7a76c3c35a27576ae1f..d44317dc8e5fb132cdc4aa5f74fd4f5f0c5624a9 100644 (file)
@@ -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
 
index 08a7805a9ee0a3261cac747c460492a0f117e9c3..14be2746a9be339a443c7459ad5edf8c41abe9e1 100644 (file)
@@ -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 <hanwen@cs.uu.nl>
            Jan Nieuwenhuizen <janneke@gnu.org>
diff --git a/flower/hash.cc b/flower/hash.cc
new file mode 100644 (file)
index 0000000..1e2debd
--- /dev/null
@@ -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;
+}
+
index 9183c5d585934581b5d0fea755c105bb83fffb81..da6e64b391794279538bdbfc5a56003cce3a7f04 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  dictionary-iter.hh -- declare 
+  dictionary-iter.hh -- declare Dictionary_iter
 
   source file of the Flower Library
 
 #ifndef DICTIONARY_ITER_HH
 #define DICTIONARY_ITER_HH
 
-#include "string.hh"
-#include "assoc-iter.hh"
+#include "dictionary.hh"
+
+
+
 #include "dictionary.hh"
 
 template<class V>
-class Dictionary_iter : public Assoc_iter<String, V>
+class Dictionary_iter
 {
+  Dictionary<V> *dict_l_;
+  int i;
 public:
-  Dictionary_iter (Dictionary<V> const &d)
-    : Assoc_iter<String, V> (d)
-  {
-  }
+  Dictionary_iter(Dictionary<V> const &dict)
+    {
+      i =0;
+      dict_l_ =(Dictionary<V> *) & 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
index b25fc84b49ac106368bb0d94eb288b66a4df993c..55f0e4fedd932edba9f1c4f320319860311b362f 100644 (file)
 #define DICTIONARY_HH
 
 #include "string.hh"
-#include "assoc.hh"
+#include "array.hh"
+
+unsigned long prime_list (int idx);
+template<class V>
+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 <search.h>
+   We use quadratic probing.  
+ */
+template<class V>
+class Fixed_size_dictionary
+{
+public:
+  Array<Dict_entry<V> > 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 T>
-class Dictionary : public Assoc<String, T>
+template<class V>
+class Dictionary
 {
+  Fixed_size_dictionary<V> * fixed_p_;
+
+  /// set size to next prime, and copy contents
+  void enlarge ()
+    {
+      Fixed_size_dictionary<V> *f = new Fixed_size_dictionary<V> (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<V> (nm, fixed_p_->dict_arr_[i].value_);
+       }
+      delete fixed_p_;
+      fixed_p_ = f;
+    }
 public:
-  
+  Dictionary ()
+    {
+      fixed_p_ = new Fixed_size_dictionary<V> (0);
+    }
+  ~Dictionary ()
+    {
+      delete fixed_p_;
+    }
+  void operator = (Dictionary<V> const &src)
+    {
+      if (&src == this)
+       return;
+      
+      delete fixed_p_;
+      fixed_p_ = new Fixed_size_dictionary<V> (*src.fixed_p_);
+    }
+  Dictionary (Dictionary<V> const &src)
+    {
+      fixed_p_ = new Fixed_size_dictionary<V> (*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<V>;
 };
 
+
 #endif // DICTIONARY_HH
index 54c737dd6174f06d100b53ef7609107309d0399d..09df59503861176fb100839bfaf1687a9c9ff225 100644 (file)
@@ -176,12 +176,11 @@ ScoreWithNumbers = \translator {
 
 };
 
-\translator {
+StupidScore = \translator {
        \type "Score_engraver";
-       \name StupidScore;
-
-       \consists "Staff_sym_engraver";
-}
+       \name Score;
+       \consists "Note_heads_engraver";
+};
 
 
 
index 9056db33b8761c2e813d93daba8c79145dd0b1e9..f8e3747b58cba51b4ae719f56dd7751e6980a426 100644 (file)
 
 /// An item which places accidentals at the start of the line
 struct Key_item : Item {
-  Array<int> pitch;
-  Array<int> acc;
-  Array<int> old_pitch;
-  Array<int> old_acc;
+  Array<int> pitch_arr_;
+  Array<int> acc_arr_;
+  Array<int> old_pitch_arr_;
+  Array<int> 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<Musical_pitch> const &idx_arr,
+           Array<Musical_pitch> const &old_idx_arr);
+
   void set_c_position (int);
   int Key_item::calculate_position(int p, int a) const;
 
index d08ca2b4905faed98be685b7addff73b924e9d00..7da65e532f7e2467bd2d8ffbde629b87b475e9c4 100644 (file)
 class Local_key_item : public Item {
 public:
     DECLARE_MY_RUNTIME_TYPEINFO;
-    Array<Musical_pitch> accs;
+    Array<Musical_pitch> accidental_pitch_arr_;
     Link_array<Item> support_items_;
     int c0_position_i_;
-    
     Local_key_item ();
     void add_support (Item*);
     void add (Musical_pitch);
index 7338f05bf16007df3846c7660020aba929713789..1d0fcf687e7fc36d99e25be465cf281c4528f907 100644 (file)
@@ -16,7 +16,7 @@
 #include "dictionary.hh"
 #include "musical-pitch.hh"
 
-class Notename_table :   public Dictionary< Musical_pitch >{
+class Notename_table :   public Dictionary<Musical_pitch>{
 public:
   String get_name (Musical_pitch) const;
 };
index 75c21d07f2ad696705e51d2ec99c730eb0dbf14e..8665ee6e8dc8359f879b6aa3b883610adb370ba8 100644 (file)
@@ -15,7 +15,6 @@ class Slur_engraver :public Engraver {
   Array<Slur_req*> new_slur_req_l_arr_;
   Array<Slur *> slur_l_stack_;
   Array<Slur*> 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;
 };
 
index be1cedace102c5db5adfb3fe1463144eff362fa4..83fd6ec6db5be709db24f5d19f11ae33790ec7c6 100644 (file)
@@ -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_);
     }
 }
 
index 58a91cac61d2245c34b2f627fcf34ce757d611f3..80e470f10fd734e9d2416d948a359b8e70223920 100644 (file)
@@ -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<Musical_pitch> const &idx_arr,
+              Array<Musical_pitch> const &old_idx_arr)
 {
-  multi_octave_b_ = key_grav_r.key_.multi_octave_b_;
-  const Array<Musical_pitch> &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<Musical_pitch> &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 ()),
index 564b66ea9a9d131f97bcb48d6d8c6cb0edba0dd0..2b2d0dd5db1660f3790c532679ad7451275355eb 100644 (file)
@@ -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));
index 87af66cfe98a04db6f1ca30bc3cdc02ce891e352..5b541eb29fb8bed2e5015d7dc45ebb622fdf9a69 100644 (file)
@@ -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)
index b19215f51200ada13487995a5f22703123bdbd2d..2b329815d6596e4ee5ddc89f89f165cffc2cce7a 100644 (file)
@@ -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 *)
 {
 }
 
index 9b08369db0b66dc87d0978ac5f485ece35d23b5a..bf32cb7ee2919031c77f9eb147421e4ad86b7c70 100644 (file)
@@ -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<String, Musical_pitch> ai (*this); ai.ok (); ai++)
+  for (Dictionary_iter<Musical_pitch> ai (*this); ai.ok (); ai++)
     {
       if (ai.val () == m)
        return ai.key ();
index d3d4a6795476f3d07af96b7cc857b9c7e1ef7207..8593add91051b63d930fb3428bbcfa50f54b0495 100644 (file)
@@ -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<String,Identifier*> i (*scope_p_); i.ok (); i++)
+  for (Dictionary_iter<Identifier*> 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<String,Identifier*> i (*scope_p_); i.ok (); i++)
+  for (Dictionary_iter<Identifier*> i (*scope_p_); i.ok (); i++)
     s += String ("\\def\\mudelapaper") + i.key () 
       + "{" + i.val ()->str () + "}\n";
   s +=  *scope_p_->elem ("texsetting")->access_String ();
index 428fff3c373f0611941608fd4249e2dd61eb881e..bf82af8ec43a9a488f7f09be4dcb6fa5064444d3 100644 (file)
@@ -1442,7 +1442,7 @@ symtable:
 symtable_body:
                                { $$ = new Symtable; }
        | symtable_body STRING  symboldef {
-               $$->add (*$2, *$3);
+               $$->elem (*$2) = *$3;
                delete $2;
                delete $3;
        }
index 5918dc92fd08f8313e42d4746114d91b3147eb88..7ff133cc285076329bf9b73364fef02fe928c488 100644 (file)
@@ -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<String,Identifier*> ai (*this);  ai.ok(); ai++)
+  for (Dictionary_iter<Identifier*> ai (*this);  ai.ok(); ai++)
     {
       if (ai.val()->init_b_ == init_b)
        {
@@ -28,7 +28,7 @@ Scope::print () const
 
 Scope::~Scope ()
 {
-  for (Assoc_iter<String,Identifier*>   ai (*this); ai.ok(); ai++)
+  for (Dictionary_iter<Identifier*>     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<Identifier*> (s)
 {
-  for (Assoc_iter<String,Identifier*> ai (s); ai.ok(); ai++)
+  for (Dictionary_iter<Identifier*> ai (s); ai.ok(); ai++)
     {
       (*this)[ai.key ()] = ai.val ()->clone ();
     }
index 768d8c42b1ab936de68a0dd5294e6ab6733afc27..8c43bfddfbc9613ec828a2ca89312799ee2d2362 100644 (file)
@@ -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();
index 94aba34bea350b9ee019ed8d770f16583f36030e..cc3cecff23140339de16c96438dcf0fd18466a37 100644 (file)
@@ -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<String, Symtable*>  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<String, Symtable*>  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<String, Symtable*>  i (*this); i.ok(); i++)
+  for (Dictionary_iter<Symtable*>  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<String, Atom>  i (*this); i.ok(); i++)
+  for (Dictionary_iter<Atom>  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<Symtable*>::add (s,p);
+  Dictionary<Symtable*>::elem  (s) = p;
 }
index 54e604d572542904ab742f8a38f288b6ec819f47..9ed1ef3b04d5255ede50fd6da0222ced5c2dd7fb 100644 (file)
@@ -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_;
index 3d5a6ff2d0a4cd5dfcf0d895c2a27fe64cec5ab2..77d0f18b6ebe26e20fe1b90367f96a4a4f587bb0 100644 (file)
@@ -35,13 +35,13 @@ Translator_group::Translator_group()
 void
 Translator_group::check_removal()
 {
-  for (int i =0; i < group_l_arr ().size();)
+  Link_array<Translator_group> 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<Translator*> 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<Translator_group> 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<Translator> 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<Translator> 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);
index 1905f1f4dd1def2bd059e0f8e0b9bb1954779bef..74072fb462448c171732fa518b5593137ef11b88 100644 (file)
@@ -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)
index 363f3229ddb71e58b1448df859fbc75f523760b1..dfc37de8c9a28afbd88fa8395c2e3fdae78a066b 100644 (file)
@@ -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)
index a51f700c675e7f28656fa1afc94fc07a7eda2303..ee6d05a22938dffc670d2335678df600fe3fda2d 100644 (file)
@@ -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 (file)
index 0000000..2020a40
--- /dev/null
@@ -0,0 +1,1005 @@
+#!/bin/sh
+#
+# Script to make a LaTeX file for Lilypond
+#
+# Written by Jan Arne Fagertun <Jan.A.Fagertun@energy.sintef.no>
+#  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 <jvromans@squirrel.nl> 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 (file)
index 0000000..74c5495
--- /dev/null
@@ -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)
+
+\f
+
+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')
+            
+
+\f
+
+class Properties:
+    """
+    This class handles all ly2dvi.py property manipulation
+
+    Public methods:
+    
+    __init__()  Constructor
+    set<property> 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]])
+
+\f
+
+#
+# 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'
+        )
+
+\f
+
+#
+# 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()
index 359d68b326958e1b1e544ceac7bd6e5f931b6f7f..596119c3dd975ea18cf24f91568fb30dd558ca68 100644 (file)
@@ -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
index a6c1c38b9842c6db88765193f4f65c90ca29542a..e828ae4961999dc0f9641cc008cd7520a0a6b490 100644 (file)
@@ -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 (file)
index 0000000..ee67572
--- /dev/null
@@ -0,0 +1,39 @@
+#include <stdio.h>
+#include <iostream.h>
+#include "dictionary-iter.hh"
+
+
+
+main ()
+{
+  Dictionary<String> *dict = new Dictionary<String>;
+  
+  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<String> *dict2=new Dictionary<String> (*dict);
+      delete dict;
+      dict = dict2;
+    }
+
+  for (Dictionary_iter<String> 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 ()) <<endl;
+    }
+}