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

Get strncat() and strnlen() out of the hot path...

Down to 4.7s now... 38× faster.
Starting to get somewhere useful now.
parent a5afd34f
No related branches found
No related tags found
No related merge requests found
Pipeline #7724 passed
...@@ -5542,6 +5542,9 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -5542,6 +5542,9 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
const unsigned char *buf = (unsigned char *)vbuf; const unsigned char *buf = (unsigned char *)vbuf;
unsigned char ch[2]; unsigned char ch[2];
unsigned char prn[BUFSIZE]; unsigned char prn[BUFSIZE];
unsigned char *prnpos;
const unsigned char *prnlast = &prn[BUFSIZE-sizeof(cterm->escbuf)-1];
size_t prntmp;
int i, j, k, x, y; int i, j, k, x, y;
int sx, sy, ex, ey; int sx, sy, ex, ey;
struct text_info ti; struct text_info ti;
...@@ -5602,12 +5605,14 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -5602,12 +5605,14 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
if(cterm->log==CTERM_LOG_RAW && cterm->logfile != NULL) if(cterm->log==CTERM_LOG_RAW && cterm->logfile != NULL)
fwrite(buf, buflen, 1, cterm->logfile); fwrite(buf, buflen, 1, cterm->logfile);
prn[0]=0; prn[0]=0;
prnpos = prn;
if (cterm->emulation == CTERM_EMULATION_PRESTEL) if (cterm->emulation == CTERM_EMULATION_PRESTEL)
prestel_get_state(cterm); prestel_get_state(cterm);
for(j=0;j<buflen;j++) { for(j=0;j<buflen;j++) {
if(ustrlen(prn) >= sizeof(prn)-sizeof(cterm->escbuf)) { if(prnpos >= prnlast) {
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
} }
ch[0]=buf[j]; ch[0]=buf[j];
if (cterm->string && !cterm->sequence) { if (cterm->string && !cterm->sequence) {
...@@ -5624,6 +5629,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -5624,6 +5629,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
if (ch[0] == 27) { if (ch[0] == 27) {
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
cterm->sequence=1; cterm->sequence=1;
break; break;
} }
...@@ -5857,15 +5863,21 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -5857,15 +5863,21 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
switch(legal_sequence(cterm->escbuf, sizeof(cterm->escbuf)-1)) { switch(legal_sequence(cterm->escbuf, sizeof(cterm->escbuf)-1)) {
case SEQ_BROKEN: case SEQ_BROKEN:
/* Broken sequence detected */ /* Broken sequence detected */
ustrcat(prn,"\033"); *prnpos++ = '\033';
ustrcat(prn,cterm->escbuf); *prnpos = 0;
prntmp = strlen(cterm->escbuf);
memcpy(prnpos, cterm->escbuf, prntmp + 1);
prnpos += prntmp;
cterm->escbuf[0]=0; cterm->escbuf[0]=0;
cterm->sequence=0; cterm->sequence=0;
if(ch[0]=='\033') { /* Broken sequence followed by a legal one! */ if(ch[0]=='\033') { /* Broken sequence followed by a legal one! */
if(prn[0]) /* Don't display the ESC */ if(prn[0]) { /* Don't display the ESC */
prn[ustrlen(prn)-1]=0; prnpos--;
*prnpos = 0;
}
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
cterm->sequence=1; cterm->sequence=1;
} }
break; break;
...@@ -6353,6 +6365,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -6353,6 +6365,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
case 0: // NUL case 0: // NUL
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
break; break;
case 5: // ENQ case 5: // ENQ
prestel_send_memory(cterm, 0, retbuf, retsize); prestel_send_memory(cterm, 0, retbuf, retsize);
...@@ -6360,26 +6373,31 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -6360,26 +6373,31 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
case 8: // APB (Active Position Packward) case 8: // APB (Active Position Packward)
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
prestel_move(cterm, -1, 0); prestel_move(cterm, -1, 0);
break; break;
case 9: // APF (Active Position Forward) case 9: // APF (Active Position Forward)
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
prestel_move(cterm, 1, 0); prestel_move(cterm, 1, 0);
break; break;
case 10: // APD (Active Position Down) case 10: // APD (Active Position Down)
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
prestel_move(cterm, 0, 1); prestel_move(cterm, 0, 1);
break; break;
case 11: // APU (Active Position Up) case 11: // APU (Active Position Up)
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
prestel_move(cterm, 0, -1); prestel_move(cterm, 0, -1);
break; break;
case 12: // CS (Clear Screen) case 12: // CS (Clear Screen)
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
cio_api.options &= ~(CONIO_OPT_PRESTEL_REVEAL); cio_api.options &= ~(CONIO_OPT_PRESTEL_REVEAL);
prestel_new_line(cterm); prestel_new_line(cterm);
cterm_clearscreen(cterm, (char)cterm->attr); cterm_clearscreen(cterm, (char)cterm->attr);
...@@ -6396,11 +6414,13 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -6396,11 +6414,13 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
case 27: // ESC case 27: // ESC
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
cterm->sequence=1; cterm->sequence=1;
break; break;
case 30: // APH (Active Position Home) case 30: // APH (Active Position Home)
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
GOTOXY(CURR_MINX, CURR_MINY); GOTOXY(CURR_MINX, CURR_MINY);
prestel_new_line(cterm); prestel_new_line(cterm);
break; break;
...@@ -6421,7 +6441,8 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -6421,7 +6441,8 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
cterm->prestel_last_mosaic = ch[0]; cterm->prestel_last_mosaic = ch[0];
} }
} }
ustrcat(prn,ch); *prnpos++ = ch[0];
*prnpos = 0;
} }
else if ((buf[j] >= 0x80) && (buf[j] <= 0x9f)) { else if ((buf[j] >= 0x80) && (buf[j] <= 0x9f)) {
// "Raw" C1 control // "Raw" C1 control
...@@ -6433,6 +6454,8 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -6433,6 +6454,8 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
else { /* ANSI-BBS */ else { /* ANSI-BBS */
if(cterm->doorway_char) { if(cterm->doorway_char) {
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0] = 0;
prnpos = prn;
tmpvc[0].ch = ch[0]; tmpvc[0].ch = ch[0];
tmpvc[0].legacy_attr=cterm->attr; tmpvc[0].legacy_attr=cterm->attr;
tmpvc[0].fg = cterm->fg_color; tmpvc[0].fg = cterm->fg_color;
...@@ -6456,6 +6479,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -6456,6 +6479,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
lastch = 0; lastch = 0;
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL) if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL)
fputs("\x07", cterm->logfile); fputs("\x07", cterm->logfile);
if(!cterm->quiet) { if(!cterm->quiet) {
...@@ -6470,6 +6494,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -6470,6 +6494,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
lastch = 0; lastch = 0;
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL) if(cterm->log==CTERM_LOG_ASCII && cterm->logfile != NULL)
fputs("\x0c", cterm->logfile); fputs("\x0c", cterm->logfile);
cterm_clearscreen(cterm, (char)cterm->attr); cterm_clearscreen(cterm, (char)cterm->attr);
...@@ -6478,11 +6503,13 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -6478,11 +6503,13 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
case 27: /* ESC */ case 27: /* ESC */
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
cterm->sequence=1; cterm->sequence=1;
break; break;
default: default:
lastch = ch[0]; lastch = ch[0];
ustrcat(prn,ch); *prnpos++ = ch[0];
*prnpos = 0;
} }
} }
} }
...@@ -6490,6 +6517,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b ...@@ -6490,6 +6517,7 @@ CIOLIBEXPORT char* cterm_write(struct cterminal * cterm, const void *vbuf, int b
} }
uctputs(cterm, prn); uctputs(cterm, prn);
prn[0]=0; prn[0]=0;
prnpos = prn;
break; break;
} }
ABS_XY(&cterm->xpos, &cterm->ypos); ABS_XY(&cterm->xpos, &cterm->ypos);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment