Example #1
0
SEXP parse_headers(SEXP sRaw) {
    SEXP res = PROTECT(allocVector(STRSXP, MAX_HDR_ENTRIES)), rn = allocVector(STRSXP, MAX_HDR_ENTRIES);
    Rf_setAttrib(res, R_NamesSymbol, rn);
    int i = 0;
    const char *cs = (const char*) RAW(sRaw), *c = cs, *e;
    R_xlen_t len = XLENGTH(sRaw), ct = 0;
    e = c + len;
    while (c < e) {
        const char *r = memchr(c, ':', e - c);
        if (!r) /* we jsut ignore trailing content - it shouldn't be there ... */
            break;

        if (i == MAX_HDR_ENTRIES)
            Rf_error("Sorry, too many header entries, aborting");

        /* we have header field entry - add it */
        SET_STRING_ELT(rn, i, mkCharLen(c, r - c));
        c = r + 1;
        while (c < e && (*c == ' ' || *c == '\t')) c++;
        const char *val = c;
        while (1) {
            r = memchr(c, '\n', e - c);
            /* if we don't find a newline then just use everything till the end */
            if (!r) {
                while (e > c && (e[-1] == '\r' || e[-1] == '\n')) e--;
                SET_STRING_ELT(res, i, mkCharLen(val, e - val));
                i++;
                c = e; /* end */
                break;
            }
            /* advance */
            c = r + 1;
            /* not a continuation? add it */
            if (!(c < e && (*c == ' ' || *c == '\t'))) {
                /* trim newlines */
                while (r > val && (*r == '\n' || *r == '\t')) r--;
                SET_STRING_ELT(res, i, mkCharLen(val, r - val));
                i++;
                break;
            }
            /* continuation */
        }
    }
    SETLENGTH(rn, i);
    SETLENGTH(res, i);
    UNPROTECT(1);
    return res;
}
Example #2
0
SEXP dotask(SEXP Sclient, SEXP Sfun, SEXP Swork, SEXP Suval, SEXP Sback, SEXP Shigh){
   rgearman_client_t *client = (rgearman_client_t *)R_ExternalPtrAddr(Sclient);
   SEXP ret;
   const char *fun, *work, *uval;
   int back, high;

   fun = (Sfun != R_NilValue)? (const char *)CHAR(STRING_ELT(Sfun,0)) : NULL;
   work = (Swork != R_NilValue)? (const char *)CHAR(STRING_ELT(Swork,0)) : NULL;
   uval = (Suval != R_NilValue)? (const char *)CHAR(STRING_ELT(Suval,0)) : NULL;

   back = LOGICAL(Sback)[0];
   high = (Shigh != R_NilValue) ? LOGICAL(Shigh)[0] : -1;

   if (back){
      gearman_return_t (*gm_fun)(gearman_client_st *client, const char *function_name, const char *unique, const void *workload, size_t workload_size, gearman_job_handle_t job_handle); 
      char *job = (char *)R_Calloc(1,gearman_job_handle_t);
      gm_fun = (high == -1)? gearman_client_do_background : (high)? gearman_client_do_high_background : gearman_client_do_low_background ;
      client->lastretcode = gm_fun(client->client,fun,uval,work,strlen(work),job);
      ret = PROTECT(allocVector(STRSXP,1));
      SET_STRING_ELT(ret,0,mkChar(job));
      R_Free(job);
      UNPROTECT(1);
   } else {
      void *(*gm_fun)(gearman_client_st *client, const char *function_name, const char *unique, const void *workload, size_t workload_size, size_t *result_size, gearman_return_t *ret_ptr); 
      size_t resultsize;
      void *result;
      gm_fun = (high == -1)? gearman_client_do : (high)? gearman_client_do_high : gearman_client_do_low ;
      result = gm_fun(client->client,fun,uval,work,strlen(work),&resultsize,&client->lastretcode);
      ret = PROTECT(allocVector(STRSXP,1));
      SET_STRING_ELT(ret,0,mkCharLen((char *)result,resultsize));
      UNPROTECT(1);
   }

   return ret;
}
Example #3
0
// take lex return
// sort by tok and iterate over the list skipping duplicates
SEXP ng_extract_words(SEXP ng_ptr, SEXP ngsize_)
{
  int i, j, k;
  int len, retlen;
  char *buf;
  ngram_t *ng = (ngram_t *) getRptr(ng_ptr);
  const int ngsize = INTEGER(ngsize_)[0];
  wordlist_t *wl;
  
  SEXP RET;
  
  // Count # words
  
  retlen = 2;
  
  PROTECT(RET = allocVector(STRSXP, retlen));
  
  // Convert them
  k = 0;
  
  for(i=0; i<ngsize; i++)
  {
    wl = ng[i].words;
    
    while(wl)
    {
      print_word(ng[i].words->word);
    }
    
    if(ng[i].words->word == NULL)
    {
/*        SET_STRING_ELT(RET, i, mkChar("<NA>"));*/
      goto nextcycle;
    }
    
    len = ng[i].words->word->len;
    buf = malloc(len * sizeof(buf));
    
    for (j=0; j<len; j++)
      buf[j] = ng[i].words->word->s[j];
    
    SET_STRING_ELT(RET, k, mkCharLen(buf, len));
    
    free(buf);
    
    
    nextcycle:
      k++;
      wl = wl->next;
  }
  
  UNPROTECT(1);
  return RET;
}
Example #4
0
SEXP ng_extract_str(SEXP str_ptr, SEXP R_strlen)
{
  SEXP RET;
  char *str = (char *) getRptr(str_ptr);
  
  PROTECT(RET = allocVector(STRSXP, 1));
  
  SET_STRING_ELT(RET, 0, mkCharLen(str, INTEGER(R_strlen)[0]));
  
  UNPROTECT(1);
  return RET;
}
/* type: 0=CHARSXP, 1=STRSXP, 2=RAWSXP
   as_matrix: 0 or 1, ignored when type is 0
   q_len, q_break, s_len: ignored when type is 0 */
static SEXP make_encoding_from_CharAE(const CharAE *buf,
				      int type, int as_matrix,
				      int q_len, int q_break, int s_len)
{
	SEXP ans, ans_elt, ans_dim;
	int buf_nelt, i, nrow;

	buf_nelt = _CharAE_get_nelt(buf);
	if (type == 0 || (type == 1 && !as_matrix)) {
		PROTECT(ans = mkCharLen(buf->elts, buf_nelt));
		if (type == 1) {
			PROTECT(ans = ScalarString(ans));
			UNPROTECT(1);
		}
		UNPROTECT(1);
		return ans;
	}
	if (type == 1) {
		PROTECT(ans = NEW_CHARACTER(buf_nelt));
		for (i = 0; i < buf_nelt; i++) {
			PROTECT(ans_elt = mkCharLen(buf->elts + i, 1));
			SET_STRING_ELT(ans, i, ans_elt);
			UNPROTECT(1);
		}
	} else {
		PROTECT(ans = _new_RAW_from_CharAE(buf));
	}
	if (as_matrix) {
		nrow = q_len;
		if (q_break != 0)
			nrow += 2;
		PROTECT(ans_dim	= NEW_INTEGER(2));
		INTEGER(ans_dim)[0] = nrow;
		INTEGER(ans_dim)[1] = s_len;
		SET_DIM(ans, ans_dim);
		UNPROTECT(1);
	}
	UNPROTECT(1);
	return ans;
}
Example #6
0
SEXP Rsockread(SEXP ssock, SEXP smaxlen)
{
    if (length(ssock) != 1) error("invalid 'socket' argument");
    int sock = asInteger(ssock), maxlen = asInteger(smaxlen);
    char buf[maxlen+1], *abuf[1];
    abuf[0] = buf;
    if(!initialized) internet_Init();
    if(initialized > 0)
	(*ptr->sockread)(&sock, abuf, &maxlen);
    else
	error(_("socket routines cannot be loaded"));
    return Rf_ScalarString(mkCharLen(buf, maxlen));
}
Example #7
0
SEXP _new_CHARACTER_from_CharAEAE(const CharAEAE *aeae)
{
	int nelt, i;
	SEXP ans, ans_elt;
	CharAE *ae;

	nelt = _CharAEAE_get_nelt(aeae);
	PROTECT(ans = NEW_CHARACTER(nelt));
	for (i = 0; i < nelt; i++) {
		ae = aeae->elts[i];
		PROTECT(ans_elt = mkCharLen(ae->elts, _CharAE_get_nelt(ae)));
		SET_STRING_ELT(ans, i, ans_elt);
		UNPROTECT(1);
	}
	UNPROTECT(1);
	return ans;
}
Example #8
0
SEXP Rsockread(SEXP ssock, SEXP smaxlen)
{
    if (length(ssock) != 1) error("invalid 'socket' argument");
    int sock = asInteger(ssock), maxlen = asInteger(smaxlen);
    char buf[maxlen+1], *abuf[1];
    abuf[0] = buf;
    if(!initialized) internet_Init();
    if(initialized > 0)
	(*ptr->sockread)(&sock, abuf, &maxlen);
    else
	error(_("socket routines cannot be loaded"));
    SEXP ans = PROTECT(allocVector(STRSXP, 1));
    SET_STRING_ELT(ans, 0, mkCharLen(buf, maxlen));
    UNPROTECT(1);
    return ans;
		       
}
Example #9
0
SEXP ng_extract_ngrams(SEXP ng_ptr, SEXP ngsize_)
{
  int i, j, len;
  char *buf;
  ngramlist_t *ngl = (ngramlist_t *) getRptr(ng_ptr);
  ngram_t *ng = ngl->ng;
  const int ngsize = INTEGER(ngsize_)[0];
  wordlist_t *wl;
  
  SEXP RET;
  PROTECT(RET = allocVector(STRSXP, ngsize));
  
  
  for(i=0; i<ngsize; i++)
  {
    len = 0;
    wl = ng[i].words;
    
    while (wl)
    {
      len += wl->word->len;
      len++; // spaces
      wl = wl->next;
    }
    
    len--; // apparently mkCharLen handles the NUL terminator for some reason
    
    buf = malloc(len * sizeof(*buf));
    
    for (j=0; j<len; j++)
      buf[j] = ng[i].words->word->s[j];
    
    SET_STRING_ELT(RET, i, mkCharLen(buf, len));
    
    
    free(buf);
  }
  
  UNPROTECT(1);
  return RET;
}
Example #10
0
SEXP _read_bam_header(SEXP ext, SEXP what)
{
    samfile_t *sfile = BAMFILE(ext)->file;
    bam_header_t *header = sfile->header;

    SEXP ans = PROTECT(NEW_LIST(2));
    SEXP nms = NEW_CHARACTER(2);
    setAttrib(ans, R_NamesSymbol, nms);
    SET_STRING_ELT(nms, 0, mkChar("targets"));
    SET_STRING_ELT(nms, 1, mkChar("text"));

    if (LOGICAL(what)[0] == TRUE) { /* 'targets' */
        int n_elts = header->n_targets;
        SET_VECTOR_ELT(ans, 0, NEW_INTEGER(n_elts));
        SEXP tlen = VECTOR_ELT(ans, 0);   /* target length */
        SEXP tnm = NEW_CHARACTER(n_elts); /* target name */
        setAttrib(tlen, R_NamesSymbol, tnm);
        for (int j = 0; j < n_elts; ++j) {
            INTEGER(tlen)[j] = header->target_len[j];
            SET_STRING_ELT(tnm, j, mkChar(header->target_name[j]));
        }
    }

    if (LOGICAL(what)[1] == TRUE) { /* 'text' */
        int n_text_elts = 0;
        for (int i = 0; i < header->l_text; ++i)
            if (header->text[i] == '\n')
                n_text_elts += 1;
        SET_VECTOR_ELT(ans, 1, NEW_LIST(n_text_elts));
        SEXP text = VECTOR_ELT(ans, 1);
        SEXP tag = NEW_CHARACTER(n_text_elts);
        setAttrib(text, R_NamesSymbol, tag);

        int start = 0, end;
        for (int i = 0; i < n_text_elts; ++i) {
            int n_elts = header->text[start] == '\n' ? 0 : 1;
            end = start;
            while (header->text[end] != '\n') {
                if (header->text[end] == '\t')
                    ++n_elts;
                ++end;
            }
            if (n_elts == 0) {
                SET_VECTOR_ELT(text, i, NEW_CHARACTER(0));
                /* SET_STRING_ELT(tag, i, mkChar("")); */
                start = end + 1;
                continue;
            }
            SET_VECTOR_ELT(text, i, NEW_CHARACTER(n_elts - 1));
            SEXP elts = VECTOR_ELT(text, i);

            for (int j = 0; j < n_elts; ++j) {
                end = start;
                while (header->text[end] != '\t' && header->text[end] != '\n')
                    ++end;
                SEXP elt = mkCharLen(&header->text[start], end - start);
                if (j == 0)   /* tag */
                    SET_STRING_ELT(tag, i, elt);
                else
                    SET_STRING_ELT(elts, j - 1, elt);
                start = end + 1;
            }
        }
    }

    UNPROTECT(1);
    return ans;
}
Example #11
0
SEXP getPass_readline_masked(SEXP msg, SEXP showstars_, SEXP noblank_)
{
  SEXP ret;
  const int showstars = INTEGER(showstars_)[0];
  const int noblank = INTEGER(noblank_)[0];
  int i = 0;
  int j;
  char c;
  ctrlc = CTRLC_NO; // must be global!
  
  REprintf(CHARPT(msg, 0));
  
#if !(OS_WINDOWS)
  struct termios tp, old;
  tcgetattr(STDIN_FILENO, &tp);
  old = tp;
  tp.c_lflag &= ~(ECHO | ICANON | ISIG);
  tcsetattr(0, TCSAFLUSH, &tp);

  #if OS_LINUX
    signal(SIGINT, ctrlc_handler);
  #else
    struct sigaction sa;
    sa.sa_handler = ctrlc_handler;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sigaction(SIGINT, &sa, NULL);
  #endif
  
#endif
  
  for (i=0; i<PWLEN; i++)
  {
#if OS_WINDOWS
    c = _getch();
#else
    c = fgetc(stdin);
#endif
    
    // newline
    if (c == '\n' || c == '\r')
    {
      if (noblank && i == 0)
      {
        i--;
        continue;
      }
      else
        break;
    }
    // backspace
    else if (c == '\b' || c == '\177')
    {
      if (i == 0)
      {
        i--;
        continue;
      }
      else
      {
        if (showstars)
          REprintf("\b \b");
        
        pw[--i] = '\0';
        i--;
      }
    }
    // C-c
    else if (ctrlc == CTRLC_YES || c == 3 || c == '\xff')
    {
#if !(OS_WINDOWS)
      tcsetattr(0, TCSANOW, &old);
#endif
      REprintf("\n");
      return R_NilValue;
    }
    // store value
    else
    {
      if (showstars)
        REprintf("*");
      
      pw[i] = c;
    }
  }

#if !(OS_WINDOWS)
  tcsetattr(0, TCSANOW, &old);
#endif
  
  if (i == PWLEN)
  {
    REprintf("\n");
    error("character limit exceeded");
  }
  
  if (showstars || strncmp(CHARPT(msg, 0), "", 1) != 0)
    REprintf("\n");
  
  PROTECT(ret = allocVector(STRSXP, 1));
  SET_STRING_ELT(ret, 0, mkCharLen(pw, i));
  
  for (j=0; j<i; j++)
    pw[j] = '\0';
  
  UNPROTECT(1);
  return ret;
}
Example #12
0
SEXP R_ng_asweka(SEXP R_str, SEXP min_n_, SEXP max_n_, SEXP R_sep)
{
	int i, j;
	char *str = CHARPT(R_str, 0); 
	char *sep = CHARPT(R_sep, 0); 
	const int min_n = INTEGER(min_n_)[0];
	const int max_n = INTEGER(max_n_)[0];
	int str_len;
	sentencelist_t *sl;
	wordlist_t *wptr;
	int numwords;
	int cur_n;
	size_t len;
	const char **starts = NULL;
	int *lens = NULL;
	int word_i;
	char *errstr;

	SEXP RET;

	str_len = strlen(str);

	if(*sep == '\0')
		sep=NULL;

	sl = lex_simple(str, str_len, sep);

	if (sl == NULL)
		error("out of memory");

	numwords = 0;
	for(i=0;i<sl->filled;i++)
		for(wptr=sl->words[i];wptr && wptr->word->s;wptr=wptr->next)
			numwords++;

	if (numwords == 0){
		errstr="no words";
		goto memerr;
	}

	len = numwords;
	starts = malloc(sizeof(*starts)*numwords);
	if (starts == NULL){
		errstr="out of memory";
		goto memerr;
	}

	lens = malloc(sizeof(*lens)*numwords);
	if (lens == NULL){
		errstr="out of memory";
		goto memerr;
	}
	
	for(i=sl->filled-1;i>=0;i--){
		for(wptr=sl->words[i];wptr && wptr->word->s;wptr=wptr->next){
			--len;
			starts[len]=wptr->word->s;
			lens[len]=wptr->word->len;
		}
	}

	i = numwords-(min_n-1);
	j = numwords-(max_n-1);
	len = i*(i+1)/2 - j*(j-1)/2;
	PROTECT(RET = allocVector(STRSXP, len));

	word_i = 0;
	for(cur_n=max_n;cur_n>=min_n;cur_n--){
		for(i=0;i<numwords-(cur_n-1);i++){
			len = starts[i+cur_n-1] - starts[i] + lens[i+cur_n-1]; 
			SET_STRING_ELT(RET, word_i, mkCharLen(starts[i], len));
			
			word_i++;
		}
	}

	free(starts);
	free(lens);
	free_sentencelist(sl,free_wordlist);

	UNPROTECT(1);
	return RET;

memerr:
	freeif(starts);
	freeif(lens);
	free_sentencelist(sl,free_wordlist);
	error(errstr);
}