Skip to content
Snippets Groups Projects
Commit 340dea55 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Allow NUL in Stari ST VT-52 sequences.

It seems at least some Atari ST VT-52 implementations do.
parent 3622e0ce
No related branches found
No related tags found
No related merge requests found
Pipeline #8633 passed
...@@ -1420,7 +1420,7 @@ incomplete: ...@@ -1420,7 +1420,7 @@ incomplete:
} }
static enum sequence_state static enum sequence_state
st_vt_52_legal_sequence(const char *seq, size_t max_len) st_vt_52_legal_sequence(const char *seq, size_t seqsz, size_t max_len)
{ {
static const char *all_seconds = "ABCDEFGHIJKLMYZbcdefjklopqvw[\\=>\x1b"; static const char *all_seconds = "ABCDEFGHIJKLMYZbcdefjklopqvw[\\=>\x1b";
...@@ -1431,13 +1431,13 @@ st_vt_52_legal_sequence(const char *seq, size_t max_len) ...@@ -1431,13 +1431,13 @@ st_vt_52_legal_sequence(const char *seq, size_t max_len)
switch (seq[0]) { switch (seq[0]) {
case 'b': case 'b':
case 'c': case 'c':
if (seq[1]) if (seqsz == 2)
return SEQ_COMPLETE; return SEQ_COMPLETE;
break; break;
case 'Y': case 'Y':
if (seq[1] > 31 && seq[2] > 31) if (seqsz == 3 && seq[1] > 31 && seq[2] > 31)
return SEQ_COMPLETE; return SEQ_COMPLETE;
if (seq[1] && seq[2]) if (seqsz == 3)
return SEQ_BROKEN; return SEQ_BROKEN;
break; break;
default: default:
...@@ -2568,6 +2568,7 @@ do_st_vt_52(struct cterminal *cterm, char *retbuf, size_t retsize) ...@@ -2568,6 +2568,7 @@ do_st_vt_52(struct cterminal *cterm, char *retbuf, size_t retsize)
break; break;
} }
cterm->escbuf[0]=0; cterm->escbuf[0]=0;
cterm->escbufsz = 0;
cterm->sequence=0; cterm->sequence=0;
} }
...@@ -5752,12 +5753,13 @@ CIOLIBEXPORT size_t cterm_write(struct cterminal * cterm, const void *vbuf, int ...@@ -5752,12 +5753,13 @@ CIOLIBEXPORT size_t cterm_write(struct cterminal * cterm, const void *vbuf, int
} }
} }
else if (cterm->emulation == CTERM_EMULATION_ATARIST_VT52) { else if (cterm->emulation == CTERM_EMULATION_ATARIST_VT52) {
ustrcat(cterm->escbuf,ch); cterm->escbuf[cterm->escbufsz++] = ch[0];
switch(st_vt_52_legal_sequence(cterm->escbuf, sizeof(cterm->escbuf)-1)) { switch(st_vt_52_legal_sequence(cterm->escbuf, cterm->escbufsz, sizeof(cterm->escbuf)-1)) {
case SEQ_BROKEN: case SEQ_BROKEN:
/* Broken sequence detected */ /* Broken sequence detected */
// Just throw it out (see COMMANDO.TXT) // Just throw it out (see COMMANDO.TXT)
cterm->escbuf[0]=0; cterm->escbuf[0]=0;
cterm->escbufsz = 0;
cterm->sequence=0; cterm->sequence=0;
break; break;
case SEQ_INCOMPLETE: case SEQ_INCOMPLETE:
...@@ -6553,6 +6555,7 @@ CIOLIBEXPORT size_t cterm_write(struct cterminal * cterm, const void *vbuf, int ...@@ -6553,6 +6555,7 @@ CIOLIBEXPORT size_t cterm_write(struct cterminal * cterm, const void *vbuf, int
prn[0]=0; prn[0]=0;
prnpos = prn; prnpos = prn;
cterm->sequence=1; cterm->sequence=1;
cterm->escbufsz = 0;
break; break;
case 28: case 28:
case 29: case 29:
......
...@@ -161,6 +161,7 @@ struct cterminal { ...@@ -161,6 +161,7 @@ struct cterminal {
char *strbuf; char *strbuf;
size_t strbuflen; size_t strbuflen;
size_t strbufsize; size_t strbufsize;
size_t escbufsz;
char escbuf[1024]; char escbuf[1024];
cterm_music_t music_enable; // The remotely/locally controled music state cterm_music_t music_enable; // The remotely/locally controled music state
char musicbuf[1024]; char musicbuf[1024];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment