/****************************************************************************** * TinTin++ * * Copyright (C) 2004 (See CREDITS file) * * * * This program is protected under the GNU GPL (See COPYING) * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ******************************************************************************/ /****************************************************************************** * (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t * * * * coded by Igor van den Hoven 2004 * ******************************************************************************/ #include "tintin.h" void printline(struct session *ses, char *str, int prompt) { char wrapped_str[STRING_SIZE]; push_call("printline(%p,%p,%d)",ses,str,prompt); if (ses->scroll_line != -1 && HAS_BIT(ses->flags, SES_FLAG_SCROLLLOCK)) { pop_call(); return; } if (HAS_BIT(ses->flags, SES_FLAG_SCAN) && !HAS_BIT(ses->flags, SES_FLAG_VERBOSE)) { pop_call(); return; } if (HAS_BIT(ses->flags, SES_FLAG_CONVERTMETA)) { convert_meta(str, wrapped_str); strcpy(str, wrapped_str); } if (HAS_BIT(ses->flags, SES_FLAG_WORDWRAP)) { word_wrap(ses, str, wrapped_str, TRUE); } else { strcpy(wrapped_str, str); } if (prompt) { printf("%s", wrapped_str); } else { printf("%s\n", wrapped_str); } pop_call(); return; } /* Word wrapper, only wraps scrolling region, returns nr of lines - Igor */ int word_wrap(struct session *ses, char *textin, char *textout, int display) { char *pti, *pto, *lis, *los, *chi, *cho; int skip = 0, cnt = 0; push_call("word_wrap(%s,%p,%p)",ses->name, textin,textout); pti = chi = lis = textin; pto = cho = los = textout; ses->cur_col = 1; while (*pti != 0) { if (skip_vt102_codes(pti)) { if (display == FALSE || interpret_vt102_codes(ses, pti, TRUE)) { for (skip = skip_vt102_codes(pti) ; skip > 0 ; skip--) { *pto++ = *pti++; } } else { pti += skip_vt102_codes(pti); } continue; } if (*pti == '\n') { *pto++ = *pti++; cnt = cnt + 1; los = pto; lis = pti; ses->cur_col = 1; continue; } if (*pti == ' ') { los = pto; lis = pti; } if (ses->cur_col > ses->cols) { cnt++; ses->cur_col = 1; if (HAS_BIT(ses->flags, SES_FLAG_WORDWRAP)) { if (pto - los > 15 || !SCROLL(ses)) { *pto++ = '\n'; los = pto; lis = pti; } else if (lis != chi) // infinite VT loop detection { pto = los; *pto++ = '\n'; pti = chi = lis; pti++; } else if (los != cho) { pto = cho = los; pto++; pti = chi = lis; pti++; } } } else { #ifdef BIG5 if (*pti & 128 && pti[1] != 0) { *pto++ = *pti++; } #endif #ifdef UTF8 if (*pti & 128 && *pti & 64) { skip = (*pti & 16) ? 3 : (*pti & 32) ? 2 : 1; while (skip-- && pti[1] != 0) { *pto++ = *pti++; } } #endif ses->cur_col++; *pto++ = *pti++; } } *pto = 0; pop_call(); return (cnt + 1); } // store whatever falls inbetween skip and keep. int word_wrap_split(struct session *ses, char *textin, char *textout, int skip, int keep) { char *pti, *pto, *lis, *los, *chi, *cho, *ptb; int i = 0, cnt = 0; push_call("word_wrap_split(%s,%p,%p,%d,%d)",ses->name, textin,textout, skip, keep); pti = chi = lis = textin; pto = cho = los = textout; ses->cur_col = 1; while (*pti != 0) { if (skip_vt102_codes(pti)) { if (cnt >= skip && cnt < keep) { for (i = skip_vt102_codes(pti) ; i > 0 ; i--) { *pto++ = *pti++; } } else { pti += skip_vt102_codes(pti); } continue; } if (*pti == '\n') { if (cnt >= skip && cnt < keep) { *pto++ = *pti++; } else { pti++; } cnt = cnt + 1; los = pto; lis = pti; ses->cur_col = 1; continue; } if (*pti == ' ') { los = pto; lis = pti; } if (ses->cur_col > ses->cols) { cnt++; ses->cur_col = 1; if (HAS_BIT(ses->flags, SES_FLAG_WORDWRAP)) { if (pto - los > 15 || !SCROLL(ses)) { if (cnt >= skip && cnt < keep) { *pto++ = '\n'; } los = pto; lis = pti; } else if (lis != chi) // infinite VT loop detection { if (cnt >= skip && cnt < keep) { pto = los; *pto++ = '\n'; } pti = chi = lis; pti++; } else if (los != cho) { if (cnt >= skip && cnt < keep) { pto = cho = los; pto++; } else { cho = los; } pti = chi = lis; pti++; } } } else { ptb = pto; #ifdef BIG5 if (*pti & 128 && pti[1] != 0) { *pto++ = *pti++; } #endif #ifdef UTF8 if (*pti & 128 && *pti & 64) { i = (*pti & 16) ? 3 : (*pti & 32) ? 2 : 1; while (i-- && pti[1] != 0) { *pto++ = *pti++; } } #endif *pto++ = *pti++; if (cnt < skip || cnt >= keep) { pto = ptb; } ses->cur_col++; } } *pto = 0; pop_call(); return (cnt + 1); }