1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-11-27 15:50:10 +01:00

Update Nyquist to v3.09.

This commit is contained in:
Leland Lucius
2015-04-07 22:10:17 -05:00
parent f88b27e6d8
commit 9fb0ce5b82
358 changed files with 26327 additions and 7043 deletions

View File

@@ -0,0 +1,58 @@
/* Handle required apple events -EAD */
#include <Files.h>
#include <string.h>
#include <AppleEvents.h>
#include "macstuff.h"
#include "MacCommandWin.h"
#include "MacFileUtils.h"
//#include "MiscellaneousUtilities.h"
#define TEXTREC (*hTERec) // the command
extern TEHandle hTERec; // window text record
//=========================================================================
// Handle quit apple event
//=========================================================================
pascal OSErr AEQuit (AppleEvent *theAppleEvent, AppleEvent *theReply, long Refcon)
{
osfinish();
}
//=========================================================================
// Handle Open Document apple event by trying to load it.
//=========================================================================
extern xlload (char *, int, int);
extern xlabort(char *);
pascal OSErr AEOpenFiles(AppleEvent *theAppleEvent, AppleEvent *theReply,
long Refcon)
{
AEDescList docList;
AEKeyword keywd;
DescType returnedType;
Size actualSize;
long itemsInList;
FSSpec theSpec;
CInfoPBRec pb;
Str255 name;
short i;
if (AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList) !=
noErr) return;
if (AECountItems (&docList, &itemsInList) != noErr) return;
SetSelection (TEXTREC->teLength, TEXTREC->teLength);
for (i = 1; i <= itemsInList; i++) {
AEGetNthPtr (&docList, i, typeFSS, &keywd, &returnedType,
(Ptr) &theSpec, sizeof(theSpec), &actualSize);
GetFullPath(&theSpec, name);
P2CStr(name); // was: pstrterm(name);
if (xlload ((char *)name + 1, 1, 0) == 0) xlabort ("load error");
}
macputs ("> ");
PrepareForInput ();
}

View File

@@ -0,0 +1,764 @@
//=============================================================================
// All command window updates, input, etc happen here -EAD
//=============================================================================
#include <Controls.h>
/* #include <ControlDefinitions.h> */
#include <Events.h>
#include <Fonts.h>
#include <MacWindows.h>
#include "MacGlobals.h"
#include "macint.h"
#include <ctype.h>
#define NIL ((void *) 0)
//=============================================================================
// local variables
//=============================================================================
ControlHandle vScroll;
int cursorPos; /* the cursor's position on the line */
short linesInView; /* how many lines are in the window */
int cmdStart; /* where (in text record) the current command starts */
TextStyle textStyle[2]; /* styles: bold for user input, plain for output */
/* output is buffered */
Handle hOutputBuffer = NULL;
enum currentStyle { plainStyle, boldStyle } currentStyle;
static void GoStartOfLine (void);
static void GoEndOfLine (void);
static void GoBackOneWord (void);
static void GoForwardOneWord (void);
//=============================================================================
// static void DoScrollBar (ControlHandle control, short change)
//=============================================================================
/* keep track of the user as he fiddles with the scroll bar */
/* This routine is called while the user has the mouse down. */
/* It makes sure the thumb isn't dragged out-of-bounds. */
//=============================================================================
static void DoScrollBar (ControlHandle control, short change) {
short value = GetControlValue (control), max = GetControlMaximum (control);
long newval = value + change; /* this is a long in case we try to go past MAX_INT */
if (newval < 0) newval = 0; else if (newval > max) newval = max;
SetControlValue (control, (short) newval);
if (newval != value) TEScroll (0, (short) (value - newval) * LINEHEIGHT, hTERec);
}
//=============================================================================
// pascal Boolean ScrollClickLoop (void)
//=============================================================================
//
//=============================================================================
pascal Boolean ScrollClickLoop (void) {
Rect tempRect;
Point mouse;
GrafPtr oldPort;
RgnHandle oldClip;
short amount = 0;
if (FrontWindow () != gCommandWin) return false;
GetPort (&oldPort);
SetPort (gCommandWin);
GetClip (oldClip = NewRgn ());
SetRect (&tempRect, INT_MIN, INT_MIN, INT_MAX, INT_MAX);
ClipRect (&tempRect);
GetMouse (&mouse);
if (mouse.v < TEXTREC->viewRect.top) DoScrollBar (vScroll, -1);
else if (mouse.v > TEXTREC->viewRect.bottom) DoScrollBar (vScroll, 1);
SetClip (oldClip);
DisposeRgn (oldClip);
SetPort (oldPort);
return true;
}
//=============================================================================
// static pascal void ScrollProc (ControlHandle control, short thePart)
//=============================================================================
// for clicks in the scroll bar or arrows; update the window properly
//=============================================================================
pascal void ScrollProc (ControlHandle control, short thePart) {
short amount;
WindowPtr window;
if (!thePart) return;
window = (*control)->contrlOwner;
switch (thePart) {
case kControlUpButtonPart: amount = -1; break;
case kControlDownButtonPart: amount = 1; break;
case kControlPageUpPart: amount = -linesInView; break;
case kControlPageDownPart: amount = linesInView; break;
}
DoScrollBar (control, amount);
}
//=============================================================================
// Rect SetTERect (void)
//=============================================================================
// set the dimensions of the text record in its window
//=============================================================================
Rect SetTERect (void) {
Rect teRect = gCommandWin->portRect;
teRect.right -= SCROLLER_WIDTH;
InsetRect (&teRect, TEXT_MARGIN, TEXT_MARGIN);
linesInView = (teRect.bottom - teRect.top) / LINEHEIGHT;
teRect.bottom = teRect.top + linesInView * LINEHEIGHT; /* round off */
return teRect;
}
//=============================================================================
// static void AdjustCursor (EventRecord *theEvent)
//=============================================================================
// make the pointer an I-beam iff it's in the text window
//=============================================================================
void AdjustCursor (Point theLoc, RgnHandle theRgn)
{
RgnHandle arrowRgn, iBeamRgn, hiliteRgn, tempRgn;
Rect theRect;
Point thePoint;
if (gInBackground)
return;
arrowRgn = NewRgn();
SetRectRgn(arrowRgn, -32767, -32767, 32767, 32767);
// GlobalToLocal ((theLoc); ???
if (gCommandWin == FrontWindow () ) {
SetPort(gCommandWin);
iBeamRgn = NewRgn();
hiliteRgn = NewRgn();
theRect = TEXTREC->viewRect;
LocalToGlobal((Point *)&(theRect.top));
LocalToGlobal((Point *)&(theRect.bottom));
RectRgn(iBeamRgn, &theRect);
TEGetHiliteRgn(hiliteRgn, hTERec);
thePoint.h = thePoint.v = 0;
LocalToGlobal(&thePoint);
OffsetRgn(hiliteRgn, thePoint.h, thePoint.v);
DiffRgn(arrowRgn, hiliteRgn, arrowRgn);
DiffRgn(arrowRgn, iBeamRgn, arrowRgn);
DiffRgn(iBeamRgn, hiliteRgn, iBeamRgn);
if (PtInRgn(theLoc, iBeamRgn)) {
SetCursor(*GetCursor(iBeamCursor));
CopyRgn(iBeamRgn, theRgn);
} else if (PtInRgn(theLoc, hiliteRgn)) {
SetCursor(&qd.arrow);
CopyRgn(hiliteRgn, theRgn);
} else {
SetCursor(&qd.arrow);
CopyRgn(arrowRgn, theRgn);
}
DisposeRgn(iBeamRgn);
DisposeRgn(hiliteRgn);
} else {
SetCursor(&qd.arrow);
CopyRgn(arrowRgn, theRgn);
}
DisposeRgn(arrowRgn);
}
//=============================================================================
// static void SetScrollRect (void)
//=============================================================================
// Set Scroll bar rec size
//=============================================================================
void SetScrollRect (void) {
/* set the dimensions of the scroll bar in its window */
// This change fixes the double flash on window resize -EAD
// MoveControl (vScroll, commandWin->portRect.right - SCROLLER_WIDTH, -1);
// SizeControl (vScroll, SCROLLER_WIDTH + 1,
// (commandWin->portRect.bottom - commandWin->portRect.top) - (SCROLLER_WIDTH - 2));
(*vScroll)->contrlRect.left = gCommandWin->portRect.right - SCROLLER_WIDTH;
(*vScroll)->contrlRect.top = -1;
(*vScroll)->contrlRect.right = gCommandWin->portRect.right + 1;
(*vScroll)->contrlRect.bottom = gCommandWin->portRect.bottom - (SCROLLER_WIDTH - 1);
}
//=============================================================================
// static void AdjustScrollBar (void)
//=============================================================================
// Set the thumb on scrollbar
//=============================================================================
static void AdjustScrollBar (void) {
/* adjust the scroll bar to match the position of the text view */
short oldval = GetControlValue (vScroll), oldmax = GetControlMaximum (vScroll);
short value, max;
short test;
max = TEXTREC->nLines - linesInView;
if ((TEXTREC->teLength > 0) && (*(*TEXTREC->hText + TEXTREC->teLength - 1) == '\r')) max++;
if (max < 0) max = 0;
if (max != oldmax) SetControlMaximum (vScroll, max);
value = (short)((TEXTREC->viewRect.top - TEXTREC->destRect.top) / LINEHEIGHT);
// value = roundup ((TEXTREC->viewRect.top - TEXTREC->destRect.top) / LINEHEIGHT);
if (value < 0) value = 0; else if (value > max) value = max;
if (value != oldval) SetControlValue (vScroll, value);
}
static short roundup (float x) { /* a kludge to round up a float to an int */
if (((int) x) != ((int) (x += 0.5))) x += 0.5;
return (int) x;
}
//=============================================================================
// void DoKeyPress (EventRecord *theEvent)
//=============================================================================
// Hanlde Keyboard Input
//=============================================================================
void DoKeyPress (EventRecord *theEvent) {
short whatKey = theEvent->message & charCodeMask;
if (theEvent->modifiers & cmdKey) {
long choice;
AdjustMenus ();
if (choice = MenuKey (theEvent->message)) DoMenu (choice);
else if (((whatKey == 'w') || (whatKey == 'W')) && (FrontWindow () == gGraphicsWin))
HideGrafWin ();
else if (whatKey == LEFTARROW) GoStartOfLine ();
else if (whatKey == RIGHTARROW) GoEndOfLine ();
else if (whatKey == UPARROW) DoScrollBar (vScroll, - linesInView);
else if (whatKey == DOWNARROW) DoScrollBar (vScroll, linesInView);
}
else if (theEvent->modifiers & optionKey) {
if (whatKey == LEFTARROW) GoBackOneWord ();
else if (whatKey == RIGHTARROW) GoForwardOneWord ();
}
else switch (whatKey) {
case PAGEUP: DoScrollBar (vScroll, -linesInView); break;
case PAGEDN: DoScrollBar (vScroll, linesInView); break;
case HOMEKEY: DoScrollBar (vScroll, INT_MIN); break;
case ENDKEY: DoScrollBar (vScroll, INT_MAX); break;
case FNKEY: break;
case HELPKEY: break;
default: recentChar = theEvent->message & charCodeMask;
}
}
//=============================================================================
// static void DrawOnlyGrowIcon (WindowPtr window)
//=============================================================================
// draw growbox on command window with no scoll bars
//=============================================================================
static void DrawOnlyGrowIcon (WindowPtr window)
{
RgnHandle saveRgn;
Rect growRect;
growRect = window->portRect;
growRect.top = growRect.bottom - SCROLLER_WIDTH;
growRect.left = growRect.right - SCROLLER_WIDTH;
GetClip (saveRgn = NewRgn ());
ClipRect (&growRect);
DrawGrowIcon (window);
SetClip (saveRgn);
DisposeRgn (saveRgn);
}
//=============================================================================
// void SetSelection (short start, short end)
//=============================================================================
// set text selection in the command window
//=============================================================================
void SetSelection (short start, short end) {
TEXTREC->clikStuff = 255; /* to make sure the caret appears at the start of a line when it should */
/* see tech note "TextEdit EOL Ambiguity" for more information */
TESetSelect (start, end, hTERec);
}
//=============================================================================
// static void CancelFlash (void)
//=============================================================================
// cancel the matching-paren flashing
//=============================================================================
static void CancelFlash (void) {
if (flashTime) {
flashTime = 0;
SetSelection (cursorBeforeFlash, cursorBeforeFlash);
}
}
//=============================================================================
// static void StopPasting (void)
//=============================================================================
// clean up after finishing a paste
//=============================================================================
void StopPasting (void) {
pastedLength = 0;
if (pastedTextH) {
DisposeHandle (pastedTextH);
pastedTextH = NULL;
}
}
//=============================================================================
// static void DoStyle (int whatStyle)
//=============================================================================
// set the text to a certain style
//=============================================================================
static void DoStyle (int whatStyle) {
TESetStyle (doFace, &(textStyle[whatStyle]), false, hTERec);
}
//=============================================================================
// static void FlushOutput (void)
//=============================================================================
// clear out the output buffer, dumping its contents to the window
//=============================================================================
void FlushOutput (void) {
short totalLines, scrollAmount, max;
if (outputBufferLength == 0) return;
CancelFlash ();
DoStyle (plainStyle);
HLock (hOutputBuffer);
TEInsert (*hOutputBuffer, outputBufferLength, hTERec);
HUnlock (hOutputBuffer);
outputBufferLength = 0;
if (TEXTREC->teLength > SCROLLBACK_THRESHHOLD) {
/* make sure TE record isn't too long */
#ifdef ORIGINALCODE
/* I replaced this because Nyquist was crashing after the
buffer got filled. The replacement below is simpler and
eliminates the crashes, although it probably could cause
problems by clearing the selection.
*/
int i = 1, newLength;
TEPtr textPtr;
while ((TEXTREC->teLength - TEXTREC->lineStarts[i]) >
(SCROLLBACK_THRESHHOLD - DELETE_BLOCK)) i++;
i = TEXTREC->lineStarts[i];
newLength = TEXTREC->teLength - i;
textPtr = (TEPtr)(*(TEXTREC->hText));
BlockMoveData ((Ptr)((long)textPtr + i), textPtr, newLength);
SetHandleSize (TEXTREC->hText, newLength);
TEXTREC->destRect.top += LINEHEIGHT;
TECalText (hTERec);
TEUpdate (&(TEXTREC->viewRect), hTERec);
#else
/* find the line start after DELETE_BLOCK */
int i = 1;
while (TEXTREC->lineStarts[i] < DELETE_BLOCK) i++;
TESetSelect(0, TEXTREC->lineStarts[i], hTERec);
TEDelete(hTERec);
/* after deletion, put cursor back at end of buffer */
TESetSelect(TEXTREC->teLength, TEXTREC->teLength, hTERec);
#endif
}
TESelView (hTERec);
AdjustScrollBar ();
}
//=============================================================================
// void PrepareForInput (void)
//=============================================================================
// get ready to take input
//=============================================================================
void PrepareForInput (void) {
FlushOutput ();
cmdStart = TEXTREC->selStart;
}
//=============================================================================
// static void DeleteRange (void)
//=============================================================================
// delete the selected range of text, updating cmdStart as necessary
//=============================================================================
void DeleteRange (void) {
if (TEXTREC->selEnd <= cmdStart) return;
if (TEXTREC->selStart < cmdStart) SetSelection (cmdStart, TEXTREC->selEnd);
TEDelete (hTERec);
}
//=============================================================================
// static void CopyThisLineToEnd (void)
//=============================================================================
// copy the line the caret is on to the end
//=============================================================================
static void CopyThisLineToEnd (void) {
char *buffer;
short b, i, caretOffset;
/* first find out exactly where it starts */
i = TEXTREC->nLines-1; /* first find which line */
while (TEXTREC->selStart < TEXTREC->lineStarts[i]) i--;
while ((i > 0) && ((*(TEXTREC->hText))[TEXTREC->lineStarts[i]-1] != '\r'))
i--; /* for wrapped lines */
i = TEXTREC->lineStarts[i]; /* now zero in on the exact character where it begins */
while ((TEXTCHAR(i) >= '0') && (TEXTCHAR(i) <= '9')) i++; /* skip error level */
if ((TEXTCHAR(i) == '>') && (TEXTCHAR(i+1) == ' ')) i+=2; /* get rid of leading prompt */
caretOffset = TEXTREC->selStart - i; /* how many characters in is the caret? */
/* now put the line into the buffer */
b = 0;
while ((TEXTCHAR(i+b) != '\r') && (i+b < TEXTREC->teLength)) b++; /* find the end of the line */
buffer = (char *) NewPtr (b);
BlockMoveData (*TEXTREC->hText + i, buffer, b);
buffer[b] = '\0';
/* delete whatever's already on the last line */
SetSelection (cmdStart, TEXTREC->teLength);
TEDelete (hTERec);
DoStyle (boldStyle);
TEInsert (buffer, b, hTERec);
DisposePtr (buffer);
if (caretOffset < 0) caretOffset = b;
SetSelection (cmdStart + caretOffset, cmdStart + caretOffset);
}
//=============================================================================
// Next four functions possition cursor in text
//=============================================================================
static void GoStartOfLine (void) {
short whichLine = TEXTREC->nLines - 1; /* look for the caret; start at the end and go up */
while (TEXTREC->lineStarts[whichLine] > TEXTREC->selStart) whichLine--;
SetSelection (TEXTREC->lineStarts[whichLine], TEXTREC->lineStarts[whichLine]);
AdjustScrollBar ();
}
static void GoEndOfLine (void) {
short whichLine = TEXTREC->nLines - 1; /* look for the caret; start at the end and go up */
while (TEXTREC->lineStarts[whichLine] > TEXTREC->selStart) whichLine--;
if (whichLine == TEXTREC->nLines - 1)
SetSelection (TEXTREC->teLength, TEXTREC->teLength);
else SetSelection (TEXTREC->lineStarts[whichLine+1] - 1, TEXTREC->lineStarts[whichLine+1] - 1);
AdjustScrollBar ();
}
static void GoBackOneWord (void) {
short i = TEXTREC->selStart;
while ((i > 0) && !isalnum (TEXTCHAR(i-1))) i--;
while ((i > 0) && isalnum (TEXTCHAR(i-1))) i--;
SetSelection (i, i);
}
static void GoForwardOneWord (void) {
short i = TEXTREC->selStart;
while ((i < TEXTREC->teLength) && !isalnum (TEXTCHAR(i))) i++;
while ((i < TEXTREC->teLength) && isalnum (TEXTCHAR(i))) i++;
SetSelection (i, i);
}
//=============================================================================
// static void EditFreely (void)
//=============================================================================
// Enter text into the command windows
//=============================================================================
static void EditFreely (void) {
Boolean done;
do {
done = false;
DoEvent ();
if (pastedLength > 0) { /* if there is still text to paste, paste it */
int i = 0;
CancelFlash ();
if (TEXTREC->selStart < cmdStart) StopPasting ();
else {
while ((i < pastedLength) && (((char *)(*pastedTextH))[i] != '\r')) i++;
DoStyle (boldStyle);
TEInsert (*pastedTextH, i, hTERec);
AdjustScrollBar ();
if (i < pastedLength) { /* we were stopped by a carriage return, so eat it */
i++;
done = true;
}
pastedLength -= i;
if (pastedLength > 0) {
BlockMoveData ((Ptr)((long)(*pastedTextH) + i), *pastedTextH, pastedLength);
SetHandleSize (pastedTextH, pastedLength);
} else StopPasting ();
}
}
else if (recentChar) { /* if the last event got us a character, process it */
int i;
Boolean wasOnLastLine;
CancelFlash ();
if ((TEXTREC->selEnd <= cmdStart) && (TEXTREC->selStart != TEXTREC->selEnd)) continue;
if (TEXTREC->selStart < cmdStart) SetSelection (cmdStart, TEXTREC->selEnd);
wasOnLastLine = (TEXTREC->selStart >= cmdStart);
if ((recentChar & 0xfc) == 0x1c) { /* was this an arrow key? */
TEXTREC->clikStuff = 255; /* to make sure the caret appears where it should */
TEKey (recentChar, hTERec);
AdjustScrollBar ();
continue;
}
if (!wasOnLastLine) CopyThisLineToEnd ();
switch (recentChar) {
case FWDDEL:
if (TEXTREC->selStart != TEXTREC->selEnd) DeleteRange ();
else if ((TEXTREC->selStart >= cmdStart) && (TEXTREC->selStart < TEXTREC->teLength)) {
TEDeactivate (hTERec);
SetSelection (TEXTREC->selStart, TEXTREC->selStart + 1);
TEDelete (hTERec);
if (FrontWindow () == gCommandWin) TEActivate (hTERec);
}
break;
case CLRKEY:
if (TEXTREC->selStart != TEXTREC->selEnd) DeleteRange ();
break;
case DELETE:
if (TEXTREC->selStart != TEXTREC->selEnd) DeleteRange ();
else if (TEXTREC->selStart > cmdStart) {
TEXTREC->clikStuff = 255; /* to make sure the caret appears where it should */
TEKey (DELETE, hTERec);
}
break;
case RETURN:
if (wasOnLastLine) done = true;
break;
case ENTER: /* ENTER ends command no matter what */
done = true;
break;
default:
DoStyle (boldStyle);
TEXTREC->clikStuff = 255; /* to make sure the caret appears where it should */
TEKey (recentChar, hTERec);
if ((recentChar == ')') && (TEXTREC->selStart > cmdStart)) {
short parenCount = -1;
Boolean inQuotes = false;
i = TEXTREC->selStart - 1;
while ((--i >= cmdStart) && (parenCount != 0))
switch ((*TEXTREC->hText)[i]) {
case DBLQUOTE: inQuotes = !inQuotes; break;
case '(': if (!inQuotes) parenCount++; break;
case ')': if (!inQuotes) parenCount--; break;
}
if (parenCount == 0) {
cursorBeforeFlash = TEXTREC->selStart;
SetSelection (i+1, i+2); /* flash the matching open-paren */
flashTime = 10;
}
} else if ((recentChar == DBLQUOTE) && (TEXTREC->selStart > cmdStart)) {
i = TEXTREC->selStart - 1;
while ((--i >= cmdStart) && ((*TEXTREC->hText)[i] != DBLQUOTE)) ;
if ((*TEXTREC->hText)[i] == DBLQUOTE) {
cursorBeforeFlash = TEXTREC->selStart;
SetSelection (i, i+1); /* flash the matching double-quote */
flashTime = 10;
}
}
}
AdjustScrollBar ();
}
} while (!done);
}
char *macgets (void) {
/* retrieve a typed character */
/* Note that this uses some extensive (and clever, if I may say so myself) buffering. */
int i, b, bufSize;
char *ptr, *buffer;
Boolean done, onLastLine;
PrepareForInput ();
do { /* repeat until a full expression has been typed */
EditFreely (); /* allow free editing for a while */
/* Now, we have a complete command to parse, if and only if: */
/* - the cursor was on the last line when the user pressed Return or Enter, and */
/* - the user either pressed Enter, or else every '(' since the beginning */
/* of the command is matched by a ')'. */
/* Quoting is watched for. ( ") is not a complete expression. */
done = true;
if (TEXTREC->selStart != TEXTREC->teLength) /* if we're not at the end already */
SetSelection (TEXTREC->teLength, TEXTREC->teLength); /* send cursor to end */
TEXTREC->clikStuff = 255; /* to make sure the caret appears where it should */
TEKey ('\r', hTERec);
/* check and see if we've completed the command yet */
if (recentChar != ENTER) {
Boolean inQuotes = false;
short parenCount = 0;
for (i = cmdStart; i < TEXTREC->teLength; i++)
switch ((*TEXTREC->hText)[i]) {
case DBLQUOTE: inQuotes = !inQuotes; break;
case '(': if (!inQuotes) parenCount++; break;
case ')': if (!inQuotes) parenCount--; break;
}
if ((parenCount > 0) || inQuotes) done = false;
}
AdjustScrollBar ();
} while (!done);
/* put the entire command into the buffer, and return it */
bufSize = TEXTREC->teLength - cmdStart;
buffer = (char *) NewPtr (bufSize + 1);
BlockMoveData (*TEXTREC->hText + cmdStart, buffer, bufSize);
buffer[bufSize] = '\0';
return buffer;
}
void macputc (int ch) {
/* put a char into the output buffer, and flush the buffer if necessary */
switch (ch) {
case '\t':
do { macputc (' '); } while (cursorPos & 7);
break;
case DELETE:
if (cursorPos) cursorPos--; /* and fall through to default */
default:
if (outputBufferLength == MAX_BUF) FlushOutput ();
if (ch == '\n') {
cursorPos = 0;
(*hOutputBuffer)[outputBufferLength++] = '\r';
} else {
cursorPos++;
(*hOutputBuffer)[outputBufferLength++] = ch;
}
}
}
void macputs (char *s) {
/* for completeness */
while (*s) macputc (*s++);
}
void scrflush (void) {
extern void osflush (void);
/* clear out everything */
FlushOutput ();
osflush ();
}
void scrclear (void) {
/* clear text window -- not implemented */
}
//=============================================================================
// static void UpdateCmdWindow (void)
//=============================================================================
// main command window update procedure
//=============================================================================
void UpdateCmdWindow (void) {
long textBottom;
Rect tempRect;
InvalRect (&(gCommandWin->portRect));
BeginUpdate (gCommandWin);
BlockMoveData(&(gCommandWin->portRect), &tempRect, sizeof(Rect));
tempRect.right -= SCROLLER_WIDTH;
EraseRect (&tempRect);
if (gCommandWinResized) {
TEXTREC->viewRect = SetTERect ();
TEXTREC->destRect.right = TEXTREC->viewRect.right;
TECalText (hTERec);
SetScrollRect ();
gCommandWinResized = false;
}
DrawOnlyGrowIcon (gCommandWin);
FlushOutput ();
TEXTREC->viewRect = SetTERect (); /* adjust for possible change in height of status line */
textBottom = TEXTREC->destRect.top + (TEXTREC->nLines * LINEHEIGHT);
if (TEXTREC->destRect.top > TEXTREC->viewRect.top)
TEScroll (0, (TEXTREC->viewRect.top - TEXTREC->destRect.top), hTERec);
if (TEXTREC->destRect.top < TEXTREC->viewRect.top) { /* make sure we don't get fractions of lineheights */
int amountOffTheTop = TEXTREC->viewRect.top - TEXTREC->destRect.top;
if (amountOffTheTop % LINEHEIGHT) TEScroll (0, amountOffTheTop % LINEHEIGHT, hTERec);
}
TEUpdate (&(TEXTREC->viewRect), hTERec);
AdjustScrollBar ();
UpdateControls (gCommandWin, gCommandWin->visRgn);
EndUpdate (gCommandWin);
}
void ActivateCmdWindow(void)
{
TEActivate (hTERec);
HiliteControl (vScroll, 0);
DrawOnlyGrowIcon (gCommandWin);
}
void DeactivateCmdWindow(void)
{
TEDeactivate (hTERec);
HiliteControl (vScroll, 255);
DrawOnlyGrowIcon (gCommandWin);
}
void InitalizeCmdWindow(void)
{
/* setup the font, size and writing mode for the command window */
TextFont (kFontIDMonaco);
TextSize (9);
TextFace (0);
TextMode (srcCopy);
textStyle[plainStyle].tsFace = 0;
textStyle[boldStyle].tsFace = bold;
currentStyle = plainStyle;
{ /* set up scroll bar */
Rect scrollRect;
vScroll = NewControl (gCommandWin, &scrollRect, "\p", 0, 0, 0, 0, scrollBarProc, 0L);
SetScrollRect ();
ShowControl (vScroll);
}
{ /* set up command text record */
Rect teRect = SetTERect ();
hTERec = (TEHandle)TEStyleNew (&teRect, &teRect);
TECalText (hTERec);
TEAutoView (true, hTERec);
TESetClickLoop (uppScrollClickLoop, hTERec);
TEActivate (hTERec);
}
hOutputBuffer = NewHandle (MAX_BUF); /* a handle to a buffer for text to be displayed */
}
void CleanupCmdWindow(void)
{
StopPasting ();
CloseWindow (gCommandWin);
TEDispose (hTERec);
DisposeHandle (hOutputBuffer);
}

View File

@@ -0,0 +1,17 @@
/* MacCommandWin.h -- headers for more mac stuff */
void SetSelection (short start, short end);
void macputc(int ch);
void macputs(char *s);
void PrepareForInput(void);
void InitalizeCmdWindow(void);
void UpdateCmdWindow(void);
void StopPasting(void);
void DeleteRange(void);
void scrflush(void);
void SetScrollRect(void);
void AdjustCursor(Point theLoc, RgnHandle theRgn);
void DoKeyPress(EventRecord *theEvent);
void ActivateCmdWindow(void);
void DeactivateCmdWindow(void);
void CleanupCmdWindow(void);

View File

@@ -0,0 +1,3 @@
/* MacDrag.h -- drag text */
Boolean DragText(EventRecord *ev);

View File

@@ -0,0 +1,81 @@
// Routines that deal with some mac file system stuff -EAD
#include <Files.h>
#include <TextUtils.h>
#include <string.h>
//#include "MiscellaneousUtilities.h"
//=========================================================================
// Function prototypes
//=========================================================================
void set_mac_file_type(char *filename);
void GetFullPath(FSSpec *theSpec, StringPtr theName);
void PathNameFromDirID(long dirID, short vRefNum, StringPtr fullPathName);
//=========================================================================
// Set the output soundfile type and creator
//=========================================================================
void set_mac_file_type(char *filename)
{
Str255 fName;
FSSpec fSpec;
FInfo fFInfo;
fFInfo.fdType = 'AIFF';
fFInfo.fdCreator = 'Sd2a';
BlockMoveData(filename, &fName[1], 256);
fName[0] = strlen(filename);
FSMakeFSSpec(0, 0, fName, &fSpec);
FSpSetFInfo(&fSpec, &fFInfo);
}
//==================================================================================================================================
// void GetFullPath(FSSpec *theSpec, StringPtr theName)
//==================================================================================================================================
// Extracts the full pathname for the file pointed to by theSpec and returns it in theName.
//==================================================================================================================================
void GetFullPath(FSSpec *theSpec, StringPtr theName)
{
*theName = 0;
if (theSpec->parID != 1) PathNameFromDirID(theSpec->parID, theSpec->vRefNum, theName);
// was: pstrcat(theName, theSpec->name);
strcat(P2CStr(theName), P2CStr(theSpec->name));
C2PStr((char *) theName);
C2PStr((char *) theSpec->name);
//pstrcat(theName, "\p:");
theName[*theName + 1] = 0;
}
//==================================================================================================================================
// void PathNameFromDirID(long dirID, short vRefNum, StringPtr fullPathName)
//==================================================================================================================================
// Given a vRefNum and a directory ID, creates a full path specification.
//==================================================================================================================================
void PathNameFromDirID(long dirID, short vRefNum, StringPtr fullPathName)
{
Str255 directoryName;
DirInfo block;
OSErr err;
fullPathName[0] = 0;
block.ioDrDirID = block.ioDrParID = dirID;
block.ioNamePtr = directoryName;
do {
block.ioVRefNum = vRefNum;
block.ioFDirIndex = -1;
block.ioDrDirID = block.ioDrParID;
err = PBGetCatInfo((CInfoPBPtr)&block, false);
//pstrcat(directoryName, (StringPtr)"\p:");
//pstrinsert(fullPathName, directoryName);
strcat(P2CStr(directoryName), ":");
strcat((char *) directoryName, (char *) fullPathName);
strcpy((char *)fullPathName, (char *) directoryName);
} while (block.ioDrDirID != 2);
C2PStr((char *) fullPathName);
}

View File

@@ -0,0 +1,3 @@
/* MacFileUtils.h -- more mac stuff */
void GetFullPath(FSSpec *theSpec, StringPtr theName);

View File

@@ -0,0 +1,50 @@
// Window pointers
extern WindowPtr gCommandWin, gGraphicsWin;
extern Boolean gCommandWinResized;
// Menu Handles
extern MenuHandle appleMenu, fileMenu, editMenu, controlMenu;
// The command window text handle
extern TEHandle hTERec;
#define TEXTREC (*hTERec)
#define TEXTCHAR(i) ((*(TEXTREC->hText))[i])
// more comand window text stuff
extern CharsHandle pastedTextH; /* a handle to pasted text */
extern int pastedLength; /* how many chars there are in the paste buffer */
extern int outputBufferLength;
extern Rect dragRect, sizeRect;
extern int flashTime, cursorBeforeFlash;
extern char recentChar; /* the last character typed */
// Allocate space for UPPs
extern ControlActionUPP uppScrollProc;
extern TEClickLoopUPP uppScrollClickLoop;
extern Boolean gInBackground;

View File

@@ -0,0 +1,64 @@
#include <MacTypes.h>
#include <Quickdraw.h>
#include <Windows.h>
#include <Controls.h>
#include <ToolUtils.h>
#include "macint.h"
extern WindowPtr gCommandWin, gGraphicsWin;
extern Boolean gCommandWinResized;
extern Rect dragRect, sizeRect;
//=============================================================================
// Hanlde Mouse Down Events
//=============================================================================
void DoMouseDown (EventRecord *theEvent) {
WindowPtr whichWindow;
short int thePart = FindWindow (theEvent->where, &whichWindow);
switch (thePart) {
case inSysWindow:
SystemClick (theEvent, whichWindow);
break;
case inDrag:
DragWindow (whichWindow, theEvent->where, &dragRect);
break;
case inMenuBar: {
long choice;
AdjustMenus ();
choice = MenuSelect (theEvent->where);
if (choice) DoMenu (choice);
break;
}
case inGoAway:
if ((whichWindow == gGraphicsWin)
&& (TrackGoAway (whichWindow, theEvent->where)))
HideGrafWin ();
break;
case inContent:
if ((FrontWindow () == gCommandWin) && (whichWindow == gCommandWin))
DoContent (theEvent);
else SelectWindow (whichWindow);
break;
case inGrow:
case inZoomIn:
case inZoomOut: {
long newSize;
GrafPtr oldPort;
if (thePart == inGrow) newSize = GrowWindow (whichWindow, theEvent->where, &sizeRect);
if (((thePart == inGrow) && newSize)
|| ((thePart != inGrow) && TrackBox (whichWindow, theEvent->where, thePart))) {
GetPort (&oldPort);
SetPort (whichWindow);
EraseRect (&whichWindow->portRect);
if (thePart == inGrow) SizeWindow (whichWindow, LoWord (newSize), HiWord (newSize), -1);
else ZoomWindow (whichWindow, thePart, 0);
gCommandWinResized = true;
InvalRect (&whichWindow->portRect);
SetPort (oldPort);
}
break;
}
}
}

View File

@@ -0,0 +1,3 @@
/* MacHandelEv.h -- event handlers */
void DoMouseDown(EventRecord *theEvent);

View File

@@ -0,0 +1,69 @@
README.txt -- information on Nyquist for Mac OS X
Installation
------------
The simplest way to install and run Nyquist is to get the pre-compiled
NyquistIDE application, which includes executables, documentation, and
libraries all in one package.
When the pre-compiled package is uncompressed, it produces two directories:
nyquist
NyquistIDE.app
You should always keep these together. The nyquist directory initially
contains documentation, but when NyquistIDE.app is run, the nyquist
folder is also populated with links to the lib and demos folders,
which contain example code and more documentation. The symbolic links
allow you to easily find these files.
You can copy both nyquist and NyquistIDE.app to the /Applications folder
if you wish, and you can add NyquistIDE.app to the Dock.
You will probably run Nyquist using the NyquistIDE application, but
you can also run nyquist from the command line. The executable is
located in
NyquistIDE.app/Contents/Resources/Java/ny
To run from the command line, you will need to set the XLISPPATH
environment variable using this command line (if you use the C shell,
e.g. csh):
setenv XLISPPATH `pwd`/runtime:`pwd`/lib
If you use the bash shell, use:
export XLISPPATH=`pwd`/runtime:`pwd`/lib
Note that this sets XLISPPATH in the environment of the current
command line shell. If you exit the shell or switch to another shell,
the XLISPPATH variable will not be set. Your shell reads an
initialization file when it starts. You can add the XLISPPATH
initialization command to this file if you want the variable to be set
automatically in every instance of your command line shell.
On the topic of the XLISPPATH, note that this variable is set by
NyquistIDE when running with that application, overriding any other
value. You can extend the search path by creating the file xlisppath
in the same directory as the nyquist executable ny. The xlisppath file
should have colon-separated paths on a single line of text.
You can also build Nyquist from sources, as described below.
How To Build Nyquist on Mac OS X
--------------------------------
You need to install Xcode, Apple's free software development system
for OS X.
Xcode 4.3.2 and later
-------
The nyquist project for Xcode v4 is in nyquist/macosxproject/nyquist.xcodeproj
To build Nyquist or NyquistIDE:
- Open nyquist.wxworkspace in Xcode
- Set the active target to "Nyquist" or "NyquistIDE"
- Click on "build active target"
- ny or NyquistIDE will be produced in a temporary folder managed by Xcode.
To find the files Right click on the Products/NyquistIDE.app of the project
navigator, and select "reveal in finder".

View File

@@ -0,0 +1,123 @@
/* macaboutbox.c - Display the "about box" of the application. */
/* Written by Brian Kendig. */
/* The functions here are only used by macint.c. */
//#include <THINK.h>
#include <Dialogs.h>
#include <Fonts.h>
#include <Menus.h>
#include <Quickdraw.h>
#include <Resources.h>
#include <ToolUtils.h>
#include <Traps.h>
#include <Windows.h>
#include "macint.h"
#define NIL ((void *) 0)
static DialogPtr aboutBox;
extern Boolean hasColorQD;
static enum {
theOKButton = 1,
theOKOutline = 2,
theIcon = 3,
theName = 4,
theAboutText = 5,
theCopyright = 6
} ;
pascal void DrawOKOutline (WindowPtr dialogWindow, short theItem) {
PenState oldPen;
short iType;
Handle iHandle;
Rect iRect;
GetPenState (&oldPen);
PenNormal ();
PenSize (3,3);
GetDialogItem (aboutBox, theOKButton, &iType, &iHandle, &iRect);
InsetRect (&iRect, -4, -4);
FrameRoundRect (&iRect, 16, 16);
SetPenState (&oldPen);
}
pascal void DrawIcon (WindowPtr dialogWindow, short theItem) {
short iType;
Handle iHandle;
Rect iRect;
GetDialogItem (aboutBox, theIcon, &iType, &iHandle, &iRect);
PlotIcon (&iRect, GetResource ('ICN#', 128));
}
pascal void DrawName (WindowPtr dialogWindow, short theItem) {
short iType;
Handle iHandle;
Rect iRect;
Str255 string;
TextFont (kFontIDHelvetica);
TextSize (24);
TextFace (0);
GetDialogItem (aboutBox, theName, &iType, &iHandle, &iRect);
GetIndString (string, STRINGS_RES, 1);
TETextBox (string+1, string[0], &iRect, teFlushLeft);
}
pascal void DrawAboutText (WindowPtr dialogWindow, short theItem) {
short iType;
Handle iHandle;
Rect iRect;
Str255 string;
TextFont (kFontIDMonaco);
TextSize (9);
TextFace (0);
GetDialogItem (aboutBox, theAboutText, &iType, &iHandle, &iRect);
GetIndString (string, STRINGS_RES, 2);
TETextBox (string+1, string[0], &iRect, teFlushLeft);
}
pascal void DrawCopyright (WindowPtr dialogWindow, short theItem) {
short iType;
Handle iHandle;
Rect iRect;
Str255 string;
TextFont (systemFont);
TextSize (12);
TextFace (0);
GetDialogItem (aboutBox, theCopyright, &iType, &iHandle, &iRect);
GetIndString (string, STRINGS_RES, 3);
TETextBox (string+1, string[0], &iRect, teFlushLeft);
}
void DoAboutBox (void) {
short itemType, itemHit = 0;
Handle itemHandle;
Rect aboutRect;
short width, hight;
PicHandle aboutPict;
aboutPict = GetPicture(ABOUT_PICT);
aboutRect = (*aboutPict)->picFrame;
width = aboutRect.right - aboutRect.left;
hight = aboutRect.bottom - aboutRect.top;
aboutBox = GetNewDialog (ABOUT_BOX, NIL, (WindowPtr) -1);
SizeWindow(aboutBox, width, hight, false);
ShowWindow (aboutBox);
SetPort(aboutBox);
DrawPicture(aboutPict, &(*aboutPict)->picFrame);
//itemHit = 0;
//while (itemHit != ok) ModalDialog (NIL, &itemHit);
while (!Button());
DisposeDialog (aboutBox);
FlushEvents(everyEvent, 0); // dmazzoni
}

View File

@@ -0,0 +1,3 @@
/* macaboutbox.h -- header for about box implementation */
void DoAboutBox(void);

View File

@@ -0,0 +1,161 @@
#include <Drag.h>
#include <Errors.h>
#include <TextEdit.h>
#include <QuickDraw.h>
extern TEHandle hTERec;
// Handle drag from newswatcher -EAD
/*----------------------------------------------------------------------------
DragText
Drag selected text.
Entry: ev = pointer to mouse down event record.
where = location of mouse down event in local coords.
theTE = handle to TextEdit record.
Exit: function result = error code.
*dragged =
true if text was dragged.
false if mouse down was not over text selection, or
user did not move the mouse before releasing the
mouse button.
*trashed = true if text was dragged to trash.
----------------------------------------------------------------------------*/
extern RgnHandle rgn;
//extern EventRecord theEvent;
Boolean DragText (EventRecord *ev)
{
DragReference dragRef;
OSErr err = noErr;
Boolean haveDragRef = false;
Handle hText;
RgnHandle dragRgn, tempRgn;
short selStart, selEnd;
char state;
Point theLoc;
GrafPtr curPort;
// if (!PtInTEHiliteRgn(where, hTERec)) return noErr;
if (!WaitMouseMoved(ev->where)) return noErr;
GetPort(&curPort);
CopyRgn(rgn, dragRgn = NewRgn());
SetPt(&theLoc, 0, 0);
LocalToGlobal(&theLoc);
OffsetRgn(dragRgn, theLoc.h, theLoc.v);
hText = (**hTERec).hText;
selStart = (**hTERec).selStart;
selEnd = (**hTERec).selEnd;
err = NewDrag(&dragRef);
if (err != noErr) goto exit;
haveDragRef = true;
state = HGetState(hText);
HLock(hText);
err = AddDragItemFlavor(dragRef, 1, 'TEXT', *hText + selStart, selEnd - selStart, 0);
HSetState(hText, state);
if (err != noErr) goto exit;
// dragRgn = NewRgn();
// err = TEGetHiliteRgn(dragRgn, hTERec);
// if (err != noErr) goto exit;
// LocalToGlobalRgn(dragRgn);
// OutlineRegion(dragRgn);
SetDragItemBounds(dragRef, 1, &(**dragRgn).rgnBBox);
tempRgn = NewRgn();
CopyRgn(dragRgn, tempRgn);
InsetRgn(tempRgn, 1, 1);
DiffRgn(dragRgn, tempRgn, dragRgn);
DisposeRgn(tempRgn);
err = TrackDrag(dragRef, ev, dragRgn);
if (err != noErr && err != userCanceledErr) goto exit;
//*trashed = DragTargetWasTrash(dragRef);
// DisposeRgn(dragRgn);
DisposeDrag(dragRef);
return true;
exit:
if (haveDragRef) DisposeDrag(dragRef);
// if (dragRgn != nil) DisposeRgn(dragRgn);
return false;
}
/*----------------------------------------------------------------------------
LocalToGlobalRgn
Convert a region from local to global coordinates.
Entry: rgn = handle to region.
----------------------------------------------------------------------------*/
void LocalToGlobalRgn (RgnHandle rgn)
{
Point where;
SetPt(&where, 0, 0);
LocalToGlobal(&where);
OffsetRgn(rgn, where.h, where.v);
}
/*----------------------------------------------------------------------------
OutlineRegion
Change a region into a tracing of its border which is appropriate
for normal dragging.
Entry: theRgn = handle to region.
Exit: Region changed to outline of region.
From Apple "HFS Drag Sample" sample code.
----------------------------------------------------------------------------*/
void OutlineRegion (RgnHandle theRgn)
{
RgnHandle tempRgn;
tempRgn = NewRgn();
CopyRgn(theRgn, tempRgn);
InsetRgn(tempRgn, 1, 1);
DiffRgn(theRgn, tempRgn, theRgn);
DisposeRgn(tempRgn);
}
/*----------------------------------------------------------------------------
PtInTEHiliteRgn
Determine whether or not a point is in the current TextEdit hilite
region.
Entry: where = point in local coords.
theTE = handle to TextEdit record.
Exit: function result = true if point is in the hilite region.
----------------------------------------------------------------------------*/
Boolean PtInTEHiliteRgn (Point where, TEHandle theTE)
{
Boolean result = false;
RgnHandle rgn = nil;
OSErr err = noErr;
//if (!HaveTEGetHiliteRgn()) return false;
rgn = NewRgn();
err = TEGetHiliteRgn(rgn, theTE);
if (err != noErr) goto exit;
result = PtInRgn(where, rgn);
exit:
if (rgn != nil) DisposeRgn(rgn);
return result;
}

View File

@@ -0,0 +1,222 @@
/* macfun.c - macintosh user interface functions for xlisp */
/* Written by Brian Kendig. */
#include <Quickdraw.h>
#include <Windows.h>
#include <Memory.h>
#include "xlisp.h"
#include "macint.h"
/* externals */
extern WindowPtr gCommandWin, gGraphicsWin;
extern Boolean hasColorQD;
extern unsigned long startupTicks;
extern void ShowGrafWin (void);
unsigned long ticks_per_second (void) { return 60; }
unsigned long run_tick_count (void) { return ((unsigned long) TickCount ()) - startupTicks; }
unsigned long real_tick_count (void) { return (unsigned long) TickCount (); }
LVAL xrealtime (void) { return cvfixnum ((FIXTYPE)real_tick_count()); } /* get-internal-real-time */
LVAL xruntime (void) { return cvfixnum ((FIXTYPE)run_tick_count()); } /* get-internal-run-time */
LVAL xtime (void) { return cvfixnum ((FIXTYPE)real_tick_count()); } /* time */
/* get an integer parameter */
LOCAL int getNumber () {
LVAL num = xlgafixnum ();
return ((int) getfixnum (num));
}
/* handle commands that require integer arguments */
LOCAL LVAL GrafCmd (char funct, int nArgs) {
short x, y, z;
if (nArgs > 0) x = getNumber ();
if (nArgs > 1) y = getNumber ();
if (nArgs > 2) z = getNumber ();
xllastarg ();
SetPort (gGraphicsWin);
switch (funct) {
case 'G': ShowGrafWin (); break;
case 'g': HideGrafWin (); break;
case 'x': EraseRect (&gGraphicsWin->portRect); break;
case 's': ShowPen (); break;
case 'h': HidePen (); break;
case 'd': PenMode (x); break;
case 'M': Move (x, y); break;
case 'm': MoveTo (x, y); break;
case 'L': Line (x, y); break;
case 'l': LineTo (x, y); break;
case 'S': PenSize (x, y); break;
case 'p': PenNormal (); break;
case 'c':
if (hasColorQD) {
RGBColor col; col.red = x; col.green = y; col.blue = z;
RGBForeColor (&col);
} break;
}
SetPort (gCommandWin);
return NIL;
}
LVAL xshowgraphics (void) { return GrafCmd ('G', 0); } /* show graphics win */
LVAL xhidegraphics (void) { return GrafCmd ('g', 0); } /* hide graphics win */
LVAL xcleargraphics (void) { return GrafCmd ('x', 0); } /* clear graphics win */
LVAL xshowpen (void) { return GrafCmd ('s', 0); } /* show the pen */
LVAL xhidepen (void) { return GrafCmd ('h', 0); } /* hide the pen */
LVAL xpenmode (void) { return GrafCmd ('d', 1); } /* set the pen mode */
LVAL xmove (void) { return GrafCmd ('M', 2); } /* move pen in a specified direction */
LVAL xmoveto (void) { return GrafCmd ('m', 2); } /* move pen to a screen location */
LVAL xdraw (void) { return GrafCmd ('L', 2); } /* draw a line in a specified direction */
LVAL xdrawto (void) { return GrafCmd ('l', 2); } /* draw a line to a screen location */
LVAL xpensize (void) { return GrafCmd ('S', 2); } /* set the pen size */
LVAL xpennormal (void) { return GrafCmd ('p', 0); } /* set the pen to normal */
LVAL xcolor (void) { return GrafCmd ('c', 3); } /* set RGB color of pen */
LVAL xgetpen (void) { /* get the pen position */
LVAL val;
Point p;
xllastarg ();
SetPort ((GrafPtr)gGraphicsWin);
GetPen (&p);
SetPort (gCommandWin);
xlsave1 (val);
val = consa (NIL);
rplaca (val,cvfixnum ((FIXTYPE)p.h));
rplacd (val,cvfixnum ((FIXTYPE)p.v));
xlpop ();
return val;
}
LVAL xpenpat (void) { /* set the pen pattern */
LVAL plist;
Pattern pat;
int i;
plist = xlgalist ();
xllastarg ();
for (i = 0; i < 8 && consp (plist); ++i, plist = cdr (plist))
// if (fixp (car (plist))) pat[i] = getfixnum (car (plist));
SetPort ((GrafPtr)gGraphicsWin);
PenPat (&pat);
SetPort (gCommandWin);
return NIL;
}
/* The functions below are not yet implemented. */
LVAL xtool (void) { /* call the toolbox */
int trap = getNumber ();
LVAL val;
/* asm {
move.l args(A6),D0
beq L2
L1: move.l D0,A0
move.l 2(A0),A1
move.w 4(A1),-(A7)
move.l 6(A0),D0
bne L1
L2: lea L3,A0
move.w trap(A6),(A0)
L3: dc.w 0xA000
clr.l val(A6)
}
return val; */
return cvfixnum ((FIXTYPE) trap);
}
LVAL xtool16 (void) { /* call the toolbox with a 16 bit result */
int trap = getNumber ();
int val;
/* asm {
clr.w -(A7)
move.l args(A6), D0
beq L2
L1: move.l D0, A0
move.l 2(A0), A1
move.w 4(A1), -(A7)
move.l 6(A0), D0
bne L1
L2: lea L3, A0
move.w trap(A6), (A0)
L3: dc.w 0xA000
move.w (A7)+, val(A6)
}
return cvfixnum ((FIXTYPE) val); */
return cvfixnum ((FIXTYPE) trap);
}
LVAL xtool32 (void) { /* call the toolbox with a 32 bit result */
int trap = getNumber ();
long val;
/* asm {
clr.l -(A7)
move.l args(A6),D0
beq L2
L1: move.l D0,A0
move.l 2(A0),A1
move.w 4(A1),-(A7)
move.l 6(A0),D0
bne L1
L2: lea L3,A0
move.w trap(A6),(A0)
L3: dc.w 0xA000
move.l (A7)+,val(A6)
}
return cvfixnum ((FIXTYPE) val); */
return cvfixnum ((FIXTYPE) trap);
}
LVAL xnewhandle (void) { /* allocate a new handle */
LVAL num = xlgafixnum ();
long size = getfixnum (num);
xllastarg ();
return cvfixnum ((FIXTYPE) NewHandle (size));
}
LVAL xnewptr (void) { /* allocate memory */
LVAL num = xlgafixnum ();
long size = getfixnum (num);
xllastarg ();
return cvfixnum ((FIXTYPE) NewPtr (size));
}
LVAL xhiword (void) { /* return the high order 16 bits of an integer */
unsigned int val = (unsigned int) (getNumber () >> 16);
xllastarg ();
return cvfixnum ((FIXTYPE) val);
}
LVAL xloword (void) { /* return the low order 16 bits of an integer */
unsigned int val = (unsigned int) getNumber ();
xllastarg ();
return cvfixnum ((FIXTYPE) val);
}
LVAL xrdnohang (void) { /* get the next character in the look-ahead buffer */
int ch = 0;
xllastarg ();
/* if ((ch = scrnextc ()) == EOF) return NIL; */
return cvfixnum ((FIXTYPE) ch);
}
void ossymbols (void) { /* ossymbols - enter important symbols */
LVAL sym;
/* setup globals for the window handles */
sym = xlenter ("*COMMAND-WINDOW*");
setvalue (sym, cvfixnum ((FIXTYPE) gCommandWin));
sym = xlenter ("*GRAPHICS-WINDOW*");
setvalue (sym, cvfixnum ((FIXTYPE) gGraphicsWin));
}
void xoserror (char *msg) { /* do nothing */ }
LVAL xsystem (V) { return NIL; }
LVAL xgetkey (V) { return NIL; }

View File

@@ -0,0 +1,521 @@
/* macint.c - macintosh interface routines for xlisp 2.1e */
/* Written by Brian Kendig. */
/* The functions here are only called by macstuff.c. */
#include <Events.h>
#include <Gestalt.h>
#include <Memory.h>
#include <Menus.h>
#include <Events.h>
#include <Quickdraw.h>
#include <StandardFile.h>
#include <TextEdit.h>
#include <ToolUtils.h>
#include <Traps.h>
#include <Windows.h>
#include <Controls.h>
/* #include <ControlDefinitions.h> */
#include <SIOUX.h>
#include <AppleEvents.h>
#include "macint.h"
/* #define FALSE 0
#define TRUE 1 */
#define NIL ((void *) 0)
#include "MacCommandWin.h"
#include "macaboutbox.h"
#include "MacDrag.h"
#include "MacHandleEv.h"
#include "macstuff.h"
#include "stdio.h"
#define TEXTREC (*hTERec) /* the command window text record */
#define TEXTCHAR(i) ((*(TEXTREC->hText))[i])
// Struct for apple event handling
typedef struct AEventList {
AEEventClass evclass;
AEEventID evid;
void *handler;
long refcon;
} AEventList, *AEventListPtr;
//===========================================================================
// GLOBALS DEFINED HERE USE MacGlobals.h FOR ACCESS
//===========================================================================
// Menu handles
MenuHandle appleMenu, fileMenu, editMenu, controlMenu;
/* command and graphics windows */
WindowPtr gCommandWin, gGraphicsWin;
WindowRecord commandWinRec, bwGraphicsWinRec;
CWindowRecord colorGraphicsWinRec;
Boolean gGraphicsShown, gCommandWinResized = false;
// Screen size stuff
Rect dragRect, sizeRect;
int screenWidth, screenHeight; /* screen dimensions */
int sHorizontal, sVertical, sWidth, sHeight; /* command win, split screen */
int gHorizontal, gVertical, gWidth, gHeight; /* graphics win, split screen */
// The Text handle
TEHandle hTERec;
/* output is buffered */
//Handle hOutputBuffer = NULL;
int outputBufferLength = 0;
// Allocate space for UPPs
ControlActionUPP uppScrollProc;
TEClickLoopUPP uppScrollClickLoop;
//AEEventHandlerUPP uppAEOpenFiles, uppAEQuit;
// Text related globals
CharsHandle pastedTextH = NULL; /* a handle to pasted text */
int pastedLength = 0; /* how many chars there are in the paste buffer */
int flashTime = 0, cursorBeforeFlash; /* for flashing cursor when parens match */
char recentChar; /* the last character typed */
RgnHandle gMouseRgn; // holds current mouse regin
/* miscellaneous stuff */
Boolean gInBackground; /* are we in background or not */
int wneImplemented;
unsigned long startupTicks;
Boolean hasColorQD;
short howManyFiles = 0, whichFile = 0; /* keep track of files opened from Finder */
// Prototypes
static pascal OSErr AEQuit (AppleEvent *theAppleEvent, AppleEvent *theReply, long Refcon);
static pascal OSErr AEOpenFiles (AppleEvent *theAppleEvent, AppleEvent *theReply, long Refcon);
pascal Boolean ScrollClickLoop (void);
pascal void ScrollProc (ControlHandle control, short thePart);
Rect SetTERect (void);
void FlushOutput (void);
void ShowGrafWin (void) {
/* make the graphics window visible */
ShowWindow (gGraphicsWin);
SelectWindow (gGraphicsWin);
SetMenuItemText (controlMenu, SHOW_GRAPHICS, "\pHide Graphics");
//AdjustCursor ();
gGraphicsShown = true;
}
void HideGrafWin (void) {
/* hide the graphics window */
HideWindow (gGraphicsWin);
SetMenuItemText (controlMenu, SHOW_GRAPHICS, "\pShow Graphics");
gGraphicsShown = false;
}
static void UpdateGraphWindow ()
{
BeginUpdate (gGraphicsWin);
EndUpdate (gGraphicsWin);
}
void InitMac (void) {
// { /* set up memory properly */
// int i;
// fix this later. -EAD
//if (DefltStack < STACKMIN) SetApplLimit (CurStackBase - STACKMIN);
// MaxApplZone ();
// for (i = 0; i < MASTERS; i++) MoreMasters ();
// }
AEventListPtr theAppleEvent;
AEventList theEventList[] = {
{ kCoreEventClass, kAEOpenDocuments, AEOpenFiles, 0 },
{ kCoreEventClass, kAEQuitApplication, AEQuit, 0 },
{ 0, 0, nil, 0 }
};
int i;
/* do all the necessary initialization mumbo-jumbo */
if (StackSpace() < STACKMIN)
SetApplLimit(GetApplLimit() - STACKMIN);
MaxApplZone();
/* printf("New StackSpace %lx GetApplLimit %lx\n",
StackSpace(), GetApplLimit()); */
for (i = 0; i < MASTERS; i++) MoreMasters ();
/* getchar(); */
/* initialize the toolbox */
InitGraf (&qd.thePort);
InitFonts ();
FlushEvents (everyEvent, 0);
InitWindows ();
InitMenus ();
TEInit ();
InitDialogs (NIL);
InitCursor ();
// Setup Callbacks
uppScrollClickLoop = NewTEClickLoopProc(ScrollClickLoop);
uppScrollProc = NewControlActionProc(ScrollProc);
// Handlers for core apple events
for (theAppleEvent = theEventList; theAppleEvent->handler; theAppleEvent++)
if (AEInstallEventHandler(theAppleEvent->evclass, theAppleEvent->evid, NewAEEventHandlerProc((ProcPtr)theAppleEvent->handler),
theAppleEvent->refcon, 0) != noErr);
// Set up the SIOUX window
SIOUXSettings.initializeTB = FALSE; //Toolbox is alread inited
SIOUXSettings.setupmenus = FALSE; //keep the csound menus
SIOUXSettings.autocloseonquit = TRUE; //close sioux without asking for save
SIOUXSettings.showstatusline = FALSE; //no status line
SIOUXSettings.asktosaveonclose = FALSE; //don't ask to save
SIOUXSettings.toppixel = 40;
SIOUXSettings.leftpixel = 5;
/* see if we have WaitNextEvent and Color Quickdraw */
wneImplemented = (NGetTrapAddress (_WaitNextEvent, ToolTrap) != NGetTrapAddress (_Unimplemented, ToolTrap));
if (NGetTrapAddress ((short) Gestalt, ToolTrap) != NGetTrapAddress (_Unimplemented, ToolTrap)) {
long returnCode;
OSErr err = Gestalt (gestaltQuickdrawVersion, &returnCode);
hasColorQD = ((err == noErr) && (returnCode >= gestalt8BitQD));
} else hasColorQD = false;
{ /* set up menus */
Handle theMenuBar = GetNewMBar (MBAR_RES);
SetMenuBar (theMenuBar);
appleMenu = (MenuHandle)GetMenuHandle (APPLE_MENU_RES);
fileMenu = (MenuHandle)GetMenuHandle (FILE_MENU_RES);
editMenu = (MenuHandle)GetMenuHandle (EDIT_MENU_RES);
controlMenu = (MenuHandle)GetMenuHandle (CONTROL_MENU_RES);
AppendResMenu (appleMenu, 'DRVR');
DrawMenuBar ();
}
/* get the size of the main screen */
screenWidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
screenHeight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top;
/* compute the size of the graphics window in split-screen mode */
gHorizontal = SCREEN_MARGIN;
gVertical = MBAR_HEIGHT + TITLEBAR_HEIGHT - 1;
gWidth = screenWidth - (SCREEN_MARGIN * 2);
gHeight = GRAFWIN_HEIGHT;
/* compute the size of the command window in split-screen mode */
sHorizontal = SCREEN_MARGIN;
sVertical = MBAR_HEIGHT + TITLEBAR_HEIGHT - 1 + SCREEN_MARGIN + GRAFWIN_HEIGHT;
sWidth = screenWidth - (SCREEN_MARGIN * 2);
sHeight = screenHeight - MBAR_HEIGHT - TITLEBAR_HEIGHT - (SCREEN_MARGIN * 2) - GRAFWIN_HEIGHT - 1;
/* set up size and drag rects */
dragRect = (*GetGrayRgn ())->rgnBBox;
// dragRect.left += DRAG_THRESHOLD;
// dragRect.right -= DRAG_THRESHOLD;
// dragRect.bottom -= DRAG_THRESHOLD;
sizeRect.top = MIN_WIN_HEIGHT;
sizeRect.left = MIN_WIN_WIDTH;
sizeRect.bottom = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top;
sizeRect.right = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
/* create the command window */
gCommandWin = GetNewWindow (CWINRES, &commandWinRec, (WindowPtr) -1L);
SetPort (gCommandWin);
/* create the graphics window */
if (hasColorQD) gGraphicsWin = GetNewCWindow (GWINRES, &colorGraphicsWinRec, (WindowPtr) -1L);
else gGraphicsWin = GetNewWindow (GWINRES, &bwGraphicsWinRec, (WindowPtr) -1L);
startupTicks = TickCount (); /* take note of what time we're starting up */
// Create mouse regin
gMouseRgn = NewRgn();
// Initalize some command window stuff
InitalizeCmdWindow();
// Turn on text outlineing
TEFeatureFlag(teFOutlineHilite, teBitSet, hTERec);
HideGrafWin ();
{ /* see if the user launched the app by opening text files from the Finder */
short doWhat;\
// call to CountAppFiles was commented out, but that left doWhat uninitialized
// RBD added this ifdef, I wonder where CountAppFiles came from?
#ifdef CountAppFilesDefined
CountAppFiles (&doWhat, &howManyFiles);
if (doWhat != appOpen) howManyFiles = 0;
#else
howManyFiles = 0;
#endif
}
UpdateCmdWindow ();
}
static void DoAppleMenu (int theItem) {
switch (theItem) {
case ABOUT_ITEM:
DoAboutBox ();
break;
default: {
Str255 name;
GetMenuItemText (appleMenu, theItem, name);
OpenDeskAcc (name);
break;
}
}
}
/* this should really be in a header for MacFileUtils.c */
void GetFullPath(FSSpec *theSpec, StringPtr theName);
static void DoFileMenu (int theItem) {
extern xlload (char *, int, int);
extern xlabort(char *);
extern xlisp_wrapup (void);
StandardFileReply theFile;
SFTypeList fileTypes;
Point pt = { 100, 100 };
fileTypes[0] = 'TEXT';
switch (theItem) {
case LOAD:
case LOAD_NOISILY:
StopPasting ();
StandardGetFile(NIL, 1, fileTypes, &theFile);
if (theFile.sfGood) {
Str255 theFullPath;
short wdRefNum;
OSErr err;
HiliteMenu (0);
err = OpenWD(theFile.sfFile.vRefNum, theFile.sfFile.parID, 'Nyqu', &wdRefNum);
err = SetVol(NIL, wdRefNum);
SetSelection (TEXTREC->teLength, TEXTREC->teLength); /* send cursor to end */
GetFullPath(&theFile.sfFile, theFullPath);
P2CStr(theFullPath);
if ((xlload((char *) theFullPath, 1, (theItem == LOAD_NOISILY))) == 0) {
xlabort("load error");
}
macputs ("> ");
PrepareForInput ();
}
break;
case QUIT:
xlisp_wrapup ();
}
}
static void DoEditMenu (int theItem) {
if (SystemEdit (theItem-1) == false)
switch (theItem) {
case CUT: case COPY:
if (ZeroScrap () == noErr) {
TECopy (hTERec); /* after copying, export the TE scrap */
if (TEToScrap () != noErr) ZeroScrap ();
}
if (theItem == CUT) DeleteRange ();
break;
case PASTE: {
long scrapOffset;
if (pastedTextH) DisposeHandle (pastedTextH);
pastedTextH = (CharsHandle) NewHandle (0);
pastedLength = GetScrap (pastedTextH, 'TEXT', &scrapOffset);
if (pastedLength < 0) pastedLength = 0; /* error */
else {
SetHandleSize (pastedTextH, pastedLength + 1);
HLock (pastedTextH);
((char *)(*pastedTextH))[pastedLength] = '\0';
HUnlock (pastedTextH);
}
} /* and fall through ... */
case CLEAR:
DeleteRange ();
break;
}
}
static void DoControlMenu (int theItem) {
extern xlbreak (char *, char *);
extern char *s_unbound;
extern xlcontinue (void);
extern xlcleanup (void);
extern xlabort (char *);
extern xltoplevel (void);
scrflush ();
HiliteMenu (0);
switch (theItem) {
case BREAK: StopPasting (); xlbreak ("user break", s_unbound); PrepareForInput (); break;
case CONTINUE: StopPasting (); xlcontinue (); PrepareForInput (); break;
case CLEAN_UP: StopPasting (); xlcleanup (); PrepareForInput (); break;
case CANCEL_INPUT: StopPasting (); xlabort ("input canceled"); PrepareForInput (); break;
case TOP_LEVEL: StopPasting (); xltoplevel (); PrepareForInput (); break;
case SHOW_GRAPHICS:
if (gGraphicsShown) HideGrafWin ();
else ShowGrafWin ();
break;
case SPLIT_SCREEN:
MoveWindow (gCommandWin, sHorizontal, sVertical, -1);
SizeWindow (gCommandWin, sWidth, sHeight, -1);
InvalRect (&gCommandWin->portRect);
SetTERect ();
SetScrollRect ();
ShowGrafWin ();
MoveWindow (gGraphicsWin, gHorizontal, gVertical, -1);
SizeWindow (gGraphicsWin, gWidth, gHeight, -1);
break;
}
}
void DoMenu (long choice) {
int theMenu = HiWord (choice), theItem = LoWord (choice);
HiliteMenu (theMenu);
switch (theMenu) {
case APPLE_MENU_RES: DoAppleMenu (theItem); break;
case FILE_MENU_RES: DoFileMenu (theItem); break;
case EDIT_MENU_RES: DoEditMenu (theItem); break;
case CONTROL_MENU_RES: DoControlMenu (theItem); break;
}
HiliteMenu (0);
}
void AdjustMenus (void) {
/* turn the stuff in the Edit menu on and off as necessary */
long temp;
DisableItem (editMenu, UNDO);
if (TEXTREC->selStart != TEXTREC->selEnd) {
EnableItem (editMenu, CUT);
EnableItem (editMenu, COPY);
EnableItem (editMenu, CLEAR);
} else {
DisableItem (editMenu, CUT);
DisableItem (editMenu, COPY);
DisableItem (editMenu, CLEAR);
}
if (GetScrap (NIL, 'TEXT', &temp) > 0) EnableItem (editMenu, PASTE);
else DisableItem (editMenu, PASTE);
}
RgnHandle rgn = nil;
void DoContent (EventRecord *theEvent) {
/* handle a click in a window's content region */
ControlHandle theScrollBar;
GrafPtr oldPort;
int scrollValue;
Point mouse = theEvent->where;
int thePart;
// RgnHandle rgn = nil;
GetPort (&oldPort);
SetPort (gCommandWin);
GlobalToLocal (&mouse);
// Get Selected text
rgn = NewRgn();
TEGetHiliteRgn(rgn, hTERec);
if (thePart = FindControl (mouse, gCommandWin, &theScrollBar)) {
switch (thePart) {
case kControlUpButtonPart:
case kControlDownButtonPart:
case kControlPageUpPart:
case kControlPageDownPart:
scrollValue = TrackControl (theScrollBar, mouse, uppScrollProc);
break;
case kControlIndicatorPart:
scrollValue = GetControlValue (theScrollBar);
thePart = TrackControl (theScrollBar, mouse, NIL);
if (thePart) {
scrollValue -= GetControlValue (theScrollBar);
if (scrollValue) TEScroll (0, scrollValue * LINEHEIGHT, hTERec);
}
break;
}
} else if (PtInRgn(mouse, rgn)) {
if (!DragText(theEvent)) {
TEClick(mouse, false, hTERec);
}
} else if (PtInRect (mouse, &(TEXTREC->viewRect))) {
TEClick (mouse, (theEvent->modifiers & shiftKey) != 0, hTERec);
}
SetPort (oldPort);
DisposeRgn(rgn);
}
void DoEvent (void) {
EventRecord theEvent;
if ((flashTime) && (--flashTime == 0)) SetSelection (cursorBeforeFlash, cursorBeforeFlash);
if (outputBufferLength) FlushOutput ();
if (FrontWindow () == gCommandWin) TEIdle (hTERec);
recentChar = '\0';
if (WaitNextEvent (everyEvent, &theEvent, 0, gMouseRgn)) {
AdjustCursor (theEvent.where, gMouseRgn);
switch (theEvent.what) {
case kHighLevelEvent:
AEProcessAppleEvent(&theEvent);
break;
case mouseDown:
DoMouseDown (&theEvent);
break;
case keyDown:
case autoKey:
DoKeyPress (&theEvent);
break;
case activateEvt: {
WindowPtr whichWindow = (WindowPtr)theEvent.message;
SetPort (whichWindow);
if (whichWindow == gCommandWin) {
if ((theEvent.modifiers & activeFlag) == 1) {
ActivateCmdWindow();
} else {
DeactivateCmdWindow();
}
}
break;
}
case updateEvt: {
if ((WindowPtr)theEvent.message == gCommandWin) UpdateCmdWindow ();
if ((WindowPtr)theEvent.message == gGraphicsWin) UpdateGraphWindow ();
break;
}
case osEvt:
if (((theEvent.message >> 24) & 0xff) == suspendResumeMessage) {
if (theEvent.message & resumeFlag) {
gInBackground = false;
if (FrontWindow () == gCommandWin) {
ActivateCmdWindow();
}
} else {
gInBackground = true;
if (FrontWindow () == gCommandWin) {
SetPort (gCommandWin);
DeactivateCmdWindow();
}
}
}
break;
}
}
AdjustCursor (theEvent.where, gMouseRgn);
}
void MacWrapUp (void) {
/* take everything down in preparation for quitting */
CleanupCmdWindow();
CloseWindow (gGraphicsWin);
}

View File

@@ -0,0 +1,166 @@
#define INT_MAX +32767
#define INT_MIN -32767
/* resource id's */
#define CWINRES 400
#define GWINRES 401
#define MBAR_RES 400
#define APPLE_MENU_RES 400
#define FILE_MENU_RES 401
#define EDIT_MENU_RES 402
#define CONTROL_MENU_RES 403
#define STRINGS_RES 400
/* Apple menu */
#define ABOUT_ITEM 1
#define ABOUT_BOX 400
#define ABOUT_PICT 400
/* File menu */
#define LOAD 1
#define LOAD_NOISILY 2
#define QUIT 4
/* Edit menu */
#define UNDO 1
#define CUT 3
#define COPY 4
#define PASTE 5
#define CLEAR 6
/* Control menu */
#define BREAK 1
#define CONTINUE 2
#define CLEAN_UP 3
#define CANCEL_INPUT 4
#define TOP_LEVEL 5
#define SHOW_GRAPHICS 7
#define SPLIT_SCREEN 8
/* window sizing/dragging stuff */
#define DRAG_THRESHOLD 8
#define MIN_WIN_HEIGHT 80
#define MIN_WIN_WIDTH 120
#define MAX_BUF 250 /* max chars in output buffer */
#define SCROLLBACK_THRESHHOLD 30000 /* max chars kept in window */
#define DELETE_BLOCK 10000 /* how many chars to delete when threshhold reached */
#define LINEHEIGHT 11 /* height in pixels of 9-point Geneva, the font used */
#define STACKMIN 400000 /* amout of memory for application stack */
#define MASTERS 3 /* arbitrary -- how many times to call MoreMasters() */
/* key codes */
#define RETURN 0x0d
#define ENTER 0x03
#define DELETE 0x08
#define FWDDEL 0x7F
#define CLRKEY 0x1b
#define PAGEUP 0x0b
#define PAGEDN 0x0c
#define HOMEKEY 0x01
#define ENDKEY 0x04
#define HELPKEY 0x05
#define FNKEY 0x10
#define LEFTARROW 0x1c
#define RIGHTARROW 0x1d
#define UPARROW 0x1e
#define DOWNARROW 0x1f
#define DBLQUOTE '\"'
/* useful definitions */
#define MBAR_HEIGHT 20
#define TITLEBAR_HEIGHT 20
#define SCROLLER_WIDTH 15
#define SCREEN_MARGIN 2
#define TEXT_MARGIN 4
#define GRAFWIN_HEIGHT 232
void AdjustMenus(void);
void DoMenu(long choice);
void HideGrafWin(void);
void DoContent(EventRecord *theEvent);
void InitMac(void);
void MacWrapUp(void);
void DoEvent (void);

View File

@@ -0,0 +1,52 @@
{ "HIDEPEN", S, xhidepen }, /* 300 */
{ "SHOWPEN", S, xshowpen }, /* 301 */
{ "GETPEN", S, xgetpen }, /* 302 */
{ "PENSIZE", S, xpensize }, /* 303 */
{ "PENMODE", S, xpenmode }, /* 304 */
{ "PENPAT", S, xpenpat }, /* 305 */
{ "PENNORMAL", S, xpennormal }, /* 306 */
{ "MOVETO", S, xmoveto }, /* 307 */
{ "MOVE", S, xmove }, /* 308 */
{ "LINETO", S, xdrawto }, /* 309 */
{ "LINE", S, xdraw }, /* 310 */
{ "SHOW-GRAPHICS", S, xshowgraphics }, /* 311 */
{ "HIDE-GRAPHICS", S, xhidegraphics }, /* 312 */
{ "CLEAR-GRAPHICS", S, xcleargraphics }, /* 313 */
{ "TOOLBOX", S, xtool }, /* 314 */
{ "TOOLBOX-16", S, xtool16 }, /* 315 */
{ "TOOLBOX-32", S, xtool32 }, /* 316 */
{ "NEWHANDLE", S, xnewhandle }, /* 317 */
{ "NEWPTR", S, xnewptr }, /* 318 */
{ "HIWORD", S, xhiword }, /* 319 */
{ "LOWORD", S, xloword }, /* 320 */
{ "READ-CHAR-NO-HANG", S, xrdnohang }, /* 321 */
/* not implemented - take a look at code in directory "sys:mac:old" */
/*{ "COMMAND-POINT-SIZE", S, xptsize }, 322 */

View File

@@ -0,0 +1,229 @@
/* 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);
}
}

View File

@@ -0,0 +1,7 @@
/* macstuff.h -- header for mac-specific functions */
void osfinish(void);
/* put searchpath into p, prefs_found tells if preference file exists */
void get_xlisp_path(char *p, long p_max, int *prefs_found);
void setup_preferences(char *filename);

View File

@@ -0,0 +1,2 @@
#include "sndmac.h"

View File

@@ -0,0 +1,58 @@
/* switches.h for Macintosh */
/* CHANGE LOG
* --------------------------------------------------------------------
* 28Apr03 dm major reorganization of conditional compilation in Nyquist
*/
#define HAS_STDLIB_H 1
#undef HAS_SYS_TYPES_H
#undef HAS_SYS_STAT_H
#define HAS_STAT_H 1
#undef HAS_MALLOC_H
#define HAS_GETTIMEOFDAY 1
#undef READ_LINE
#define XL_BIG_ENDIAN 1
#undef XL_LITTLE_ENDIAN
#define USE_RAND 1
#undef USE_RANDOM
/* define this to be printf, or define your own fn of the form
void nyquist_printf(char *format, ...);
(for a GUI)
*/
void nyquist_printf(char *format, ...);
#define NEED_ULONG 1
#define NEED_USHORT 1
#define NEED_BYTE 1
#define NEED_ROUND 1
#undef NEED_DEFINE_MALLOC
/* explicitly choose a platform */
#undef UNIX
#undef WINDOWS
#undef MICROSOFT
#undef DOS
#define MACINTOSH 1
#define BUFFERED_SYNCHRONOUS_INPUT 1
#define SPACE_FOR_PLAY 10000
#define MAX_CHANNELS 16
/* this will enable code to read midi files, etc. */
#define CMTSTUFF 1
/* NYQUIST tells some CMT code that we're really in
* XLISP and NYQUIST
*/
#define NYQUIST 1
#include "swlogic.h"

View File

@@ -0,0 +1,107 @@
; system.lsp -- machine/system-dependent definitions
; Macintosh
(setf ny:bigendianp t)
;; note that *default-sf-format* is used below by
;; compute-default-sound-file
(if (not (boundp '*default-sf-format*))
(setf *default-sf-format* snd-head-AIFF))
;; note that compute-default-sound-file uses *default-sf-format*,
;; so be sure to set *default-sf-format* first (this was just done)
(if (not (boundp '*default-sound-file*))
(compute-default-sound-file))
(if (not (boundp '*default-sf-dir*))
(setf *default-sf-dir* ""))
(if (not (boundp '*default-sf-mode*))
(setf *default-sf-mode* snd-mode-pcm))
(if (not (boundp '*default-sf-bits*))
(setf *default-sf-bits* 16))
(if (not (boundp '*default-plot-file*))
(setf *default-plot-file* "points.dat"))
; turn off switch to play sound as it is computed
(setf *soundenable* T)
; local definition for play
(defmacro play (expr)
`(s-save-autonorm ,expr NY:ALL *default-sound-file* :play *soundenable*))
(defun r ()
(s-save (s-read *default-sound-file*) NY:ALL "" :play t)
)
; PLAY-FILE -- play a file
(defun play-file (name)
(s-save (s-read name) NY:ALL "" :play t))
; FULL-NAME-P -- test if file name is a full path or relative path
;
; (otherwise the *default-sf-dir* will be prepended
;
(defun full-name-p (filename)
(eq (char filename 0) #\:))
(setf *file-separator* #\:)
; save the standard function to write points to a file
;
;(setfn s-plot-points s-plot)
(defun array-max-abs (points)
(let ((m 0.0))
(dotimes (i (length points))
(setf m (max m (abs (aref points i)))))
m))
(setf graph-width 800)
(setf graph-height 220)
(defun s-plot (snd &optional (n 800))
(show-graphics)
(clear-graphics)
(cond ((soundp snd)
(s-plot-2 snd n (/ graph-height 2) graph-height nil))
(t
(let ((gh (/ graph-height (length snd)))
hs)
(dotimes (i (length snd))
(setf hs (s-plot-2 (aref snd i) n (+ (/ gh 2) (* i gh)) gh hs)))))))
(defun s-plot-2 (snd n y-offset graph-height horizontal-scale)
(prog ((points (snd-samples snd n))
maxpoint horizontal-scale vertical-scale)
(setf maxpoint (array-max-abs points))
(moveto 0 y-offset)
(lineto graph-width y-offset)
(moveto 0 y-offset)
(cond ((null horizontal-scale)
(setf horizontal-scale (/ (float graph-width) (length points)))))
(setf vertical-scale (- (/ (float graph-height) 2 maxpoint)))
(dotimes (i (length points))
(lineto (truncate (* horizontal-scale i))
(+ y-offset (truncate (* vertical-scale (aref points i))))))
(format t "X Axis: ~A to ~A (seconds)\n" (snd-t0 snd) (/ (length points) (snd-srate snd)))
(format t "Y Axis: ~A to ~A\n" (- maxpoint) maxpoint)
(format t "~A samples plotted.\n" (length points))
(return horizontal-scale)
))
; S-EDIT - run the audio editor on a sound
;
;(defmacro s-edit (&optional expr)
; `(prog ()
; (if ,expr (s-save ,expr 1000000000 *default-sound-file*))
; (system (format nil "audio_editor ~A &"
; (soundfilename *default-sound-file*)))))

View File

@@ -0,0 +1 @@
/* nothing to do */