use Inline C => <<'__EOC__'; SV *scan_c (char *from, char *to) { int f = 0; int t = 0; int from_len = strlen(from); int to_len = strlen(to); int ret_ptr = 0; unsigned char fc, tc; int error = 0; SV *retsv; char *ret; if (!from_len || !to_len) return(&PL_sv_undef); ret = malloc(from_len > to_len ? from_len+1 : to_len+1); while(!error) { fc = from[f]; tc = to[t]; if (fc == tc) { f++; t++; if (to[t] && (to[t] != tc)) { while (from[f] == fc) { f++; ret[ret_ptr++] = fc; } } if (t == to_len) error = 1; } else if (!fc || (fc < tc)) { ret[ret_ptr++] = fc; f++; if (f >= from_len) error = 2; } else { error = 2; } } if (error < 2) { while(f <= from_len) { ret[ret_ptr++] = from[f++]; } retsv = newSVpvn(ret, strlen(ret)); } else { retsv = &PL_sv_undef; } free(ret); return retsv; } __EOC__