Public Methods |
|
| ? | Parser (Awk *awk, const cmt_string pattern, const cmt_regexp *expression) |
| Awk::condition? | parse (const cmt_string &text) |
| ? |
this first level parsing function extracts individual lines from the text, taking care of both Unix and Windows EOL styles. |
| Awk::condition? | parse_line (const cmt_string &line) |
| ? |
This second level parsing function accumulates individual lines with real trailing back slashes. |
Private Attributes |
|
| cmt_string? | m_accumulator |
| cmt_string? | m_pattern |
| const cmt_regexp *? | m_expression |
| Awk *? | m_awk |
|
||||||||||||||||
| ? |
Definition at line 19 of file cmt_awk.cxx. References m_awk, m_expression, and m_pattern. 00019 : 00020 m_pattern (pattern), m_expression (expression), m_awk(awk) 00021 { 00022 } |
|
| ? |
this first level parsing function extracts individual lines from the text, taking care of both Unix and Windows EOL styles. Then the second level parsing function parse_line is called. Definition at line 30 of file cmt_awk.cxx. References Awk::condition, cmt_string::erase(), cmt_string::find(), Awk::inc_line_number(), m_accumulator, m_awk, cmt_string::npos, Awk::ok, parse_line(), cmt_string::size(), and cmt_string::substr(). Referenced by Awk::run(). 00031 {
00032 Awk::condition result = Awk::ok;
00033
00034 cmt_string line;
00035 int pos;
00036 int max_pos;
00037
00038 pos = 0;
00039 max_pos = text.size ();
00040
00041 m_accumulator.erase (0);
00042
00043 for (pos = 0; pos < max_pos;)
00044 {
00045 int eol = text.find (pos, '\n');
00046
00047 if (eol == cmt_string::npos)
00048 {
00049 // Last line, since there is no eol at all
00050 text.substr (pos, line);
00051 pos = max_pos;
00052 }
00053 else
00054 {
00055 int length = 1;
00056
00057 int cr = text.find (pos, "\r\n");
00058
00059 if (cr == (eol-1))
00060 {
00061 eol = cr;
00062 length = 2;
00063 }
00064
00065 if (eol == pos)
00066 {
00067 // this is an empty line
00068 line = "";
00069 pos += length;
00070 }
00071 else
00072 {
00073 // The eol was found beyond the current position
00074 // (ie. this is a non empty line)
00075 text.substr (pos, eol - pos, line);
00076 pos = eol + length;
00077 }
00078 }
00079
00080 if (m_awk != 0) m_awk->inc_line_number ();
00081
00082 //cout << "parse> line=[" << line << "]" << endl;
00083
00084 result = parse_line (line);
00085 if (result != Awk::ok) break;
00086 }
00087
00088 return (result);
00089 }
|
|
| ? |
This second level parsing function accumulates individual lines with real trailing back slashes. Eventually the possible text pattern or regular expression is checked and the Awk::filter function is called in case of succesful match onto the accumulated line. Definition at line 98 of file cmt_awk.cxx. References Awk::condition, cmt_string::erase(), Awk::filter(), cmt_string::find(), cmt_string::find_last_of(), Awk::get_last_condition(), m_accumulator, m_awk, m_expression, m_pattern, cmt_regexp::match(), cmt_string::npos, Awk::ok, and cmt_string::size(). Referenced by parse(). 00099 {
00100 Awk::condition result = Awk::ok;
00101 int length;
00102 cmt_string temp_line = line;
00103
00104 //
00105 // We scan the line for handling backslashes.
00106 //
00107 // Really terminating backslashes (ie those only followed by spaces/tabs
00108 // mean continued line
00109 //
00110 //
00111
00112 bool finished = true;
00113
00114 length = temp_line.size ();
00115
00116 if (length == 0)
00117 {
00118 // An empty line following a backslash terminates the continuation.
00119 finished = true;
00120 }
00121 else
00122 {
00123 int back_slash = temp_line.find_last_of ('\\');
00124
00125 if (back_slash != cmt_string::npos)
00126 {
00127 //
00128 // This is the last backslash
00129 // check if there are only space chars after it
00130 //
00131
00132 bool at_end = true;
00133
00134 for (int i = (back_slash + 1); i < length; i++)
00135 {
00136 char c = temp_line[i];
00137 if ((c != ' ') && (c != '\t'))
00138 {
00139 at_end = false;
00140 break;
00141 }
00142 }
00143
00144 if (at_end)
00145 {
00146 temp_line.erase (back_slash);
00147 finished = false;
00148 }
00149 else
00150 {
00151 // This was not a trailing backslash.
00152 finished = true;
00153 }
00154 }
00155
00156 m_accumulator += temp_line;
00157 }
00158
00159 //cout << "parse_line1> accumulator=[" << m_accumulator << "]" << endl;
00160 //cout << "parse_line1> finished=[" << finished << "]" << endl;
00161
00162 if (!finished)
00163 {
00164 // We still need to accumulate forthcoming lines
00165 // before parsing the resulting text.
00166 return (Awk::ok);
00167 }
00168
00169 // now filter the complete accumulated line (if non empty)
00170
00171 if (m_accumulator != "")
00172 {
00173 bool ok = false;
00174
00175 if (m_expression != 0)
00176 {
00177 if (m_expression->match (m_accumulator))
00178 {
00179 ok = true;
00180 }
00181 }
00182 else
00183 {
00184 if ((m_pattern == "") ||
00185 (m_accumulator.find (m_pattern) != cmt_string::npos))
00186 {
00187 ok = true;
00188 }
00189 }
00190
00191 if (ok && (m_awk != 0))
00192 {
00193 //cout << "parse_line> accumulator=[" << m_accumulator << "]" << endl;
00194
00195 m_awk->filter (m_accumulator);
00196 result = m_awk->get_last_condition ();
00197 }
00198
00199 m_accumulator.erase (0);
00200 }
00201
00202 return (result);
00203 }
|
|
| ? |
Definition at line 207 of file cmt_awk.cxx. Referenced by parse(), and parse_line(). |
|
| ? |
Definition at line 210 of file cmt_awk.cxx. Referenced by parse(), parse_line(), and Parser(). |
|
| ? |
Definition at line 209 of file cmt_awk.cxx. Referenced by parse_line(), and Parser(). |
|
| ? |
Definition at line 208 of file cmt_awk.cxx. Referenced by parse_line(), and Parser(). |