use Inline C => <<'__EOC__'; SV *fast_c (char *original, char *chopped) { int counts[256] = {0}; /* each potential character */ int ptr = 0; int buffer_size = 0; char *ret = NULL; int ret_ptr = 0; int error = 0; SV *retsv = &PL_sv_undef; while (original[ptr] != '\0') { counts[original[ptr++]]++; buffer_size++; } ptr = 0; while (!error && chopped[ptr] != '\0') { counts[chopped[ptr]]--; buffer_size--; if (counts[chopped[ptr++]] < 0) { error++; } } if (!error) { ret = malloc(buffer_size + 1); for (ptr = 0; ptr <= 255; ptr++) { while (counts[ptr]-- > 0) { ret[ret_ptr++] = ptr; } } ret[ret_ptr] = '\0'; retsv = newSVpvn(ret, strlen(ret)); free(ret); } return(retsv); } __EOC__