// FIXME: Pass 'const HeadTail *' instead of 'pdict_head' // and 'pdict_tail'. Also change MatchPDictBuf struct so the // head_widths and tail_widths members are IntAE buffers. static MatchPDictBuf new_MatchPDictBuf_from_PDict3Parts(SEXP matches_as, SEXP pptb, SEXP pdict_head, SEXP pdict_tail) { int tb_length, tb_width; const int *head_widths, *tail_widths; tb_length = _get_PreprocessedTB_length(pptb); tb_width = _get_PreprocessedTB_width(pptb); if (pdict_head == R_NilValue) head_widths = NULL; else head_widths = INTEGER(_get_XStringSet_width(pdict_head)); if (pdict_tail == R_NilValue) tail_widths = NULL; else tail_widths = INTEGER(_get_XStringSet_width(pdict_tail)); return _new_MatchPDictBuf(matches_as, tb_length, tb_width, head_widths, tail_widths); }
/* * --- .Call ENTRY POINT --- * Return an AAStringSet object. */ SEXP DNAStringSet_translate(SEXP x, SEXP base_codes, SEXP lkup, SEXP skipcode) { cachedXStringSet X, Y; cachedCharSeq X_elt, Y_elt; char skipcode0; int ans_length, i, errcode; SEXP ans, width, ans_width; TwobitEncodingBuffer teb; X = _cache_XStringSet(x); skipcode0 = (unsigned char) INTEGER(skipcode)[0]; ans_length = _get_cachedXStringSet_length(&X); PROTECT(width = NEW_INTEGER(ans_length)); for (i = 0; i < ans_length; i++) { X_elt = _get_cachedXStringSet_elt(&X, i); INTEGER(width)[i] = X_elt.length / 3; } PROTECT(ans = alloc_XRawList("AAStringSet", "AAString", width)); Y = _cache_XStringSet(ans); teb = _new_TwobitEncodingBuffer(base_codes, 3, 0); ans_width = _get_XStringSet_width(ans); for (i = 0; i < ans_length; i++) { X_elt = _get_cachedXStringSet_elt(&X, i); Y_elt = _get_cachedXStringSet_elt(&Y, i); errcode = translate(&X_elt, &Y_elt, &teb, lkup, skipcode0); if (errcode == -1) { UNPROTECT(2); if (ans_length == 1) error("%s", errmsg_buf); else error("in 'x[[%d]]': %s", i + 1, errmsg_buf); } if (errcode == 1) { if (ans_length == 1) warning("%s", errmsg_buf); else warning("in 'x[[%d]]': %s", i + 1, errmsg_buf); } INTEGER(ans_width)[i] = Y_elt.length; } UNPROTECT(2); return ans; }