]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.0.1
authorfred <fred>
Sun, 24 Mar 2002 20:12:20 +0000 (20:12 +0000)
committerfred <fred>
Sun, 24 Mar 2002 20:12:20 +0000 (20:12 +0000)
flower/string-convert.cc
input/bugs/hari-number.ly [new file with mode: 0644]
input/bugs/slur-broken.ly
input/test/beam-length.fly [new file with mode: 0644]
input/test/multi-slope.fly [new file with mode: 0644]
input/test/slur-bug.ly [new file with mode: 0644]
input/test/tie-bug.ly [new file with mode: 0644]
lily/afm-reader.cc [new file with mode: 0644]
lily/include/misc.hh
lily/keyword.cc

index dd89038d09d0e2caa309cdd08ad567e555b858e7..bb293f062dc4e5e67f27d6bf56c3860bc8741b87 100644 (file)
 #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.
    @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 (file)
index 0000000..79bdd60
--- /dev/null
@@ -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";
+}
+
+% }
+       }
+}
+
index dfdf22adc2a01117b1cbc4283cbe21e702dc9ee1..cb8391a086a4ecba7a52cb96c1263b200a9dbb3f 100644 (file)
@@ -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 (file)
index 0000000..5c7d7a7
--- /dev/null
@@ -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 (file)
index 0000000..3e63dd3
--- /dev/null
@@ -0,0 +1 @@
+               [c8 c16 c16]
diff --git a/input/test/slur-bug.ly b/input/test/slur-bug.ly
new file mode 100644 (file)
index 0000000..583415c
--- /dev/null
@@ -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 (file)
index 0000000..0cdf237
--- /dev/null
@@ -0,0 +1,8 @@
+
+%  middle tie is wrong
+\score{
+       \melodic\relative c'{
+       {               <c4 e g~ > <d f a>
+       }
+}}
+
diff --git a/lily/afm-reader.cc b/lily/afm-reader.cc
new file mode 100644 (file)
index 0000000..ba3adae
--- /dev/null
@@ -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 <hanwen@cs.uu.nl>
+  
+ */
+
+#include "direction.hh"
+#include "afm.hh"
+#include "data-file.hh"
+#include "string-convert.hh"
+
+
+Box
+parse_box (Array<String> 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<String> a= String_convert::split_arr (s, ';');
+  for (int i=0; i < a.size (); i++)
+    {
+      String c = strip_leading_white (a[i]);
+
+      Array<String> 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<Adobe_font_char_metric> &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;
+}
+
+
index 35a10dfaf94e264457525fe83d2d6c58f69b378c..e659602e991497492d17a7611972426150918e2d 100644 (file)
@@ -1,18 +1,23 @@
 #ifndef MISC_HH
 #define MISC_HH
 
+#include <stdlib.h>
+
 #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<Item*> &its);
 #endif
 
+void set_frobnify (void*, size_t);
 int get_lower_bound (Array<Real> const& positions, Real x);
 Slice get_bounds_slice (Array<Real> const& positions, Real x);
 Interval get_bounds_iv (Array<Real> const& positions, Real x);
index 43c87d95b5573877bfa4d7bcb6793d9a79274302..b273df2d6e2dbcb1d25bd645cdbbdeb94bcbe154 100644 (file)
@@ -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);