/* --- .Call ENTRY POINT --- */ SEXP find_palindromes(SEXP x, SEXP min_armlength, SEXP max_looplength, SEXP max_mismatch, SEXP L2R_lkup) { Chars_holder x_holder; int x_len, min_arm_len, max_loop_len1, max_nmis, lkup_len, n; const int *lkup; x_holder = hold_XRaw(x); x_len = x_holder.length; min_arm_len = INTEGER(min_armlength)[0]; max_loop_len1 = INTEGER(max_looplength)[0] + 1; max_nmis = INTEGER(max_mismatch)[0]; if (L2R_lkup == R_NilValue) { lkup = NULL; lkup_len = 0; } else { lkup = INTEGER(L2R_lkup); lkup_len = LENGTH(L2R_lkup); } _init_match_reporting("MATCHES_AS_RANGES", 1); for (n = 0; n < x_len; n++) { /* Find palindromes centered on n. */ get_find_palindromes_at(x_holder.ptr, x_len, n - 1, n + 1, max_loop_len1, min_arm_len, max_nmis, lkup, lkup_len); /* Find palindromes centered on n + 0.5. */ get_find_palindromes_at(x_holder.ptr, x_len, n, n + 1, max_loop_len1, min_arm_len, max_nmis, lkup, lkup_len); } return _reported_matches_asSEXP(); }
/* --- .Call ENTRY POINT --- */ SEXP match_XStringSet_XStringViews(SEXP pattern, SEXP subject, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP matches_as, SEXP envir) { XStringSet_holder P; int P_length, i; Chars_holder S, P_elt; const char *algo, *ms_mode; P = _hold_XStringSet(pattern); P_length = _get_length_from_XStringSet_holder(&P); S = hold_XRaw(subject); algo = CHAR(STRING_ELT(algorithm, 0)); ms_mode = CHAR(STRING_ELT(matches_as, 0)); _init_match_reporting(ms_mode, P_length); for (i = 0; i < P_length; i++) { P_elt = _get_elt_from_XStringSet_holder(&P, i); _set_active_PSpair(i); _match_pattern_XStringViews(&P_elt, &S, views_start, views_width, max_mismatch, min_mismatch, with_indels, fixed, algo); } return _MatchBuf_as_SEXP(_get_internal_match_buf(), envir); }
/* --- .Call ENTRY POINT --- * Args: * x: An XStringSetList object. * sep: An XString object of the same seqtype as 'x'. * Returns an XStringSet object parallel to and of the same seqtype as 'x'. */ SEXP XStringSetList_unstrsplit(SEXP x, SEXP sep, SEXP seqtype) { XStringSetList_holder x_holder; XStringSet_holder x_elt_holder, ans_holder; Chars_holder sep_holder, ans_elt_holder; int x_len, sep_len, i; const char *seqtype0; char ans_elt_type[37]; /* longest string should be "DNAString" */ char ans_classname[40]; /* longest string should be "DNAStringSet" */ SEXP ans, ans_width, ans_names; x_holder = _hold_XStringSetList(x); x_len = _get_length_from_XStringSetList_holder(&x_holder); sep_holder = hold_XRaw(sep); sep_len = sep_holder.length; seqtype0 = CHAR(STRING_ELT(seqtype, 0)); if (snprintf(ans_elt_type, sizeof(ans_elt_type), "%sString", seqtype0) >= sizeof(ans_elt_type)) error("Biostrings internal error in " "XStringSetList_unstrsplit(): " "'ans_elt_type' buffer too small"); if (snprintf(ans_classname, sizeof(ans_classname), "%sSet", ans_elt_type) >= sizeof(ans_classname)) error("Biostrings internal error in " "XStringSetList_unstrsplit(): " "'ans_classname' buffer too small"); /* 1st pass: compute 'ans_width' */ PROTECT(ans_width = NEW_INTEGER(x_len)); for (i = 0; i < x_len; i++) { x_elt_holder = _get_elt_from_XStringSetList_holder( &x_holder, i); INTEGER(ans_width)[i] = compute_joined_strings_length( &x_elt_holder, sep_len); } /* Allocate 'ans' */ PROTECT(ans = alloc_XRawList(ans_classname, ans_elt_type, ans_width)); /* 2nd pass: fill 'ans' */ ans_holder = _hold_XStringSet(ans); for (i = 0; i < x_len; i++) { x_elt_holder = _get_elt_from_XStringSetList_holder( &x_holder, i); ans_elt_holder = _get_elt_from_XStringSet_holder( &ans_holder, i); join_strings_in_buf((char *) ans_elt_holder.ptr, &x_elt_holder, sep_holder.ptr, sep_holder.length); } PROTECT(ans_names = duplicate(get_CompressedList_names(x))); _set_XStringSet_names(ans, ans_names); UNPROTECT(3); return ans; }
/* --- .Call ENTRY POINT --- */ SEXP XString_match_pattern(SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP count_only) { Chars_holder P, S; const char *algo; int is_count_only; P = hold_XRaw(pattern); S = hold_XRaw(subject); algo = CHAR(STRING_ELT(algorithm, 0)); is_count_only = LOGICAL(count_only)[0]; _init_match_reporting(is_count_only ? "MATCHES_AS_COUNTS" : "MATCHES_AS_RANGES", 1); _match_pattern_XString(&P, &S, max_mismatch, min_mismatch, with_indels, fixed, algo); return _reported_matches_asSEXP(); }
/* --- .Call ENTRY POINT --- */ SEXP match_PDict3Parts_XString(SEXP pptb, SEXP pdict_head, SEXP pdict_tail, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, SEXP matches_as, SEXP envir) { HeadTail headtail; Chars_holder S; MatchPDictBuf matchpdict_buf; headtail = _new_HeadTail(pdict_head, pdict_tail, pptb, max_mismatch, fixed, 1); S = hold_XRaw(subject); matchpdict_buf = new_MatchPDictBuf_from_PDict3Parts(matches_as, pptb, pdict_head, pdict_tail); match_pdict(pptb, &headtail, &S, max_mismatch, min_mismatch, fixed, &matchpdict_buf); return _MatchBuf_as_SEXP(&(matchpdict_buf.matches), envir); }
/* --- .Call ENTRY POINT --- */ SEXP palindrome_arm_length(SEXP x, SEXP max_mismatch, SEXP L2R_lkup) { Chars_holder x_holder; int x_len, max_nmis, lkup_len, arm_len; const int *lkup; x_holder = hold_XRaw(x); x_len = x_holder.length; max_nmis = INTEGER(max_mismatch)[0]; if (L2R_lkup == R_NilValue) { lkup = NULL; lkup_len = 0; } else { lkup = INTEGER(L2R_lkup); lkup_len = LENGTH(L2R_lkup); } arm_len = get_palindrome_arm_length(x_holder.ptr, x_len, max_nmis, lkup, lkup_len); return ScalarInteger(arm_len); }
/* --- .Call ENTRY POINT --- */ SEXP match_PDict3Parts_XStringViews(SEXP pptb, SEXP pdict_head, SEXP pdict_tail, SEXP subject, SEXP views_start, SEXP views_width, SEXP max_mismatch, SEXP min_mismatch, SEXP fixed, SEXP matches_as, SEXP envir) { HeadTail headtail; int tb_length; Chars_holder S, S_view; int nviews, v, *view_start, *view_width, view_offset; MatchPDictBuf matchpdict_buf; MatchBuf global_match_buf; tb_length = _get_PreprocessedTB_length(pptb); headtail = _new_HeadTail(pdict_head, pdict_tail, pptb, max_mismatch, fixed, 1); S = hold_XRaw(subject); matchpdict_buf = new_MatchPDictBuf_from_PDict3Parts(matches_as, pptb, pdict_head, pdict_tail); global_match_buf = _new_MatchBuf(matchpdict_buf.matches.ms_code, tb_length); nviews = LENGTH(views_start); for (v = 0, view_start = INTEGER(views_start), view_width = INTEGER(views_width); v < nviews; v++, view_start++, view_width++) { view_offset = *view_start - 1; if (view_offset < 0 || view_offset + *view_width > S.length) error("'subject' has \"out of limits\" views"); S_view.ptr = S.ptr + view_offset; S_view.length = *view_width; match_pdict(pptb, &headtail, &S_view, max_mismatch, min_mismatch, fixed, &matchpdict_buf); _MatchPDictBuf_append_and_flush(&global_match_buf, &matchpdict_buf, view_offset); } return _MatchBuf_as_SEXP(&global_match_buf, envir); }
/* --- .Call ENTRY POINT --- * Arguments are the same as for XString_match_pattern() except for: * subject: XStringSet object. */ SEXP XStringSet_vmatch_pattern(SEXP pattern, SEXP subject, SEXP max_mismatch, SEXP min_mismatch, SEXP with_indels, SEXP fixed, SEXP algorithm, SEXP ms_mode) { Chars_holder P, S_elt; XStringSet_holder S; int S_length, j; const char *algo; P = hold_XRaw(pattern); S = _hold_XStringSet(subject); S_length = _get_XStringSet_length(subject); algo = CHAR(STRING_ELT(algorithm, 0)); _init_match_reporting(CHAR(STRING_ELT(ms_mode, 0)), S_length); for (j = 0; j < S_length; j++) { S_elt = _get_elt_from_XStringSet_holder(&S, j); _set_active_PSpair(j); _match_pattern_XString(&P, &S_elt, max_mismatch, min_mismatch, with_indels, fixed, algo); } return _MatchBuf_as_SEXP(_get_internal_match_buf(), R_NilValue); }