Browse Source

Add string as acceptable parameter for replacement string

mingodad 10 years ago
parent
commit
263b03c742
1 changed files with 47 additions and 5 deletions
  1. 47 5
      SquiLu/sqstdlib/sqstdstring.cpp

+ 47 - 5
SquiLu/sqstdlib/sqstdstring.cpp

@@ -385,11 +385,11 @@ static SQRESULT _regexp_gsub(HSQUIRRELVM v)
 	    blob.Write(str, begin-str);
 	    blob.Write(str, begin-str);
 	    SQInteger n = sqstd_rex_getsubexpcount(self);
 	    SQInteger n = sqstd_rex_getsubexpcount(self);
 	    SQRexMatch match;
 	    SQRexMatch match;
-        SQInteger i = 0;
+        SQInteger i;
 	    switch(ptype){
 	    switch(ptype){
 	        case OT_CLOSURE:{
 	        case OT_CLOSURE:{
                 sq_pushroottable(v); //this
                 sq_pushroottable(v); //this
-                for(;i < n; i++) {
+                for(i=0; i < n; i++) {
                     sqstd_rex_getsubexp(self,i,&match);
                     sqstd_rex_getsubexp(self,i,&match);
                     if(i > 0){ //skip whole match
                     if(i > 0){ //skip whole match
                         sq_pushstring(v, match.begin, match.len);
                         sq_pushstring(v, match.begin, match.len);
@@ -406,7 +406,7 @@ static SQRESULT _regexp_gsub(HSQUIRRELVM v)
 	        }
 	        }
 	        break;
 	        break;
 	        case OT_ARRAY:{
 	        case OT_ARRAY:{
-                for(;i < n; i++) {
+                for(i=0; i < n; i++) {
                     sqstd_rex_getsubexp(self,i,&match);
                     sqstd_rex_getsubexp(self,i,&match);
                     if(i > 0){ //skip whole match
                     if(i > 0){ //skip whole match
                         sq_pushinteger(v, i-1);
                         sq_pushinteger(v, i-1);
@@ -420,7 +420,7 @@ static SQRESULT _regexp_gsub(HSQUIRRELVM v)
 	        }
 	        }
 	        break;
 	        break;
 	        case OT_TABLE:{
 	        case OT_TABLE:{
-                for(;i < n; i++) {
+                for(i=0; i < n; i++) {
                     sqstd_rex_getsubexp(self,i,&match);
                     sqstd_rex_getsubexp(self,i,&match);
                     if(i > 0){ //skip whole match
                     if(i > 0){ //skip whole match
                         sq_pushstring(v, match.begin, match.len);
                         sq_pushstring(v, match.begin, match.len);
@@ -433,6 +433,48 @@ static SQRESULT _regexp_gsub(HSQUIRRELVM v)
                 }
                 }
 	        }
 	        }
 	        break;
 	        break;
+	        case OT_STRING:{
+	            sq_getstr_and_size(v, -1, &replacement, &replacement_size);
+
+                for(i=0; i < replacement_size; i++) {
+                    SQInteger c = replacement[i];
+                    switch(c)
+                    {
+                    case '$':
+                        ++i;
+                        if(i < replacement_size)
+                        {
+                            SQInteger idx = replacement[i] - '0';
+                            if(idx < n)
+                            {
+                                sqstd_rex_getsubexp(self,idx,&match);
+                                blob.Write(match.begin, match.len);
+                            }
+                            else
+                            {
+                                return sq_throwerror(v, _SC("there is no match for replacement $%d"), idx);
+                            }
+                            continue;
+                        }
+                        else
+                        {
+                            return sq_throwerror(v, _SC("unexpected end of replacement string"));
+                        }
+                        break;
+                    case '\\':
+                        ++i;
+                        if(i < replacement_size)
+                        {
+                            blob.WriteChar(replacement[i]);
+                            continue;
+                        }
+                        //falthrough last character on replacement string
+                    default:
+                        blob.WriteChar(c);
+                    }
+                }
+	        }
+	        break;
 	        default:
 	        default:
                 return sq_throwerror(v, _SC("gsub only works with closure, array, table for replacement"));
                 return sq_throwerror(v, _SC("gsub only works with closure, array, table for replacement"));
 	    }
 	    }
@@ -558,7 +600,7 @@ static SQRegFunction rexobj_funcs[]={
 	_DECL_REX_FUNC(search,-2,_SC("xsn")),
 	_DECL_REX_FUNC(search,-2,_SC("xsn")),
 	_DECL_REX_FUNC(match,2,_SC("xs")),
 	_DECL_REX_FUNC(match,2,_SC("xs")),
 	_DECL_REX_FUNC(gmatch,3,_SC("xsc")),
 	_DECL_REX_FUNC(gmatch,3,_SC("xsc")),
-	_DECL_REX_FUNC(gsub,3,_SC("xs c|a|t")),
+	_DECL_REX_FUNC(gsub,3,_SC("xs s|c|a|t")),
 	_DECL_REX_FUNC(capture,-2,_SC("xsn")),
 	_DECL_REX_FUNC(capture,-2,_SC("xsn")),
 	_DECL_REX_FUNC(xcapture,-2,_SC("xsn")),
 	_DECL_REX_FUNC(xcapture,-2,_SC("xsn")),
 	_DECL_REX_FUNC(getxcapture,4,_SC("xsna")),
 	_DECL_REX_FUNC(getxcapture,4,_SC("xsna")),