show.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. /******************************************************************************
  2. * This file is part of TinTin++ *
  3. * *
  4. * Copyright 2004-2019 Igor van den Hoven *
  5. * *
  6. * TinTin++ is free software; you can redistribute it and/or modify *
  7. * it under the terms of the GNU General Public License as published by *
  8. * the Free Software Foundation; either version 3 of the License, or *
  9. * (at your option) any later version. *
  10. * *
  11. * This program is distributed in the hope that it will be useful, *
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of *
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
  14. * GNU General Public License for more details. *
  15. * *
  16. * *
  17. * You should have received a copy of the GNU General Public License *
  18. * along with TinTin++. If not, see https://www.gnu.org/licenses. *
  19. ******************************************************************************/
  20. /******************************************************************************
  21. * (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t *
  22. * *
  23. * coded by Peter Unold 1992 *
  24. * recoded by Igor van den Hoven 2005 *
  25. ******************************************************************************/
  26. #include "tintin.h"
  27. DO_COMMAND(do_showme)
  28. {
  29. char arg1[BUFFER_SIZE], arg2[BUFFER_SIZE], arg3[BUFFER_SIZE], temp[STRING_SIZE], *output;
  30. int lnf;
  31. arg = get_arg_in_braces(ses, arg, arg1, GET_ALL);
  32. lnf = !str_suffix(arg1, "\\");
  33. substitute(ses, arg1, temp, SUB_VAR|SUB_FUN);
  34. substitute(ses, temp, arg1, SUB_COL|SUB_ESC);
  35. arg = sub_arg_in_braces(ses, arg, arg2, GET_ONE, SUB_VAR|SUB_FUN);
  36. arg = sub_arg_in_braces(ses, arg, arg3, GET_ONE, SUB_VAR|SUB_FUN);
  37. do_one_line(arg1, ses);
  38. if (HAS_BIT(ses->flags, SES_FLAG_GAG))
  39. {
  40. DEL_BIT(ses->flags, SES_FLAG_GAG);
  41. gtd->level->ignore++;
  42. show_info(ses, LIST_GAG, "#INFO GAG {%s}", arg1);
  43. gtd->level->ignore--;
  44. return ses;
  45. }
  46. if (*arg2)
  47. {
  48. split_show(ses, arg1, (int) get_number(ses, arg2), (int) get_number(ses, arg3));
  49. return ses;
  50. }
  51. if (strip_vt102_strlen(ses, ses->more_output) != 0)
  52. {
  53. output = str_dup_printf("\n%s%s%s", COLOR_TEXT, arg1, COLOR_TEXT);
  54. }
  55. else
  56. {
  57. output = str_dup_printf("%s%s%s", COLOR_TEXT, arg1, COLOR_TEXT);
  58. }
  59. add_line_buffer(ses, output, lnf);
  60. if (ses == gtd->ses)
  61. {
  62. if (!HAS_BIT(ses->flags, SES_FLAG_READMUD) && IS_SPLIT(ses))
  63. {
  64. save_pos(ses);
  65. goto_pos(ses, ses->split->bot_row, ses->split->top_col);
  66. }
  67. print_line(ses, &output, lnf);
  68. if (!HAS_BIT(ses->flags, SES_FLAG_READMUD) && IS_SPLIT(ses))
  69. {
  70. restore_pos(ses);
  71. }
  72. }
  73. str_free(output);
  74. return ses;
  75. }
  76. void show_message(struct session *ses, int index, char *format, ...)
  77. {
  78. struct listroot *root;
  79. char *buffer;
  80. va_list args;
  81. push_call("show_message(%p,%p,%p)",ses,index,format);
  82. root = ses->list[index];
  83. if (gtd->level->verbose || gtd->level->debug )
  84. {
  85. goto display;
  86. }
  87. if (HAS_BIT(root->flags, LIST_FLAG_DEBUG))
  88. {
  89. goto display;
  90. }
  91. if (!HAS_BIT(root->flags, LIST_FLAG_MESSAGE))
  92. {
  93. goto end;
  94. }
  95. if (gtd->level->input)
  96. {
  97. goto end;
  98. }
  99. display:
  100. va_start(args, format);
  101. vasprintf(&buffer, format, args);
  102. va_end(args);
  103. tintin_puts2(ses, buffer);
  104. free(buffer);
  105. pop_call();
  106. return;
  107. end:
  108. if (HAS_BIT(root->flags, LIST_FLAG_LOG))
  109. {
  110. if (ses->logfile)
  111. {
  112. va_start(args, format);
  113. vasprintf(&buffer, format, args);
  114. va_end(args);
  115. logit(ses, buffer, ses->logfile, LOG_FLAG_LINEFEED);
  116. free(buffer);
  117. }
  118. }
  119. pop_call();
  120. return;
  121. }
  122. void show_error(struct session *ses, int index, char *format, ...)
  123. {
  124. struct listroot *root;
  125. char *buffer;
  126. va_list args;
  127. push_call("show_error(%p,%p,%p)",ses,index,format);
  128. va_start(args, format);
  129. vasprintf(&buffer, format, args);
  130. va_end(args);
  131. if (gtd->level->verbose || gtd->level->debug)
  132. {
  133. tintin_puts2(ses, buffer);
  134. goto end;
  135. }
  136. root = ses->list[index];
  137. if (HAS_BIT(root->flags, LIST_FLAG_DEBUG))
  138. {
  139. tintin_puts2(ses, buffer);
  140. goto end;
  141. }
  142. if (HAS_BIT(root->flags, LIST_FLAG_MESSAGE))
  143. {
  144. tintin_puts2(ses, buffer);
  145. goto end;
  146. }
  147. if (HAS_BIT(root->flags, LIST_FLAG_LOG))
  148. {
  149. if (ses->logfile)
  150. {
  151. logit(ses, buffer, ses->logfile, LOG_FLAG_LINEFEED);
  152. }
  153. }
  154. end:
  155. free(buffer);
  156. pop_call();
  157. return;
  158. }
  159. void show_debug(struct session *ses, int index, char *format, ...)
  160. {
  161. struct listroot *root;
  162. char buf[STRING_SIZE];
  163. va_list args;
  164. push_call("show_debug(%p,%p,%p)",ses,index,format);
  165. root = ses->list[index];
  166. if (gtd->level->debug == 0 && !HAS_BIT(root->flags, LIST_FLAG_DEBUG) && !HAS_BIT(root->flags, LIST_FLAG_LOG))
  167. {
  168. pop_call();
  169. return;
  170. }
  171. va_start(args, format);
  172. vsprintf(buf, format, args);
  173. va_end(args);
  174. if (gtd->level->debug || HAS_BIT(root->flags, LIST_FLAG_DEBUG))
  175. {
  176. gtd->level->verbose++;
  177. tintin_puts2(ses, buf);
  178. gtd->level->verbose--;
  179. pop_call();
  180. return;
  181. }
  182. if (HAS_BIT(root->flags, LIST_FLAG_LOG))
  183. {
  184. if (ses->logfile)
  185. {
  186. logit(ses, buf, ses->logfile, LOG_FLAG_LINEFEED);
  187. }
  188. }
  189. pop_call();
  190. return;
  191. }
  192. void show_info(struct session *ses, int index, char *format, ...)
  193. {
  194. struct listroot *root;
  195. char buf[STRING_SIZE];
  196. va_list args;
  197. push_call("show_info(%p,%p,%p)",ses,index,format);
  198. root = ses->list[index];
  199. if (gtd->level->info == 0 && !HAS_BIT(root->flags, LIST_FLAG_INFO))
  200. {
  201. pop_call();
  202. return;
  203. }
  204. va_start(args, format);
  205. vsprintf(buf, format, args);
  206. va_end(args);
  207. gtd->level->verbose++;
  208. tintin_puts(ses, buf);
  209. gtd->level->verbose--;
  210. pop_call();
  211. return;
  212. }
  213. void print_lines(struct session *ses, int flags, char *format, ...)
  214. {
  215. char *buffer, *str_buf;
  216. va_list args;
  217. push_call("print_lines(%p,%d,%p,...)",ses,flags,format);
  218. va_start(args, format);
  219. vasprintf(&buffer, format, args);
  220. va_end(args);
  221. if (flags)
  222. {
  223. str_buf = str_alloc(BUFFER_SIZE + strlen(buffer) * 2);
  224. substitute(ses, buffer, str_buf, flags);
  225. show_lines(ses, str_buf);
  226. str_free(str_buf);
  227. }
  228. else
  229. {
  230. show_lines(ses, buffer);
  231. }
  232. free(buffer);
  233. pop_call();
  234. return;
  235. }
  236. void show_lines(struct session *ses, char *str)
  237. {
  238. char *ptf;
  239. push_call("show_lines(%p,%p,...)",ses,str);
  240. while (*str)
  241. {
  242. ptf = strchr(str, '\n');
  243. if (ptf == NULL)
  244. {
  245. break;
  246. }
  247. *ptf++ = 0;
  248. tintin_puts3(ses, str);
  249. str = ptf;
  250. }
  251. pop_call();
  252. return;
  253. }
  254. void tintin_header(struct session *ses, char *format, ...)
  255. {
  256. char arg[BUFFER_SIZE], buf[BUFFER_SIZE];
  257. va_list args;
  258. int cols;
  259. push_call("tintin_header(%p,%p)",ses,format);
  260. va_start(args, format);
  261. vsprintf(arg, format, args);
  262. va_end(args);
  263. cols = get_scroll_cols(ses);
  264. if (cols < 2)
  265. {
  266. pop_call();
  267. return;
  268. }
  269. if ((int) strlen(arg) > cols - 2)
  270. {
  271. arg[cols - 2] = 0;
  272. }
  273. if (HAS_BIT(ses->flags, SES_FLAG_SCREENREADER))
  274. {
  275. memset(buf, ' ', cols);
  276. }
  277. else
  278. {
  279. memset(buf, '#', cols);
  280. }
  281. memcpy(&buf[(cols - strlen(arg)) / 2], arg, strlen(arg));
  282. buf[cols] = 0;
  283. tintin_puts2(ses, buf);
  284. pop_call();
  285. return;
  286. }
  287. void tintin_printf2(struct session *ses, char *format, ...)
  288. {
  289. char *buffer;
  290. va_list args;
  291. push_call("tintin_printf2(%p,%p,...)",ses,format);
  292. va_start(args, format);
  293. vasprintf(&buffer, format, args);
  294. va_end(args);
  295. tintin_puts2(ses, buffer);
  296. free(buffer);
  297. pop_call();
  298. return;
  299. }
  300. void tintin_printf(struct session *ses, char *format, ...)
  301. {
  302. char buffer[BUFFER_SIZE];
  303. va_list args;
  304. va_start(args, format);
  305. vsprintf(buffer, format, args);
  306. va_end(args);
  307. tintin_puts(ses, buffer);
  308. }
  309. /*
  310. Show string and fire triggers
  311. */
  312. void tintin_puts(struct session *ses, char *string)
  313. {
  314. if (ses == NULL)
  315. {
  316. ses = gtd->ses;
  317. }
  318. do_one_line(string, ses);
  319. if (HAS_BIT(ses->flags, SES_FLAG_GAG))
  320. {
  321. DEL_BIT(ses->flags, SES_FLAG_GAG);
  322. gtd->level->ignore++;
  323. if (HAS_BIT(ses->list[LIST_GAG]->flags, LIST_FLAG_INFO))
  324. {
  325. show_info(ses, LIST_GAG, "#INFO GAG {%s}", string);
  326. }
  327. gtd->level->ignore--;
  328. }
  329. else
  330. {
  331. tintin_puts2(ses, string);
  332. }
  333. }
  334. /*
  335. show string and don't fire triggers
  336. */
  337. void tintin_puts2(struct session *ses, char *string)
  338. {
  339. char *output;
  340. push_call("tintin_puts2(%p,%p)",ses,string);
  341. output = str_dup_printf("%s%s%s", COLOR_TEXT, string, COLOR_TEXT);
  342. tintin_puts3(ses, output);
  343. str_free(output);
  344. pop_call();
  345. return;
  346. }
  347. /*
  348. show string, no triggers, no color reset
  349. */
  350. void tintin_puts3(struct session *ses, char *string)
  351. {
  352. char *output, temp[STRING_SIZE];
  353. push_call("tintin_puts3(%p,%p)",ses,string);
  354. if (ses == NULL)
  355. {
  356. ses = gtd->ses;
  357. }
  358. if (ses->line_capturefile)
  359. {
  360. sprintf(temp, "{%d}{%s}", ses->line_captureindex++, string);
  361. if (ses->line_captureindex == 1)
  362. {
  363. set_nest_node_ses(ses, ses->line_capturefile, "%s", temp);
  364. }
  365. else
  366. {
  367. add_nest_node_ses(ses, ses->line_capturefile, "%s", temp);
  368. }
  369. }
  370. if (!HAS_BIT(gtd->ses->flags, SES_FLAG_VERBOSE) && gtd->level->quiet && gtd->level->verbose == 0)
  371. {
  372. pop_call();
  373. return;
  374. }
  375. if (strip_vt102_strlen(ses, ses->more_output) != 0)
  376. {
  377. output = str_dup_printf("\n%s", string);
  378. }
  379. else
  380. {
  381. output = str_dup_printf("%s", string);
  382. }
  383. add_line_buffer(ses, output, FALSE);
  384. if (ses == gtd->ses)
  385. {
  386. if (!HAS_BIT(ses->flags, SES_FLAG_READMUD) && IS_SPLIT(ses))
  387. {
  388. save_pos(ses);
  389. goto_pos(ses, ses->split->bot_row, ses->split->top_col);
  390. }
  391. print_line(ses, &output, FALSE);
  392. if (!HAS_BIT(ses->flags, SES_FLAG_READMUD) && IS_SPLIT(ses))
  393. {
  394. restore_pos(ses);
  395. }
  396. }
  397. str_free(output);
  398. pop_call();
  399. return;
  400. }