char *extend_string (const char * str, int len) { malloc_block_t *mbt; #ifdef STRING_STATS int oldsize = MSTR_SIZE(str); #endif mbt = (malloc_block_t *)DREALLOC(MSTR_BLOCK(str), len + sizeof(malloc_block_t) + 1, TAG_MALLOC_STRING, "extend_string"); if (len < USHRT_MAX) { mbt->size = len; } else { mbt->size = USHRT_MAX; } ADD_STRING_SIZE(mbt->size - oldsize); CHECK_STRING_STATS; return (char *)(mbt + 1); }
static array_t *pcre_match(array_t *v, svalue_t *pattern, int flag) { pcre_t *run; array_t *ret; svalue_t *sv1, *sv2; char *res; int num_match, size, match = !(flag & 2); if (!(size = v->size)) return &the_null_array; run = CALLOCATE(1, pcre_t, TAG_TEMPORARY, "pcre_match : run"); run->ovector = NULL; run->ovecsize = 0; assign_svalue_no_free(&run->pattern, pattern); run->re = pcre_get_cached_pattern(&pcre_cache, &run->pattern); if (run->re == NULL) { if (pcre_local_compile(run) == NULL) { const char *rerror = run->error; int offset = run->erroffset; pcre_free_memory(run); error("PCRE compilation failed at offset %d: %s\n", offset, rerror); } else pcre_cache_pattern(&pcre_cache, run->re, &run->pattern); } res = (char*)DMALLOC(size, TAG_TEMPORARY, "prcre_match: res"); sv1 = v->item + size; num_match = 0; while (size--) { if ((--sv1)->type != T_STRING) { res[size] = 0; continue; } run->subject = sv1->u.string; run->s_length = SVALUE_STRLEN(sv1); pcre_local_exec(run); if (pcre_query_match(run) != match) //was not checking for match! (woom) { res[size] = 0; continue; } res[size] = 1; num_match++; } flag &= 1; ret = allocate_empty_array(num_match << flag); sv2 = ret->item + (num_match << flag); size = v->size; while (size--) { if (res[size]) { if (flag) { (--sv2)->type = T_NUMBER; sv2->u.number = size + 1; } (--sv2)->type = T_STRING; sv1 = v->item + size; *sv2 = *sv1; if (sv1->subtype & STRING_COUNTED) { INC_COUNTED_REF(sv1->u.string); ADD_STRING(MSTR_SIZE(sv1->u.string)); } if (!--num_match) break; } } FREE(res); pcre_free_memory(run); return ret; }