From 74c57a9363cee62ff7ef4622714700d778da19dc Mon Sep 17 00:00:00 2001
From: Andreas Lange <andreas@lange.cx>
Date: Fri, 14 Jul 2000 13:46:00 +0200
Subject: [PATCH] Like Parser.C, but can take a little more pikeishness

Rev: lib/modules/Parser.pmod/Pike.pmod:1.1
---
 lib/modules/Parser.pmod/Pike.pmod | 190 ++++++++++++++++++++++++++++++
 1 file changed, 190 insertions(+)
 create mode 100644 lib/modules/Parser.pmod/Pike.pmod

diff --git a/lib/modules/Parser.pmod/Pike.pmod b/lib/modules/Parser.pmod/Pike.pmod
new file mode 100644
index 0000000000..2d5f67ea3e
--- /dev/null
+++ b/lib/modules/Parser.pmod/Pike.pmod
@@ -0,0 +1,190 @@
+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] });
+  }
+}
+ 
-- 
GitLab