/****************************************************************************** * 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 logit(struct session *ses, char *txt, FILE *file, int newline) { char out[BUFFER_SIZE]; if (HAS_BIT(ses->flags, SES_FLAG_LOGPLAIN)) { strip_vt102_codes(txt, out); } else if (HAS_BIT(ses->flags, SES_FLAG_LOGHTML)) { vt102_to_html(ses, txt, out); } else { strcpy(out, txt); } if (newline) { strcat(out, "\n"); } fputs(out, file); fflush(file); } DO_COMMAND(do_log) { char left[BUFFER_SIZE], right[BUFFER_SIZE]; arg = get_arg_in_braces(arg, left, FALSE); substitute(ses, left, left, SUB_VAR|SUB_FUN); arg = get_arg_in_braces(arg, right, TRUE); substitute(ses, right, right, SUB_VAR|SUB_FUN); if (ses->logfile) { fclose(ses->logfile); ses->logfile = NULL; show_message(ses, -1, "#OK: LOGGING TURNED OFF."); } else if (*left == 0 || *right == 0 || (!is_abbrev(left, "APPEND") && !is_abbrev(left, "OVERWRITE"))) { tintin_printf(ses, "#SYNTAX: #LOG [<APPEND|OVERWRITE> <FILENAME>]"); } else { if (is_abbrev(left, "APPEND")) { if ((ses->logfile = fopen(right, "a"))) { fseek(ses->logfile, 0, SEEK_END); if (ftell(ses->logfile) == 0 && HAS_BIT(ses->flags, SES_FLAG_LOGHTML)) { write_html_header(ses->logfile); } show_message(ses, -1, "#OK: LOGGING OUTPUT TO '%s' FILESIZE: %ld", right, ftell(ses->logfile)); } else { tintin_printf2(ses, "#ERROR: #LOG {%s} {%s} - COULDN'T OPEN FILE.", left, right); } } else { if ((ses->logfile = fopen(right, "w"))) { if (HAS_BIT(ses->flags, SES_FLAG_LOGHTML)) { write_html_header(ses->logfile); } show_message(ses, -1, "#OK: LOGGING OUTPUT TO '%s'", right); } else { tintin_printf2(ses, "#ERROR: #LOG {%s} {%s} - COULDN'T OPEN FILE.", left, right); } } } return ses; } void write_html_header(FILE *fp) { char *header = "<html>\n" "<head>\n" "<meta http-equiv='content-type' content='text/html; charset=iso-8859-1'>\n" "<meta name='description' content='Generated by TinTin++ "CLIENT_VERSION" - http://tintin.sourceforge.net'>\n" "<style type='text/css'>\n" "{\n\tfont-family: Courier;\n\tfont-size: 10pt;\n}\n" ".d30{ color: #000; } .l30{ color: #555; } .b40{ background-color: #000; } .b50{ background-color: #555 }\n" ".d31{ color: #B00; } .l31{ color: #F55; } .b41{ background-color: #B00; } .b51{ background-color: #F55 }\n" ".d32{ color: #0B0; } .l32{ color: #5F5; } .b42{ background-color: #0B0; } .b52{ background-color: #5F5 }\n" ".d33{ color: #BB0; } .l33{ color: #FF5; } .b43{ background-color: #BB0; } .b53{ background-color: #FF5 }\n" ".d34{ color: #00B; } .l34{ color: #55F; } .b44{ background-color: #00B; } .b54{ background-color: #55F }\n" ".d35{ color: #B0B; } .l35{ color: #F5F; } .b45{ background-color: #B0B; } .b55{ background-color: #F5F }\n" ".d36{ color: #0BB; } .l36{ color: #5FF; } .b46{ background-color: #0BB; } .b56{ background-color: #5FF }\n" ".d37{ color: #BBB; } .l37{ color: #FFF; } .b47{ background-color: #BBB; } .b57{ background-color: #FFF }\n" ".d38{ color: #FFF; } .l38{ color: #FFF; } .b48{ background-color: #000; } .b58{ background-color: #000 }\n" ".d39{ color: #FFF; } .l39{ color: #FFF; } .b49{ background-color: #000; } .b59{ background-color: #000 }\n" "</style>\n" "<body bgcolor='#000000'>\n" "</head>\n" "<pre>\n" "<span class='b49'><span class='d39'>\n"; fputs(header, fp); } void vt102_to_html(struct session *ses, char *txt, char *out) { char tmp[BUFFER_SIZE], *pti, *pto, x[] = { '0', '5', '8', 'B', 'D', 'F' }; int vtc, fgc, bgc, cnt; vtc = ses->vtc; fgc = ses->fgc; bgc = ses->bgc; pti = txt; pto = out; while (*pti) { while (skip_vt102_codes_non_graph(pti)) { pti += skip_vt102_codes_non_graph(pti); } switch (*pti) { case 27: pti += 2; for (cnt = 0 ; pti[cnt] ; cnt++) { tmp[cnt] = pti[cnt]; if (pti[cnt] == ';' || pti[cnt] == 'm') { tmp[cnt] = 0; cnt = -1; pti += 1 + strlen(tmp); if (HAS_BIT(vtc, COL_256) && (HAS_BIT(vtc, COL_XTF) || HAS_BIT(vtc, COL_XTB))) { if (HAS_BIT(vtc, COL_XTF)) { fgc = URANGE(0, atoi(tmp), 255); } if (HAS_BIT(vtc, COL_XTB)) { bgc = URANGE(0, atoi(tmp), 255); } } else { switch (atoi(tmp)) { case 0: vtc = 0; fgc = 39; bgc = 49; break; case 1: SET_BIT(vtc, COL_BLD); break; case 5: if (HAS_BIT(vtc, COL_XTF) || HAS_BIT(vtc, COL_XTB)) { SET_BIT(vtc, COL_256); } break; case 7: SET_BIT(vtc, COL_REV); break; case 2: case 21: case 22: DEL_BIT(vtc, COL_BLD); break; case 27: DEL_BIT(vtc, COL_REV); break; case 38: DEL_BIT(vtc, COL_XTB); SET_BIT(vtc, COL_XTF); fgc = 38; break; case 48: DEL_BIT(vtc, COL_XTF); SET_BIT(vtc, COL_XTB); bgc = 48; break; default: if (atoi(tmp) / 10 == 4) { bgc = atoi(tmp); } if (atoi(tmp) / 10 == 10) { bgc = atoi(tmp) - 50; } if (atoi(tmp) / 10 == 3) { fgc = atoi(tmp); } if (atoi(tmp) / 10 == 9) { SET_BIT(vtc, COL_BLD); fgc = atoi(tmp) - 60; } break; } } } if (pti[-1] == 'm') { break; } } if (!HAS_BIT(vtc, COL_REV) && HAS_BIT(ses->vtc, COL_REV)) { cnt = fgc; fgc = ses->fgc = bgc - 10; bgc = ses->bgc = cnt + 10; } if (bgc != ses->bgc || fgc != ses->fgc || vtc != ses->vtc) { sprintf(pto, "</span>"); pto += strlen(pto); if (bgc != ses->bgc) { if (HAS_BIT(vtc, COL_256) && HAS_BIT(vtc, COL_XTB)) { if (bgc < 8) { sprintf(pto, "</span><span class='b%d'>", 40+bgc); } else if (bgc < 16) { sprintf(pto, "</span><span class='b%d'>", 50+bgc-8); } else if (bgc < 232) { sprintf(pto, "</span><span style='background-color: #%c%c%c;'>", x[(bgc-16) / 36], x[(bgc-16) % 36 / 6], x[(bgc-16) % 6]); } else { sprintf(pto, "</span><span style='background-color: rgb(%d,%d,%d);'>", (bgc-232) * 10 + 8, (bgc-232) * 10 + 8,(bgc-232) * 10 + 8); } } else { sprintf(pto, "</span><span class='b%d'>", bgc); } pto += strlen(pto); } if (HAS_BIT(vtc, COL_256) && HAS_BIT(vtc, COL_XTF)) { if (fgc < 8) { sprintf(pto, "</span><span class='d%d'>", 30+fgc); } else if (fgc < 16) { sprintf(pto, "</span><span class='l%d'>", 30+fgc-8); } else if (fgc < 232) { sprintf(pto, "<span style='color: #%c%c%c;'>", x[(fgc-16) / 36], x[(fgc-16) % 36 / 6], x[(fgc-16) % 6]); } else { sprintf(pto, "<span style='color: rgb(%d,%d,%d);'>", (fgc-232) * 10 + 8, (fgc-232) * 10 + 8,(fgc-232) * 10 + 8); } } else { if (HAS_BIT(vtc, COL_BLD)) { sprintf(pto, "<span class='l%d'>", fgc); } else { sprintf(pto, "<span class='d%d'>", fgc); } } pto += strlen(pto); } if (HAS_BIT(vtc, COL_REV) && !HAS_BIT(ses->vtc, COL_REV)) { cnt = fgc; fgc = ses->fgc = bgc - 10; bgc = ses->bgc = cnt + 10; } DEL_BIT(vtc, COL_XTF); DEL_BIT(vtc, COL_XTB); DEL_BIT(vtc, COL_256); ses->vtc = vtc; ses->fgc = fgc; ses->bgc = bgc; break; case 6: *pto++ = '&'; pti++; break; case 28: *pto++ = '<'; pti++; break; case 30: *pto++ = '>'; pti++; break; case '>': sprintf(pto, ">"); pto += strlen(pto); pti++; break; case '<': sprintf(pto, "<"); pto += strlen(pto); pti++; break; case '"': sprintf(pto, """); pto += strlen(pto); pti++; break; case '&': sprintf(pto, "&"); pto += strlen(pto); pti++; break; case 0: break; default: *pto++ = *pti++; break; } } *pto = 0; }