00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00040 #ifndef BISON_POSITION_HH
00041 # define BISON_POSITION_HH
00042
00043 # include <iostream>
00044 # include <string>
00045
00046 namespace vrml1
00047 {
00049 class position
00050 {
00051 public:
00052
00054 position ()
00055 : filename (0), line (1), column (0)
00056 {
00057 }
00058
00059
00061 inline void initialize (std::string* fn)
00062 {
00063 filename = fn;
00064 line = 1;
00065 column = 0;
00066 }
00067
00070 public:
00072 inline void lines (int count = 1)
00073 {
00074 column = 0;
00075 line += count;
00076 }
00077
00079 inline void columns (int count = 1)
00080 {
00081 int leftmost = 0;
00082 int current = column;
00083 if (leftmost <= current + count)
00084 column += count;
00085 else
00086 column = 0;
00087 }
00090 public:
00092 std::string* filename;
00094 unsigned int line;
00096 unsigned int column;
00097 };
00098
00100 inline const position&
00101 operator+= (position& res, const int width)
00102 {
00103 res.columns (width);
00104 return res;
00105 }
00106
00108 inline const position
00109 operator+ (const position& begin, const int width)
00110 {
00111 position res = begin;
00112 return res += width;
00113 }
00114
00116 inline const position&
00117 operator-= (position& res, const int width)
00118 {
00119 return res += -width;
00120 }
00121
00123 inline const position
00124 operator- (const position& begin, const int width)
00125 {
00126 return begin + -width;
00127 }
00128
00133 inline std::ostream&
00134 operator<< (std::ostream& ostr, const position& pos)
00135 {
00136 if (pos.filename)
00137 ostr << *pos.filename << ':';
00138 return ostr << pos.line << '.' << pos.column;
00139 }
00140
00141 }
00142 #endif // not BISON_POSITION_HH