ARTS  2.3.1285(git:92a29ea9-dirty)
sourcetext.cc
Go to the documentation of this file.
1 /* Copyright (C) 2012 Oliver Lemke <olemke@core-dump.info>
2 
3  This program is free software; you can redistribute it and/or modify it
4  under the terms of the GNU General Public License as published by the
5  Free Software Foundation; either version 2, or (at your option) any
6  later version.
7 
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program; if not, write to the Free Software
15  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16  USA. */
17 
18 #include "sourcetext.h"
19 #include <iostream>
20 #include "file.h"
21 
22 void SourceText::AppendFile(const String& name) {
23  mSfLine.push_back(mText.nelem());
24  mSfName.push_back(name);
25 
27 }
28 
30  if (mColumn < mText[mLine].nelem() - 1) {
31  ++mColumn;
32  } else {
33  mLineBreak = true;
34  do {
35  if (mLine >= mText.nelem()) {
36  throw Eot("", this->File(), this->Line(), this->Column());
37  } else if (mLine == mText.nelem() - 1) {
38  mColumn++;
39  break;
40  } else {
41  ++mLine;
42  mColumn = 0;
43  }
44  } while (1 > mText[mLine].nelem()); // Skip empty lines.
45  }
46 }
47 
49  mLineBreak = true;
50  mColumn = 0;
51  do {
52  if (mLine >= mText.nelem() - 1) {
53  throw Eot("", this->File(), this->Line(), this->Column());
54  } else {
55  ++mLine;
56  }
57  } while (1 > mText[mLine].nelem()); // Skip empty lines.
58 }
59 
61  Index i = 0;
62  bool stop = false;
63 
64  while (i < mSfLine.nelem() - 1 && !stop) {
65  if (mLine >= mSfLine[i + 1])
66  ++i;
67  else
68  stop = true;
69  }
70 
71  return mSfName[i];
72 }
73 
75  mLine = 0;
76  mColumn = 0;
77 
78  if (1 > mText.nelem()) {
79  throw Eot("Empty text!", this->File(), this->Line(), this->Column());
80  } else {
81  // Skip empty lines:
82  while (1 > mText[mLine].nelem()) {
83  if (mLine >= mText.nelem() - 1) {
84  throw Eot("", this->File(), this->Line(), this->Column());
85  } else {
86  mLineBreak = true;
87  ++mLine;
88  }
89  }
90  }
91 }
92 
94  Index i = 0;
95  bool stop = false;
96 
97  while (i < mSfLine.nelem() - 1 && !stop) {
98  if (line >= mSfLine[i + 1])
99  ++i;
100  else
101  stop = true;
102  }
103 
104  return line - mSfLine[i] + 1;
105 }
106 
107 std::ostream& operator<<(std::ostream& os, const SourceText& text) {
108  for (Index i = 0; i < text.mText.nelem(); ++i)
109  os << i << "(" << text.mText[i].nelem() << ")"
110  << ": " << text.mText[i] << '\n';
111  return (os);
112 }
const String & File()
Return the filename associated with the current position.
Definition: sourcetext.cc:60
INDEX Index
The type to use for all integer numbers and indices.
Definition: matpack.h:39
Index nelem() const
Number of elements.
Definition: array.h:195
This file contains basic functions to handle ASCII files.
void AdvanceChar()
Advance position pointer by one character.
Definition: sourcetext.cc:29
void read_text_from_file(ArrayOfString &text, const String &name)
Reads an ASCII file and appends the contents to the String vector text.
Definition: file.cc:225
void AppendFile(const String &name)
Appends contents of file to the source text.
Definition: sourcetext.cc:22
Index GetSourceLine(const Index line)
Return the line number, but for the file that is associated with the given position.
Definition: sourcetext.cc:93
Index mColumn
Column position in the text.
Definition: sourcetext.h:133
Definition: exceptions.h:67
ArrayOfString mSfName
Names associated with.
Definition: sourcetext.h:145
A smart class to hold the text for parsing.
Definition: sourcetext.h:36
void Init()
This sets the pointer to the first existing character in the text.
Definition: sourcetext.cc:74
friend std::ostream & operator<<(std::ostream &os, const SourceText &text)
Output operator for SourceText.
Definition: sourcetext.cc:107
ArrayOfString mText
The text.
Definition: sourcetext.h:127
Index mLine
Line position in the text.
Definition: sourcetext.h:130
bool mLineBreak
Is set to true if the last operation caused a line break.
Definition: sourcetext.h:149
Index nelem(const Lines &l)
Number of lines.
ArrayOfIndex mSfLine
Remember where which source file starts.
Definition: sourcetext.h:142
void AdvanceLine()
Advances position pointer by one line.
Definition: sourcetext.cc:48
Index Column()
Return the current column.
Definition: sourcetext.h:89
Index Line()
Return the line number, but for the file that is associated with the current position.
Definition: sourcetext.h:76