MCPcopy Create free account
hub / github.com/digego/extempore / rreplace

Function rreplace

src/UNIV.cpp:402–461  ·  view source on GitHub ↗

returns char* result

Source from the content-addressed store, hash-verified

400
401// returns char* result
402char* 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]);

Callers 1

jitCompileIRStringMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected