void init_buffer(struct session *ses, int size) { int cnt; push_call("init_buffer(%p,%p)",ses,size); if (ses->scroll_max == size) { pop_call(); return; } if (ses->buffer) { cnt = ses->scroll_row; do { if (++cnt == ses->scroll_max) { cnt = 0; } if (ses->buffer[cnt] == NULL) { break; } str_unhash(ses->buffer[cnt]); } while (cnt != ses->scroll_row); } if (ses->buffer) { free(ses->buffer); } if (size) { ses->buffer = (char **) calloc(size, sizeof(char *)); ses->scroll_max = size; ses->scroll_row = size - 1; ses->scroll_line = - 1; } pop_call(); return; }
void add_line_buffer(struct session *ses, char *line, int more_output) { char linebuf[STRING_SIZE]; char *pti, *pto; int lines; int sav_row, sav_col, cur_row, cur_col, top_row, bot_row; push_call("add_line_buffer(%p,%s,%d)", ses, line, more_output); if (ses->buffer == NULL || HAS_BIT(ses->flags, SES_FLAG_SCROLLSTOP)) { pop_call(); return; } sav_row = ses->sav_row; sav_col = ses->sav_col; cur_row = ses->cur_row; cur_col = ses->cur_col; top_row = ses->top_row; bot_row = ses->bot_row; if (more_output == TRUE) { if (strlen(ses->more_output) < BUFFER_SIZE / 2) { strcat(ses->more_output, line); pop_call(); return; } } strcat(ses->more_output, line); pti = pto = ses->more_output; while (*pti != 0) { while (skip_vt102_codes_non_graph(pti)) { interpret_vt102_codes(ses, pti, FALSE); pti += skip_vt102_codes_non_graph(pti); } if (*pti == 0) { break; } if (SCROLL(ses)) { *pto++ = *pti++; } else { pti++; } } *pto = 0; lines = word_wrap(ses, ses->more_output, linebuf, FALSE); ses->more_output[0] = 0; ses->buffer[ses->scroll_row] = str_hash(linebuf, lines); if (more_output == -1) { str_hash_grep(ses->buffer[ses->scroll_row], TRUE); } if (!HAS_BIT(ses->flags, SES_FLAG_LOGLEVEL)) { if (ses->logfile) { logit(ses, linebuf, ses->logfile, TRUE); } } if (gtd->chat) { chat_forward_session(ses, linebuf); } if (--ses->scroll_row < 0) { ses->scroll_row = ses->scroll_max - 1; } if (ses->buffer[ses->scroll_row]) { ses->buffer[ses->scroll_row] = str_unhash(ses->buffer[ses->scroll_row]); } ses->sav_row = sav_row; ses->sav_col = sav_col; ses->cur_row = cur_row; ses->cur_col = cur_col; ses->top_row = top_row; ses->bot_row = bot_row; pop_call(); return; }