2 source-file.cc -- implement Source_file
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
7 & Han-Wen Nienhuys <hanwen@stack.nl>
12 #include <strstream.h>
18 #include "windhoos-suck-suck-suck-thank-you-cygnus.hh"
19 #include "source-file.hh"
20 #include "file-storage.hh"
22 Source_file::Source_file(String filename_str
)
24 name_str_
= filename_str
;
26 storage_p_
= new Simple_file_storage(filename_str
);
30 Source_file::istream_l()
33 if (!name_str_.length_i())
39 if (length_i()) // can-t this be done without such a hack?
40 istream_p_
= new istrstream(ch_C(), length_i());
43 istream_p_
= new istrstream("", 0);
44 istream_p_
->set(ios::eofbit
);
51 Source_file::file_line_no_str(char const *context_ch_C
) const
54 return _("(unknown)");
56 return name_str() + ": "
57 + String(line_i(context_ch_C
));
61 Source_file::name_str() const
66 Source_file::~Source_file()
74 Source_file::error_str(char const* pos_ch_C
) const
76 char const* data_ch_C
= ch_C();
77 char const * eof_C_
= data_ch_C
+ length_i();
79 return _("(position unknown)");
82 if (pos_ch_C
== eof_C_
)
84 char const* begin_ch_C
= pos_ch_C
;
85 while (begin_ch_C
> data_ch_C
)
86 if (*--begin_ch_C
== '\n')
92 char const* end_ch_C
= pos_ch_C
;
93 while (end_ch_C
< eof_C_
)
94 if (*end_ch_C
++ == '\n')
100 // String(char const* p, int length) is missing!?
101 String
line_str((Byte
const*)begin_ch_C
, end_ch_C
- begin_ch_C
);
104 char const* scan_ch_C
= begin_ch_C
;
105 while (scan_ch_C
< pos_ch_C
)
106 if (*scan_ch_C
++ == '\t')
107 error_col_i
= (error_col_i
/ 8 + 1) * 8;
111 String str
= line_str
.left_str(pos_ch_C
- begin_ch_C
)
113 + String(' ', error_col_i
)
114 + line_str
.mid_str(pos_ch_C
- begin_ch_C
, INT_MAX
); // String::mid should take 0 arg..
119 Source_file::in_b(char const* pos_ch_C
) const
121 return (pos_ch_C
&& (pos_ch_C
>= ch_C()) && (pos_ch_C
<= ch_C() + length_i()));
126 Source_file::line_i(char const* pos_ch_C
) const
132 char const* scan_ch_C
= ch_C();
136 while (scan_ch_C
< pos_ch_C
)
137 if (*scan_ch_C
++ == '\n')
143 Source_file::length_i() const
145 return storage_p_
->length_i();
149 Source_file::ch_C() const
151 return storage_p_
->ch_C();