2 source-file.cc -- implement
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()
32 if (!name_str_.length_i())
37 if (length_i()) // can-t this be done without such a hack?
38 istream_p_ = new istrstream(ch_C(), length_i());
41 istream_p_ = new istrstream("", 0);
42 istream_p_->set(ios::eofbit);
49 Source_file::file_line_no_str(char const *context_ch_C) const
54 return name_str() + ": "
55 + String(line_i(context_ch_C));
59 Source_file::name_str() const
64 Source_file::~Source_file()
72 Source_file::error_str(char const* pos_ch_C) const
74 char const* data_ch_C = ch_C();
75 char const * eof_C_ = data_ch_C + length_i();
77 return "(position unknown)";
80 if (pos_ch_C == eof_C_)
82 char const* begin_ch_C = pos_ch_C;
83 while (begin_ch_C > data_ch_C)
84 if (*--begin_ch_C == '\n')
90 char const* end_ch_C = pos_ch_C;
91 while (end_ch_C < eof_C_)
92 if (*end_ch_C++ == '\n')
98 // String(char const* p, int length) is missing!?
99 String line_str((Byte const*)begin_ch_C, end_ch_C - begin_ch_C);
102 char const* scan_ch_C = begin_ch_C;
103 while (scan_ch_C < pos_ch_C)
104 if (*scan_ch_C++ == '\t')
105 error_col_i = (error_col_i / 8 + 1) * 8;
109 String str = line_str.left_str(pos_ch_C - begin_ch_C)
111 + String(' ', error_col_i)
112 + line_str.mid_str(pos_ch_C - begin_ch_C, INT_MAX); // String::mid should take 0 arg..
117 Source_file::in_b(char const* pos_ch_C) const
119 return (pos_ch_C && (pos_ch_C >= ch_C()) && (pos_ch_C <= ch_C() + length_i()));
124 Source_file::line_i(char const* pos_ch_C) const
130 char const* scan_ch_C = ch_C();
134 while (scan_ch_C < pos_ch_C)
135 if (*scan_ch_C++ == '\n')
141 Source_file::length_i() const
143 return storage_p_->length_i();
147 Source_file::ch_C() const
149 return storage_p_->ch_C();