X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Flily-library.scm;h=e7f1d295d81ea98708163f173acf76e0f6067979;hb=2fab58f39ab5d5188c69af3500ffd4072031ea92;hp=6f6dc67a72813ddae272567359fafcbe655b59b2;hpb=47ca10364f3b6f64e2ecc5001be09753d509edfa;p=lilypond.git diff --git a/scm/lily-library.scm b/scm/lily-library.scm index 6f6dc67a72..e7f1d295d8 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -2,7 +2,7 @@ ;;;; lily-library.scm -- utilities ;;;; ;;;; source file of the GNU LilyPond music typesetter -;;;; +;;;; ;;;; (c) 1998--2009 Jan Nieuwenhuizen ;;;; Han-Wen Nienhuys @@ -47,11 +47,15 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; moments -(define-public ZERO-MOMENT (ly:make-moment 0 1)) +(define-public ZERO-MOMENT (ly:make-moment 0 1)) (define-public (moment-min a b) (if (ly:moment output hooks. - + (define-public (collect-bookpart-for-book parser book-part) "Toplevel book-part handler" (define (add-bookpart book-part) @@ -123,7 +127,7 @@ (define-public (scorify-music music parser) "Preprocess MUSIC." - + (for-each (lambda (func) (set! music (func music parser))) toplevel-music-functions) @@ -239,7 +243,7 @@ found." (hash-fold (lambda (k v acc) (acons k v acc)) '() t)) -;; todo: code dup with C++. +;; todo: code dup with C++. (define-safe-public (alist->hash-table lst) "Convert alist to table" (let ((m (make-hash-table (length lst)))) @@ -263,14 +267,14 @@ found." (define (split-list lst n) "Split LST in N equal sized parts" - + (define (helper todo acc-vector k) (if (null? todo) acc-vector (begin (if (< k 0) (set! k (+ n k))) - + (vector-set! acc-vector k (cons (car todo) (vector-ref acc-vector k))) (helper (cdr todo) acc-vector (1- k))))) @@ -296,7 +300,7 @@ found." (reverse (helper lst '() 1))) - + (define-public (list-join lst intermediate) "put INTERMEDIATE between all elts of LST." @@ -314,7 +318,7 @@ found." (define (flatten-list lst) - "Unnest LST" + "Unnest LST" (if (null? lst) '() (if (pair? (car lst)) @@ -328,7 +332,7 @@ found." (define-public (uniq-list lst) "Uniq LST, assuming that it is sorted. Uses equal? for comparisons." - (reverse! + (reverse! (fold (lambda (x acc) (if (null? acc) (list x) @@ -343,7 +347,7 @@ found." Example: (split-at-predicate < '(1 2 3 2 1)) ==> ((1 2 3) . (2 1))" (if (null? lst) (list lst) - (let ((i (list-index predicate (cdr lst) lst))) + (let ((i (list-index pred (cdr lst) lst))) (if i (cons (take lst (1+ i)) (drop lst (1+ i))) (list lst))))) @@ -363,7 +367,7 @@ found." (define-public (offset-add a b) (cons (+ (car a) (car b)) - (+ (cdr a) (cdr b)))) + (+ (cdr a) (cdr b)))) (define-public (offset-flip-y o) (cons (car o) (- (cdr o)))) @@ -392,6 +396,8 @@ found." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; intervals +(define-public empty-interval '(+inf.0 . -inf.0)) + (define-public (interval-length x) "Length of the number-pair X, when an interval" (max 0 (- (cdr x) (car x)))) @@ -408,7 +414,7 @@ found." (define-public (interval-index interval dir) "Interpolate INTERVAL between between left (DIR=-1) and right (DIR=+1)" - + (* (+ (interval-start interval) (interval-end interval) (* dir (- (interval-end interval) (interval-start interval)))) 0.5)) @@ -447,6 +453,10 @@ found." (inf? (cdr i)) (> (car i) (cdr i))))) +(define-public (add-point interval p) + (cons (min (interval-start interval) p) + (max (interval-end interval) p))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; string @@ -455,10 +465,10 @@ found." (equal? suffix (substring s (max 0 (- (string-length s) (string-length suffix))) (string-length s)))) - + (define-public (string-startswith s prefix) (equal? prefix (substring s 0 (min (string-length s) (string-length prefix))))) - + (define-public (string-encode-integer i) (cond ((= i 0) "o") @@ -522,7 +532,7 @@ possibly turned off." (fold-right conc #f lst)) (define-public (string-regexp-substitute a b str) - (regexp-substitute/global #f a str 'pre b 'post)) + (regexp-substitute/global #f a str 'pre b 'post)) (define (regexp-split str regex) (define matches '()) @@ -545,12 +555,27 @@ possibly turned off." (reverse matches)) ;;;;;;;;;;;;;;;; -; other +;; other + (define (sign x) (if (= x 0) 0 (if (< x 0) -1 1))) +(define-public (binary-search start end getter target-val) + (_i "Find the index between @var{start} and @var{end} (an integer) +which will produce the closest match to @var{target-val} when +applied to function @var{getter}.") + (if (<= end start) + start + (let* ((compare (quotient (+ start end) 2)) + (get-val (getter compare))) + (cond + ((< target-val get-val) + (set! end (1- compare))) + ((< get-val target-val) + (set! start (1+ compare)))) + (binary-search start end getter target-val)))) (define-public (car< a b) (< (car a) (car b))) @@ -562,8 +587,8 @@ possibly turned off." (stringstring (car lst)) (symbol->string (car r)))) ;; -;; don't confuse users with # syntax. -;; +;; don't confuse users with # syntax. +;; (define-public (scm->string val) (if (and (procedure? val) (symbol? (procedure-name val))) @@ -593,17 +618,19 @@ possibly turned off." ;;; FONT may be font smob, or pango font string... (define-public (font-name-style font) - ;; FIXME: ughr, (ly:font-name) sometimes also has Style appended. + ;; FIXME: ughr, barf: feta-alphabet is actually emmentaler + (if (and (string? font) + (string-prefix? "feta-alphabet" font)) + (string-append "emmentaler" + "-" + (substring font + (string-length "feta-alphabet") + (string-length font))) (let* ((font-name (ly:font-name font)) - (full-name (if font-name font-name (ly:font-file-name font))) - (name-style (string-split full-name #\-))) - ;; FIXME: ughr, barf: feta-alphabet is actually emmentaler - (if (string-prefix? "feta-alphabet" full-name) - (list "emmentaler" - (substring full-name (string-length "feta-alphabet"))) - (if (not (null? (cdr name-style))) - name-style - (append name-style '("Regular")))))) + (full-name (if font-name font-name (ly:font-file-name font)))) + (if (string-prefix? "Aybabtu" full-name) + "aybabtu" + (string-downcase full-name))))) (define-public (modified-font-metric-font-scaling font) (let* ((designsize (ly:font-design-size font)) @@ -616,7 +643,7 @@ possibly turned off." (define-public (version-not-seen-message input-file-name) (ly:message - "~a:0: ~a ~a" + "~a:0: ~a ~a" input-file-name (_ "warning:") (format #f @@ -625,7 +652,7 @@ possibly turned off." (define-public (old-relative-not-used-message input-file-name) (ly:message - "~a:0: ~a ~a" + "~a:0: ~a ~a" input-file-name (_ "warning:") (_ "old relative compatibility not used")))