Exemple #1
0
/* --- .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();
}
Exemple #2
0
/* --- .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;
}
Exemple #4
0
/* --- .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();
}
Exemple #5
0
/* --- .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);
}
Exemple #6
0
/* --- .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);
}
Exemple #7
0
/* --- .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);
}
Exemple #8
0
/* --- .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);
}