bug fixes, collect full definition before setting text, performance improvements.

This commit is contained in:
Kelvin Sherlock 2019-07-07 19:46:29 -04:00
parent 9e24014b62
commit 681ec30d6f
1 changed files with 78 additions and 17 deletions

95
nda.c
View File

@ -24,6 +24,15 @@
#include "connection.h" #include "connection.h"
#include "nda.h" #include "nda.h"
/*
* TODO:
* [ ] store definition in handle, put into TE control when finished?
* [ ] {text} -> drop {}, use dark blue text color.
*
*/
unsigned NDAStartUpTools(Word memID, StartStopRecord *ssRef); unsigned NDAStartUpTools(Word memID, StartStopRecord *ssRef);
void NDAShutDownTools(StartStopRecord *ssRef); void NDAShutDownTools(StartStopRecord *ssRef);
@ -43,6 +52,10 @@ Word FlagTCP;
Word ToolsLoaded; Word ToolsLoaded;
GrafPortPtr MyWindow; GrafPortPtr MyWindow;
Handle TextHandle;
LongWord TextHandleSize;
LongWord TextHandleUsed;
static StartStopRecord ss = {0, static StartStopRecord ss = {0,
0, 0,
0, 0,
@ -83,27 +96,54 @@ pascal void MarinettiCallback(char *str);
void EnableControls(void); void EnableControls(void);
void DisableControls(void); void DisableControls(void);
void InsertString(word length, char *cp) {
void AppendText(word length, char *cp) {
Handle h = TextHandle;
LongWord size;
size = TextHandleUsed + length;
if (size > TextHandleSize) {
size += 4095;
size &= 4096;
if (h) {
HUnlock(h);
SetHandleSize(size, h);
if (_toolErr) return;
HLock(h);
TextHandleSize = size;
} else {
TextHandle = h = NewHandle(size, MyID, attrLocked, 0);
if (_toolErr) return;
TextHandleSize = size;
}
HLock(h);
}
BlockMove(cp, *h + TextHandleUsed, length);
TextHandleUsed += length;
}
void SetText(void) {
Handle handle; Handle handle;
// TERecord **temp; TERecord *temp;
longword oldStart, oldEnd; longword oldStart, oldEnd;
handle = (Handle)GetCtlHandleFromID(MyWindow, rCtrlTE); handle = (Handle)GetCtlHandleFromID(MyWindow, rCtrlTE);
// temp = (TERecord **)handle; temp = *(TERecord **)handle;
//(**temp).textFlags &= (~fReadOnly); temp->textFlags &= (~fReadOnly);
TEGetSelection((pointer)&oldStart, (pointer)&oldEnd, handle);
TESetSelection((Pointer)-1, (Pointer)-1, handle); TESetSelection((Pointer)-1, (Pointer)-1, handle);
TEInsert(teDataIsTextBlock, (Ref)cp, length, NULL, NULL, /* no style info */ TESetText(teDataIsTextBlock, (Ref)*TextHandle, TextHandleUsed, NULL, NULL, handle);
handle); temp->textFlags |= fReadOnly;
//(**temp).textFlags |= fReadOnly;
TESetSelection((Pointer)oldStart, (Pointer)oldEnd, handle); TextHandleUsed = 0;
} }
static char buffer[512]; static char buffer[512];
void TCPLoop(void) { void TCPLoop(void) {
@ -130,12 +170,18 @@ void TCPLoop(void) {
case st_connect: case st_connect:
x = ConnectionPoll(&connection); x = ConnectionPoll(&connection);
switch (x) { switch (connection.state) {
case kConnectionStateConnected: case kConnectionStateConnected:
MarinettiCallback("\pConnected.");
++st; ++st;
break; break;
case kConnectionStateDisconnected: case kConnectionStateDisconnected:
MarinettiCallback("\pDisconnected.");
EnableControls();
st = st_none;
break;
case kConnectionStateError: case kConnectionStateError:
MarinettiCallback("\pConnection Error.");
EnableControls(); EnableControls();
st = st_none; st = st_none;
break; break;
@ -143,7 +189,7 @@ void TCPLoop(void) {
return; return;
case st_disconnect: case st_disconnect:
x = ConnectionPoll(&connection); x = ConnectionPoll(&connection);
switch (x) { switch (connection.state) {
case kConnectionStateDisconnected: case kConnectionStateDisconnected:
case kConnectionStateError: case kConnectionStateError:
EnableControls(); EnableControls();
@ -152,6 +198,7 @@ void TCPLoop(void) {
} }
return; return;
redo:
case st_login: case st_login:
case st_client: case st_client:
case st_define1: case st_define1:
@ -171,6 +218,8 @@ void TCPLoop(void) {
/* all data should be \r\n delimited. we want to keep the \r */ /* all data should be \r\n delimited. we want to keep the \r */
terr = TCPIPReadLineTCP(ipid, "\p\n", 0x0000, (Ref)&buffer, terr = TCPIPReadLineTCP(ipid, "\p\n", 0x0000, (Ref)&buffer,
sizeof(buffer) - 2, &rlr); sizeof(buffer) - 2, &rlr);
if (terr) return;
if (!rlr.rlrIsDataFlag) if (!rlr.rlrIsDataFlag)
return; return;
qtick += 60 * 15; /* bump timeout */ qtick += 60 * 15; /* bump timeout */
@ -185,7 +234,6 @@ void TCPLoop(void) {
++x; ++x;
} }
buffer[x] = 0; buffer[x] = 0;
++x;
rlr.rlrBuffCount = x; rlr.rlrBuffCount = x;
if (st != st_define3) { if (st != st_define3) {
@ -193,7 +241,7 @@ void TCPLoop(void) {
status = 0; status = 0;
for (i = 0;; ++i) { for (i = 0;; ++i) {
unsigned c = buffer[i]; unsigned c = buffer[i];
if (isdigit(x)) { if (isdigit(c)) {
status *= 10; status *= 10;
status += c - '0'; status += c - '0';
continue; continue;
@ -238,7 +286,8 @@ void TCPLoop(void) {
MarinettiCallback("\pNo match"); MarinettiCallback("\pNo match");
st = st_idle; st = st_idle;
} else { } else {
InsertString(rlr.rlrBuffCount, buffer); AppendText(rlr.rlrBuffCount, buffer);
SetText();
st = st_idle; st = st_idle;
} }
EnableControls(); EnableControls();
@ -251,6 +300,7 @@ void TCPLoop(void) {
else if (status == 250) { else if (status == 250) {
st = st_idle; st = st_idle;
qtick = GetTick() + 60 * 60 * 2; /* 2-minute timeout */ qtick = GetTick() + 60 * 60 * 2; /* 2-minute timeout */
SetText();
EnableControls(); EnableControls();
} else { } else {
} }
@ -258,13 +308,14 @@ void TCPLoop(void) {
case st_define3: case st_define3:
/* expect definition text. '.' terminates. */ /* expect definition text. '.' terminates. */
if (buffer[0] == '.') { if (buffer[0] == '.') {
InsertString(rlr.rlrBuffCount - 1, buffer + 1); AppendText(rlr.rlrBuffCount - 1, buffer + 1);
if (buffer[1] == '\r') { if (buffer[1] == '\r') {
--st; --st;
} }
} else { } else {
InsertString(rlr.rlrBuffCount, buffer); AppendText(rlr.rlrBuffCount, buffer);
} }
goto redo;
break; break;
case st_quit: case st_quit:
@ -365,11 +416,21 @@ void NDAClose(void) {
MyWindow = NULL; MyWindow = NULL;
NDAResourceShutDown(&resInfo); NDAResourceShutDown(&resInfo);
if (TextHandle) {
DisposeHandle(TextHandle);
TextHandle = NULL;
TextHandleUsed = 0;
TextHandleSize = 0;
}
} }
GrafPortPtr NDAOpen(void) { GrafPortPtr NDAOpen(void) {
MyWindow = NULL; MyWindow = NULL;
TextHandle = NULL;
TextHandleSize = 0;
TextHandleSize = 0;
if (!ToolsLoaded) { if (!ToolsLoaded) {
if (NDAStartUpTools(MyID, &ss)) { if (NDAStartUpTools(MyID, &ss)) {