Hi, Can anyboby help me. I'm try to write a UDF which replace substring in string according regular expression. When I compile my program with -I ./../regex gcc switch I recive as result "Segmentetion fault". But when I compile my program without -I ./../regex - my program works fine. I think gcc found regex.h in /usr/include. Hope someone can help me Thank you in advance Regards, Vladislav This is my source: (test program with function main() ) #include <stdio.h> #include <string.h> #include <regex.h> #define NS 10 char* reg_replace(const char *pattern, const char *replace, const char *string, int icase, int extended); char* regex_error(int err, regex_t *re); int main() { char* rez; rez = reg_replace("t", "test passed:", "htpt:///", 1, 0); printf("Result =%s\n",rez); free(rez); } char* reg_replace(const char *pattern, const char *replace, const char *string, int icase, int extended) { regex_t* re; regmatch_t* subs; char *buf, /* buf is where we build the replaced string */ *nbuf, /* nbuf is used when we grow the buffer */ *walkbuf; /* used to walk buf when replacing backrefs */ const char *walk; /* used to walk replacement string for backrefs */ int buf_len; int pos, tmp, string_len, new_l; int tmp1; int err, copts = 0; string_len = strlen(string); if (icase) copts = REG_ICASE; if (extended) copts |= REG_EXTENDED; re = (regex_t*)malloc(sizeof(regex_t)); err = regcomp(re, pattern, copts); if (err) return regex_error(err, re); buf = (char*) malloc(strlen(string)+1); /* start with a buffer that is twice the size of the stringo we're doing replacements in */ buf_len = 2 * string_len + 1; buf = (char*) malloc(buf_len * sizeof(char)); if (!buf) { regfree(re); return "Unable to allocate memory in php_reg_replace"; } err = pos = 0; buf[0] = '\0'; subs = (regmatch_t*)malloc(sizeof(regmatch_t)*NS); // while (!err) { if (!err) { err = regexec(re, &string[pos], (size_t) NS, subs, 0); if (err && err != REG_NOMATCH) { regex_error(err, re); regfree(re); free(subs); free(re); return 0; } if (!err) { tmp = strlen(string); for( pos = 0; pos < NS; pos++) { if(subs[pos].rm_so !=-1) { tmp = tmp - (subs[pos].rm_eo - subs[pos].rm_so) + strlen(replace); } printf("check point:%i, value=%i\n",pos,subs[pos].rm_so); } printf("Result length = %i\n",tmp); buf = (char*) malloc(tmp+1); buf[tmp] = '\0'; pos = tmp = tmp1 = 0; while(subs[pos].rm_so !=-1){ printf("In str:%s, pattern:%s, replace:%s, start: %i, end: %i\n", string, pattern, replace, subs[pos].rm_so,subs[pos].rm_eo); memcpy(buf+tmp,string+tmp1,subs[pos].rm_so-tmp1); tmp += subs[pos].rm_so; tmp1 = subs[pos].rm_eo; memcpy(buf+tmp, replace, strlen(replace)); tmp += strlen(replace); pos++; } memcpy(buf+tmp,string+tmp1,strlen(string)-tmp1); } } /* don't want to leak memory .. */ regfree(re); free(subs); free(re); /* whew. */ return buf; } char* regex_error(int err, regex_t *re) { char *buf = NULL, *message = NULL; size_t len; size_t buf_len; /* get the length of the message */ buf_len = regerror(err, re, NULL, 0); if (buf_len) { buf = (char*) malloc(buf_len * sizeof(char)); if (!buf) return "fail silently"; /* fail silently */ /* finally, get the error message */ regerror(err, re, buf, buf_len); } len = regerror(err, re, NULL, 0); if (len) { message = (char *)malloc((buf_len + len + 2) * sizeof(char)); if (!message) { return "** fail silently"; /* */ } if (buf_len) { snprintf(message, buf_len, "%s: ", buf); buf_len += 1; /* so pointer math below works */ } /* drop the message into place */ regerror(err, re, message + buf_len, len); } free(buf); return message; } --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php