void SC_LanguageClient::initRuntime(const Options& opt) { // start virtual machine if (!mHiddenClient->mRunning) { #ifdef __linux__ char deprecatedSupportDirectory[PATH_MAX]; sc_GetUserHomeDirectory(deprecatedSupportDirectory, PATH_MAX); sc_AppendToPath(deprecatedSupportDirectory, PATH_MAX, "share/SuperCollider"); if (sc_DirectoryExists(deprecatedSupportDirectory)) { char supportDirectory[PATH_MAX]; sc_GetUserAppSupportDirectory(supportDirectory, PATH_MAX); postfl("WARNING: Deprecated support directory detected: %s\n" "Extensions and other contents in this directory will not be available until you move them to the new support directory:\n" "%s\n" "Quarks will need to be reinstalled due to broken symbolic links.\n\n", deprecatedSupportDirectory, supportDirectory); } #endif mHiddenClient->mRunning = true; if (opt.mRuntimeDir) { int err = chdir(opt.mRuntimeDir); if (err) error("Cannot change to runtime directory: %s", strerror(errno)); } pyr_init_mem_pools(opt.mMemSpace, opt.mMemGrow); init_OSC(opt.mPort); schedInit(); onInitRuntime(); } }
void sc_GetUserAppSupportDirectory(char *str, int size) { // XDG support according to http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html const char * xdg_data_home = getenv("XDG_DATA_HOME"); if (xdg_data_home) { strncpy(str, xdg_data_home, size); sc_AppendToPath(str, size, "SuperCollider"); return; } #if defined(_WIN32) win32_GetKnownFolderPath(CSIDL_LOCAL_APPDATA, str, size); sc_AppendToPath(str, size, "SuperCollider"); #else sc_GetUserHomeDirectory(str, size); #if defined(SC_IPHONE) sc_AppendToPath(str, size, "Documents"); #elif defined(__APPLE__) // Get the main bundle name for the app sc_AppendToPath(str, size, "Library/Application Support"); sc_AppendBundleName(str, size); #else sc_AppendToPath(str, size, ".local/share/SuperCollider"); #endif #endif }
void sc_GetUserAppSupportDirectory(char *str, int size) { // XDG support according to http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html const char * xdg_data_home = getenv("XDG_DATA_HOME"); if (xdg_data_home) { strncpy(str, xdg_data_home, size); sc_AppendToPath(str, size, "SuperCollider"); return; } #if defined(_WIN32) ITEMIDLIST * pidl; char buf[MAX_PATH]; SHGetFolderLocation(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, &pidl); SHGetPathFromIDList( pidl, buf ); ILFree(pidl); strncpy(str, buf, size); sc_AppendToPath(str, size, "SuperCollider"); #else sc_GetUserHomeDirectory(str, size); #if defined(SC_IPHONE) sc_AppendToPath(str, size, "Documents"); #elif defined(__APPLE__) // Get the main bundle name for the app sc_AppendToPath(str, size, "Library/Application Support"); sc_AppendBundleName(str, size); #else sc_AppendToPath(str, size, ".local/share/SuperCollider"); #endif #endif }
// Get the directory for the configuration files. void sc_GetUserConfigDirectory(char *str, int size) { // XDG support according to http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html const char * xdg_config_home = getenv("XDG_CONFIG_HOME"); if (xdg_config_home) { strncpy(str, xdg_config_home, size); sc_AppendToPath(str, size, "SuperCollider"); return; } #if defined(__linux__) || defined(__freebsd__) sc_GetUserHomeDirectory(str, size); sc_AppendToPath(str, size, ".config/SuperCollider"); #else sc_GetUserAppSupportDirectory(str, size); #endif }
char *sc_StandardizePath(const char *path, char *newpath2) { char newpath1[MAXPATHLEN]; newpath1[0] = '\0'; newpath2[0] = '\0'; size_t pathLen = strlen(path); if ((pathLen >= 2) && (path[0] == '~') && ((path[1] == '/') || (path[1] == '\\'))) { char home[PATH_MAX]; sc_GetUserHomeDirectory(home, PATH_MAX); if (home != 0) { if ((pathLen - 1 + strlen(home)) >= MAXPATHLEN) { return 0; } strcpy(newpath1, home); strcat(newpath1, path + 1); } else { if (pathLen >= MAXPATHLEN) { return 0; } strcpy(newpath1, path); newpath1[0] = '.'; } } else { if (pathLen >= MAXPATHLEN) { return 0; } strcpy(newpath1, path); } bool isAlias = false; if(sc_ResolveIfAlias(newpath1, newpath2, isAlias, PATH_MAX)!=0) { strcpy(newpath2, newpath1); } return newpath2; }