Skip to content
Snippets Groups Projects
Commit 74c57a93 authored by Andreas Lange's avatar Andreas Lange
Browse files

Like Parser.C, but can take a little more pikeishness

Rev: lib/modules/Parser.pmod/Pike.pmod:1.1
parent be57ead5
No related branches found
No related tags found
No related merge requests found
inherit "C.pmod";
array(string) split(string data)
{
int start;
int line=1;
array(string) ret=({});
int pos;
data+="\0";
while(1)
{
int start=pos;
// werror("::::%c\n",data[pos]);
switch(data[pos])
{
case '\0':
return ret;
case '#':
{
pos+=1;
if(data[pos]=='\"')
break;
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);
break;
case 'a'..'z':
case 'A'..'Z':
case '_':
while(1)
{
switch(data[pos])
{
case 'a'..'z':
case 'A'..'Z':
case '0'..'9':
case '_':
pos++;
continue;
}
break;
}
break;
case '.':
if(data[start..start+2]=="...")
{
pos+=2;
break;
}
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++;
if(data[pos]=='.')
{
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++;
}
}
break;
default:
werror("Unknown token %s\n",data[pos..pos+5]);
exit(1);
case '`':
while(data[pos]=='`') data[pos]++;
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);
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 "->":
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++;
if(data[pos]=='\\') pos++;
pos=search(data, "'", pos)+1;
break;
case '"':
{
int q,s;
while(1)
{
q=search(data,"\"",pos+1);
s=search(data,"\\",pos+1);
if(q==-1) q=strlen(data)-1;
if(s==-1) s=strlen(data)-1;
if(q<s)
{
pos=q+1;
break;
}else{
pos=s+1;
}
}
break;
}
}
}
ret+=({ data[start..pos-1] });
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment