1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-11 14:41:06 +02:00
2010-01-24 09:19:39 +00:00

227 lines
5.9 KiB
C

/*
* New xlisp_path code by Dominic Mazzoni
*
* There is now a function provided to set the xlisp_path.
* This is particularly useful for external programs
* (e.g. Audacity, or a Nyquist GUI) that have their own
* mechanism of setting/finding the path. If xlisp_path
* is NULL, the old platform-specific methods are still
* used.
*/
/* CHANGE LOG
*
* 24-dec-05 RBD
* Made ';' a valid path separator for every system (to work
* around a windows installer limitation)
*
* 22-jul-07 RBD
* Added get_user_id()
*
* 9-jan-08 RBD
* Added find-in-xlisp-path as XLISP primitive
*/
#include <string.h>
#include "switches.h"
#include "xlisp.h"
static char *g_xlisp_path = NULL;
void set_xlisp_path(const char *p)
{
if (g_xlisp_path) {
free(g_xlisp_path);
g_xlisp_path = NULL;
}
if (p) {
g_xlisp_path = malloc(strlen(p)+1);
strcpy(g_xlisp_path, p);
}
}
#ifdef UNIX
const char *unix_return_xlisp_path()
{
char *paths = getenv("XLISPPATH");
if (!paths || !*paths) {
char msg[512];
sprintf(msg, "\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
"Warning: XLISP failed to find XLISPPATH in the environment.",
"If you are using Nyquist, probably you should cd to the",
"nyquist directory and type:",
" setenv XLISPPATH `pwd`/runtime:`pwd`/lib",
"or set XLISPPATH in your .login or .cshrc file.",
"If you use the bash shell, try:",
" XLISPPATH=`pwd`/runtime:`pwd`/lib; export XLISPPATH");
errputstr(msg);
}
return paths;
}
#endif
#ifdef WINDOWS
#include "winfun.h"
const char *windows_return_xlisp_path()
{
#define paths_max 1024
static char paths[paths_max];
get_xlisp_path(paths, paths_max);
/* make sure we got paths, and the list is not empty */
if (!paths[0]) {
sprintf(paths, "\n%s\n%s\n%s\n",
"Warning: XLISP failed to find XLISPPATH in the Registry.",
"You should follow the installation instructions. Enter an",
"empty string if you really want no search path.");
errputstr(paths);
}
return paths;
}
#endif
#ifdef MACINTOSH
const char *mac_return_xlisp_path()
{
#define paths_max 1024
static char paths[paths_max];
int prefs_found = false;
get_xlisp_path(paths, paths_max, &prefs_found);
if (!paths[0]) {
if (prefs_found) {
sprintf(paths, "\n%s\n%s\n%s\n",
"Warning: XLISP failed to find XLISPPATH in XLisp Preferences.",
"You should probably delete XLisp Preferences and let XLisp",
"create a new one for you.");
}
else {
sprintf(paths, "\n%s\n%s\n%s\n%s\n%s\n",
"Warning: XLISP failed to find XLisp Preferences.",
"You should manually locate and load the file runtime:init.lsp",
"Nyquist will create an XLisp Preferences file to automatically",
"find the file next time. You may edit XLisp Preferences to add",
"additional search paths, using a comma as separator.");
}
errputstr(paths);
}
return paths;
}
const char *get_user_id()
{
// not implemented for MACINTOSH (OS 9), just use "nyquist"
return "nyquist";
}
#endif
const char *return_xlisp_path()
{
if (g_xlisp_path)
return g_xlisp_path;
#ifdef WINDOWS
return windows_return_xlisp_path();
#endif
#ifdef MACINTOSH
return mac_return_xlisp_path();
#endif
#ifdef UNIX
return unix_return_xlisp_path();
#endif
}
char *g_xlptemp = NULL;
// find_in_xlisp_path -- find fname or fname.lsp by searching XLISP_PATH
//
// NOTE: this module owns the string. The string is valid
// until the next call to find_in_xlisp_path()
//
const char *find_in_xlisp_path(const char *fname)
{
const char *paths = return_xlisp_path();
if (!paths)
return NULL;
while (paths && *paths) {
FILE *fp;
const char *start;
int len;
/* skip over separator */
while (*paths == os_sepchar || *paths == ';') paths++;
/* find next directory */
start = paths;
while (*paths && (*paths != os_sepchar && *paths != ';'))
paths++;
if (g_xlptemp) {
free(g_xlptemp);
g_xlptemp = NULL;
}
len = paths - start;
g_xlptemp = malloc(len + strlen(fname) + 10);
memcpy(g_xlptemp, start, len);
if (len == 0)
continue;
/* add "/" if needed */
if (g_xlptemp[len-1] != os_pathchar)
g_xlptemp[len++] = os_pathchar;
/* append the file name */
memcpy(&g_xlptemp[len], fname, strlen(fname));
len += strlen(fname);
g_xlptemp[len] = 0;
/* printf("Attempting to open %s, start is %s\n", g_xlptemp, start); */
fp = osaopen(g_xlptemp, "r");
if (!fp) {
/* try appending the .lsp extension */
if (needsextension(g_xlptemp)) {
strcat(g_xlptemp, ".lsp");
fp = osaopen(g_xlptemp, "r");
if (!fp) {
g_xlptemp[strlen(g_xlptemp) - 4] = 0; /* remove .lsp */
}
}
}
if (fp) {
fclose(fp);
#ifdef MACINTOSH
/* We found the file ok, call setup_preferences to create
* XLisp Preferences file (this only happens if previous
* attempt to find the file failed
*/
setup_preferences(g_xlptemp);
#endif
return g_xlptemp;
}
}
/* It wasn't found */
return NULL;
}
/* xfind_in_xlisp_path -- search XLISPPATH for file, return full path */
LVAL xfind_in_xlisp_path()
{
LVAL string = xlgastring();
const char *path = (const char *) getstring(string);
xllastarg();
path = find_in_xlisp_path(path);
return (path ? cvstring(path) : NULL);
}