1 /* NetHack 3.6 wc_trace.c $NHDT-Date: 1501464799 2017/07/31 01:33:19 $ $NHDT-Branch: NetHack-3.6.0 $:$NHDT-Revision: 1.8 $ */
2 /* Copyright (c) Kenneth Lorber, 2012 */
3 /* NetHack may be freely redistributed. See license for details. */
12 FILE *wc_tracelogf; /* Should be static, but it's just too useful to have
13 * access to this logfile from arbitrary other files. */
14 static unsigned int indent_level; /* Some winfuncs call other winfuncs, so
15 * we need to support nesting. */
17 static char indentdata[10] = " ";
21 &indentdata[((indent_level * ISCALE) < (sizeof(indentdata))) \
22 ? ((sizeof(indentdata) - 1) - (indent_level * ISCALE)) \
25 /* for debugging this file */
28 static char buf[50]; \
29 sprintf(buf, "[%s:%d %d]\t", __func__, __LINE__, indent_level); \
33 #define PRE indent_level++
34 #define POST indent_level--
37 struct chain_procs *nprocs;
44 trace_procs_chain(cmd, n, me, nextprocs, nextdata)
51 struct trace_data *tdp = 0;
55 tdp = (struct trace_data *) alloc(sizeof *tdp);
62 tdp->nprocs = nextprocs;
63 tdp->ndata = nextdata;
66 panic("trace_procs_chain: bad cmd\n");
79 /* processors shouldn't need this test, but just in case */
83 pid = (long) getpid();
84 Sprintf(fname, "%s/tlog.%ld", HACKDIR, pid);
85 wc_tracelogf = fopen(fname, "w");
87 fprintf(stderr, "Can't open trace log file %s: %s\n", fname,
89 nh_terminate(EXIT_FAILURE);
91 setvbuf(wc_tracelogf, (char *) 0, _IONBF, 0);
92 fprintf(wc_tracelogf, "Trace log started for pid %ld\n", pid);
102 trace_init_nhwindows(vp, argcp, argv)
107 struct trace_data *tdp = vp;
109 fprintf(wc_tracelogf, "%sinit_nhwindows(%d,*)\n", INDENT, *argcp);
112 (*tdp->nprocs->win_init_nhwindows)(tdp->ndata, argcp, argv);
117 trace_player_selection(vp)
120 struct trace_data *tdp = vp;
121 fprintf(wc_tracelogf, "%splayer_selection()\n", INDENT);
124 (*tdp->nprocs->win_player_selection)(tdp->ndata);
132 struct trace_data *tdp = vp;
133 fprintf(wc_tracelogf, "%saskname()\n", INDENT);
136 (*tdp->nprocs->win_askname)(tdp->ndata);
141 trace_get_nh_event(vp)
144 struct trace_data *tdp = vp;
145 fprintf(wc_tracelogf, "%sget_nh_event()\n", INDENT);
148 (*tdp->nprocs->win_get_nh_event)(tdp->ndata);
153 trace_exit_nhwindows(vp, str)
157 struct trace_data *tdp = vp;
158 fprintf(wc_tracelogf, "%sexit_nhwindows(%s)\n", INDENT, str);
161 (*tdp->nprocs->win_exit_nhwindows)(tdp->ndata, str);
166 trace_suspend_nhwindows(vp, str)
170 struct trace_data *tdp = vp;
171 fprintf(wc_tracelogf, "%ssuspend_nhwindows(%s)\n", INDENT, str);
174 (*tdp->nprocs->win_suspend_nhwindows)(tdp->ndata, str);
179 trace_resume_nhwindows(vp)
182 struct trace_data *tdp = vp;
183 fprintf(wc_tracelogf, "%sresume_nhwindows()\n", INDENT);
186 (*tdp->nprocs->win_resume_nhwindows)(tdp->ndata);
209 sprintf(b, "(%d)", type);
216 trace_create_nhwindow(vp, type)
220 struct trace_data *tdp = vp;
221 const char *typestring = NHWname(type);
224 fprintf(wc_tracelogf, "%screate_nhwindow(%s)\n", INDENT, typestring);
227 rv = (*tdp->nprocs->win_create_nhwindow)(tdp->ndata, type);
230 fprintf(wc_tracelogf, "%s=> %d\n", INDENT, rv);
235 trace_clear_nhwindow(vp, window)
239 struct trace_data *tdp = vp;
241 fprintf(wc_tracelogf, "%sclear_nhwindow(%d)\n", INDENT, window);
244 (*tdp->nprocs->win_clear_nhwindow)(tdp->ndata, window);
249 trace_display_nhwindow(vp, window, blocking)
254 struct trace_data *tdp = vp;
256 fprintf(wc_tracelogf, "%sdisplay_nhwindow(%d, %d)\n", INDENT, window,
260 (*tdp->nprocs->win_display_nhwindow)(tdp->ndata, window, blocking);
265 trace_destroy_nhwindow(vp, window)
269 struct trace_data *tdp = vp;
271 fprintf(wc_tracelogf, "%sdestroy_nhwindow(%d)\n", INDENT, window);
274 (*tdp->nprocs->win_destroy_nhwindow)(tdp->ndata, window);
279 trace_curs(vp, window, x, y)
285 struct trace_data *tdp = vp;
287 fprintf(wc_tracelogf, "%scurs(%d, %d, %d)\n", INDENT, window, x, y);
290 (*tdp->nprocs->win_curs)(tdp->ndata, window, x, y);
295 trace_putstr(vp, window, attr, str)
301 struct trace_data *tdp = vp;
304 fprintf(wc_tracelogf, "%sputstr(%d, %d, '%s'(%d))\n", INDENT, window,
305 attr, str, (int) strlen(str));
307 fprintf(wc_tracelogf, "%sputstr(%d, %d, NULL)\n", INDENT, window,
312 (*tdp->nprocs->win_putstr)(tdp->ndata, window, attr, str);
317 trace_putmixed(vp, window, attr, str)
323 struct trace_data *tdp = vp;
326 fprintf(wc_tracelogf, "%sputmixed(%d, %d, '%s'(%d))\n", INDENT,
327 window, attr, str, (int) strlen(str));
329 fprintf(wc_tracelogf, "%sputmixed(%d, %d, NULL)\n", INDENT, window,
334 (*tdp->nprocs->win_putmixed)(tdp->ndata, window, attr, str);
339 trace_display_file(vp, fname, complain)
344 struct trace_data *tdp = vp;
347 fprintf(wc_tracelogf, "%sdisplay_file('%s'(%d), %d)\n", INDENT, fname,
348 (int) strlen(fname), complain);
350 fprintf(wc_tracelogf, "%sdisplay_file(NULL, %d)\n", INDENT, complain);
354 (*tdp->nprocs->win_display_file)(tdp->ndata, fname, complain);
359 trace_start_menu(vp, window)
363 struct trace_data *tdp = vp;
365 fprintf(wc_tracelogf, "%sstart_menu(%d)\n", INDENT, window);
368 (*tdp->nprocs->win_start_menu)(tdp->ndata, window);
373 trace_add_menu(vp, window, glyph, identifier, ch, gch, attr, str, preselected)
375 winid window; /* window to use, must be of type NHW_MENU */
376 int glyph; /* glyph to display with item (unused) */
377 const anything *identifier; /* what to return if selected */
378 char ch; /* keyboard accelerator (0 = pick our own) */
379 char gch; /* group accelerator (0 = no group) */
380 int attr; /* attribute for string (like tty_putstr()) */
381 const char *str; /* menu string */
382 boolean preselected; /* item is marked as selected */
384 struct trace_data *tdp = vp;
390 sprintf(buf_ch, "'%c'(%d)", ch, ch);
392 sprintf(buf_ch, "(%d)", ch);
396 sprintf(buf_gch, "'%c'(%d)", gch, gch);
398 sprintf(buf_gch, "(%d)", gch);
402 fprintf(wc_tracelogf,
403 "%sadd_menu(%d, %d, %p, %s, %s, %d, '%s'(%d), %d)\n", INDENT,
404 window, glyph, (void *) identifier, buf_ch, buf_gch, attr,
405 str, (int) strlen(str), preselected);
407 fprintf(wc_tracelogf,
408 "%sadd_menu(%d, %d, %p, %s, %s, %d, NULL, %d)\n", INDENT,
409 window, glyph, (void *) identifier, buf_ch, buf_gch, attr,
414 (*tdp->nprocs->win_add_menu)(tdp->ndata, window, glyph, identifier, ch,
415 gch, attr, str, preselected);
420 trace_end_menu(vp, window, prompt)
425 struct trace_data *tdp = vp;
428 fprintf(wc_tracelogf, "%send_menu(%d, '%s'(%d))\n", INDENT, window,
429 prompt, (int) strlen(prompt));
431 fprintf(wc_tracelogf, "%send_menu(%d, NULL)\n", INDENT, window);
435 (*tdp->nprocs->win_end_menu)(tdp->ndata, window, prompt);
440 trace_select_menu(vp, window, how, menu_list)
444 menu_item **menu_list;
446 struct trace_data *tdp = vp;
449 fprintf(wc_tracelogf, "%sselect_menu(%d, %d, %p)\n", INDENT, window, how,
453 rv = (*tdp->nprocs->win_select_menu)(tdp->ndata, window, how,
457 fprintf(wc_tracelogf, "%s=> %d\n", INDENT, rv);
462 trace_message_menu(vp, let, how, mesg)
468 struct trace_data *tdp = vp;
473 sprintf(buf_let, "'%c'(%d)", let, let);
475 sprintf(buf_let, "(%d)", let);
479 fprintf(wc_tracelogf, "%smessage_menu(%s, %d, '%s'(%d))\n", INDENT,
480 buf_let, how, mesg, (int) strlen(mesg));
482 fprintf(wc_tracelogf, "%smessage_menu(%s, %d, NULL)\n", INDENT,
487 rv = (*tdp->nprocs->win_message_menu)(tdp->ndata, let, how, mesg);
491 sprintf(buf_let, "'%c'(%d)", rv, rv);
493 sprintf(buf_let, "(%d)", rv);
495 fprintf(wc_tracelogf, "%s=> %s\n", INDENT, buf_let);
501 trace_update_inventory(vp)
504 struct trace_data *tdp = vp;
506 fprintf(wc_tracelogf, "%supdate_inventory()\n", INDENT);
509 (*tdp->nprocs->win_update_inventory)(tdp->ndata);
517 struct trace_data *tdp = vp;
519 fprintf(wc_tracelogf, "%smark_synch()\n", INDENT);
522 (*tdp->nprocs->win_mark_synch)(tdp->ndata);
530 struct trace_data *tdp = vp;
532 fprintf(wc_tracelogf, "%swait_synch()\n", INDENT);
535 (*tdp->nprocs->win_wait_synch)(tdp->ndata);
541 trace_cliparound(vp, x, y)
546 struct trace_data *tdp = vp;
548 fprintf(wc_tracelogf, "%scliparound(%d, %d)\n", INDENT, x, y);
551 (*tdp->nprocs->win_cliparound)(tdp->ndata, x, y);
558 trace_update_positionbar(vp, posbar)
562 struct trace_data *tdp = vp;
565 fprintf(wc_tracelogf, "%supdate_positionbar('%s'(%d))\n", INDENT,
566 posbar, (int) strlen(posbar));
568 fprintf(wc_tracelogf, "%supdate_positionbar(NULL)\n", INDENT);
571 (*tdp->nprocs->win_update_positionbar)(tdp->ndata, posbar);
576 /* XXX can we decode the glyph in a meaningful way? see mapglyph()?
579 trace_print_glyph(vp, window, x, y, glyph, bkglyph)
585 struct trace_data *tdp = vp;
587 fprintf(wc_tracelogf, "%sprint_glyph(%d, %d, %d, %d, %d)\n", INDENT, window,
588 x, y, glyph, bkglyph);
591 (*tdp->nprocs->win_print_glyph)(tdp->ndata, window, x, y, glyph, bkglyph);
596 trace_raw_print(vp, str)
600 struct trace_data *tdp = vp;
603 fprintf(wc_tracelogf, "%sraw_print('%s'(%d))\n", INDENT, str,
606 fprintf(wc_tracelogf, "%sraw_print(NULL)\n", INDENT);
610 (*tdp->nprocs->win_raw_print)(tdp->ndata, str);
615 trace_raw_print_bold(vp, str)
619 struct trace_data *tdp = vp;
622 fprintf(wc_tracelogf, "%sraw_print_bold('%s'(%d))\n", INDENT, str,
625 fprintf(wc_tracelogf, "%sraw_print_bold(NULL)\n", INDENT);
629 (*tdp->nprocs->win_raw_print_bold)(tdp->ndata, str);
637 struct trace_data *tdp = vp;
641 fprintf(wc_tracelogf, "%snhgetch()\n", INDENT);
644 rv = (*tdp->nprocs->win_nhgetch)(tdp->ndata);
647 if (rv > 0 && rv < 256 && isprint(rv)) {
648 sprintf(buf, "'%c'(%d)", rv, rv);
650 sprintf(buf, "(%d)", rv);
652 fprintf(wc_tracelogf, "%s=> %s\n", INDENT, buf);
658 trace_nh_poskey(vp, x, y, mod)
664 struct trace_data *tdp = vp;
668 fprintf(wc_tracelogf, "%snh_poskey(%d, %d, %d)\n", INDENT, *x, *y, *mod);
671 rv = (*tdp->nprocs->win_nh_poskey)(tdp->ndata, x, y, mod);
673 if (rv > 0 && rv < 256 && isprint(rv)) {
674 sprintf(buf, "'%c'(%d)", rv, rv);
676 sprintf(buf, "(%d)", rv);
678 fprintf(wc_tracelogf, "%s=> %s (%d, %d, %d)\n", INDENT, buf, *x, *y,
688 struct trace_data *tdp = vp;
690 fprintf(wc_tracelogf, "%snhbell()\n", INDENT);
693 (*tdp->nprocs->win_nhbell)(tdp->ndata);
698 trace_doprev_message(vp)
701 struct trace_data *tdp = vp;
704 fprintf(wc_tracelogf, "%sdoprev_message()\n", INDENT);
707 rv = (*tdp->nprocs->win_doprev_message)(tdp->ndata);
710 fprintf(wc_tracelogf, "%s=> %d\n", INDENT, rv);
716 trace_yn_function(vp, query, resp, def)
718 const char *query, *resp;
721 struct trace_data *tdp = vp;
726 fprintf(wc_tracelogf, "%syn_function('%s'(%d), ", INDENT, query,
727 (int) strlen(query));
729 fprintf(wc_tracelogf, "%syn_function(NULL, ", INDENT);
733 fprintf(wc_tracelogf, "'%s'(%d), ", resp, (int) strlen(resp));
735 fprintf(wc_tracelogf, "NULL, ");
739 sprintf(buf, "'%c'(%d)", def, def);
741 sprintf(buf, "(%d)", def);
744 fprintf(wc_tracelogf, "%s)\n", buf);
747 rv = (*tdp->nprocs->win_yn_function)(tdp->ndata, query, resp, def);
751 sprintf(buf, "'%c'(%d)", rv, rv);
753 sprintf(buf, "(%d)", rv);
756 fprintf(wc_tracelogf, "%s=> %s\n", INDENT, buf);
762 trace_getlin(vp, query, bufp)
767 struct trace_data *tdp = vp;
770 fprintf(wc_tracelogf, "%sgetlin('%s'(%d), ", INDENT, query,
771 (int) strlen(query));
773 fprintf(wc_tracelogf, "%sgetlin(NULL, ", INDENT);
777 fprintf(wc_tracelogf, "%s)\n", fmt_ptr((genericptr_t) bufp));
779 fprintf(wc_tracelogf, "NULL)\n");
783 (*tdp->nprocs->win_getlin)(tdp->ndata, query, bufp);
788 trace_get_ext_cmd(vp)
791 struct trace_data *tdp = vp;
795 /* this is ugly, but the size isn't exposed */
796 const struct ext_func_tab *efp;
797 for (efp = extcmdlist; efp->ef_txt; efp++)
800 fprintf(wc_tracelogf, "%sget_ext_cmd()\n", INDENT);
803 rv = (*tdp->nprocs->win_get_ext_cmd)(tdp->ndata);
806 if (rv < 0 || rv >= ecl_size) {
807 fprintf(wc_tracelogf, "%s=> (%d)\n", INDENT, rv);
809 fprintf(wc_tracelogf, "%s=> %d/%s\n", INDENT, rv,
810 extcmdlist[rv].ef_txt);
817 trace_number_pad(vp, state)
821 struct trace_data *tdp = vp;
823 fprintf(wc_tracelogf, "%snumber_pad(%d)\n", INDENT, state);
826 (*tdp->nprocs->win_number_pad)(tdp->ndata, state);
831 trace_delay_output(vp)
834 struct trace_data *tdp = vp;
836 fprintf(wc_tracelogf, "%sdelay_output()\n", INDENT);
839 (*tdp->nprocs->win_delay_output)(tdp->ndata);
845 trace_change_color(vp, color, value, reverse)
851 struct trace_data *tdp = vp;
853 fprintf(wc_tracelogf, "%schange_color(%d, $%lx, %d)\n", INDENT, color,
857 (*tdp->nprocs->win_change_color)(tdp->ndata, color, value, reverse);
863 trace_change_background(vp, bw)
867 struct trace_data *tdp = vp;
869 fprintf(wc_tracelogf, "%schange_background(%d)\n", INDENT, bw);
872 (*tdp->nprocs->win_change_background)(tdp->ndata, bw);
877 trace_set_font_name(vp, window, font)
882 struct trace_data *tdp = vp;
886 fprintf(wc_tracelogf, "%sset_font_name(%d, '%s'(%d))\n", INDENT,
887 window, font, (int) (strlen(font)));
889 fprintf(wc_tracelogf, "%sset_font_name(%d, NULL)\n", INDENT, window);
893 rv = (*tdp->nprocs->win_set_font_name)(tdp->ndata, window, font);
896 fprintf(wc_tracelogf, "%s=> %d\n", INDENT, rv);
903 trace_get_color_string(vp)
906 struct trace_data *tdp = vp;
909 fprintf(wc_tracelogf, "%sget_color_string()\n", INDENT);
912 rv = (*tdp->nprocs->win_get_color_string)(tdp->ndata);
916 fprintf(wc_tracelogf, "%s=> '%s'(%d)\n", INDENT, rv,
919 fprintf(wc_tracelogf, "%s=> NULL\n", INDENT);
927 /* other defs that really should go away (they're tty specific) */
929 trace_start_screen(vp)
932 struct trace_data *tdp = vp;
934 fprintf(wc_tracelogf, "%sstart_screen()\n", INDENT);
937 (*tdp->nprocs->win_start_screen)(tdp->ndata);
945 struct trace_data *tdp = vp;
947 fprintf(wc_tracelogf, "%send_screen()\n", INDENT);
950 (*tdp->nprocs->win_end_screen)(tdp->ndata);
955 trace_outrip(vp, tmpwin, how, when)
961 struct trace_data *tdp = vp;
963 fprintf(wc_tracelogf, "%soutrip(%d, %d, %ld)\n", INDENT, (int) tmpwin,
967 (*tdp->nprocs->win_outrip)(tdp->ndata, tmpwin, how, when);
972 trace_preference_update(vp, pref)
976 struct trace_data *tdp = vp;
979 fprintf(wc_tracelogf, "%spreference_update('%s'(%d))\n", INDENT, pref,
982 fprintf(wc_tracelogf, "%spreference_update(NULL)\n", INDENT);
986 (*tdp->nprocs->win_preference_update)(tdp->ndata, pref);
991 trace_getmsghistory(vp, init)
995 struct trace_data *tdp = vp;
998 fprintf(wc_tracelogf, "%sgetmsghistory(%d)\n", INDENT, init);
1001 rv = (*tdp->nprocs->win_getmsghistory)(tdp->ndata, init);
1005 fprintf(wc_tracelogf, "%s=> '%s'(%d)\n", INDENT, rv,
1008 fprintf(wc_tracelogf, "%s=> NULL\n", INDENT);
1015 trace_putmsghistory(vp, msg, is_restoring)
1018 boolean is_restoring;
1020 struct trace_data *tdp = vp;
1023 fprintf(wc_tracelogf, "%sputmsghistory('%s'(%d), %d)\n", INDENT, msg,
1024 (int) strlen(msg), is_restoring);
1026 fprintf(wc_tracelogf, "%sputmghistory(NULL, %d)\n", INDENT,
1031 (*tdp->nprocs->win_putmsghistory)(tdp->ndata, msg, is_restoring);
1036 trace_status_init(vp)
1039 struct trace_data *tdp = vp;
1041 fprintf(wc_tracelogf, "%sstatus_init()\n", INDENT);
1044 (*tdp->nprocs->win_status_init)(tdp->ndata);
1049 trace_status_finish(vp)
1052 struct trace_data *tdp = vp;
1054 fprintf(wc_tracelogf, "%sstatus_finish()\n", INDENT);
1057 (*tdp->nprocs->win_status_finish)(tdp->ndata);
1062 trace_status_enablefield(vp, fieldidx, nm, fmt, enable)
1069 struct trace_data *tdp = vp;
1071 fprintf(wc_tracelogf, "%sstatus_enablefield(%d, ", INDENT, fieldidx);
1073 fprintf(wc_tracelogf, "'%s'(%d), ", nm, (int) strlen(nm));
1075 fprintf(wc_tracelogf, "NULL, ");
1078 fprintf(wc_tracelogf, "'%s'(%d), ", fmt, (int) strlen(fmt));
1080 fprintf(wc_tracelogf, "NULL, ");
1082 fprintf(wc_tracelogf, "%d)\n", enable);
1085 (*tdp->nprocs->win_status_enablefield)(tdp->ndata, fieldidx, nm, fmt,
1091 trace_status_update(vp, idx, ptr, chg, percent, color, colormasks)
1093 int idx, chg, percent, color;
1095 unsigned long *colormasks;
1097 struct trace_data *tdp = vp;
1099 fprintf(wc_tracelogf, "%sstatus_update(%d, %p, %d, %d)\n", INDENT, idx,
1103 (*tdp->nprocs->win_status_update)(tdp->ndata, idx, ptr, chg, percent,
1109 trace_can_suspend(vp)
1112 struct trace_data *tdp = vp;
1115 fprintf(wc_tracelogf, "%scan_suspend()\n", INDENT);
1118 rv = (*tdp->nprocs->win_can_suspend)(tdp->ndata);
1121 fprintf(wc_tracelogf, "%s=> %d\n", INDENT, rv);
1126 struct chain_procs trace_procs = {
1127 "+trace", 0, /* wincap */
1130 XXX problem - the above need to come from the real window port, possibly
1131 modified. May need to do something to call an additional init fn later
1132 or if this is the only place like this the choose_windows fn can do the
1134 (but not if the value can be modified by the stack?) TBD
1136 trace_init_nhwindows,
1137 trace_player_selection, trace_askname, trace_get_nh_event,
1138 trace_exit_nhwindows, trace_suspend_nhwindows, trace_resume_nhwindows,
1139 trace_create_nhwindow, trace_clear_nhwindow, trace_display_nhwindow,
1140 trace_destroy_nhwindow, trace_curs, trace_putstr, trace_putmixed,
1141 trace_display_file, trace_start_menu, trace_add_menu, trace_end_menu,
1142 trace_select_menu, trace_message_menu, trace_update_inventory,
1143 trace_mark_synch, trace_wait_synch,
1148 trace_update_positionbar,
1150 trace_print_glyph, trace_raw_print, trace_raw_print_bold, trace_nhgetch,
1151 trace_nh_poskey, trace_nhbell, trace_doprev_message, trace_yn_function,
1152 trace_getlin, trace_get_ext_cmd, trace_number_pad, trace_delay_output,
1156 trace_change_background, trace_set_font_name,
1158 trace_get_color_string,
1161 trace_start_screen, trace_end_screen,
1163 trace_outrip, trace_preference_update, trace_getmsghistory,
1164 trace_putmsghistory,
1165 trace_status_init, trace_status_finish, trace_status_enablefield,
1166 trace_status_update,