From: fred Date: Sun, 24 Mar 2002 20:12:20 +0000 (+0000) Subject: lilypond-1.0.1 X-Git-Tag: release/1.5.59~3066 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=fde8b410b366a9a00c429a08b55fc056394d4b63;p=lilypond.git lilypond-1.0.1 --- diff --git a/flower/string-convert.cc b/flower/string-convert.cc index dd89038d09..bb293f062d 100644 --- a/flower/string-convert.cc +++ b/flower/string-convert.cc @@ -11,10 +11,10 @@ #include "string.hh" #include "string-convert.hh" #include "rational.hh" -#include "varray.hh" +#include "array.hh" /** - a safe length for stringconversion buffers + A safe length for stringconversion buffers. worst case would be %f printing HUGE (or 1/HUGE), which is approx 2e318, this number would have approx 318 zero's in its string. @@ -24,8 +24,16 @@ @see man 3 snprintf */ + +// hmm, this is shorter even than PATH_MAX static const int STRING_BUFFER_LEN=1024; +String +String_convert::bool_str (bool b) +{ + return String (b ? "true" : "false"); +} + String String_convert::bin2hex_str (String bin_str) { @@ -33,8 +41,8 @@ String_convert::bin2hex_str (String bin_str) Byte const* byte_C = bin_str.byte_C(); for (int i = 0; i < bin_str.length_i(); i++) { - str += (char)nibble2hex_byte (*byte_C >> 4); - str += (char)nibble2hex_byte (*byte_C++); + str += to_str ((char)nibble2hex_byte (*byte_C >> 4)); + str += to_str ((char)nibble2hex_byte (*byte_C++)); } return str; } @@ -109,7 +117,7 @@ String_convert::hex2bin_i (String hex_str, String& bin_str_r) int low_i = hex2nibble_i (*byte_C++); if (high_i < 0 || low_i < 0) return 1; // illegal char - bin_str_r += String ((char)(high_i << 4 | low_i), 1 ); + bin_str_r += to_str ((char)(high_i << 4 | low_i), 1 ); i += 2; } return 0; @@ -147,10 +155,10 @@ String_convert::i2dec_str (int i, int length_i, char ch) fill_ch = '0'; // ugh - String dec_str (i); + String dec_str = to_str (i); // ugh - return String (fill_ch, length_i - dec_str.length_i()) + dec_str; + return to_str (fill_ch, length_i - dec_str.length_i()) + dec_str; } @@ -165,16 +173,16 @@ String_convert::u2hex_str (unsigned u, int length_i, char fill_ch) #if 1 // both go... while (u) { - str = String ((char)((u % 16)["0123456789abcdef"] ) ) + str; + str = to_str ((char)((u % 16)["0123456789abcdef"] ) ) + str; u /= 16; } #else str += int_str (u, "%x"); // hmm. %lx vs. %x -> portability? #endif - str = String (fill_ch, length_i - str.length_i()) + str; + str = to_str (fill_ch, length_i - str.length_i()) + str; while ((str.length_i() > length_i) && (str[ 0 ] == 'f' ) ) - str = str.cut (2, INT_MAX); + str = str.cut_str (2, INT_MAX); return str; } @@ -208,6 +216,25 @@ String_convert::int_str (int i, char const* fmt) return String (buffer); } +String +String_convert::form_str (char const* format, ...) +{ + va_list args; + va_start (args, format); + char buffer[STRING_BUFFER_LEN]; + vsnprintf (buffer, STRING_BUFFER_LEN, format, args); + va_end (args); + return String (buffer); +} + +String +String_convert::vform_str (char const* format, va_list args) +{ + char buffer[STRING_BUFFER_LEN]; + vsnprintf (buffer, STRING_BUFFER_LEN, format, args); + return String (buffer); +} + /** Convert a double to a string. @@ -262,7 +289,7 @@ String_convert::pointer_str (void const *l) String String_convert::precision_str (double x, int n) { - String format = "%." + String (0 >? n - 1) + "e"; + String format = "%." + to_str (0 >? n - 1) + "e"; String str = double_str (abs (x), format.ch_C ()); int exp = str.right_str (3).value_i (); @@ -276,14 +303,14 @@ String_convert::precision_str (double x, int n) if (exp == 0) return (sign (x) > 0 ? str : "-" + str); - str = str.left_str (1) + str.cut (2, INT_MAX); + str = str.left_str (1) + str.cut_str (2, INT_MAX); int dot = 1 + exp; if (dot <= 0) - str = "0." + String ('0', -dot) + str; + str = "0." + to_str ('0', -dot) + str; else if (dot >= str.length_i ()) - str += String ('0', dot - str.length_i ()); + str += to_str ('0', dot - str.length_i ()); else if (( dot > 0) && (dot < str.length_i ())) - str = str.left_str (dot) + '.' + str.cut (dot, INT_MAX); + str = str.left_str (dot) + "." + str.cut_str (dot, INT_MAX); else assert (0); @@ -299,7 +326,9 @@ String_convert::split_arr (String str, char c) { String s = str.left_str (i); a.push (s); - str = str.cut (i + 1, INT_MAX); + while (str[++i] == c) + ; + str = str.cut_str (i, INT_MAX); i = str.index_i (c); } if (str.length_i ()) diff --git a/input/bugs/hari-number.ly b/input/bugs/hari-number.ly new file mode 100644 index 0000000000..79bdd6050d --- /dev/null +++ b/input/bugs/hari-number.ly @@ -0,0 +1,32 @@ +\score{ + \melodic { R1 } + \paper{ + linewidth = 40.0\mm; + +Staff = \translator { + \type "Hara_kiri_line_group_engraver"; + defaultclef = violin; + + \consists "Bar_engraver"; + \consists "Clef_engraver"; + \consists "Key_engraver"; + \consists "Meter_engraver"; + \consists "Local_key_engraver"; + \consists "Staff_sym_engraver"; + \consists "Collision_engraver"; + \consists "Rest_collision_engraver"; +% { + \consists "Bar_column_engraver"; + \consists "Bar_number_engraver"; +% } + \consists "Staff_margin_engraver"; + \consists "Separating_line_group_engraver"; +% \consists "Line_group_engraver"; + + \accepts "Voice"; +} + +% } + } +} + diff --git a/input/bugs/slur-broken.ly b/input/bugs/slur-broken.ly index dfdf22adc2..cb8391a086 100644 --- a/input/bugs/slur-broken.ly +++ b/input/bugs/slur-broken.ly @@ -2,7 +2,7 @@ shortlong = \melodic{ c4()c( c c | c c c c | c c c c | - \break; + \break c c c )c | c c c c | c c c c | diff --git a/input/test/beam-length.fly b/input/test/beam-length.fly new file mode 100644 index 0000000000..5c7d7a7ffa --- /dev/null +++ b/input/test/beam-length.fly @@ -0,0 +1,3 @@ +% beams should look the same + [d''8 d d] [d g d] + c c diff --git a/input/test/multi-slope.fly b/input/test/multi-slope.fly new file mode 100644 index 0000000000..3e63dd367f --- /dev/null +++ b/input/test/multi-slope.fly @@ -0,0 +1 @@ + [c8 c16 c16] diff --git a/input/test/slur-bug.ly b/input/test/slur-bug.ly new file mode 100644 index 0000000000..583415ceef --- /dev/null +++ b/input/test/slur-bug.ly @@ -0,0 +1,8 @@ +% bug +% excentric slur can't handle this ... +\score{ + \melodic{ + \stemdown + \[4/5c8( c f,, c c\]1/1 c c c )c | + } +} diff --git a/input/test/tie-bug.ly b/input/test/tie-bug.ly new file mode 100644 index 0000000000..0cdf237204 --- /dev/null +++ b/input/test/tie-bug.ly @@ -0,0 +1,8 @@ + +% middle tie is wrong +\score{ + \melodic\relative c'{ + { + } +}} + diff --git a/lily/afm-reader.cc b/lily/afm-reader.cc new file mode 100644 index 0000000000..ba3adae70f --- /dev/null +++ b/lily/afm-reader.cc @@ -0,0 +1,154 @@ +/* + afm-reader.cc -- implement Adobe_font_metric_file + + source file of the GNU LilyPond music typesetter + + (c) 1998 Han-Wen Nienhuys + + */ + +#include "direction.hh" +#include "afm.hh" +#include "data-file.hh" +#include "string-convert.hh" + + +Box +parse_box (Array a) +{ + Box b; + int i=0; + b[X_AXIS][SMALLER] = a[i++].value_f (); + b[Y_AXIS][SMALLER] = a[i++].value_f (); + b[X_AXIS][BIGGER] = a[i++].value_f (); + b[Y_AXIS][BIGGER] = a[i++].value_f (); + return b; +} + +String +strip_leading_white (String c) +{ + int i=0; + while (c[i] == ' ') + i++; + c = c.cut_str (i, INT_MAX); + return c; +} + +Adobe_font_char_metric +read_char_metric (String s) +{ + Adobe_font_char_metric char_metric; + Array a= String_convert::split_arr (s, ';'); + for (int i=0; i < a.size (); i++) + { + String c = strip_leading_white (a[i]); + + Array b = String_convert::split_arr (c, ' '); + if (b[0] == "C") + char_metric.C_ = b[1].value_i (); + if (b[0] == "WX") + char_metric.WX_ = b[1].value_f (); + if (b[0] == "N") + char_metric.N_ = strip_leading_white (b[1]); + if (b[0] == "B") + char_metric.B_ = parse_box (b.slice (1, b.size())); + } + return char_metric; +} + +void +read_char_metrics (Array &mets, Data_file &input) +{ + while (!input.eof_b ()) + { + input.gobble_leading_white (); + String s= input.get_line (); + if (s == "EndCharMetrics") + return ; + mets.push (read_char_metric (s)); + } +} + +#define READSTRING(k) if (key == #k) { \ + afm.k ## _ = input.get_line (); continue; } +#define READBOX(b) if (key == #b) { \ + afm.b ## _ = read_box (input); continue; } +#define READREAL(r) if (key == #r) { \ + afm.r ## _ = read_real (input); continue; } + +Real +read_real(Data_file &d) +{ + String s = d.get_word (); + d.gobble_white (); + return s.value_f (); +} + + +Box +read_box ( Data_file &d) +{ + Box b; + b[X_AXIS][SMALLER] = read_real (d); + b[Y_AXIS][SMALLER] = read_real (d); + b[X_AXIS][BIGGER] = read_real (d); + b[Y_AXIS][BIGGER] = read_real (d); + return b; +} + +Adobe_font_metric +read_afm (String fn) +{ + Data_file input (fn); + + assert (!input.eof_b ()); + + Adobe_font_metric afm; + + while (!input.eof_b ()) + { + input.gobble_leading_white (); + String w = input.get_word (); + if (w == "StartFontMetrics") + break; + input.get_line (); + } + + while (!input.eof_b ()) + { + input.gobble_leading_white (); + String key = input.get_word (); + if (key == "Comment") + continue; + + READSTRING(FontName); + READSTRING(FullName); + READSTRING(FamilyName); + READSTRING(Weight); + READSTRING(Version); + READSTRING(Notice); + READSTRING(EncodingScheme); + READREAL(ItalicAngle); + READREAL(UnderlineThickness); + READREAL(UnderlinePosition); + READBOX(FontBBox); + if (key == "StartCharMetrics") + { + input.get_line (); + read_char_metrics (afm.char_metrics_, input); + } + if (key == "EndFontMetrics") + break; + + } + + /* + read to EOF + */ + input.gulp (); + + return afm; +} + + diff --git a/lily/include/misc.hh b/lily/include/misc.hh index 35a10dfaf9..e659602e99 100644 --- a/lily/include/misc.hh +++ b/lily/include/misc.hh @@ -1,18 +1,23 @@ #ifndef MISC_HH #define MISC_HH +#include + #include "real.hh" -#include "varray.hh" +#include "array.hh" #include "interval.hh" double log_2(double x) ; int intlog2(int d); -#if ! defined(_ABS_) + +#if 0 + // defined in real.hh inline int abs (int i){ return (i < 0)?-i:i; } #endif + inline int sign (int i) { if (i<0) return -1; @@ -25,6 +30,7 @@ sign (int i) { Interval itemlist_width (const Array &its); #endif +void set_frobnify (void*, size_t); int get_lower_bound (Array const& positions, Real x); Slice get_bounds_slice (Array const& positions, Real x); Interval get_bounds_iv (Array const& positions, Real x); diff --git a/lily/keyword.cc b/lily/keyword.cc index 43c87d95b5..b273df2d6e 100644 --- a/lily/keyword.cc +++ b/lily/keyword.cc @@ -13,7 +13,7 @@ int tabcmp (void const * p1, void const * p2) { return strcmp (((Keyword_ent const *) p1)->name, - ((Keyword_ent const *) p2)->name); + ((Keyword_ent const *) p2)->name); } Keyword_table::Keyword_table (Keyword_ent *tab) @@ -21,7 +21,8 @@ Keyword_table::Keyword_table (Keyword_ent *tab) table = tab; /* count keywords */ - for (maxkey = 0; table[maxkey].name; maxkey++); + for (maxkey = 0; table[maxkey].name; maxkey++) + ; /* sort them */ qsort (table, maxkey, sizeof (Keyword_ent), tabcmp);