#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)
{
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;
}
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;
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;
}
#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;
}
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.
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 ();
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);
{
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 ())
--- /dev/null
+\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";
+}
+
+% }
+ }
+}
+
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 |
--- /dev/null
+% beams should look the same
+ [d''8 d d] [d g d]
+ c c
--- /dev/null
+ [c8 c16 c16]
--- /dev/null
+% bug
+% excentric slur can't handle this ...
+\score{
+ \melodic{
+ \stemdown
+ \[4/5c8( c f,, c c\]1/1 c c c )c |
+ }
+}
--- /dev/null
+
+% middle tie is wrong
+\score{
+ \melodic\relative c'{
+ { <c4 e g~ > <d f a>
+ }
+}}
+
--- /dev/null
+/*
+ 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;
+}
+
+
#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;
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);
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)
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);