returns char* result
| 400 | |
| 401 | // returns char* result |
| 402 | char* rreplace(char* regex, char* str, char* replacement, char* result) { |
| 403 | |
| 404 | char* data = str; //string_value(pair_car(args)); |
| 405 | char* pattern = regex; //string_value(pair_cadr(args)); |
| 406 | strcpy(result,replacement); |
| 407 | |
| 408 | pcre *re; |
| 409 | const char *error; |
| 410 | int erroffset; |
| 411 | re = pcre_compile( pattern, /* the pattern */ |
| 412 | 0, /* default options */ |
| 413 | &error, /* for error message */ |
| 414 | &erroffset, /* for error offset */ |
| 415 | NULL); /* use default character tables */ |
| 416 | |
| 417 | int rc; |
| 418 | int ovector[60]; |
| 419 | |
| 420 | rc = pcre_exec( re, /* result of pcre_compile() */ |
| 421 | NULL, /* we didn’t study the pattern */ |
| 422 | data, /* the subject string */ |
| 423 | strlen(data), /* the length of the subject string */ |
| 424 | 0, /* start at offset 0 in the subject */ |
| 425 | 0, /* default options */ |
| 426 | ovector, /* vector of integers for substring information */ |
| 427 | 60); /* number of elements (NOT size in bytes) */ |
| 428 | |
| 429 | // no match found return original string |
| 430 | if(rc<1) {strcpy(result,str); return result;} // Return mk_string(_sc,data); |
| 431 | |
| 432 | // ok we have a match |
| 433 | // first replace any groups in replace string (i.e. $1 $2 ...) |
| 434 | char* res = (char*) ""; |
| 435 | char* sep = (char*) "$"; |
| 436 | char* tmp = 0; |
| 437 | int pos,range,size = 0; |
| 438 | char* p = strtok(result,sep); |
| 439 | do{ |
| 440 | char* cc; |
| 441 | pos = strtol(p,&cc,10); |
| 442 | range = (pos>0) ? ovector[(pos*2)+1] - ovector[pos*2] : 0; |
| 443 | size = strlen(res); |
| 444 | tmp = (char*) alloca(size+range+strlen(cc)+1); |
| 445 | memset(tmp,0,size+range+strlen(cc)+1); |
| 446 | memcpy(tmp,res,size); |
| 447 | memcpy(tmp+size,data+ovector[pos*2],range); |
| 448 | memcpy(tmp+size+range,cc,strlen(cc)); |
| 449 | res = tmp; |
| 450 | p = strtok(NULL, sep); |
| 451 | }while(p); |
| 452 | // now we can use "rep" to replace the original regex match (i.e. ovector[0]-ovector[1]) |
| 453 | int lgth = (strlen(data)-range)+strlen(res)+1; |
| 454 | range = ovector[1] - ovector[0]; |
| 455 | //char* result = (char*) alloca(lgth); |
| 456 | memset(result,0,lgth); |
| 457 | memcpy(result,data,ovector[0]); |
| 458 | memcpy(result+ovector[0],res,strlen(res)); |
| 459 | memcpy(result+ovector[0]+strlen(res),data+ovector[1],strlen(data)-ovector[1]); |