Feature #6129 » patch2.diff
| configure.in | ||
|---|---|---|
| 	      setuid setgid daemon select_large_fdset setenv unsetenv\ | ||
|               mktime timegm gmtime_r clock_gettime gettimeofday poll ppoll\ | ||
|               pread sendfile shutdown sigaltstack dl_iterate_phdr\ | ||
|               dup3 pipe2 posix_memalign memalign) | ||
|               dup3 pipe2 posix_memalign memalign memmem) | ||
| AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value, | ||
|   [AC_TRY_COMPILE([ | ||
| ... | ... | |
|     AC_MSG_ERROR([failed]) | ||
|     ])]) | ||
| fi | ||
| AC_CACHE_CHECK(for broken memmem, rb_cv_broken_memmem, | ||
|   [AC_TRY_RUN([ | ||
| #include <string.h> | ||
| int | ||
| main() | ||
| { | ||
|   char *str = "hogefugafoobar"; | ||
|   char *rs = "foo"; | ||
|   char *empty = ""; | ||
|   char *p; | ||
|   p = memmem(str, strlen(str), rs, strlen(rs)); | ||
|   if (p == str+8) { | ||
|     p = memmem(str, strlen(str), empty, strlen(empty)); | ||
|     if (p == str) | ||
|       return 0; | ||
|     else | ||
|       return 1; | ||
|   } | ||
|   else { | ||
|     return 1; | ||
|   } | ||
| } | ||
|   ], | ||
|   rb_cv_broken_memmem=no, | ||
|   rb_cv_broken_memmem=yes, | ||
|   rb_cv_broken_memmem=yes) | ||
| ]) | ||
| if test "$rb_cv_broken_memmem" = yes; then | ||
|   AC_DEFINE(BROKEN_MEMMEM, 1) | ||
| fi | ||
| CPPFLAGS="$CPPFLAGS "'$(DEFS)' | ||
| test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}' | ||
| string.c | ||
|---|---|---|
|     return rb_str_split_m(1, &sep, str); | ||
| } | ||
| static VALUE rb_str_valid_encoding_p(VALUE str); | ||
| static const char *line_yield(VALUE str, const char *substr, long sublen){ | ||
|     VALUE line = rb_str_new5(str, substr, sublen); | ||
|     OBJ_INFECT(line, str); | ||
|     rb_enc_cr_str_copy_for_substr(line, str); | ||
|     rb_yield(line); | ||
|     return substr + sublen; | ||
| } | ||
| /* | ||
|  *  call-seq: | ||
| ... | ... | |
| 		continue; | ||
| 	    } | ||
| 	    p = p0 + rb_enc_mbclen(p0, pend, enc); | ||
| 	    line = rb_str_new5(str, s, p - s); | ||
| 	    OBJ_INFECT(line, str); | ||
| 	    rb_enc_cr_str_copy_for_substr(line, str); | ||
| 	    rb_yield(line); | ||
| 	    line_yield(str, s, p - s); | ||
| 	    str_mod_check(str, ptr, len); | ||
| 	    s = p; | ||
| 	} | ||
| ... | ... | |
|     enc = rb_enc_check(str, rs); | ||
|     rslen = RSTRING_LEN(rs); | ||
|     if (rslen == 0) { | ||
|     if (rslen == 0) | ||
| 	newline = '\n'; | ||
| #if defined(HAVE_MEMMEM) && !defined(BROKEN_MEMMEM) | ||
|     if (rb_str_valid_encoding_p(str) && rb_str_valid_encoding_p(rs)) { | ||
| 	int rspara = 0; | ||
| 	long sublen, rest = len; | ||
| 	const char *e, *pp, *rsptr, *ss = s; | ||
| 	if (rslen == 0) { | ||
| 	    rspara = 1; | ||
| 	    rs = rb_usascii_str_new("\n\n", 2); | ||
| 	    if (!rb_enc_asciicompat(enc)) | ||
| 		rs = rb_str_encode(rs, rb_enc_from_encoding(enc), 0, Qnil); | ||
| 	    rslen = RSTRING_LEN(rs); | ||
| 	} | ||
| 	rsptr = RSTRING_PTR(rs); | ||
| 	while (e = memmem(ss, rest, rsptr, rslen)) { | ||
| 	    if (rspara) { | ||
| 		p = e; | ||
| 		rb_enc_codepoint_len(p, pend, &n, enc); | ||
| 		while (p < pend && rb_enc_codepoint(p, pend, enc) == newline) | ||
| 		    p += n; | ||
| 		sublen = p-ss; | ||
| 	    } | ||
| 	    else { | ||
| 		sublen = e-ss+rslen; | ||
| 	    } | ||
| 	    pp = rb_enc_left_char_head(ss, e, ss+rest, enc); | ||
| 	    if (pp == e) { | ||
| 		s = line_yield(str, s, sublen); | ||
| 		str_mod_check(str, ptr, len); | ||
| 	    } | ||
| 	    ss += sublen; | ||
| 	    rest -= sublen; | ||
| 	} | ||
| 	goto finish; | ||
|     } | ||
|     else { | ||
| #endif | ||
|     if (rslen != 0) | ||
| 	newline = rb_enc_codepoint(RSTRING_PTR(rs), RSTRING_END(rs), enc); | ||
|     } | ||
|     while (p < pend) { | ||
| 	unsigned int c = rb_enc_codepoint_len(p, pend, &n, enc); | ||
| ... | ... | |
| 	if (c == newline && | ||
| 	    (rslen <= 1 || | ||
| 	     (pend - p >= rslen && memcmp(RSTRING_PTR(rs), p, rslen) == 0))) { | ||
| 	    line = rb_str_new5(str, s, p - s + (rslen ? rslen : n)); | ||
| 	    OBJ_INFECT(line, str); | ||
| 	    rb_enc_cr_str_copy_for_substr(line, str); | ||
| 	    rb_yield(line); | ||
| 	    s = line_yield(str, s, p - s + (rslen ? rslen : n)); | ||
| 	    str_mod_check(str, ptr, len); | ||
| 	    s = p + (rslen ? rslen : n); | ||
| 	} | ||
| 	p += n; | ||
|     } | ||
- « Previous
- 1
- 2
- Next »