int main(int argc, char *argv[]) { // Intialize the R environment. int r_argc = 2; char *r_argv[] = { "R", "--silent" }; Rf_initEmbeddedR(r_argc, r_argv); int arg[] = { 1, 2, 3, 4, 5 }; // Invoke a function in R source("func.R"); R_add1(5, arg); // Release R environment Rf_endEmbeddedR(0); return(0); }
int64_t R_bns_fasta2bntseq(gzFile fp_fa, const char *prefix) { // extern void seq_reverse(int len, ubyte_t *seq, int is_comp); // in bwaseqio.c kseq_t *seq; char name[1024]; bntseq_t *bns; uint8_t *pac = 0; uint8_t *reverse_pac = NULL; int32_t m_seqs, m_holes; int64_t ret = -1, m_pac, l, m_r_pac; bntamb1_t *q; FILE *fp, *fp_r; int i; // initialization seq = kseq_init(fp_fa); bns = (bntseq_t*)calloc(1, sizeof(bntseq_t)); bns->seed = 11; // fixed seed for random generator srand48(bns->seed); m_seqs = m_holes = 8; m_pac = 0x10000; bns->anns = (bntann1_t*)calloc(m_seqs, sizeof(bntann1_t)); bns->ambs = (bntamb1_t*)calloc(m_holes, sizeof(bntamb1_t)); pac = calloc(m_pac/NT_PER_BYTE, 1); q = bns->ambs; strcpy(name, prefix); strcat(name, ".pac"); fp = xopen(name, "wb"); memset(name, '\0', 1024);strcpy(name, prefix); strcat(name, ".rpac"); fp_r = xopen(name, "wb"); // read sequences while (kseq_read(seq) >= 0) pac = R_add1(seq, bns, pac, &m_pac, &m_seqs, &m_holes, &q); // add the reverse complemented sequence ret = bns->l_pac; fprintf(stderr, "[R_bns_fasta2bntseq]:reverse_pac!\n"); m_r_pac = (bns->l_pac +NT_PER_BYTE-1)/NT_PER_BYTE *NT_PER_BYTE; reverse_pac = calloc(m_r_pac/NT_PER_BYTE, sizeof(uint8_t)); for(l = bns->l_pac-1, i =0; l>=0, i < bns->l_pac; --l, ++i) { _set_pac(reverse_pac, i, _get_pac(pac, l)); } ubyte_t ct; { // finalize .pac and file fwrite(pac, 1, (bns->l_pac>>1) + ((bns->l_pac&1) == 0? 0 : 1), fp); // the following codes make the pac file size always (l_pac/4+1+1) if (bns->l_pac % NT_PER_BYTE == 0) { ct = 0; fwrite(&ct, 1, 1, fp); } ct = bns->l_pac % NT_PER_BYTE; fwrite(&ct, 1, 1, fp); // close .pac file fclose(fp); } { // finalize .rpac and file fwrite(reverse_pac, 1, (bns->l_pac>>1) + ((bns->l_pac&1) == 0? 0 : 1), fp_r); // the following codes make the pac file size always (l_pac/4+1+1) if (bns->l_pac % NT_PER_BYTE == 0) { ct = 0; fwrite(&ct, 1, 1, fp_r); } ct = bns->l_pac % NT_PER_BYTE; fwrite(&ct, 1, 1, fp_r); // close .rpac file fclose(fp_r); } bns_dump(bns, prefix); bns_destroy(bns); kseq_destroy(seq); free(pac); free(reverse_pac); return ret; }