sc7: Optimize string copying in rebuffer() and stgwrite()

This commit is contained in:
Daniel_Cortez 2018-01-11 23:04:08 +07:00
parent 0d9bb02970
commit 8c1133b00d

View File

@ -1332,14 +1332,12 @@ SC_FUNC void stgmark(char mark)
static int rebuffer(char *str) static int rebuffer(char *str)
{ {
if (sc_status==statWRITE) { if (sc_status==statWRITE) {
int st_len=strlen(str);
if (pipeidx>=2 && stgpipe[pipeidx-1]=='\0' && stgpipe[pipeidx-2]!='\n') if (pipeidx>=2 && stgpipe[pipeidx-1]=='\0' && stgpipe[pipeidx-2]!='\n')
pipeidx-=1; /* overwrite last '\0' */ pipeidx-=1; /* overwrite last '\0' */
while (*str!='\0') { /* copy to staging buffer */ CHECK_STGPIPE(pipeidx+st_len+1);
CHECK_STGPIPE(pipeidx); memcpy(stgpipe+pipeidx,str,st_len+1); /* copy to staging buffer */
stgpipe[pipeidx++]=*str++; pipeidx+=st_len+1;
} /* while */
CHECK_STGPIPE(pipeidx);
stgpipe[pipeidx++]='\0';
} /* if */ } /* if */
return TRUE; return TRUE;
} }
@ -1372,22 +1370,18 @@ static int filewrite(char *str)
SC_FUNC void stgwrite(const char *st) SC_FUNC void stgwrite(const char *st)
{ {
int len; int len;
int st_len; int st_len=strlen(st);
if (staging) { if (staging) {
assert(stgidx==0 || stgbuf!=NULL); /* staging buffer must be valid if there is (apparently) something in it */ assert(stgidx==0 || stgbuf!=NULL); /* staging buffer must be valid if there is (apparently) something in it */
if (stgidx>=2 && stgbuf[stgidx-1]=='\0' && stgbuf[stgidx-2]!='\n') if (stgidx>=2 && stgbuf[stgidx-1]=='\0' && stgbuf[stgidx-2]!='\n')
stgidx-=1; /* overwrite last '\0' */ stgidx-=1; /* overwrite last '\0' */
while (*st!='\0') { /* copy to staging buffer */ CHECK_STGBUFFER(stgidx+st_len+1);
CHECK_STGBUFFER(stgidx); memcpy(stgbuf+stgidx,st,st_len+1); /* copy to staging buffer */
stgbuf[stgidx++]=*st++; stgidx+=st_len+1;
stglen++; stglen+=st_len;
} /* while */
CHECK_STGBUFFER(stgidx);
stgbuf[stgidx++]='\0';
} else { } else {
len=(stgbuf!=NULL) ? stglen : 0; len=(stgbuf!=NULL) ? stglen : 0;
st_len=strlen(st);
CHECK_STGBUFFER(len+st_len+1); CHECK_STGBUFFER(len+st_len+1);
memcpy(stgbuf+len,st,st_len+1); memcpy(stgbuf+len,st,st_len+1);
len=len+st_len; len=len+st_len;