SEXP R_addTaskCallback(SEXP f, SEXP data, SEXP useData, SEXP name) { SEXP internalData; SEXP index; R_ToplevelCallbackEl *el; const char *tmpName = NULL; internalData = allocVector(VECSXP, 3); R_PreserveObject(internalData); SET_VECTOR_ELT(internalData, 0, f); SET_VECTOR_ELT(internalData, 1, data); SET_VECTOR_ELT(internalData, 2, useData); if(length(name)) tmpName = CHAR(STRING_ELT(name, 0)); PROTECT(index = allocVector(INTSXP, 1)); el = Rf_addTaskCallback(R_taskCallbackRoutine, internalData, (void (*)(void*)) R_ReleaseObject, tmpName, INTEGER(index)); if(length(name) == 0) { PROTECT(name = mkString(el->name)); setAttrib(index, R_NamesSymbol, name); UNPROTECT(1); } else { setAttrib(index, R_NamesSymbol, name); } UNPROTECT(1); return(index); }
void nvimcom_Start(int *vrb, int *odf, int *ols, int *anm, int *lbe, char **pth, char **vcv, char **srchls) { verbose = *vrb; opendf = *odf; openls = *ols; allnames = *anm; labelerr = *lbe; R_PID = getpid(); strncpy(nvimcom_version, *vcv, 31); if(getenv("NVIMR_TMPDIR")){ strncpy(nvimcom_home, *pth, 1023); strncpy(search_list, *srchls, 1023); strncpy(tmpdir, getenv("NVIMR_TMPDIR"), 500); if(getenv("NVIMR_SECRET")) strncpy(nvimsecr, getenv("NVIMR_SECRET"), 127); else REprintf("nvimcom: Environment variable NVIMR_SECRET is missing.\n"); } else { if(verbose) REprintf("nvimcom: It seems that R was not started by Neovim. The communication with Nvim-R will not work.\n"); tmpdir[0] = 0; return; } snprintf(liblist, 510, "%s/liblist_%s", tmpdir, getenv("NVIMR_ID")); snprintf(globenv, 510, "%s/globenv_%s", tmpdir, getenv("NVIMR_ID")); char envstr[1024]; envstr[0] = 0; if(getenv("LC_MESSAGES")) strcat(envstr, getenv("LC_MESSAGES")); if(getenv("LC_ALL")) strcat(envstr, getenv("LC_ALL")); if(getenv("LANG")) strcat(envstr, getenv("LANG")); int len = strlen(envstr); for(int i = 0; i < len; i++) envstr[i] = toupper(envstr[i]); if(strstr(envstr, "UTF-8") != NULL || strstr(envstr, "UTF8") != NULL){ nvimcom_is_utf8 = 1; strcpy(strL, "\xe2\x94\x94\xe2\x94\x80 "); strcpy(strT, "\xe2\x94\x9c\xe2\x94\x80 "); } else { nvimcom_is_utf8 = 0; strcpy(strL, "`- "); strcpy(strT, "|- "); } #ifndef WIN32 *flag_eval = 0; int fds[2]; if(pipe(fds) == 0){ ifd = fds[0]; ofd = fds[1]; ih = addInputHandler(R_InputHandlers, ifd, &nvimcom_uih, 32); } else { REprintf("setwidth error: pipe != 0\n"); ih = NULL; } #endif #ifdef WIN32 tid = _beginthread(nvimcom_server_thread, 0, NULL); #else pthread_create(&tid, NULL, nvimcom_server_thread, NULL); #endif if(nvimcom_failure == 0){ // Linked list sentinel firstList = calloc(1, sizeof(ListStatus)); firstList->key = (char*)malloc(13 * sizeof(char)); strcpy(firstList->key, "package:base"); for(int i = 0; i < 64; i++){ loadedlibs[i] = (char*)malloc(64 * sizeof(char)); loadedlibs[i][0] = 0; } for(int i = 0; i < 64; i++){ builtlibs[i] = (char*)malloc(64 * sizeof(char)); builtlibs[i][0] = 0; } obbrbuf1 = (char*)calloc(obbrbufzise, sizeof(char)); obbrbuf2 = (char*)calloc(obbrbufzise, sizeof(char)); if(!obbrbuf1 || !obbrbuf2) REprintf("nvimcom: Error allocating memory.\n"); Rf_addTaskCallback(nvimcom_task, NULL, free, "NVimComHandler", NULL); nvimcom_initialized = 1; if(verbose > 0) // TODO: use packageStartupMessage() REprintf("nvimcom %s loaded\n", nvimcom_version); if(verbose > 1) REprintf(" NVIMR_TMPDIR = %s\n NVIMR_ID = %s\n", tmpdir, getenv("NVIMR_ID")); } }