~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to client/drizzletest.cc

Merged trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
6305
6305
  char* pattern; /* Pattern to be replaced */
6306
6306
  char* replace; /* String or expression to replace the pattern with */
6307
6307
  int icase; /* true if the match is case insensitive */
 
6308
  int global; /* true if the match should be global -- 
 
6309
                 i.e. repeat the matching until the end of the string */
6308
6310
};
6309
6311
 
6310
6312
struct st_replace_regex
6328
6330
struct st_replace_regex *glob_replace_regex= 0;
6329
6331
 
6330
6332
int reg_replace(char** buf_p, int* buf_len_p, char *pattern, char *replace,
6331
 
                char *string, int icase);
 
6333
                char *string, int icase, int global);
6332
6334
 
6333
6335
 
6334
6336
 
6429
6431
 
6430
6432
    /* Check if we should do matching case insensitive */
6431
6433
    if (p < expr_end && *p == 'i')
 
6434
    {
 
6435
      p++;
6432
6436
      reg.icase= 1;
 
6437
    }
 
6438
 
 
6439
    /* Check if we should do matching globally */
 
6440
    if (p < expr_end && *p == 'g')
 
6441
    {
 
6442
      p++;
 
6443
      reg.global= 1;
 
6444
    }
6433
6445
 
6434
6446
    /* done parsing the statement, now place it in regex_arr */
6435
6447
    if (insert_dynamic(&res->regex_arr,(unsigned char*) &reg))
6487
6499
    get_dynamic(&r->regex_arr,(unsigned char*)&re,i);
6488
6500
 
6489
6501
    if (!reg_replace(&out_buf, buf_len_p, re.pattern, re.replace,
6490
 
                     in_buf, re.icase))
 
6502
                     in_buf, re.icase, re.global))
6491
6503
    {
6492
6504
      /* if the buffer has been reallocated, make adjustements */
6493
6505
      if (save_out_buf != out_buf)
6557
6569
  icase - flag, if set to 1 the match is case insensitive
6558
6570
*/
6559
6571
int reg_replace(char** buf_p, int* buf_len_p, char *pattern,
6560
 
                char *replace, char *in_string, int icase)
 
6572
                char *replace, char *in_string, int icase, int global)
6561
6573
{
6562
 
  string string_to_match(in_string);
6563
6574
  const char *error= NULL;
6564
6575
  int erroffset;
6565
6576
  int ovector[3];
6566
6577
  pcre *re= pcre_compile(pattern,
6567
 
                         icase ? PCRE_CASELESS : 0,
 
6578
                         icase ? PCRE_CASELESS | PCRE_MULTILINE : PCRE_MULTILINE,
6568
6579
                         &error, &erroffset, NULL);
6569
6580
  if (re == NULL)
6570
6581
    return 1;
6571
6582
 
6572
 
  int rc= pcre_exec(re, NULL, in_string, (int)strlen(in_string),
6573
 
                    0, 0, ovector, 3);
6574
 
  if (rc < 0)
6575
 
  {
6576
 
    pcre_free(re);
6577
 
    return 1;
6578
 
  }
6579
 
 
6580
 
  char *substring_to_replace= in_string + ovector[0];
6581
 
  int substring_length= ovector[1] - ovector[0];
6582
 
  *buf_len_p= strlen(in_string) - substring_length + strlen(replace);
6583
 
  char * new_buf = (char *)malloc(*buf_len_p+1);
6584
 
  if (new_buf == NULL)
6585
 
  {
6586
 
    pcre_free(re);
6587
 
    return 1;
6588
 
  }
6589
 
 
6590
 
  memset(new_buf, 0, *buf_len_p+1);
6591
 
  strncpy(new_buf, in_string, substring_to_replace-in_string);
6592
 
  strncpy(new_buf+(substring_to_replace-in_string), replace, strlen(replace));
6593
 
  strncpy(new_buf+(substring_to_replace-in_string)+strlen(replace),
6594
 
          substring_to_replace + substring_length,
6595
 
          strlen(in_string)
6596
 
            - substring_length
6597
 
            - (substring_to_replace-in_string));
6598
 
  *buf_p= new_buf;
6599
 
 
6600
 
  pcre_free(re);
6601
 
  return 0;
 
6583
  if (! global)
 
6584
  {
 
6585
 
 
6586
    int rc= pcre_exec(re, NULL, in_string, (int)strlen(in_string),
 
6587
                      0, 0, ovector, 3);
 
6588
    if (rc < 0)
 
6589
    {
 
6590
      pcre_free(re);
 
6591
      return 1;
 
6592
    }
 
6593
 
 
6594
    char *substring_to_replace= in_string + ovector[0];
 
6595
    int substring_length= ovector[1] - ovector[0];
 
6596
    *buf_len_p= strlen(in_string) - substring_length + strlen(replace);
 
6597
    char * new_buf = (char *)malloc(*buf_len_p+1);
 
6598
    if (new_buf == NULL)
 
6599
    {
 
6600
      pcre_free(re);
 
6601
      return 1;
 
6602
    }
 
6603
 
 
6604
    memset(new_buf, 0, *buf_len_p+1);
 
6605
    strncpy(new_buf, in_string, substring_to_replace-in_string);
 
6606
    strncpy(new_buf+(substring_to_replace-in_string), replace, strlen(replace));
 
6607
    strncpy(new_buf+(substring_to_replace-in_string)+strlen(replace),
 
6608
            substring_to_replace + substring_length,
 
6609
            strlen(in_string)
 
6610
              - substring_length
 
6611
              - (substring_to_replace-in_string));
 
6612
    *buf_p= new_buf;
 
6613
 
 
6614
    pcre_free(re);
 
6615
    return 0;
 
6616
  }
 
6617
  else
 
6618
  {
 
6619
    /* Repeatedly replace the string with the matched regex */
 
6620
    string subject(in_string);
 
6621
    size_t replace_length= strlen(replace);
 
6622
    size_t current_position= 0;
 
6623
    int rc= 0;
 
6624
    while(0 >= (rc= pcre_exec(re, NULL, subject.c_str() + current_position, subject.length() - current_position,
 
6625
                      0, 0, ovector, 3)))
 
6626
    {
 
6627
      current_position= static_cast<size_t>(ovector[0]);
 
6628
      replace_length= static_cast<size_t>(ovector[1] - ovector[0]);
 
6629
      subject.replace(current_position, replace_length, replace, replace_length);
 
6630
    }
 
6631
 
 
6632
    char *new_buf = (char *) malloc(subject.length() + 1);
 
6633
    if (new_buf == NULL)
 
6634
    {
 
6635
      pcre_free(re);
 
6636
      return 1;
 
6637
    }
 
6638
    memset(new_buf, 0, subject.length() + 1);
 
6639
    strncpy(new_buf, subject.c_str(), subject.length());
 
6640
    *buf_len_p= subject.length() + 1;
 
6641
    *buf_p= new_buf;
 
6642
          
 
6643
    pcre_free(re);
 
6644
    return 0;
 
6645
  }
6602
6646
}
6603
6647
 
6604
6648