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;
 | 
						|
}
 |