|
|
|
|
|
|
|
|
|
|
inherit "C.pmod"; |
|
array(string) low_split(string data, void|mapping state) |
{ |
if(state && state->remains) |
data = m_delete(state, "remains") + data; |
array ret; |
string rem; |
[ret, rem] = Parser._parser._Pike.tokenize(data); |
if(sizeof(rem)) { |
if(rem[0]=='"') |
throw(UnterminatedStringError(ret*"", rem)); |
if(state) state->remains=rem; |
} |
return ret; |
} |
|
|
|
|
|
|
|
|
array(string) split(string data, void|mapping state) { |
array r = low_split(data, state); |
|
array new = ({}); |
for(int i; i<sizeof(r); i++) |
if(r[i][..1]=="//" && r[i][-1]=='\n') |
new += ({ r[i][..<1], "\n" }); |
else |
new += ({ r[i] }); |
|
if(sizeof(new) && (< "\n", " " >)[new[-1]]) |
new[-1] += "\n"; |
else |
new += ({ "\n" }); |
return new; |
} |
|
class UnterminatedStringError |
|
{ |
inherit Error.Generic; |
constant error_type = "unterminated_string"; |
constant is_unterminated_string_error = 1; |
|
string err_str; |
|
|
protected void create(string pre, string post) |
{ |
int line = String.count(pre, "\n")+1; |
err_str = pre+post; |
if( sizeof(post) > 100 ) |
::create(sprintf("Unterminated string %O[%d] at line %d\n", |
post[..100], sizeof(post)-100, line)); |
else |
::create(sprintf("Unterminated string %O at line %d\n", |
post, line)); |
} |
} |
|
|