5d445f | 2002-03-20 | Martin Nilsson | |
|
64a60f | 2002-07-14 | Martin Nilsson | |
|
916c02 | 2002-06-28 | Martin Nilsson | |
|
a20af6 | 2000-09-26 | Fredrik Hübinette (Hubbe) | |
|
74c57a | 2000-07-14 | Andreas Lange | | inherit "C.pmod";
|
ba7b0a | 2001-01-18 | David Norlin | | #define UNKNOWN_TOKEN \
|
eb0fe0 | 2001-11-08 | Fredrik Hübinette (Hubbe) | | throw( ({sprintf("Unknown pike token: %O\n",data[pos..pos+20]) }) )
|
ba7b0a | 2001-01-18 | David Norlin | |
static mapping(string : int) backquoteops =
|
4f096f | 2001-08-13 | Fredrik Hübinette (Hubbe) | | (["/":1,
"%":1,
"*":1,
"*=":2,
"&":1,
"|":1,
"^":1,
"~":1,
|
ba7b0a | 2001-01-18 | David Norlin | | "+=":2, "+":1,
"<<":2, "<=":2, "<":1,
">>":2, ">=":2, ">":1,
"!=":2, "!":1,
"==":2, "=":1,
"()":2,
"->=":3, "->":2, "-":1,
"[]=":3, "[]":2 ]);
|
916c02 | 2002-06-28 | Martin Nilsson | |
|
9ee932 | 2002-03-03 | Martin Nilsson | | array(string) split(string data, void|mapping state)
|
74c57a | 2000-07-14 | Andreas Lange | | {
int line=1;
array(string) ret=({});
int pos;
|
9ee932 | 2002-03-03 | Martin Nilsson | | data += "\n\0";
if(state && state->in_token) {
switch(state->remains[0..1]) {
case "/*":
pos = search(data, "*/");
if(pos==-1) {
state->in_token = 1;
state->remains += data[..sizeof(data)-2];
|
52b86c | 2002-04-02 | Martin Nilsson | | return ret;
|
9ee932 | 2002-03-03 | Martin Nilsson | | }
|
5d5cb3 | 2002-03-04 | Henrik Grubbström (Grubba) | | ret += ({ state->remains + data[..pos] });
m_delete(state, "remains");
|
9ee932 | 2002-03-03 | Martin Nilsson | | pos+=2;
break;
case "#\"":
int q,s;
pos=-1;
while(1) {
q = search(data,"\"",pos+1);
s = search(data,"\\",pos+1);
if( q==-1 ||
(s==sizeof(data)-2 && s<q) ) {
state->in_token = 1;
state->remains += data[..sizeof(data)-2];
|
52b86c | 2002-04-02 | Martin Nilsson | | return ret;
|
9ee932 | 2002-03-03 | Martin Nilsson | | }
if(s==-1 || s>q) {
pos = q+1;
break;
}
pos=s+1;
}
|
5d5cb3 | 2002-03-04 | Henrik Grubbström (Grubba) | | ret += ({ state->remains + data[..pos-1] });
m_delete(state, "remains");
|
9ee932 | 2002-03-03 | Martin Nilsson | | break;
}
state->in_token = 0;
}
|
74c57a | 2000-07-14 | Andreas Lange | |
while(1)
{
int start=pos;
|
1c9333 | 2001-10-23 | Martin Nilsson | |
|
74c57a | 2000-07-14 | Andreas Lange | |
switch(data[pos])
{
case '\0':
return ret;
case '#':
{
pos+=1;
|
9ee932 | 2002-03-03 | Martin Nilsson | |
if(data[pos]=='\"') {
int q,s;
while(1) {
q = search(data,"\"",pos+1);
s = search(data,"\\",pos+1);
if( q==-1 ||
(s==sizeof(data)-2 && s<q) ) {
if(state) {
state->in_token = 1;
state->remains = data[pos-1..sizeof(data)-2];
|
52b86c | 2002-04-02 | Martin Nilsson | | return ret;
|
9ee932 | 2002-03-03 | Martin Nilsson | | }
error("Failed to find end of multiline string.\n");
}
if(s==-1 || s>q) {
pos = q+1;
break;
}
pos=s+1;
}
|
74c57a | 2000-07-14 | Andreas Lange | | break;
|
9ee932 | 2002-03-03 | Martin Nilsson | | }
|
74c57a | 2000-07-14 | Andreas Lange | | pos=search(data,"\n",pos);
if(pos==-1)
error("Failed to find end of preprocessor statement.\n");
while(data[pos-1]=='\\') pos=search(data,"\n",pos+1);
|
5f450d | 2000-08-19 | Andreas Lange | | sscanf(data[start..pos],
"#%*[ \t]charset%*[ \t\\]%s%*[ \n]", string charset);
if(charset)
data = (data[0..pos]+
master()->decode_charset(data[pos+1..sizeof(data)-3],
charset)
+"\n\0");
|
64a60f | 2002-07-14 | Martin Nilsson | | pos++;
|
74c57a | 2000-07-14 | Andreas Lange | | break;
case 'a'..'z':
case 'A'..'Z':
|
5f450d | 2000-08-19 | Andreas Lange | | case 128..:
|
74c57a | 2000-07-14 | Andreas Lange | | case '_':
while(1)
{
switch(data[pos])
{
case 'a'..'z':
case 'A'..'Z':
case '0'..'9':
|
5f450d | 2000-08-19 | Andreas Lange | | case 128..:
|
74c57a | 2000-07-14 | Andreas Lange | | case '_':
pos++;
continue;
}
break;
}
break;
case '.':
|
93d427 | 2000-10-16 | David Norlin | | if(data[start..start+2]=="...")
|
74c57a | 2000-07-14 | Andreas Lange | | {
|
93d427 | 2000-10-16 | David Norlin | | pos+=3;
|
74c57a | 2000-07-14 | Andreas Lange | | break;
}
|
93d427 | 2000-10-16 | David Norlin | | if(data[start..start+1]=="..")
{
pos+=2;
break;
}
pos++;
break;
|
74c57a | 2000-07-14 | Andreas Lange | |
case '0'..'9':
if(data[pos]=='0' && (data[pos+1]=='x' || data[pos+1]=='X'))
{
pos+=2;
while(1)
{
switch(data[pos])
{
case '0'..'9':
case 'a'..'f':
case 'A'..'F':
pos++;
continue;
}
break;
}
break;
}
while(data[pos]>='0' && data[pos]<='9') pos++;
|
93d427 | 2000-10-16 | David Norlin | | if(data[pos]=='.' && data[pos+1]>='0' && data[pos+1]<='9')
|
74c57a | 2000-07-14 | Andreas Lange | | {
pos++;
while(data[pos]>='0' && data[pos]<='9') pos++;
if(data[pos]=='e' || data[pos]=='E')
{
pos++;
while(data[pos]>='0' && data[pos]<='9') pos++;
}
|
467e8f | 2002-06-07 | Martin Nilsson | | break;
}
if( (data[pos]=='e' || data[pos]=='E') &&
data[pos+1]>='0' && data[pos+1]<='9' )
{
pos++;
while(data[pos]>='0' && data[pos]<='9') pos++;
|
74c57a | 2000-07-14 | Andreas Lange | | }
break;
default:
|
ba7b0a | 2001-01-18 | David Norlin | | UNKNOWN_TOKEN;
|
74c57a | 2000-07-14 | Andreas Lange | |
case '`':
|
ba7b0a | 2001-01-18 | David Norlin | | {
int bqstart = pos;
while(data[pos]=='`')
++pos;
if (pos - bqstart > 3)
UNKNOWN_TOKEN;
int chars = backquoteops[data[pos..pos+2]]
|| backquoteops[data[pos..pos+1]]
|| backquoteops[data[pos..pos]];
if (chars)
pos += chars;
else
UNKNOWN_TOKEN;
}
break;
|
74c57a | 2000-07-14 | Andreas Lange | |
case '/':
case '{': case '}':
case '[': case ']':
case '(': case ')':
case ';':
case ',':
case '*': case '%':
case '?': case ':':
case '&': case '|': case '^':
case '!': case '~':
case '=':
case '+':
case '-':
case '@':
case '<': case '>':
switch(data[pos..pos+1])
{
case "//":
pos=search(data,"\n",pos);
break;
case "/*":
pos=search(data,"*/",pos);
|
9ee932 | 2002-03-03 | Martin Nilsson | | if(pos==-1) {
if(state) {
state->remains = data[start..sizeof(data)-2];
state->in_token = 1;
return ret;
}
|
d6272a | 2002-02-17 | Martin Nilsson | | error("Failed to find end of comment.\n");
|
9ee932 | 2002-03-03 | Martin Nilsson | | }
|
74c57a | 2000-07-14 | Andreas Lange | | pos+=2;
break;
case "<<": case ">>":
if(data[pos+2]=='=') pos++;
case "==": case "<=": case ">=":
case "*=": case "/=": case "%=":
case "&=": case "|=": case "^=":
case "+=": case "-=":
case "++": case "--":
case "&&": case "||":
case "->":
|
c4c6d2 | 2000-12-20 | David Norlin | | case "::":
|
74c57a | 2000-07-14 | Andreas Lange | | pos++;
default:
pos++;
}
break;
case ' ':
case '\n':
case '\r':
case '\t':
while(1)
{
switch(data[pos])
{
case ' ':
case '\n':
case '\r':
case '\t':
pos++;
continue;
}
break;
}
break;
case '\'':
pos++;
|
eb0fe0 | 2001-11-08 | Fredrik Hübinette (Hubbe) | | if(data[pos]=='\\') pos+=2;
|
2710da | 2001-07-27 | David Norlin | | int end=search(data, "'", pos)+1;
|
370d36 | 2001-07-27 | David Norlin | | if (!end) {
--pos;
|
2710da | 2001-07-27 | David Norlin | | UNKNOWN_TOKEN;
|
370d36 | 2001-07-27 | David Norlin | | }
|
2710da | 2001-07-27 | David Norlin | | pos=end;
|
74c57a | 2000-07-14 | Andreas Lange | | break;
case '"':
{
int q,s;
while(1)
{
q=search(data,"\"",pos+1);
s=search(data,"\\",pos+1);
|
9ee932 | 2002-03-03 | Martin Nilsson | |
if( q==-1 ||
(s==sizeof(data)-2 && s<q) )
error("Unterminated string.\n");
if(s==-1 || s>q) {
pos = q+1;
|
74c57a | 2000-07-14 | Andreas Lange | | break;
}
|
9ee932 | 2002-03-03 | Martin Nilsson | |
pos=s+1;
|
74c57a | 2000-07-14 | Andreas Lange | | }
|
9ee932 | 2002-03-03 | Martin Nilsson | | if(has_value(data[start..pos-1], "\n"))
error("Newline in string.\n");
|
74c57a | 2000-07-14 | Andreas Lange | | break;
}
}
}
ret+=({ data[start..pos-1] });
}
}
|