changeset 110:336da6ce8174

Merge
author Mike Pavone <pavone@retrodev.com>
date Wed, 06 Oct 2010 23:48:32 +0000
parents b7df624895b2 (diff) 439db471f595 (current diff)
children 7ca80654c9bb 25a205094f9b
files string.rhope
diffstat 4 files changed, 267 insertions(+), 100 deletions(-) [+]
line wrap: on
line diff
--- a/backendutils_c.rhope	Tue Aug 24 23:22:45 2010 -0400
+++ b/backendutils_c.rhope	Wed Oct 06 23:48:32 2010 +0000
@@ -1,9 +1,7 @@
 
-Escape Rhope Name[name:out]
+Escape Rhope Name[name,p:out]
 {
-	escaped <- [name]Replace[
-		("_",  "@",  " ",  ":",  "?",  "+",  "-",  "*",  "/",  "<",  ">",  "(",  ")",  "!",  "=",  "'",  
-			"\"", "\t", ",",  ".",  "\n", "{",  "}",   "[",   "]",   "#",   "\\",  "\r",  ";",   "&",   "|",   "%",   "^",   "`",   "~"),
+	escaped <- [name]Replace[p,
 		("UN_","AT_","SP_","CN_","QN_","PL_","MN_","TM_","DV_","LT_","GT_","LP_","RP_","NT_","EQ_","PR_",
 			"DP_","TB_","CM_","PD_","NL_","LC_","RC_", "LS_", "RS_", "HS_", "BS_", "CR_", "SC_", "AM_", "PI_", "PC_", "CT_", "BT_", "TD_")]
 			
--- a/cbackend_c.rhope	Tue Aug 24 23:22:45 2010 -0400
+++ b/cbackend_c.rhope	Wed Oct 06 23:48:32 2010 +0000
@@ -114,7 +114,7 @@
 	out <- Fold[_Register Field C[?], field reg, [ctype]Fields >>]
 }
 
-Rhope Type to C[type:out,array]
+Rhope Type to C[type,p:out,array]
 {
 	If[[Blueprint Of[type]]=[Type Instance()]]
 	{
@@ -205,30 +205,30 @@
 	{
 		escaped <- Val[typename]	
 	}{
-		escaped <- Escape Rhope Name[typename]
+		escaped <- Escape Rhope Name[typename,p]
 	}
 	out <- [[prefix]Append[escaped]]Append[postfix]
 }
 
-_Type Def C Type[text,field:out]
+_Type Def C Type[text,field,p:out]
 {
 	name <- [field]Index[0]
-	,postfix <- Rhope Type to C[[field]Index[1]]
+	,postfix <- Rhope Type to C[[field]Index[1],p]
 	{ type <- ["\n\t"]Append[~] }
 	
-	out <- [[[[text]Append[type]]Append[" "]]Append[[Escape Rhope Name[name]]Append[postfix]]]Append[";"]
+	out <- [[[[text]Append[type]]Append[" "]]Append[[Escape Rhope Name[name,p]]Append[postfix]]]Append[";"]
 }
 
-Type Def@C Type[ctype:out]
+Type Def@C Type[ctype,p:out]
 {
 	If[[[[ctype]Fields >>]Length] = [1]]
 	{
-		out <- [[[[_Type Def C Type["typedef struct {\n\tobject _SP_header;\n\t", [[ctype]Fields >>]Index[0]]]Append["\n} t_"]]Append[Escape Rhope Name[[ctype]Name >>]]]Append[";"]
+		out <- [[[[_Type Def C Type["typedef struct {\n\tobject _SP_header;\n\t", [[ctype]Fields >>]Index[0], p]]Append["\n} t_"]]Append[Escape Rhope Name[[ctype]Name >>,p]]]Append[";"]
 					]Append[ 
 						[[[["typedef "
-							]Append[Rhope Type to C[ [[[ctype]Fields >>]Index[0]]Index[1] ]]
+							]Append[Rhope Type to C[ [[[ctype]Fields >>]Index[0]]Index[1],p ]]
 							]Append[" nt_"]
-							]Append[Escape Rhope Name[[ctype]Name >>]]
+							]Append[Escape Rhope Name[[ctype]Name >>,p]]
 							]Append[";"] ]
 	}{
 		//HACK!!!
@@ -239,24 +239,24 @@
 			[("Array","Boxed Array","Worker")]Find[=[[ctype]Name >>,?]]
 			{ oend <- "\nMObject(" }
 			{ oend <- "\nObject(" } 
-			out <- [Fold[_Type Def C Type[?], "OBegin", [ctype]Fields >>]]Append[ [[oend]Append[Escape Rhope Name[[ctype]Name >>]]]Append[")"] ]
+			out <- [Fold[_Type Def C Type[?,?,p], "OBegin", [ctype]Fields >>]]Append[ [[oend]Append[Escape Rhope Name[[ctype]Name >>,p]]]Append[")"] ]
 		}
 	}
 }
 
-_Type Init C[type name,method reg,text,method:out]
+_Type Init C[type name,method reg,text,method,p:out]
 {
-	out <- [[text]Append[[["\n\tadd_method(bp, "]Append[ [method reg]Method ID[method] ]]Append[  [[", MethodName("]Append[Escape Rhope Name[method]]]Append[[","]Append[Escape Rhope Name[type name]]]]]]Append["));"]
+	out <- [[text]Append[[["\n\tadd_method(bp, "]Append[ [method reg]Method ID[method] ]]Append[  [[", MethodName("]Append[Escape Rhope Name[method,p]]]Append[[","]Append[Escape Rhope Name[type name,p]]]]]]Append["));"]
 }
 
-_Type Init C Field[type name,field reg,text,field:out]
+_Type Init C Field[type name,field reg,text,field,p:out]
 {
 	fname <- [field]Index[0]
-	out <- [[[[text]Append[[["\n\tadd_getter(bp, "]Append[ String[[field reg]Field ID[fname]] ]]Append[  [[", MethodName("]Append[Escape Rhope Name[[fname]Append[" >>"]]]]Append[[","]Append[Escape Rhope Name[type name]]]]]]Append["));"]
-		]Append[[["\n\tadd_setter(bp, "]Append[ String[[field reg]Field ID[fname]] ]]Append[  [[", MethodName("]Append[Escape Rhope Name[[fname]Append[" <<"]]]]Append[[","]Append[Escape Rhope Name[type name]]]]]]Append["));"]
+	out <- [[[[text]Append[[["\n\tadd_getter(bp, "]Append[ String[[field reg]Field ID[fname]] ]]Append[  [[", MethodName("]Append[Escape Rhope Name[[fname]Append[" >>"],p]]]Append[[","]Append[Escape Rhope Name[type name,p]]]]]]Append["));"]
+		]Append[[["\n\tadd_setter(bp, "]Append[ String[[field reg]Field ID[fname]] ]]Append[  [[", MethodName("]Append[Escape Rhope Name[[fname]Append[" <<"],p]]]Append[[","]Append[Escape Rhope Name[type name,p]]]]]]Append["));"]
 }
 
-Type Init@C Type[ctype,id,method reg,field reg:out]
+Type Init@C Type[ctype,id,method reg,field reg,p:out]
 {
 	[("Array","Boxed Array", "Worker")]Find[=[[ctype]Name >>, ?]]
 	{ size <- "-1" }
@@ -276,7 +276,7 @@
 				{ 
 					If[[[ctype]Name >>]=["Boolean"]]
 					{ typename <- "int32_t" }
-					{ typename <- ["nt_"]Append[Escape Rhope Name[[ctype]Name >>]] }
+					{ typename <- ["nt_"]Append[Escape Rhope Name[[ctype]Name >>,p]] }
 				}
 			}
 		}
@@ -289,11 +289,11 @@
 			]Append[
 				[", (special_func)"]Append[
 					[ 
-						[[[[Escape Rhope Name[[ctype]Init >>]
+						[[[[Escape Rhope Name[[ctype]Init >>,p]
 						]Append[", (special_func)"]
-						]Append[Escape Rhope Name[[ctype]Copy >> ]]
+						]Append[Escape Rhope Name[[ctype]Copy >> ,p]]
 						]Append[", (special_func)"]
-						]Append[Escape Rhope Name[[ctype]Cleanup >>]]         
+						]Append[Escape Rhope Name[[ctype]Cleanup >>,p]]         
 					]Append[");"]]] ]
 	out <- Val[start]//Fold[[["_Type Init C Field"]Set Input[0, [ctype]Name >>]]Set Input[1, field reg], Fold[[["_Type Init C"]Set Input[0, [ctype]Name >>]]Set Input[1, method reg], start, [ctype]Methods >>], [ctype]Fields >>]
 }
@@ -303,11 +303,12 @@
 	Lookup
 	Definitions
 	Next ID
+	Escape Pattern
 }
 
-C Type Registry[:out]
+C Type Registry[p:out]
 {
-	out <- [[[Build[C Type Registry()]]Lookup << [
+	out <- [[[[Build[C Type Registry()]]Lookup << [
 			[[[[[[[[[[[[[[[[[[[Dictionary[]
 			]Set["UInt8", "TYPE_UINT8"]			//1
 			]Set["UInt16", "TYPE_UINT16"]		//2
@@ -330,21 +331,22 @@
 			]Set["Wrong Type Exception", "TYPE_WRONGTYPEEXCEPTION"]]		//19
 		]Definitions << [Dictionary[]]
 		]Next ID <<[0]
+		]Escape Pattern <<[p]
 }
 
-_Type Defs C[text,def:out]
+_Type Defs C[text,def,p:out]
 {
-	out <- [[text]Append[[def]Type Def]]Append["\n\n"]
+	out <- [[text]Append[[def]Type Def[p]]]Append["\n\n"]
 }
 
 Type Defs@C Type Registry[reg:out]
 {
-	out <- Fold[_Type Defs C[?], "", [reg]Definitions >>]
+	out <- Fold[_Type Defs C[?,?,[reg]Escape Pattern >>], "", [reg]Definitions >>]
 }
 
 _Type Inits C[reg,method reg,field reg,text,def,name:out]
 {
-	out <- [[text]Append[ [def]Type Init[[reg]Type ID[name], method reg, field reg] ]]Append["\n\n"]
+	out <- [[text]Append[ [def]Type Init[[reg]Type ID[name], method reg, field reg,[reg]Escape Pattern >>] ]]Append["\n\n"]
 }
 
 Type Inits@C Type Registry[reg,method reg,field reg:out]
@@ -403,16 +405,17 @@
 	Output Types
 	Resume Index
 	Last NumParams
+	Escape Pattern
 }
 
-C Function[name,inputs,outputs,convention:out]
+C Function[name,inputs,outputs,convention,p:out]
 {
-	out <- C Function With Registry[name,inputs,outputs,convention, C Method Registry[], C Field Registry[], C Type Registry[]]
+	out <- C Function With Registry[name,inputs,outputs,convention, C Method Registry[], C Field Registry[], C Type Registry[p],p]
 }
 
-C Function With Registry[name,inputs,outputs,convention,registry,field reg,type reg:out]
+C Function With Registry[name,inputs,outputs,convention,registry,field reg,type reg,p:out]
 {
-	out <- [[[[[[[[[[[[[[Build[C Function()]
+	out <- [[[[[[[[[[[[[[[Build[C Function()]
 		]Name <<[name]
 		]Inputs <<[inputs]
 		]Outputs <<[outputs]
@@ -427,6 +430,7 @@
 		]Output Types <<[ Fold[Append[?, "Any Type"], (), outputs] ]
 		]Resume Index <<[1]
 		]Last NumParams <<[-1]
+		]Escape Pattern <<[p]
 }
 
 Set Input Type@C Function[func,type,input num:out]
@@ -561,7 +565,7 @@
 
 Lookup Constant@C Function[func,const,doaddref:out]
 {
-	var <- ["_const_"]Append[Escape Rhope Name[const]]
+	var <- ["_const_"]Append[Escape Rhope Name[const,[func]Escape Pattern >>]]
 	If[doaddref]
 	{
 		out <- [["add_ref("]Append[var]]Append[")"]
@@ -600,7 +604,7 @@
 		{
 			rvar <- Val[as op]
 		}{
-			rvar <- [[[["(("]Append[ Rhope Type to C[type] ]]Append[")("]]Append[as op]]Append["))"]
+			rvar <- [[[["(("]Append[ Rhope Type to C[type,[func]Escape Pattern >>] ]]Append[")("]]Append[as op]]Append["))"]
 		}
 	}{
 		rvar <- Val[as op]
@@ -613,7 +617,7 @@
 		//TODO: Generate some kind of error/exception in this case
 		access <- "->" 
 	}
-	out <- [[rvar]Append[access]]Append[Escape Rhope Name[field]]
+	out <- [[rvar]Append[access]]Append[Escape Rhope Name[field,[func]Escape Pattern >>]]
 }
 
 Read Field@C Function[func,var,field:out,result op]
@@ -736,14 +740,14 @@
 		]Append[", "]
 		]Append[String[[func]Resume Index >>]]
 		]Append[", "]
-		]Append[Escape Rhope Name[[func]Name >>]]
+		]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]
 		]Append[")"]]
 	]Add Raw Line["DISPATCH"]
 	]Add Raw Line[
 		[[[["ValCallPostlude("
 		]Append[String[[func]Resume Index >>]]
 		]Append[", "]
-		]Append[Escape Rhope Name[[func]Name >>]]
+		]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]
 		]Append[")"]]
 	]Resume Index <<[ [[func]Resume Index >>]+[1] ]
 }
@@ -766,7 +770,7 @@
 			]Func Base["Call",args, "Call"]
 			]Add Raw Line["}"]
 		}{
-			out <- [func]Func Base[Escape Rhope Name[name],args, "Call"]
+			out <- [func]Func Base[Escape Rhope Name[name,[func]Escape Pattern >>],args, "Call"]
 		}
 	}
 }
@@ -800,7 +804,7 @@
 		]Append[", "]
 		]Append[String[[func]Resume Index >>]]
 		]Append[", "]
-		]Append[Escape Rhope Name[[func]Name >>]]
+		]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]
 		]Append[")"]]
 	]Resume Index <<[ [[func]Resume Index >>]+[1] ]
 }
@@ -823,12 +827,12 @@
 
 Get Field Call@C Function[func,field,source:out]
 {
-	out <- [func]Func Base[Escape Rhope Name[[field]Append[" >>"]], [()]Append[source], "Call"]
+	out <- [func]Func Base[Escape Rhope Name[[field]Append[" >>"],[func]Escape Pattern >>], [()]Append[source], "Call"]
 }
 
 Set Field Call@C Function[func,field,object,value:out]
 {
-	out <- [func]Func Base[Escape Rhope Name[[field]Append[" <<"]], [[()]Append[object]]Append[value], "Call"]
+	out <- [func]Func Base[Escape Rhope Name[[field]Append[" <<"],[func]Escape Pattern >>], [[()]Append[object]]Append[value], "Call"]
 }
 
 Tail Method Call@C Function[func,method,args:out]
@@ -838,7 +842,7 @@
 
 Tail Call@C Function[func,name,args:out]
 {
-	out <- [func]Func Base[Escape Rhope Name[name],args, "TCall"]
+	out <- [func]Func Base[Escape Rhope Name[name,[func]Escape Pattern >>],args, "TCall"]
 }
 
 Resolve@C Function[func,op:out]
@@ -849,10 +853,10 @@
 		{
 			out <- [["my_cdata->params["]Append[String[~]]]Append["	]"]
 		}{
-			out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>]]]Append["->"]]Append[Escape Rhope Name[op]]
+			out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]Append[Escape Rhope Name[op,[func]Escape Pattern >>]]
 		}
 	}{
-		out <- Escape Rhope Name[op]
+		out <- Escape Rhope Name[op,[func]Escape Pattern >>]
 	}
 }
 
@@ -860,9 +864,9 @@
 {
 	If[[[func]Convention >>] = ["rhope"]]
 	{
-		out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>]]]Append["->"]]Append[Escape Rhope Name[name]]
+		out <- [[["lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]Append[Escape Rhope Name[name,[func]Escape Pattern >>]]
 	}{
-		out <- Escape Rhope Name[name]
+		out <- Escape Rhope Name[name,[func]Escape Pattern >>]
 	} 
 }
 
@@ -924,7 +928,7 @@
 
 _Set Outputs C[string,inputname,inputnum,func:out]
 {
-	out <- [string]Append[[[ [ ["\tRet("]Append[String[inputnum]] ]Append[ [[", lv_"]Append[Escape Rhope Name[[func]Name >>]]]Append["->"]]]Append[Escape Rhope Name[inputname]]]Append[")\n"]]
+	out <- [string]Append[[[ [ ["\tRet("]Append[String[inputnum]] ]Append[ [[", lv_"]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append["->"]]]Append[Escape Rhope Name[inputname,[func]Escape Pattern >>]]]Append[")\n"]]
 }
 
 Set Outputs@C Function[func:out]
@@ -935,7 +939,7 @@
 	}{
 		[[func]Outputs >>]Index[0]
 		{
-			out <- [["\treturn "]Append[Escape Rhope Name[~]]]Append[";\n"]
+			out <- [["\treturn "]Append[Escape Rhope Name[~,[func]Escape Pattern >>]]]Append[";\n"]
 		}{
 			out <- ""
 		}
@@ -943,13 +947,13 @@
 }
 _Output Defs C[string,varname,index,func:out]
 {
-	out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[[[func]Output Types >>]Index[index]]] ]]Append[[" "]Append[Escape Rhope Name[varname]]]]Append[";\n"]
+	out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[[[func]Output Types >>]Index[index],[func]Escape Pattern >>]] ]]Append[[" "]Append[Escape Rhope Name[varname,[func]Escape Pattern >>]]]]Append[";\n"]
 }
-_Var Defs C[string,type,varname:out]
+_Var Defs C[string,type,varname,p:out]
 {
 	Print[["Variable: "]Append[varname]]
 	{
-	out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[type]] ]]Append[[" "]Append[Escape Rhope Name[varname]]]]Append[";\n"]
+	out <- [[[string]Append[ ["\t"]Append[Rhope Type to C[type,p]] ]]Append[[" "]Append[Escape Rhope Name[varname,p]]]]Append[";\n"]
 	{ Print["Produced Output"]}
 	}
 }
@@ -961,7 +965,7 @@
 	{
 	If[ [[[func]Convention >>] = ["rhope"]] And [[ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] > [0]] ]
 	{
-		localtype <- [[[Fold[_Output Defs C[?, ?, ?, func], Fold[_Var Defs C[?],"typedef struct {\n", [func]Variables >>], [func]Outputs >>]]Append["} lt_"]]Append[Escape Rhope Name[[func]Name >>]]]Append[";\n"]
+		localtype <- [[[Fold[_Output Defs C[?, ?, ?, func], Fold[_Var Defs C[?,?,?,[func]Escape Pattern >>],"typedef struct {\n", [func]Variables >>], [func]Outputs >>]]Append["} lt_"]]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[";\n"]
 	}{
 		localtype <- ""
 	}
@@ -972,12 +976,12 @@
 		[parts]Index[1]
 		{
 			proto <- [[[["MethodDef("
-				]Append[Escape Rhope Name[[parts]Index[0]]]
+				]Append[Escape Rhope Name[[parts]Index[0],[func]Escape Pattern >>]]
 				]Append[", "]
-				]Append[Escape Rhope Name[~]]
+				]Append[Escape Rhope Name[~,[func]Escape Pattern >>]]
 				]Append[")\n"]
 		}{
-			proto <- [["FuncDef("]Append[Escape Rhope Name[[func]Name >>]]]Append[")\n"]
+			proto <- [["FuncDef("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[")\n"]
 		} */
 		out <- Val[localtype]
 	}{
@@ -986,23 +990,23 @@
 	}
 }
 
-_Proto Input[list,input,index,types:out]
+_Proto Input[list,input,index,types,p:out]
 {
-	out <- [list]Append[ [[Rhope Type to C[[types]Index[index]]]Append[" "]]Append[Escape Rhope Name[input]] ]
+	out <- [list]Append[ [[Rhope Type to C[[types]Index[index],p]]Append[" "]]Append[Escape Rhope Name[input,p]] ]
 }
 
 Naked Proto@C Function[func:out]
 {
 	[[func]Output Types >>]Index[0]
 	{
-		outtype <- [Rhope Type to C[~]]Append[" "]
+		outtype <- [Rhope Type to C[~,[func]Escape Pattern >>]]Append[" "]
 	}{
 		outtype <- "void "
 	}
 	out <- [[[[outtype
-			]Append[ Escape Rhope Name[[func]Name >>]]
+			]Append[ Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]
 			]Append["("]
-			]Append[ [Fold[_Proto Input[?, ?, ?, [func]Input Types >>], (), [func]Inputs >>]]Join[", "] ]
+			]Append[ [Fold[_Proto Input[?, ?, ?, [func]Input Types >>,[func]Escape Pattern >>], (), [func]Inputs >>]]Join[", "] ]
 			]Append[")"]
 }
 
@@ -1040,16 +1044,16 @@
 		before <- [[func]Name >>]Partition["@"] {} {}
 		{
 			type <- "MethodImpl"
-			cname <- [[[[Escape Rhope Name[before]
+			cname <- [[[[Escape Rhope Name[before,[func]Escape Pattern >>]
 				]Append[", "]
-				]Append[Escape Rhope Name[~]]
+				]Append[Escape Rhope Name[~,[func]Escape Pattern >>]]
 				]Append[", "]
 				]Append[ [[func]Type Registry >>]Type ID[~] ]
 		}{
 			type <- "Func"
 			cname <- Val[fname]
 		}
-		fname <- Escape Rhope Name[[func]Name >>]
+		fname <- Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]
 		param check <- Fold[Check Param Type C[?, ?, ?, func], "", [func]Input Types >>]
 		If[ [ [[[func]Variables >>]Length]+[[[func]Outputs >>]Length] ] = [0] ]
 		{
@@ -1099,11 +1103,14 @@
 	Field Registry
 	Type Registry
 	Libraries
+	Escape Pattern
 }
 
 C Program[:out]
 {
-	out <- [[[[[Build[C Program()]]Functions <<[Dictionary[]]]Method Registry <<[C Method Registry[]]]Type Registry <<[C Type Registry[]]]Field Registry <<[C Field Registry[]]]Libraries <<[Dictionary[]]
+	p <- Pattern[("_",  "@",  " ",  ":",  "?",  "+",  "-",  "*",  "/",  "<",  ">",  "(",  ")",  "!",  "=",  "'",  
+			"\"", "\t", ",",  ".",  "\n", "{",  "}",   "[",   "]",   "#",   "\\",  "\r",  ";",   "&",   "|",   "%",   "^",   "`",   "~")]
+	out <- [[[[[[Build[C Program()]]Functions <<[Dictionary[]]]Method Registry <<[C Method Registry[]]]Type Registry <<[C Type Registry[p]]]Field Registry <<[C Field Registry[]]]Libraries <<[Dictionary[]]]Escape Pattern <<[p]
 }
 
 Link@C Program[program,language,library:out]
@@ -1132,7 +1139,7 @@
 
 Create Function@C Program[program,name,inputs,outputs,convention:out]
 {
-	out <- C Function With Registry[name,inputs,outputs,convention, [program]Method Registry >>, [program]Field Registry >>, [program]Type Registry >>]
+	out <- C Function With Registry[name,inputs,outputs,convention, [program]Method Registry >>, [program]Field Registry >>, [program]Type Registry >>, [program]Escape Pattern >>]
 }
 
 Store Function@C Program[program,func:out]
@@ -1166,9 +1173,9 @@
 	out <- Combine[[func]Constants >>, consts]
 }
 
-_Consts C Program[text,value,name:out]
+_Consts C Program[text,value,name,p:out]
 {
-	out <- [text]Append[ [["object * _const_"]Append[Escape Rhope Name[name]]]Append[";\n"] ]
+	out <- [text]Append[ [["object * _const_"]Append[Escape Rhope Name[name,p]]]Append[";\n"] ]
 }
 
 Const Construct C[value,type reg:out]
@@ -1217,7 +1224,7 @@
 						{ size <- String[[~]+[1]] }
 						{ size <- "0" }
 						out <- [[[[[["make_Worker(FUNC_"
-								]Append[Escape Rhope Name[[value]Name >>]]
+								]Append[Escape Rhope Name[[value]Name >>,[type reg]Escape Pattern >>]]
 								]Append[", "]
 								]Append[size]
 								]Append[", "]
@@ -1253,7 +1260,7 @@
 		out <- text
 	}{
 		Const Construct C[value,type reg]
-		{ out <- [text]Append[ [[[["\t_const_"]Append[Escape Rhope Name[name]]]Append[" = "]]Append[~]]Append[";\n"] ] }
+		{ out <- [text]Append[ [[[["\t_const_"]Append[Escape Rhope Name[name,[type reg]Escape Pattern >>]]]Append[" = "]]Append[~]]Append[";\n"] ] }
 	}
 }
 
@@ -1277,14 +1284,14 @@
 		If[[~]>[3]]
 		{
 			out <- [Fold[_Set List Els[?, ?, ?, type reg], "\trhope(FUNC_List, inout, 0, 1);\n", value]
-				]Append[[["\t_const_"]Append[Escape Rhope Name[name]]]Append[" = inout[0];\n"]]
+				]Append[[["\t_const_"]Append[Escape Rhope Name[name,[type reg]Escape Pattern >>]]]Append[" = inout[0];\n"]]
 		}{
 			Const Construct C[value,type reg]
-			{ init <- [text]Append[ [[[["\t_const_"]Append[Escape Rhope Name[name]]]Append[" = "]]Append[~]]Append[";\n"] ] }
+			{ init <- [text]Append[ [[[["\t_const_"]Append[Escape Rhope Name[name,[type reg]Escape Pattern >>]]]Append[" = "]]Append[~]]Append[";\n"] ] }
 		
 			If[[valtype]=[Worker Literal()]]
 			{
-				out <- Fold[_Set Worker Params C[?, ?, ?, type reg, Escape Rhope Name[name]], init, [value]Args >>]
+				out <- Fold[_Set Worker Params C[?, ?, ?, type reg, Escape Rhope Name[name,[type reg]Escape Pattern >>]], init, [value]Args >>]
 			}{
 				out <- Val[init]
 			}
@@ -1308,7 +1315,7 @@
 {
 	If[[[func]Convention >>] = ["rhope"]]
 	{
-		name <- Escape Rhope Name[raw name]
+		name <- Escape Rhope Name[raw name,[func]Escape Pattern >>]
 		out <- [[text]Append[ [["\tDispatchEntry("]Append[name]]Append[")\\\n"] ]
 			]Append[Fold[_Dispatch Switch Sub[?, ?, name], "", Range[1, [func]Resume Index >>]]]
 	}{
@@ -1316,9 +1323,9 @@
 	}
 }
 
-_Dispatch Switch Methods[text,id,raw name:out]
+_Dispatch Switch Methods[p,text,id,raw name:out]
 {
-	name <- Escape Rhope Name[raw name]
+	name <- Escape Rhope Name[raw name,p]
 	out <- [text]Append[ [["\tDispatchEntry("]Append[name]]Append[")\\\n"] ]
 }
 
@@ -1336,7 +1343,7 @@
 {
 	If[[[func]Convention >>] = ["rhope"]]
 	{
-		name <- Escape Rhope Name[raw name]
+		name <- Escape Rhope Name[raw name,[func]Escape Pattern >>]
 		out <- [[text]Append[ [["\tFUNC_"]Append[name]]Append[",\n"] ]
 			]Append[Fold[_Dispatch Enum Sub[?, ?, name], "", Range[1, [func]Resume Index >>]]]
 	}{
@@ -1344,21 +1351,21 @@
 	}
 }
 
-_Dispatch Enum Methods[text,types,name:out]
+_Dispatch Enum Methods[p,text,types,name:out]
 {
-	out <- [text]Append[ [["\tFUNC_"]Append[Escape Rhope Name[name]]]Append[",\n"] ]
+	out <- [text]Append[ [["\tFUNC_"]Append[Escape Rhope Name[name,p]]]Append[",\n"] ]
 }
 
 Dispatch@C Program[program,all methods:out]
 {
 	out <- [[[[["typedef enum {\n"
 		]Append[Fold[_Dispatch Enum[?], 
-			[Fold[_Dispatch Enum Methods[?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n"], 
+			[Fold[_Dispatch Enum Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tFUNC_Build,\n\tFUNC_BlueprintSP_Of,\n\tFUNC_ID,\n\tFUNC_BlueprintSP_FromSP_ID,\n"], 
 			[program]Functions >>]]
 		]Append["\tEND\n} funcids;\n\n"]
 		]Append["#define DispatchEntries \\\n"] 
 		]Append[Fold[_Dispatch Switch[?], 
-			[Fold[_Dispatch Switch Methods[?], "", all methods]]Append["\tDispatchEntry(Build)\\\n\tDispatchEntry(BlueprintSP_Of)\\\n\tDispatchEntry(ID)\\\n\tDispatchEntry(BlueprintSP_FromSP_ID)\\\n"], 
+			[Fold[_Dispatch Switch Methods[[program]Escape Pattern >>,?], "", all methods]]Append["\tDispatchEntry(Build)\\\n\tDispatchEntry(BlueprintSP_Of)\\\n\tDispatchEntry(ID)\\\n\tDispatchEntry(BlueprintSP_FromSP_ID)\\\n"], 
 			[program]Functions >>]]
 		]Append["\tEndEntry\n\n"]
 }
@@ -1381,7 +1388,7 @@
 	{
 		out <- text
 	}{
-		out <- [text]Append[[["\tFuncDef("]Append[Escape Rhope Name[[func]Name >>]]]Append[")\n"]]
+		out <- [text]Append[[["\tFuncDef("]Append[Escape Rhope Name[[func]Name >>,[func]Escape Pattern >>]]]Append[")\n"]]
 	}
 }
 
@@ -1413,19 +1420,20 @@
 
 _Method Dispatch[text, type, method, reg: out]
 {
-	out <- [[[[[[[text]Append["\tMethodDispatch("]]Append[ [reg]Type ID[type] ]]Append[","]]Append[Escape Rhope Name[method]]]Append[","]]Append[Escape Rhope Name[type]]]Append[")\n"]
+	out <- [[[[[[[text]Append["\tMethodDispatch("]]Append[ [reg]Type ID[type] ]]Append[","]]Append[Escape Rhope Name[method,[reg]Escape Pattern >>]]]Append[","]]Append[Escape Rhope Name[type,[reg]Escape Pattern >>]]]Append[")\n"]
 }
 
 Method Dispatch[text, types, method, reg: out]
 {
-	out <- [[[Fold[_Method Dispatch[?, ?, method, reg], [[[text]Append["Method("]]Append[ Escape Rhope Name[method] ]]Append[")\n"], types]
+	out <- [[[Fold[_Method Dispatch[?, ?, method, reg], [[[text]Append["Method("]]Append[ Escape Rhope Name[method,[reg]Escape Pattern >>] ]]Append[")\n"], types]
 		]Append["EndMethod("]
-		]Append[Escape Rhope Name[method]]
+		]Append[Escape Rhope Name[method,[reg]Escape Pattern >>]]
 		]Append[")\n\n"]
 }
 
 Text@C Program[program:out]
 {
+	p <- [program]Escape Pattern >>
 	type defs <- [[program]Type Registry >>]Definitions >>
 	constants <- Fold[Combine Consts[?], Dictionary[], [program]Functions >>]
 	all methods <- Fold[Field to Types[?], Fold[Method to Types[?], Dictionary[], type defs], type defs]
@@ -1443,7 +1451,7 @@
 	out <- [[[[[[[[[[[[[[[headers
 		]Append[[program]Dispatch[all methods]]
 		]Append[[[program]Type Registry >>]Type Defs]
-		]Append[Fold[_Consts C Program[?], 
+		]Append[Fold[_Consts C Program[?,?,?,p], 
 					Fold[_Defs C Program[?], "", [program]Functions >>], 
 					constants]]
 		]Append[Fold[_Text C Program[?, ?, [program]Type Registry >>], "", Filter[[program]Functions >>, Not Native[?]]]]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pattern.rhope	Wed Oct 06 23:48:32 2010 +0000
@@ -0,0 +1,130 @@
+
+Blueprint Empty Pattern
+{
+}
+
+Empty Pattern[:out]
+{
+	out <- Build[Empty Pattern()]
+}
+
+Add String@Empty Pattern[pattern,string,idx:out]
+{
+	out <- [pattern]_Add String[string,0,idx]
+}
+
+_Add String@Empty Pattern[pattern,string,n,idx:out]
+{
+	If[[n]<[[string]Byte Length]]
+	{
+		out <- [[[[[[Build[Pattern()]
+		]Byte <<[[string]Byte[n]]
+		]Left <<[pattern]
+		]Right <<[pattern]
+		]Straight <<[[pattern]_Add String[string, [n]+[1],idx]]
+		]Terminal? <<[[n]=[[[string]Byte Length]-[1]]]
+		]Index <<[idx]
+	}{
+		out <- pattern
+	}
+}
+
+Blueprint Pattern
+{
+	Byte
+	Left
+	Right
+	Straight
+	Terminal?
+	Index
+}
+
+_Add String@Pattern[pattern,string,n,idx:out]
+{
+	If[[n]<[[string]Byte Length]]
+	{
+		b <- [string]Byte[n]
+		myb <- [pattern]Byte >>
+		If[[b]<[myb]]
+		{
+			out <- [pattern]Left <<[[[pattern]Left >>]_Add String[string,n,idx]]
+		}{
+			If[[b]>[myb]]
+			{
+				out <- [pattern]Right <<[[[pattern]Right >>]_Add String[string,n,idx]]
+			}{
+				newpat <- [pattern]Straight <<[[[pattern]Straight >>]_Add String[string,[n]+[1],idx]]
+				If[[n]=[[[string]Byte Length]-[1]]]
+				{
+					out <- [newpat]Terminal? <<[Yes]
+				}{
+					out <- Val[newpat]
+				}
+			}
+		}
+	}{
+		out <- pattern
+	}
+}
+
+Add String@Pattern[pattern,string,idx:out]
+{
+	out <- [pattern]_Add String[string,0,idx]
+}
+
+Pattern@List[list:out]
+{
+	out <- Fold[Add String[?], Empty Pattern[], list]
+}
+
+Pattern@List Leaf[list:out]
+{
+        out <- Fold[Add String[?], Empty Pattern[], list]
+}
+
+Pattern@Pattern[p:out]
+{
+	out <- p
+}
+
+
+_Match@Empty Pattern[pattern,string,n:num,no match]
+{
+	no match <- Yes
+}
+
+Match@Empty Pattern[pattern,string:num,no match]
+{
+	no match <- Yes
+}
+
+Match@Pattern[pattern,string:num,no match,idx]
+{
+	num,no match,idx <- [pattern]_Match[string,0]
+}
+
+_Match@Pattern[pattern,string,n:num,no match,idx]
+{
+	b <- [string]Byte[n]
+	myb <- [pattern]Byte >>
+	If[[b]=[myb]]
+	{
+		num, ,idx <- [[pattern]Straight >>]_Match[string, [n]+[1]] { }
+		{
+			,no match <- If[[pattern]Terminal? >>]
+			{
+				num <- [n]+[1]
+				idx <- Index >>[pattern]
+			}
+		}
+	
+	}{
+		If[[b]<[myb]]
+		{
+			num, no match, idx <- [[pattern]Left >>]_Match[string, n]
+		}{
+			num, no match, idx <- [[pattern]Right >>]_Match[string, n]
+		}
+	}
+}
+
--- a/string.rhope	Tue Aug 24 23:22:45 2010 -0400
+++ b/string.rhope	Wed Oct 06 23:48:32 2010 +0000
@@ -1,3 +1,5 @@
+
+Import pattern.rhope
 
 UTF8 Expect[num,arr,index,count,consumed:out]
 {
@@ -786,31 +788,59 @@
 	}
 }
 
+Pattern@String[string:out]
+{
+	out <- string
+}
+
+Pattern@String Slice[string:out]
+{
+	out <- string
+}
+
+Pattern@String Cat[string:out]
+{
+	out <- Flatten[string]
+}
+
+Match@String[string,cmp:num,no match,idx]
+{
+	n <- [string]Length
+	,no match <- If[[string]=[[cmp]Slice[n]]]
+	{
+		num <- Val[n]
+		idx <- 0
+	}
+}
+
+Match@String Slice[string,cmp:num,no match,idx]
+{
+        n <- [string]Length
+        ,no match <- If[[string]=[[cmp]Slice[n]]]
+        {
+                num <- Val[n]
+		idx <- 0
+        }
+}
+
 
 _Partition[string,delims:matched,after,not found]
 {
 	not found <- If[[string]=[""]] {}
 	{
-		,after <- =Delim[string, delims, [delims]First]
+		[delims]Match[string]
 		{
-			matched <- [delims]Index[~]
-		} {} {
+			matched,after <- [string]Slice[~]
+		}{
 			[string]Slice[1] {}
 			{ matched,after,not found <- _Partition[~,delims] }
 		}
 	}
 }
 
-Partition[string,odelims:before,matched,after,not found]
+Partition[string,delims:before,matched,after,not found]
 {
-	dt <- Blueprint Of[odelims]
-	If[ [[[dt]=[String()]] Or [[dt]=[String Slice()]]] Or [[dt]=[String Cat()]] ]
-	{
-		delims <- [List[]]Append[odelims]
-	}{
-		delims <- Val[odelims]
-	}
-	matched,after,not found <- _Partition[string,delims]
+	matched,after,not found <- _Partition[string,Pattern[delims]]
 	{ dlen <- Length[~] }
 	{ alen <- Length[~] }
 	before <- [string]Slice[ [[string]Length]-[[dlen]+[alen]] ]
@@ -884,7 +914,8 @@
 		{
 			replacement <- with
 		}{
-			replacement <- [with]Index[[toreplace]Find[=[delim,?]]]
+			,,idx <- [toreplace]Match[delim]
+			replacement <- [with]Index[idx]
 		}
 		out <- [[~]Append[replacement]]Append[Replace[after,toreplace,with]]
 	} {} {} {