f0d81ffd1c
which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@5403 c028cbd2-c16b-5b4b-a496-9718f37d4682
325 lines
7.5 KiB
C
Executable File
325 lines
7.5 KiB
C
Executable File
#include <QuickDraw.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
|
|
#define bufferSize 1024
|
|
|
|
#define screenWindow 128
|
|
|
|
static Rect scrollRect, pauseRect;
|
|
static WindowPtr theWindow;
|
|
static RgnHandle scrollRgn;
|
|
|
|
static short fontHeight, fontWidth, screenHeight, screenWidth;
|
|
static short currentPosition, maxPosition, pausePosition;
|
|
|
|
static short *screenLength, startLine, endLine;
|
|
static char *screenImage, **screenLine;
|
|
|
|
static int screenOptions;
|
|
|
|
#define pauseOption 0x0001
|
|
#define scrollOption 0x0002
|
|
|
|
void screenOpen(char *Title) {
|
|
FontInfo fontInfo;
|
|
int n;
|
|
|
|
theWindow = GetNewWindow(screenWindow, nil, (WindowPtr)(-1));
|
|
|
|
if ((Title != NULL) && (*Title != '\0')) {
|
|
c2pstr(Title);
|
|
SetWTitle(theWindow, (StringPtr)Title);
|
|
p2cstr(Title);
|
|
}
|
|
|
|
ShowWindow(theWindow);
|
|
|
|
SetPort(theWindow);
|
|
TextFont(monaco);
|
|
TextSize(9);
|
|
|
|
GetFontInfo(&fontInfo);
|
|
fontHeight = fontInfo.ascent + fontInfo.descent + fontInfo.leading;
|
|
fontWidth = fontInfo.widMax;
|
|
|
|
scrollRgn = NewRgn();
|
|
|
|
screenWidth = (theWindow->portRect.right - theWindow->portRect.left - 10) /
|
|
fontWidth;
|
|
screenHeight = (theWindow->portRect.bottom - theWindow->portRect.top) /
|
|
fontHeight;
|
|
maxPosition = screenHeight * fontHeight;
|
|
pausePosition = maxPosition - (currentPosition = fontHeight);
|
|
|
|
SetRect(&scrollRect, theWindow->portRect.left, theWindow->portRect.top + fontInfo.descent,
|
|
theWindow->portRect.right, theWindow->portRect.bottom);
|
|
SetRect(&pauseRect, theWindow->portRect.left, pausePosition + fontInfo.descent,
|
|
theWindow->portRect.right, theWindow->portRect.bottom);
|
|
|
|
MoveTo(5, currentPosition);
|
|
|
|
n = (sizeof(char *) + sizeof(short) + screenWidth) * screenHeight;
|
|
|
|
screenLine = (char **)NewPtr(n);
|
|
|
|
screenLength = (short *)&screenLine[screenHeight];
|
|
screenImage = (char *)&screenLength[screenHeight];
|
|
|
|
for (n = 0; n < screenHeight; n++) {
|
|
screenLine[n] = &screenImage[n * screenWidth];
|
|
screenLength[n] = 0;
|
|
}
|
|
|
|
startLine = endLine = 0;
|
|
|
|
screenOptions = 0;
|
|
|
|
return;
|
|
}
|
|
|
|
void screenControl(options, setting) char *options; int setting; {
|
|
int n = 0;
|
|
|
|
while (*options) {
|
|
switch (*options) {
|
|
case 'p':
|
|
n |= pauseOption;
|
|
break;
|
|
case 'r':
|
|
currentPosition = maxPosition;
|
|
break;
|
|
case 's':
|
|
n |= scrollOption;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
options += 1;
|
|
}
|
|
|
|
if (setting == 0)
|
|
screenOptions &= (n ^ (-1));
|
|
else
|
|
screenOptions |= n;
|
|
|
|
if ((pausePosition = maxPosition - currentPosition) == 0)
|
|
pausePosition = maxPosition - fontHeight;
|
|
|
|
return;
|
|
}
|
|
|
|
void screenClose(void) {
|
|
DisposPtr((Ptr)screenLine);
|
|
|
|
DisposeWindow(theWindow);
|
|
|
|
return;
|
|
}
|
|
|
|
void screenUpdate(WindowPtr window) {
|
|
GrafPort *savePort;
|
|
int m, n;
|
|
|
|
if (window == theWindow) {
|
|
BeginUpdate(window);
|
|
if (!EmptyRgn(window->visRgn)) {
|
|
GetPort(&savePort);
|
|
SetPort(window);
|
|
n = startLine;
|
|
for (m = 1; ; m++) {
|
|
MoveTo(5, m * fontHeight);
|
|
if (screenLength[n] != 0)
|
|
DrawText(screenLine[n], 0, screenLength[n]);
|
|
if (n == endLine) break;
|
|
if ((n += 1) == screenHeight) n = 0;
|
|
}
|
|
SetPort(savePort);
|
|
}
|
|
EndUpdate(window);
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
static void screenNewline(void) {
|
|
MoveTo(5, currentPosition += fontHeight);
|
|
if (currentPosition > maxPosition) {
|
|
if (screenOptions & scrollOption) {
|
|
ScrollRect(&scrollRect, 0, -fontHeight, scrollRgn);
|
|
MoveTo(5, currentPosition = maxPosition);
|
|
if ((startLine += 1) == screenHeight) startLine = 0;
|
|
} else {
|
|
ScrollRect(&scrollRect, 0, -maxPosition + fontHeight, scrollRgn);
|
|
MoveTo(5, currentPosition = fontHeight + fontHeight);
|
|
startLine = endLine;
|
|
}
|
|
}
|
|
pausePosition -= fontHeight;
|
|
|
|
if ((endLine += 1) == screenHeight) endLine = 0;
|
|
screenLength[endLine] = 0;
|
|
|
|
return;
|
|
}
|
|
|
|
static char waitChar(void) {
|
|
WindowPtr whichWindow;
|
|
EventRecord theEvent;
|
|
|
|
for ( ; ; ) {
|
|
SystemTask();
|
|
if (GetNextEvent(everyEvent, &theEvent)) {
|
|
switch (theEvent.what) {
|
|
case keyDown:
|
|
if ((theEvent.modifiers & cmdKey) &&
|
|
((theEvent.message & charCodeMask) == '.'))
|
|
ExitToShell();
|
|
return(theEvent.message & charCodeMask);
|
|
case mouseDown:
|
|
if (FindWindow(theEvent.where, &whichWindow) == inSysWindow)
|
|
SystemClick(&theEvent, whichWindow);
|
|
break;
|
|
case updateEvt:
|
|
screenUpdate((WindowPtr)theEvent.message);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void screenPause(void) {
|
|
if (pausePosition == 0) {
|
|
if (screenOptions & pauseOption) {
|
|
DrawText("Press any key to continue ...", 0, 29);
|
|
memcpy(screenLine[endLine], "Press any key to continue ...", 29);
|
|
screenLength[endLine] = 29;
|
|
|
|
(void)waitChar();
|
|
|
|
EraseRect(&pauseRect);
|
|
MoveTo(5, currentPosition);
|
|
screenLength[endLine] = 0;
|
|
}
|
|
|
|
pausePosition = maxPosition - fontHeight;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void screenDisplay(char *s) {
|
|
GrafPort *savePort;
|
|
int m, n;
|
|
char *t;
|
|
|
|
GetPort(&savePort);
|
|
SetPort(theWindow);
|
|
|
|
while (*s) {
|
|
screenPause();
|
|
|
|
for (t = s; (*s) && (*s != '\n') && (*s != '\r'); s++);
|
|
|
|
if ((n = s - t) > (m = screenWidth - screenLength[endLine])) n = m;
|
|
|
|
if (n > 0) {
|
|
DrawText(t, 0, n);
|
|
memcpy(screenLine[endLine] + screenLength[endLine], t, n);
|
|
screenLength[endLine] += n;
|
|
}
|
|
|
|
if ((*s == '\n') || (*s == '\r')) {
|
|
screenNewline();
|
|
s += 1;
|
|
}
|
|
}
|
|
|
|
SetPort(savePort);
|
|
|
|
return;
|
|
}
|
|
|
|
void screenDump(char *s, long n) {
|
|
GrafPort *savePort;
|
|
int k, m;
|
|
char *t;
|
|
|
|
GetPort(&savePort);
|
|
SetPort(theWindow);
|
|
|
|
while (n) {
|
|
screenPause();
|
|
|
|
for (t = s; (n) && (*s != '\n') && (*s != '\r'); s++, n--);
|
|
|
|
if ((k = s - t) > (m = screenWidth - screenLength[endLine])) k = m;
|
|
|
|
if (k > 0) {
|
|
DrawText(t, 0, k);
|
|
memcpy(screenLine[endLine] + screenLength[endLine], t, k);
|
|
screenLength[endLine] += k;
|
|
}
|
|
|
|
if ((*s == '\n') || (*s == '\r')) {
|
|
screenNewline();
|
|
s += 1;
|
|
n -= 1;
|
|
}
|
|
}
|
|
|
|
SetPort(savePort);
|
|
|
|
return;
|
|
}
|
|
|
|
char *wfgets(char *s, int n, FILE *stream) {
|
|
GrafPort *savePort;
|
|
char c, *t = s;
|
|
|
|
GetPort(&savePort);
|
|
SetPort(theWindow);
|
|
|
|
for (n -= 1; (n > 0) && ((c = waitChar()) != '\r'); n -= 1) {
|
|
DrawChar(*t++ = c);
|
|
if (screenLength[endLine] < screenWidth)
|
|
screenLine[endLine][screenLength[endLine]++] = c;
|
|
}
|
|
|
|
if (c == '\r') screenNewline();
|
|
|
|
*t = '\0';
|
|
|
|
SetPort(savePort);
|
|
|
|
return(s);
|
|
}
|
|
|
|
void wfprintf(FILE *stream, char *format, ...) {
|
|
char buffer[bufferSize];
|
|
va_list ap;
|
|
|
|
va_start(ap, format);
|
|
vsprintf(buffer, format, ap);
|
|
va_end(ap);
|
|
|
|
screenDisplay(buffer);
|
|
|
|
return;
|
|
}
|
|
|
|
void wprintf(char *format, ...) {
|
|
char buffer[bufferSize];
|
|
va_list ap;
|
|
|
|
va_start(ap, format);
|
|
vsprintf(buffer, format, ap);
|
|
va_end(ap);
|
|
|
|
screenDisplay(buffer);
|
|
|
|
return;
|
|
}
|