]> git.donarmstrong.com Git - lilypond.git/blob - lily/binary-source-file.cc
2c726df90de1f2a677826866578ab877d50ca336
[lilypond.git] / lily / binary-source-file.cc
1 /*
2   binary-source-file.cc -- implement Binary_source_file
3
4   source file of the LilyPond music typesetter
5
6   (c) 1997--2005 Jan Nieuwenhuizen
7 */
8
9 #include <climits>              // INT_MAX
10
11 #include "binary-source-file.hh"
12 #include "string-convert.hh"
13
14 Binary_source_file::Binary_source_file (String &file_name_string)
15   : Source_file (file_name_string)
16 {
17 }
18
19 Binary_source_file::~Binary_source_file ()
20 {
21 }
22
23 String
24 Binary_source_file::quote_input (char const *pos_str0) const
25 {
26   assert (this);
27   if (!contains (pos_str0))
28     return "";
29
30   char const *begin_str0 = max (pos_str0 - 8, to_str0 ());
31   char const *end_str0 = min (pos_str0 + 7, to_str0 () + length ());
32
33   String pre_string ((Byte const *)begin_str0, pos_str0 - begin_str0);
34   pre_string = String_convert::bin2hex (pre_string);
35   for (int i = 2; i < pre_string.length (); i += 3)
36     pre_string = pre_string.left_string (i)
37       + " " + pre_string.cut_string (i, INT_MAX);
38   String post_string ((Byte const *)pos_str0, end_str0 - pos_str0);
39   post_string = String_convert::bin2hex (post_string);
40   for (int i = 2; i < post_string.length (); i += 3)
41     post_string = post_string.left_string (i)
42       + " " + post_string.cut_string (i, INT_MAX);
43
44   String str = pre_string
45     + to_string ('\n')
46     + to_string (' ', pre_string.length () + 1)
47     + post_string;
48   return str;
49 }
50
51 int
52 Binary_source_file::get_line (char const *pos_str0) const
53 {
54   if (!contains (pos_str0))
55     return 0;
56
57   return pos_str0 - to_str0 ();
58 }
59
60 U8
61 Binary_source_file::get_U8 ()
62 {
63   return *(U8 *)forward_str0 (1);
64 }
65
66 U16
67 Binary_source_file::get_U16 ()
68 {
69   U16 b;
70
71   b = get_U8 () << 8;
72   b |= get_U8 ();
73
74   return b;
75 }
76
77 /*
78   naming is wrong. This is a UNIX-endian-32 (as opposed to xinu or ixun)
79 */
80
81 U32
82 Binary_source_file::get_U32 ()
83 {
84   U32 b;
85
86   b = get_U8 () << 24;
87   b |= get_U8 () << 16;
88   b |= get_U8 () << 8;
89   b |= get_U8 ();
90
91   return b;
92 }
93