[comp.sources.mac] HyperTerm XCMD sources

UD069225@NDSUVM1.BITNET (Eric H. Romo) (05/25/88)

[HyperTerm XCMD sources]

[Moderator's Note:  This posting contains the source files for the
 xcmds in the HyperTerm stack posted in comp.binaries.mac.]

---
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#	breakSPort.p
#	bufferSPort.p
#	openPort.p
#	portHasChar.p
#	recvPort.p
#	recvString.p
#	recvUpTo.p
#	resetPort.p
#	sendPort.p
# This archive created: Tue May 24 08:36:57 1988
# By:	Roger L. Long (bytebug@dhw68k.cts.com)
export PATH; PATH=/bin:$PATH
echo shar: extracting "'breakSPort.p'" '(1932 characters)'
if test -f 'breakSPort.p'
then
	echo shar: will not over-write existing file "'breakSPort.p'"
else
sed 's/^X//' << \SHAR_EOF > 'breakSPort.p'
X{$R-}
X
X(*
X    breakSPort(port number, trueOrFalse) -- Send or clear a break on the serial port.
X
X    To compile and link this file using Macintosh Programmer's Workshop,
X
X    pascal -w resetPort.p
X    link -m ENTRYPOINT -o HyperCommands -rt XCMD=1 -sn Main=breakSPort breakSPort.p.o "{MPW}"Libraries:interface.o
X    
X*)
X
X{$S breakSPort }    { Segment name must be the same as the command name. }
X
Xunit DummyUnit;
X
Xinterface
X
Xuses MemTypes, QuickDraw, OSIntf, HyperXCmd;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X    
Ximplementation
X
Xtype
X
XStr31 = String[31];
X
Xprocedure breakSPort(paramPtr: XCmdPtr); forward;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X
X    begin
X        breakSPort(paramPtr);
X    end;
X
Xprocedure breakSPort(paramPtr: XCmdPtr);
X
X    var portNumber: integer;
X        setting: integer;
X        outPort: integer;
X        str: Str255;
X        doBreak: boolean;
X
X    {$I XCmdGlue.inc}
X
X    procedure Fail(errMsg: Str255); { set theResult and quit }
X        begin
X            paramPtr^.returnValue := PasToZero(errMsg);
X            exit(breakSPort);
X        end;
X
X    begin
X        if paramPtr^.paramCount <> 2 then Fail('parameter count is not 2');
X
X        ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
X        portNumber := StrToNum(str);
X        if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
X        ZeroToPas(paramPtr^.params[2]^,str);        { Second parameter is setting. }
X        doBreak := false;
X        if length(str) > 0 then
X            if (str[1] = 't') or (str[1] = 'T') then doBreak := true;
X
X        if portNumber = 1 then outPort := -7
X        else outPort := -9;
X        if doBreak then
X            begin
X                if SerSetBrk(outPort) <> noErr then Fail('SerSetBrk failed');
X            end
X        else
X            begin
X                if SerClrBrk(outPort) <> noErr then Fail('SerClrBrk failed');
X            end;
X    end;
X
Xend.
SHAR_EOF
if test 1932 -ne "`wc -c < 'breakSPort.p'`"
then
	echo shar: error transmitting "'breakSPort.p'" '(should have been 1932 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'bufferSPort.p'" '(2504 characters)'
if test -f 'bufferSPort.p'
then
	echo shar: will not over-write existing file "'bufferSPort.p'"
else
sed 's/^X//' << \SHAR_EOF > 'bufferSPort.p'
X{$R-}
X
X(*
X    bufferSPort(port number, oldBuffer,sizeOfBuffer) -- Free the old buffer at the address specified by
X    oldBuffer (if non-zero), and allocate a new buffer of sizeOfBuffer (or revert to default buffer if
X    zero). Return the address of the allocated buffer or zero if sizeOfBuffer is zero.
X
X    To compile and link this file using Macintosh Programmer's Workshop,
X
X    pascal -w bufferSPort.p
X    link -m ENTRYPOINT -o HyperCommands -rt XFCN=3 -sn Main=bufferSPort bufferSPort.p.o "{MPW}"Libraries:interface.o
X    
X*)
X
X{$S bufferSPort }   { Segment name must be the same as the command name. }
X
Xunit DummyUnit;
X
Xinterface
X
Xuses MemTypes, QuickDraw, OSIntf, ToolIntf, HyperXCmd;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X    
Ximplementation
X
Xconst
X
Xreturn = chr(13);
Xlinefeed = chr(10);
Xbs = chr(8);
X
Xtype
X
XStr31 = String[31];
X
Xprocedure bufferSPort(paramPtr: XCmdPtr); forward;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X
X    begin
X        bufferSPort(paramPtr);
X    end;
X
Xprocedure bufferSPort(paramPtr: XCmdPtr);
X
X    var portNumber: integer;
X        oldBufferPtr: Ptr;
X        newBufferPtr: Ptr;
X        newBufferSize: longInt;
X        inPort, outPort: integer;
X        str: Str255;
X
X    {$I XCmdGlue.inc}
X
X    procedure Fail(errMsg: Str255); { set theResult and quit }
X        begin
X            paramPtr^.returnValue := PasToZero(errMsg);
X            exit(bufferSPort);
X        end;
X
X    begin
X        if paramPtr^.paramCount <> 3 then Fail('parameter count is not 3');
X
X        ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
X        portNumber := StrToNum(str);
X        if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
X        ZeroToPas(paramPtr^.params[2]^,str);        { Second parameter is old buffer address. }
X        oldBufferPtr := Ptr(StrToNum(str));
X        ZeroToPas(paramPtr^.params[3]^,str);        { Third parameter is new buffer size. }
X        newBufferSize := StrToNum(str);
X
X        if portNumber = 1 then inPort := -6
X        else inPort := -8;
X
X        if newBufferSize = 0 then newBufferPtr := nil
X        else newBufferPtr := NewPtr(newBufferSize);
X        if SerSetBuf(inPort,newBufferPtr,newBufferSize) <> noErr then
X            begin
X                DisposPtr(newBufferPtr);
X                Fail('SetSetBuf failed');
X            end;
X        if oldBufferPtr <> NIL then DisposPtr(oldBufferPtr);
X        str := LongToStr(ord4(newBufferPtr));
X        paramPtr^.returnValue := PasToZero(str);
X    end;
Xend.
SHAR_EOF
if test 2504 -ne "`wc -c < 'bufferSPort.p'`"
then
	echo shar: error transmitting "'bufferSPort.p'" '(should have been 2504 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'openPort.p'" '(2102 characters)'
if test -f 'openPort.p'
then
	echo shar: will not over-write existing file "'openPort.p'"
else
sed 's/^X//' << \SHAR_EOF > 'openPort.p'
X{$R-}
X
X(*
X    openSPort portNumber -- Open the serial port driver.
X
X    To compile and link this file using Macintosh Programmer's Workshop,
X
X    pascal -w openPort.p
X    link -m ENTRYPOINT -o HyperCommands -rt XCMD=0 -sn Main=openSPort openPort.p.o "{MPW}"Libraries:interface.o
X    
X*)
X
X{$S openSPort }     { Segment name must be the same as the command name. }
X
Xunit DummyUnit;
X
Xinterface
X
Xuses MemTypes, QuickDraw, OSIntf, HyperXCmd;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X    
Ximplementation
X
Xtype
X
XStr31 = String[31];
X
Xprocedure openSPort(paramPtr: XCmdPtr); forward;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X
X    begin
X        openSPort(paramPtr);
X    end;
X
Xprocedure openSPort(paramPtr: XCmdPtr);
X
X    var portNumber: integer;    
X        inPort, outPort: integer;
X        actualIn, actualOut: integer;
X        i: integer;
X        str: Str255;
X        shakes: SerShk;
X
X    {$I XCmdGlue.inc}
X
X    procedure Fail(errMsg: Str255); { set theResult and quit }
X        begin
X            paramPtr^.returnValue := PasToZero(errMsg);
X            exit(openSPort);
X        end;
X
X    begin
X        if paramPtr^.paramCount <> 1 then Fail('parameter count is not 1');
X
X        ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
X        portNumber := StrToNum(str);
X        if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
X
X        if portNumber = 1 then
X            begin
X                inPort := -6; outPort := -7;
X            end
X        else
X            begin
X                inPort := -8; outPort := -9;
X            end;
X        if (OpenDriver('.AOut',actualOut) <> noErr) or (OpenDriver('.AIn',actualIn) <> noErr) then
X            Fail('OpenDriver failed');
X        if (actualOut <> outPort) or (actualIn <> inPort) then Fail('openDriver failed');
X        with shakes do
X            begin
X                fXOn := 0; fCTS := 0; errs := 0; evts := 0; fInX := 0;
X            end;
X        if SerHShake(inPort,shakes) <> noErr then Fail('SerHShake failed');
X        if SerHShake(outPort,shakes) <> noErr then Fail('SerHShake failed');
X    end;
X
Xend.
SHAR_EOF
if test 2102 -ne "`wc -c < 'openPort.p'`"
then
	echo shar: error transmitting "'openPort.p'" '(should have been 2102 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'portHasChar.p'" '(1638 characters)'
if test -f 'portHasChar.p'
then
	echo shar: will not over-write existing file "'portHasChar.p'"
else
sed 's/^X//' << \SHAR_EOF > 'portHasChar.p'
X{$R-}
X
X(*
X    SPortHasChar(port number) -- Return "true" if the serial port has data; "false" otherwise.
X
X    To compile and link this file using Macintosh Programmer's Workshop,
X
X    pascal -w portHasChar.p
X    link -m ENTRYPOINT -o HyperCommands -rt XFCN=0 -sn Main=SPortHasChar portHasChar.p.o "{MPW}"Libraries:interface.o
X    
X*)
X
X{$S SPortHasChar }  { Segment name must be the same as the command name. }
X
Xunit DummyUnit;
X
Xinterface
X
Xuses MemTypes, QuickDraw, OSIntf, HyperXCmd;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X    
Ximplementation
X
Xtype
X
XStr31 = String[31];
X
Xprocedure SPortHasChar(paramPtr: XCmdPtr); forward;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X
X    begin
X        SPortHasChar(paramPtr);
X    end;
X
Xprocedure SPortHasChar(paramPtr: XCmdPtr);
X
X    var portNumber: integer;
X        inPort: integer;
X        str: Str255;
X        l: longInt;
X
X    {$I XCmdGlue.inc}
X
X    procedure Fail(errMsg: Str255); { set theResult and quit }
X        begin
X            paramPtr^.returnValue := PasToZero(errMsg);
X            exit(SPortHasChar);
X        end;
X
X    begin
X        if paramPtr^.paramCount <> 1 then Fail('parameter count is not 1');
X
X        ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
X        portNumber := StrToNum(str);
X        if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
X
X        if portNumber = 1 then inPort := -6
X        else inPort := -8;
X        if SerGetBuf(inPort,l) <> noErr then Fail('SerGetBuf failed');
X        if l = 0 then paramPtr^.returnValue := PasToZero('false')
X        else paramPtr^.returnValue := PasToZero('true');
X    end;
X
Xend.
SHAR_EOF
if test 1638 -ne "`wc -c < 'portHasChar.p'`"
then
	echo shar: error transmitting "'portHasChar.p'" '(should have been 1638 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'recvPort.p'" '(1614 characters)'
if test -f 'recvPort.p'
then
	echo shar: will not over-write existing file "'recvPort.p'"
else
sed 's/^X//' << \SHAR_EOF > 'recvPort.p'
X{$R-}
X
X(*
X    recvSPort(port number) -- Return a character from the serial port.
X
X    To compile and link this file using Macintosh Programmer's Workshop,
X
X    pascal -w recvPort.p
X    link -m ENTRYPOINT -o HyperCommands -rt XFCN=1 -sn Main=recvSPort recvPort.p.o "{MPW}"Libraries:interface.o
X    
X*)
X
X{$S recvSPort }     { Segment name must be the same as the command name. }
X
Xunit DummyUnit;
X
Xinterface
X
Xuses MemTypes, QuickDraw, OSIntf, HyperXCmd;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X    
Ximplementation
X
Xtype
X
XStr31 = String[31];
X
Xprocedure recvSPort(paramPtr: XCmdPtr); forward;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X
X    begin
X        recvSPort(paramPtr);
X    end;
X
Xprocedure recvSPort(paramPtr: XCmdPtr);
X
X    var portNumber: integer;
X        inPort: integer;
X        str: Str255;
X        l: longInt;
X
X    {$I XCmdGlue.inc}
X
X    procedure Fail(errMsg: Str255); { set theResult and quit }
X        begin
X            paramPtr^.returnValue := PasToZero(errMsg);
X            exit(recvSPort);
X        end;
X
X    begin
X        if paramPtr^.paramCount <> 1 then Fail('parameter count is not 1');
X
X        ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
X        portNumber := StrToNum(str);
X        if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
X
X        if portNumber = 1 then inPort := -6
X        else inPort := -8;
X        l := 1;
X        str[0] := chr(1);
X        if FSRead(inPort,l,Ptr(ord4(@str)+1)) <> noErr then Fail('FSRead failed');
X        if l <> 1 then str[0] := chr(0);
X        paramPtr^.returnValue := PasToZero(str);
X    end;
X
Xend.
SHAR_EOF
if test 1614 -ne "`wc -c < 'recvPort.p'`"
then
	echo shar: error transmitting "'recvPort.p'" '(should have been 1614 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'recvString.p'" '(6707 characters)'
if test -f 'recvString.p'
then
	echo shar: will not over-write existing file "'recvString.p'"
else
sed 's/^X//' << \SHAR_EOF > 'recvString.p'
X{$R-}
X
X(*
X    recvString(port number, termination character, waitTime, echo, edit,oldString) -- Return a string from the
X        serial port; return everything available, up to the termination character (if any). Pass an empty
X        termination character to receive everything available. WaitTime is the amount of time to wait
X        for the input, in ticks (60ths of a second). Echo is true to enable echoing. Edit is true to enable edit
X        characters (i.e., backspace). oldString is what was read the last call (presumably terminated
X        due to a time-out).
X
X    To compile and link this file using Macintosh Programmer's Workshop,
X
X    pascal -w recvString.p
X    link -m ENTRYPOINT -o HyperCommands -rt XFCN=0 -sn Main=recvUpTo recvString.p.o "{MPW}"Libraries:interface.o
X    
X*)
X
X{$S recvString }    { Segment name must be the same as the command name. }
X
Xunit DummyUnit;
X
Xinterface
X
Xuses MemTypes, QuickDraw, OSIntf, ToolIntf, HyperXCmd;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X    
Ximplementation
X
Xconst
X
Xreturn = chr(13);
Xlinefeed = chr(10);
Xbs = chr(8);
X
Xtype
X
XStr31 = String[31];
X
Xprocedure recvString(paramPtr: XCmdPtr); forward;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X
X    begin
X        recvString(paramPtr);
X    end;
X
Xprocedure recvString(paramPtr: XCmdPtr);
X
X    var portNumber: integer;
X        inPort, outPort: integer;
X        str: Str255;
X        l: longInt;
X        waitForChars: longInt;
X        lookForTerm: boolean;
X        termChar: char;
X        echoOn: boolean;
X        editOn: boolean;
X        linefeedStr: string[1];
X        bsStr: string[3];
X        resultHand: Handle;
X        resultSize: longInt;
X        theChar: char;
X        p: Ptr;
X
X    {$I XCmdGlue.inc}
X
X    procedure Fail(errMsg: Str255); { set theResult and quit }
X        begin
X            paramPtr^.returnValue := PasToZero(errMsg);
X            exit(recvString);
X        end;
X
X    begin
X        if paramPtr^.paramCount <> 6 then Fail('parameter count is not 6');
X
X        ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
X        portNumber := StrToNum(str);
X        if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
X        ZeroToPas(paramPtr^.params[2]^,str);        { Second parameter is termination character. }
X        if length(str) = 0 then lookForTerm := false
X        else
X            begin
X                lookForTerm := true;
X                termChar := str[1];
X            end;
X        ZeroToPas(paramPtr^.params[3]^,str);        { Third parameter is whether to wait. }
X        waitForChars := StrToNum(str);
X        ZeroToPas(paramPtr^.params[4]^,str);        { Fourth parameter is whether to echo. }
X        echoOn := false;
X        if length(str) > 0 then
X            if (str[1] = 't') or (str[1] = 'T') then echoOn := true;
X        ZeroToPas(paramPtr^.params[5]^,str);        { Fifth parameter is whether to edit. }
X        editOn := false;
X        if length(str) > 0 then
X            if (str[1] = 't') or (str[1] = 'T') then editOn := true;
X        resultHand := paramPtr^.params[6];          { Sixth parameter is the old string. }
X        if resultHand = NIL then Fail('NIL resultHandle!');
X        l := GetHandleSize(resultHand);
X        p := resultHand^;
X        resultSize := 1;
X        while resultSize < l do
X            begin
X                if p^ = 0 then leave;
X                p := Ptr(ord4(p)+1);
X                resultSize := resultSize + 1;
X            end;
X        if resultSize < 1 then Fail('Input string size too small!');
X        if HandToHand(resultHand) <> noErr then Fail('HandToHand failed!');
X        resultSize := resultSize-1;
X        SetHandleSize(resultHand,resultSize);
X
X        if portNumber = 1 then
X            begin
X                inPort := -6;
X                outPort := -7;
X            end
X        else
X            begin
X                inPort := -8;
X                outPort := -9;
X            end;
X        linefeedStr[0] := chr(1); linefeedStr[1] := linefeed;
X        bsStr := '   '; bsStr[1] := bs; bsStr[3] := bs;
X        waitForChars := waitForChars + TickCount;
X        while TickCount <= waitForChars do
X            begin
X                if SerGetBuf(inPort,l) <> noErr then
X                    begin
X                        DisposHandle(resultHand);
X                        Fail('SerGetBuf failed');
X                    end;
X                if l = 0 then cycle;
X                l := 1;
X                resultSize := resultSize+1;
X                SetHandleSize(resultHand,resultSize);
X                if MemError <> noErr then
X                    begin
X                        DisposHandle(resultHand);
X                        Fail('SetHandleSize failed!');
X                    end;
X                HLock(resultHand);
X                if FSRead(inPort,l,Ptr(ord4(resultHand^)+resultSize-1)) <> noErr then
X                    begin
X                        DisposHandle(resultHand);
X                        Fail('FSRead failed');
X                    end;
X                HUnlock(resultHand);
X                p := Ptr(ord4(resultHand^)+resultSize-1);
X                p^ := BAND(p^,$7F);
X                theChar := chr(p^);
X                if echoOn then
X                    begin
X                        l := 1;
X                        if FSWrite(outPort,l,Ptr(ord4(resultHand^)+resultSize-1)) <> noErr then
X                            Fail('FSWriter failed');
X                        if theChar = return then
X                            begin
X                                l := length(linefeedStr);
X                                if FSWrite(outPort,l,Ptr(ord4(@linefeedStr)+1)) <> noErr then Fail('FSWrite failed');
X                            end;
X                        if editOn and (theChar = bs) then
X                            begin
X                                l := length(bsStr);
X                                if FSWrite(outPort,l,Ptr(ord4(@bsStr)+1)) <> noErr then Fail('FSWrite failed');
X                            end;
X                    end;
X                if editOn then
X                    begin
X                        if theChar = bs then
X                            begin
X                                resultSize := resultSize-2;
X                                if resultSize < 0 then resultSize := 0;
X                                SetHandleSize(resultHand,resultSize);
X                            end;
X                    end;
X                if lookForTerm then
X                    if theChar = termChar then leave;
X                if resultSize > 30000 then leave;
X            end;
X        SetHandleSize(resultHand,resultSize+1);
X        p := ptr(ord4(resultHand^)+resultSize);
X        p^ := 0;
X        paramPtr^.returnValue := resultHand;
X    end;
X
Xend.
SHAR_EOF
if test 6707 -ne "`wc -c < 'recvString.p'`"
then
	echo shar: error transmitting "'recvString.p'" '(should have been 6707 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'recvUpTo.p'" '(4983 characters)'
if test -f 'recvUpTo.p'
then
	echo shar: will not over-write existing file "'recvUpTo.p'"
else
sed 's/^X//' << \SHAR_EOF > 'recvUpTo.p'
X{$R-}
X
X(*
X    recvUpTo(port number, termination character, waitTime, echo, edit) -- Return a string from the
X        serial port; return everything available, up to the termination character (if any). Pass an empty
X        termination character to receive everything available. WaitTime is the amount of time to wait
X        for the input, in ticks (60ths of a second). Echo is true to enable echoing. Edit is
X        true to enable edit characters (i.e., backspace).
X
X    To compile and link this file using Macintosh Programmer's Workshop,
X
X    pascal -w recvUpTo.p
X    link -m ENTRYPOINT -o HyperCommands -rt XFCN=0 -sn Main=recvUpTo recvUpTo.p.o "{MPW}"Libraries:interface.o
X    
X*)
X
X{$S recvUpTo }  { Segment name must be the same as the command name. }
X
Xunit DummyUnit;
X
Xinterface
X
Xuses MemTypes, QuickDraw, OSIntf, ToolIntf, HyperXCmd;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X    
Ximplementation
X
Xconst
X
Xreturn = chr(13);
Xlinefeed = chr(10);
Xbs = chr(8);
X
Xtype
X
XStr31 = String[31];
X
Xprocedure recvUpTo(paramPtr: XCmdPtr); forward;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X
X    begin
X        recvUpTo(paramPtr);
X    end;
X
Xprocedure recvUpTo(paramPtr: XCmdPtr);
X
X    var portNumber: integer;
X        inPort, outPort: integer;
X        str: Str255;
X        l: longInt;
X        waitForChars: longInt;
X        lookForTerm: boolean;
X        termChar: char;
X        echoOn: boolean;
X        editOn: boolean;
X        linefeedStr: string[1];
X        bsStr: string[3];
X
X    {$I XCmdGlue.inc}
X
X    procedure Fail(errMsg: Str255); { set theResult and quit }
X        begin
X            paramPtr^.returnValue := PasToZero(errMsg);
X            exit(recvUpTo);
X        end;
X
X    begin
X        if paramPtr^.paramCount <> 5 then Fail('parameter count is not 5');
X
X        ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
X        portNumber := StrToNum(str);
X        if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
X        ZeroToPas(paramPtr^.params[2]^,str);        { Second parameter is termination character. }
X        if length(str) = 0 then lookForTerm := false
X        else
X            begin
X                lookForTerm := true;
X                termChar := str[1];
X            end;
X        ZeroToPas(paramPtr^.params[3]^,str);        { Third parameter is whether to wait. }
X        waitForChars := StrToNum(str);
X        ZeroToPas(paramPtr^.params[4]^,str);        { Fourth parameter is whether to echo. }
X        echoOn := false;
X        if length(str) > 0 then
X            if (str[1] = 't') or (str[1] = 'T') then echoOn := true;
X        ZeroToPas(paramPtr^.params[5]^,str);        { Fifth parameter is whether to edit. }
X        editOn := false;
X        if length(str) > 0 then
X            if (str[1] = 't') or (str[1] = 'T') then editOn := true;
X
X        if portNumber = 1 then
X            begin
X                inPort := -6;
X                outPort := -7;
X            end
X        else
X            begin
X                inPort := -8;
X                outPort := -9;
X            end;
X        linefeedStr[0] := chr(1); linefeedStr[1] := linefeed;
X        bsStr := '   '; bsStr[1] := bs; bsStr[3] := bs;
X        str := '';
X        waitForChars := waitForChars + TickCount;
X        while TickCount <= waitForChars do
X            begin
X                if SerGetBuf(inPort,l) <> noErr then Fail('SerGetBuf failed');
X                if l = 0 then cycle;
X                str[0] := chr(integer(str[0])+1);
X                l := 1;
X                if FSRead(inPort,l,Ptr(ord4(@str)+ord(str[0]))) <> noErr then Fail('FSRead failed');
X                if echoOn then
X                    begin
X                        l := 1;
X                        if FSWrite(outPort,l,Ptr(ord4(@str)+ord(str[0]))) <> noErr then Fail('FSWriter failed');
X                        if str[length(str)] = return then
X                            begin
X                                l := length(linefeedStr);
X                                if FSWrite(outPort,l,Ptr(ord4(@linefeedStr)+1)) <> noErr then Fail('FSWrite failed');
X                            end;
X                        if editOn and (str[length(str)] = bs) then
X                            begin
X                                l := length(bsStr);
X                                if FSWrite(outPort,l,Ptr(ord4(@bsStr)+1)) <> noErr then Fail('FSWrite failed');
X                            end;
X                    end;
X                if editOn then
X                    begin
X                        if str[length(str)] = bs then
X                            begin
X                                str[0] := chr(length(str)-1);
X                                if length(str) > 0 then str[0] := chr(length(str)-1);
X                            end;
X                    end;
X                if lookForTerm then
X                    if str[length(str)] = termChar then leave;
X                if length(str) = 255 then leave;
X            end;
X        paramPtr^.returnValue := PasToZero(str);
X    end;
X
Xend.
SHAR_EOF
if test 4983 -ne "`wc -c < 'recvUpTo.p'`"
then
	echo shar: error transmitting "'recvUpTo.p'" '(should have been 4983 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'resetPort.p'" '(1800 characters)'
if test -f 'resetPort.p'
then
	echo shar: will not over-write existing file "'resetPort.p'"
else
sed 's/^X//' << \SHAR_EOF > 'resetPort.p'
X{$R-}
X
X(*
X    resetSPort(port number, setting) -- Reset the serial port driver.
X
X    To compile and link this file using Macintosh Programmer's Workshop,
X
X    pascal -w resetPort.p
X    link -m ENTRYPOINT -o HyperCommands -rt XCMD=1 -sn Main=resetSPort resetPort.p.o "{MPW}"Libraries:interface.o
X    
X*)
X
X{$S resetSPort }    { Segment name must be the same as the command name. }
X
Xunit DummyUnit;
X
Xinterface
X
Xuses MemTypes, QuickDraw, OSIntf, HyperXCmd;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X    
Ximplementation
X
Xtype
X
XStr31 = String[31];
X
Xprocedure resetSPort(paramPtr: XCmdPtr); forward;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X
X    begin
X        resetSPort(paramPtr);
X    end;
X
Xprocedure resetSPort(paramPtr: XCmdPtr);
X
X    var portNumber: integer;
X        setting: integer;
X        inPort, outPort: integer;
X        str: Str255;
X
X    {$I XCmdGlue.inc}
X
X    procedure Fail(errMsg: Str255); { set theResult and quit }
X        begin
X            paramPtr^.returnValue := PasToZero(errMsg);
X            exit(resetSPort);
X        end;
X
X    begin
X        if paramPtr^.paramCount <> 2 then Fail('parameter count is not 2');
X
X        ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
X        portNumber := StrToNum(str);
X        if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
X        ZeroToPas(paramPtr^.params[2]^,str);        { Second parameter is setting. }
X        setting := StrToNum(str);
X
X        if portNumber = 1 then
X            begin
X                inPort := -6; outPort := -7;
X            end
X        else
X            begin
X                inPort := -8; outPort := -9;
X            end;
X        if (SerReset(inPort,setting) <> noErr) or (SerReset(outPort,setting) <> noErr) then
X            Fail('SerReset failed');
X    end;
X
Xend.
SHAR_EOF
if test 1800 -ne "`wc -c < 'resetPort.p'`"
then
	echo shar: error transmitting "'resetPort.p'" '(should have been 1800 characters)'
fi
fi # end of overwriting check
echo shar: extracting "'sendPort.p'" '(2502 characters)'
if test -f 'sendPort.p'
then
	echo shar: will not over-write existing file "'sendPort.p'"
else
sed 's/^X//' << \SHAR_EOF > 'sendPort.p'
X{$R-}
X
X(*
X    sendSPort portNumber, addLFs, string -- Send a string to the serial port driver.
X
X    To compile and link this file using Macintosh Programmer's Workshop,
X
X    pascal -w sendPort.p
X    link -m ENTRYPOINT -o HyperCommands -rt XCMD=2 -sn Main=sendSPort sendPort.p.o "{MPW}"Libraries:interface.o
X    
X*)
X
X{$S sendSPort }     { Segment name must be the same as the command name. }
X
Xunit DummyUnit;
X
Xinterface
X
Xuses MemTypes, QuickDraw, OSIntf, HyperXCmd;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X    
Ximplementation
X
Xconst
X
Xreturn = 13;
Xlinefeed = 10;
X
Xtype
X
XStr31 = String[31];
X
Xprocedure sendSPort(paramPtr: XCmdPtr); forward;
X
Xprocedure EntryPoint(paramPtr: XCmdPtr);
X
X    begin
X        sendSPort(paramPtr);
X    end;
X
Xprocedure sendSPort(paramPtr: XCmdPtr);
X
X    var portNumber: integer;
X        outPort: integer;
X        sendLFs: boolean;
X        str: Str255;
X        p: Ptr;
X        l: longInt;
X        linefeedByte: SignedByte;
X
X    {$I XCmdGlue.inc}
X
X    procedure Fail(errMsg: Str255); { set theResult and quit }
X        begin
X            paramPtr^.returnValue := PasToZero(errMsg);
X            exit(sendSPort);
X        end;
X
X    begin
X        if paramPtr^.paramCount <> 3 then Fail('parameter count is not 3');
X
X        ZeroToPas(paramPtr^.params[1]^,str);        { First parameter is port number. }
X        portNumber := StrToNum(str);
X        if (portNumber < 1) or (portNumber > 2) then Fail('invalid port number');
X        ZeroToPas(paramPtr^.params[2]^,str);        { Third parameter is whether to wait. }
X        sendLFs := false;
X        if length(str) > 0 then
X            if (str[1] = 't') or (str[1] = 'T') then sendLFs := true;
X        HLock(paramPtr^.params[3]);
X        p := paramPtr^.params[3]^;      { Second parameter is string to send. }
X
X        if portNumber = 1 then outPort := -7
X        else outPort := -9;
X        linefeedByte := linefeed;
X        while p^ <> 0 do
X            begin
X                l := 1;
X                if FSWrite(outPort,l,p) <> noErr then Fail('FSWrite failed');
X                if l <> 1 then Fail('not all characters sent');
X                if sendLFs and (p^ = return) then
X                    begin
X                        l := 1;
X                        if FSWrite(outPort,l,@linefeedByte) <> noErr then Fail('FSWrite failed');
X                        if l <> 1 then Fail('not all characters sent');
X                    end;
X                p := ptr(ord4(p)+1);
X            end;
X        HUnlock(paramPtr^.params[3]);
X    end;
X
Xend.
SHAR_EOF
if test 2502 -ne "`wc -c < 'sendPort.p'`"
then
	echo shar: error transmitting "'sendPort.p'" '(should have been 2502 characters)'
fi
fi # end of overwriting check
#	End of shell archive
exit 0
---