mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-17 16:40:07 +02:00
230 lines
6.4 KiB
C
230 lines
6.4 KiB
C
/* macstuff.c - macintosh interface routines for xlisp */
|
|
/* Written by Brian Kendig. */
|
|
/* This file contains the stuff that the other xlisp files call directly. */
|
|
|
|
#include "cext.h"
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <QuickDraw.h> /* for Random */
|
|
#include <Memory.h> /* for DisposePtr */
|
|
#include <SegLoad.h> /* for ExitToShell */
|
|
#include "xlisp.h"
|
|
#include <string.h>
|
|
#include "macint.h"
|
|
#include "MacCommandWin.h"
|
|
#define DELETE 0x08
|
|
|
|
/* externals */
|
|
extern FILE *tfp; /* transcript file pointer */
|
|
extern int cursorPos;
|
|
extern char *macgets (void);
|
|
|
|
/* local variables */
|
|
int lposition;
|
|
static char *linebuf = NULL, *lineptr;
|
|
static int numChars;
|
|
|
|
/* system-dependent variable definitions */
|
|
static const char os_pathchar = ':';
|
|
static const char os_sepchar = ',';
|
|
|
|
|
|
int isascii (char c) { return 1; } /* every char is an ascii char, isn't it? */
|
|
|
|
void osinit (char *banner) {
|
|
#ifdef SAFE_NYQUIST
|
|
SAFE_NYQUIST is not supported in macstuff.c
|
|
#endif
|
|
int i;
|
|
char version[] = "\nMacintosh interface by Brian Kendig, Erik A. Dahl, and Dominic Mazzoni.\n";
|
|
InitMac (); /* initialize the mac interface routines */
|
|
lposition = 0; /* initialize the line editor */
|
|
for (i = 0; banner[i] != '\0'; i++) macputc (banner[i]);
|
|
for (i = 0; version[i] != '\0'; i++) macputc (version[i]);
|
|
}
|
|
|
|
FILE *osaopen (char *name, char *mode) {
|
|
return fopen (name, mode);
|
|
}
|
|
|
|
FILE *osbopen (char *name, char *mode) {
|
|
FILE *f;
|
|
char nmode[4];
|
|
strcpy (nmode, mode); strcat (nmode, "b");
|
|
f = fopen(name, nmode);
|
|
return f;
|
|
}
|
|
|
|
int osclose (FILE *fp) { return (fclose (fp)); }
|
|
int osaputc (int ch, FILE *fp) { return (putc (ch, fp)); }
|
|
int osbputc (int ch, FILE *fp) { return (putc (ch, fp)); }
|
|
|
|
/* osagetc - get a character from an ascii file */
|
|
int osagetc(fp)
|
|
FILE *fp;
|
|
{
|
|
return (getc(fp));
|
|
}
|
|
|
|
int ostgetc (void) {
|
|
int i;
|
|
|
|
if (numChars <= 0) { /* get some more */
|
|
if (linebuf) DisposePtr (linebuf);
|
|
linebuf = macgets ();
|
|
i = 0;
|
|
while (linebuf[i] != '\0') i++;
|
|
numChars = i;
|
|
if (tfp) for (i = 0; i < numChars; i++) osaputc (linebuf[i], tfp);
|
|
lineptr = linebuf;
|
|
}
|
|
numChars--;
|
|
if (*lineptr == '\r') {
|
|
lineptr++;
|
|
return '\n';
|
|
} else return (*lineptr++);
|
|
}
|
|
|
|
void ostputc (int ch) {
|
|
macputc (ch);
|
|
if (tfp) osaputc (ch, tfp);
|
|
}
|
|
|
|
void osflush (void) {
|
|
lineptr = linebuf;
|
|
numChars = 0;
|
|
lposition = 0;
|
|
}
|
|
|
|
void oscheck (void) { DoEvent (); }
|
|
|
|
void oserror (char *msg) {
|
|
char line[100], *p;
|
|
sprintf (line,"error: %s\n",msg);
|
|
for (p = line; *p != '\0'; ++p) ostputc (*p);
|
|
}
|
|
|
|
void osfinish(void) {
|
|
/* dispose of everything... */
|
|
if (linebuf) DisposePtr(linebuf);
|
|
portaudio_exit();
|
|
MacWrapUp ();
|
|
ExitToShell ();
|
|
}
|
|
|
|
#define GPRINTF_MESSAGE_LEN 500
|
|
|
|
/* nyquist_printf -- system independent version of printf */
|
|
/*
|
|
* this function prints to console like printf, but using GUI
|
|
* rather than stdio when appropriate.
|
|
*
|
|
*/
|
|
void nyquist_printf(char *format, ...)
|
|
{
|
|
char temp[GPRINTF_MESSAGE_LEN];
|
|
va_list pvar;
|
|
char *p = temp;
|
|
va_start(pvar, format);
|
|
vsnprintf(temp, GPRINTF_MESSAGE_LEN, format, pvar);
|
|
va_end(pvar);
|
|
while (*p) ostputc(*p++);
|
|
}
|
|
|
|
int renamebackup (char *filename) { return 0; }
|
|
|
|
static FSSpec prefsFSSpec;
|
|
static int need_preferences_file = false;
|
|
static char xlisp_path[1024]; /* cache for the path */
|
|
static int valid_xlisp_path = false;
|
|
|
|
/* xsetupconsole -- used to configure window in Win32 version */
|
|
LVAL xsetupconsole() { return NIL; }
|
|
|
|
|
|
/* this should really be in a header for MacFileUtils.c */
|
|
void GetFullPath(FSSpec *theSpec, StringPtr theName);
|
|
|
|
|
|
void get_xlisp_path(char *p, long p_max, int *prefs_found)
|
|
{
|
|
Str63 fileName = "\pXLisp Preferences";
|
|
SInt16 foundPrefVRefNum = 0;
|
|
SInt32 foundPrefDirID = 0;
|
|
OSErr err = noErr;
|
|
*p = 0; /* initialize to empty string */
|
|
*prefs_found = false;
|
|
/* if we find path in the cache, copy and return */
|
|
if (valid_xlisp_path) {
|
|
*prefs_found = true;
|
|
strcpy(p, xlisp_path + 10); /* remember, path has XLISPPATH= at head */
|
|
return;
|
|
}
|
|
/* if we've been here before, do not try opening again */
|
|
if (need_preferences_file) return;
|
|
err = FindFolder(kOnSystemDisk, kPreferencesFolderType,
|
|
kDontCreateFolder, &foundPrefVRefNum,
|
|
&foundPrefDirID);
|
|
if (err == noErr) {
|
|
err = FSMakeFSSpec(foundPrefVRefNum, foundPrefDirID,
|
|
fileName, &prefsFSSpec);
|
|
*prefs_found = (err == noErr);
|
|
need_preferences_file = !*prefs_found;
|
|
}
|
|
if (*prefs_found) {
|
|
FILE *pf;
|
|
GetFullPath(&prefsFSSpec, (StringPtr) xlisp_path);
|
|
P2CStr((StringPtr) xlisp_path);
|
|
pf = fopen(xlisp_path, "r");
|
|
if (!pf) {
|
|
return; /* problem opening the path */
|
|
}
|
|
while (fgets(xlisp_path, 1023, pf)) {
|
|
if (strncmp(xlisp_path, "XLISPPATH=", 10) == 0) {
|
|
valid_xlisp_path = true;
|
|
xlisp_path[strlen(xlisp_path) - 1] = 0; /* trim newline */
|
|
strcpy(p, xlisp_path + 10);
|
|
break;
|
|
}
|
|
}
|
|
fclose(pf);
|
|
}
|
|
}
|
|
|
|
|
|
/* this is called when we load a file -- if need_preference_file,
|
|
* we will build a preference file and insert the path of the file
|
|
* we just opened, assuming it will tell us where to find init.lsp
|
|
*/
|
|
void setup_preferences(char *filename)
|
|
{
|
|
if (need_preferences_file) {
|
|
unsigned char prefname[256];
|
|
FILE *pf;
|
|
char *cp;
|
|
int len = 0;
|
|
GetFullPath(&prefsFSSpec, prefname);
|
|
need_preferences_file = false;
|
|
P2CStr(prefname);
|
|
/* we expect file-not-found error, path is valid */
|
|
pf = fopen((char *) prefname, "w");
|
|
if (pf == NULL) return;
|
|
cp = strrchr((char *) filename, ':');
|
|
if (cp == NULL) return;
|
|
cp[1] = 0;
|
|
/* now, filename is the path. If filename ends in runtime, this
|
|
* is probably the standard nyquist runtime folder. We should put
|
|
* the nyquist lib folder on the path too.
|
|
*/
|
|
len = cp + 1 - filename;
|
|
if (len >= 9 &&
|
|
strcmp(filename + len - 9, ":runtime:") == 0) {
|
|
filename[len - 8] = 0;
|
|
fprintf(pf, "XLISPPATH=%sruntime:,%slib:\n", filename, filename);
|
|
} else {
|
|
fprintf(pf, "XLISPPATH=%s\n", filename);
|
|
}
|
|
fclose(pf);
|
|
}
|
|
}
|