| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547 |
- /******************************************************************************
- * This file is part of TinTin++ *
- * *
- * Copyright 2004-2019 Igor van den Hoven *
- * *
- * TinTin++ 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 3 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 TinTin++. If not, see https://www.gnu.org/licenses. *
- ******************************************************************************/
- /******************************************************************************
- * (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t *
- * *
- * coded by Peter Unold 1992 *
- * recoded by Igor van den Hoven 2005 *
- ******************************************************************************/
- #include "tintin.h"
- DO_COMMAND(do_showme)
- {
- char arg1[BUFFER_SIZE], arg2[BUFFER_SIZE], arg3[BUFFER_SIZE], temp[STRING_SIZE], *output;
- int lnf;
- arg = get_arg_in_braces(ses, arg, arg1, GET_ALL);
- lnf = !str_suffix(arg1, "\\");
- substitute(ses, arg1, temp, SUB_VAR|SUB_FUN);
- substitute(ses, temp, arg1, SUB_COL|SUB_ESC);
- arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
- arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
- do_one_line(arg1, ses);
- if (HAS_BIT(ses->flags, SES_FLAG_GAG))
- {
- DEL_BIT(ses->flags, SES_FLAG_GAG);
- gtd->level->ignore++;
- show_info(ses, LIST_GAG, "#INFO GAG {%s}", arg1);
- gtd->level->ignore--;
- return ses;
- }
- if (*arg2)
- {
- split_show(ses, arg1, (int) get_number(ses, arg2), (int) get_number(ses, arg3));
- return ses;
- }
- if (strip_vt102_strlen(ses, ses->more_output) != 0)
- {
- output = str_dup_printf("\n%s%s%s", COLOR_TEXT, arg1, COLOR_TEXT);
- }
- else
- {
- output = str_dup_printf("%s%s%s", COLOR_TEXT, arg1, COLOR_TEXT);
- }
- add_line_buffer(ses, output, lnf);
- if (ses == gtd->ses)
- {
- if (!HAS_BIT(ses->flags, SES_FLAG_READMUD) && IS_SPLIT(ses))
- {
- save_pos(ses);
- goto_pos(ses, ses->split->bot_row, ses->split->top_col);
- }
- print_line(ses, &output, lnf);
- if (!HAS_BIT(ses->flags, SES_FLAG_READMUD) && IS_SPLIT(ses))
- {
- restore_pos(ses);
- }
- }
- str_free(output);
- return ses;
- }
- void show_message(struct session *ses, int index, char *format, ...)
- {
- struct listroot *root;
- char *buffer;
- va_list args;
- push_call("show_message(%p,%p,%p)",ses,index,format);
- root = ses->list[index];
- if (gtd->level->verbose || gtd->level->debug )
- {
- goto display;
- }
- if (HAS_BIT(root->flags, LIST_FLAG_DEBUG))
- {
- goto display;
- }
- if (!HAS_BIT(root->flags, LIST_FLAG_MESSAGE))
- {
- goto end;
- }
- if (gtd->level->input)
- {
- goto end;
- }
- display:
- va_start(args, format);
- vasprintf(&buffer, format, args);
- va_end(args);
- tintin_puts2(ses, buffer);
- free(buffer);
- pop_call();
- return;
- end:
- if (HAS_BIT(root->flags, LIST_FLAG_LOG))
- {
- if (ses->logfile)
- {
- va_start(args, format);
- vasprintf(&buffer, format, args);
- va_end(args);
- logit(ses, buffer, ses->logfile, LOG_FLAG_LINEFEED);
- free(buffer);
- }
- }
- pop_call();
- return;
- }
- void show_error(struct session *ses, int index, char *format, ...)
- {
- struct listroot *root;
- char *buffer;
- va_list args;
- push_call("show_error(%p,%p,%p)",ses,index,format);
- va_start(args, format);
- vasprintf(&buffer, format, args);
- va_end(args);
- if (gtd->level->verbose || gtd->level->debug)
- {
- tintin_puts2(ses, buffer);
- goto end;
- }
- root = ses->list[index];
- if (HAS_BIT(root->flags, LIST_FLAG_DEBUG))
- {
- tintin_puts2(ses, buffer);
- goto end;
- }
- if (HAS_BIT(root->flags, LIST_FLAG_MESSAGE))
- {
- tintin_puts2(ses, buffer);
- goto end;
- }
- if (HAS_BIT(root->flags, LIST_FLAG_LOG))
- {
- if (ses->logfile)
- {
- logit(ses, buffer, ses->logfile, LOG_FLAG_LINEFEED);
- }
- }
- end:
- free(buffer);
- pop_call();
- return;
- }
- void show_debug(struct session *ses, int index, char *format, ...)
- {
- struct listroot *root;
- char buf[STRING_SIZE];
- va_list args;
- push_call("show_debug(%p,%p,%p)",ses,index,format);
- root = ses->list[index];
- if (gtd->level->debug == 0 && !HAS_BIT(root->flags, LIST_FLAG_DEBUG) && !HAS_BIT(root->flags, LIST_FLAG_LOG))
- {
- pop_call();
- return;
- }
- va_start(args, format);
- vsprintf(buf, format, args);
- va_end(args);
- if (gtd->level->debug || HAS_BIT(root->flags, LIST_FLAG_DEBUG))
- {
- gtd->level->verbose++;
- tintin_puts2(ses, buf);
- gtd->level->verbose--;
- pop_call();
- return;
- }
- if (HAS_BIT(root->flags, LIST_FLAG_LOG))
- {
- if (ses->logfile)
- {
- logit(ses, buf, ses->logfile, LOG_FLAG_LINEFEED);
- }
- }
- pop_call();
- return;
- }
- void show_info(struct session *ses, int index, char *format, ...)
- {
- struct listroot *root;
- char buf[STRING_SIZE];
- va_list args;
- push_call("show_info(%p,%p,%p)",ses,index,format);
- root = ses->list[index];
- if (gtd->level->info == 0 && !HAS_BIT(root->flags, LIST_FLAG_INFO))
- {
- pop_call();
- return;
- }
- va_start(args, format);
- vsprintf(buf, format, args);
- va_end(args);
- gtd->level->verbose++;
- tintin_puts(ses, buf);
- gtd->level->verbose--;
- pop_call();
- return;
- }
- void print_lines(struct session *ses, int flags, char *format, ...)
- {
- char *buffer, *str_buf;
- va_list args;
- push_call("print_lines(%p,%d,%p,...)",ses,flags,format);
- va_start(args, format);
- vasprintf(&buffer, format, args);
- va_end(args);
- if (flags)
- {
- str_buf = str_alloc(BUFFER_SIZE + strlen(buffer) * 2);
- substitute(ses, buffer, str_buf, flags);
- show_lines(ses, str_buf);
- str_free(str_buf);
- }
- else
- {
- show_lines(ses, buffer);
- }
- free(buffer);
- pop_call();
- return;
- }
- void show_lines(struct session *ses, char *str)
- {
- char *ptf;
- push_call("show_lines(%p,%p,...)",ses,str);
- while (*str)
- {
- ptf = strchr(str, '\n');
- if (ptf == NULL)
- {
- break;
- }
- *ptf++ = 0;
- tintin_puts3(ses, str);
- str = ptf;
- }
- pop_call();
- return;
- }
- void tintin_header(struct session *ses, char *format, ...)
- {
- char arg[BUFFER_SIZE], buf[BUFFER_SIZE];
- va_list args;
- int cols;
- push_call("tintin_header(%p,%p)",ses,format);
- va_start(args, format);
- vsprintf(arg, format, args);
- va_end(args);
- cols = get_scroll_cols(ses);
- if (cols < 2)
- {
- pop_call();
- return;
- }
- if ((int) strlen(arg) > cols - 2)
- {
- arg[cols - 2] = 0;
- }
- if (HAS_BIT(ses->flags, SES_FLAG_SCREENREADER))
- {
- memset(buf, ' ', cols);
- }
- else
- {
- memset(buf, '#', cols);
- }
- memcpy(&buf[(cols - strlen(arg)) / 2], arg, strlen(arg));
- buf[cols] = 0;
- tintin_puts2(ses, buf);
- pop_call();
- return;
- }
- void tintin_printf2(struct session *ses, char *format, ...)
- {
- char *buffer;
- va_list args;
- push_call("tintin_printf2(%p,%p,...)",ses,format);
- va_start(args, format);
- vasprintf(&buffer, format, args);
- va_end(args);
- tintin_puts2(ses, buffer);
- free(buffer);
- pop_call();
- return;
- }
- void tintin_printf(struct session *ses, char *format, ...)
- {
- char buffer[BUFFER_SIZE];
- va_list args;
- va_start(args, format);
- vsprintf(buffer, format, args);
- va_end(args);
- tintin_puts(ses, buffer);
- }
- /*
- Show string and fire triggers
- */
- void tintin_puts(struct session *ses, char *string)
- {
- if (ses == NULL)
- {
- ses = gtd->ses;
- }
- do_one_line(string, ses);
- if (HAS_BIT(ses->flags, SES_FLAG_GAG))
- {
- DEL_BIT(ses->flags, SES_FLAG_GAG);
- gtd->level->ignore++;
- if (HAS_BIT(ses->list[LIST_GAG]->flags, LIST_FLAG_INFO))
- {
- show_info(ses, LIST_GAG, "#INFO GAG {%s}", string);
- }
- gtd->level->ignore--;
- }
- else
- {
- tintin_puts2(ses, string);
- }
- }
- /*
- show string and don't fire triggers
- */
- void tintin_puts2(struct session *ses, char *string)
- {
- char *output;
- push_call("tintin_puts2(%p,%p)",ses,string);
- output = str_dup_printf("%s%s%s", COLOR_TEXT, string, COLOR_TEXT);
- tintin_puts3(ses, output);
- str_free(output);
- pop_call();
- return;
- }
- /*
- show string, no triggers, no color reset
- */
- void tintin_puts3(struct session *ses, char *string)
- {
- char *output, temp[STRING_SIZE];
- push_call("tintin_puts3(%p,%p)",ses,string);
- if (ses == NULL)
- {
- ses = gtd->ses;
- }
- if (ses->line_capturefile)
- {
- sprintf(temp, "{%d}{%s}", ses->line_captureindex++, string);
- if (ses->line_captureindex == 1)
- {
- set_nest_node_ses(ses, ses->line_capturefile, "%s", temp);
- }
- else
- {
- add_nest_node_ses(ses, ses->line_capturefile, "%s", temp);
- }
- }
- if (!HAS_BIT(gtd->ses->flags, SES_FLAG_VERBOSE) && gtd->level->quiet && gtd->level->verbose == 0)
- {
- pop_call();
- return;
- }
- if (strip_vt102_strlen(ses, ses->more_output) != 0)
- {
- output = str_dup_printf("\n%s", string);
- }
- else
- {
- output = str_dup_printf("%s", string);
- }
- add_line_buffer(ses, output, FALSE);
- if (ses == gtd->ses)
- {
- if (!HAS_BIT(ses->flags, SES_FLAG_READMUD) && IS_SPLIT(ses))
- {
- save_pos(ses);
- goto_pos(ses, ses->split->bot_row, ses->split->top_col);
- }
- print_line(ses, &output, FALSE);
- if (!HAS_BIT(ses->flags, SES_FLAG_READMUD) && IS_SPLIT(ses))
- {
- restore_pos(ses);
- }
- }
- str_free(output);
- pop_call();
- return;
- }
|