/* * This file is not part of a normal build. It wraps libcurses calls, * adding logging. */ #include #include #include #include #include int __real_cbreak (void); int __wrap_cbreak (void); int __real_endwin (void); int __wrap_endwin (void); WINDOW *__real_initscr (void); WINDOW *__wrap_initscr (void); int __real_mvprintw (int, int, const char *, ...) __attribute__((__format__(__printf__,3,4))); int __wrap_mvprintw (int, int, const char *, ...) __attribute__((__format__(__printf__,3,4))); int __real_noecho (void); int __wrap_noecho (void); int __real_nonl (void); int __wrap_nonl (void); int __real_printw (const char *, ...) __attribute__((__format__(__printf__,1,2))); int __wrap_printw (const char *, ...) __attribute__((__format__(__printf__,1,2))); int __real_waddch (WINDOW *, int); int __wrap_waddch (WINDOW *, int); int __real_waddnstr (WINDOW *, const char *, int); int __wrap_waddnstr (WINDOW *, const char *, int); int __real_wclear (WINDOW *); int __wrap_wclear (WINDOW *); int __real_wclrtobot (WINDOW *); int __wrap_wclrtobot (WINDOW *); int __real_wclrtoeol (WINDOW *); int __wrap_wclrtoeol (WINDOW *); int __real_wgetch (WINDOW *); int __wrap_wgetch (WINDOW *); int __real_wmove (WINDOW *, int, int); int __wrap_wmove (WINDOW *, int, int); int __real_wrefresh (WINDOW *); int __wrap_wrefresh (WINDOW *); int __real_wstandend (WINDOW *); int __wrap_wstandend (WINDOW *); int __real_wstandout (WINDOW *); int __wrap_wstandout (WINDOW *); #define INT_VOID_WRAP(name) \ int __wrap_##name(void) \ { \ logit(#name "()\n"); \ return(__real_##name()); \ } #define INT_WINDOW_WRAP(name) \ int __wrap_##name(WINDOW *w) \ { \ logit(#name "("); \ if (w == stdscr) logit("stdscr"); else logit("%p",(void *)w);\ logit(")\n"); \ return(__real_##name(w)); \ } static FILE *logf; static const char *c_esc(unsigned char c) { static char buf[5]; switch (c) { case 0 ... 31: case 128 ... 255: buf[0] = '\\'; buf[1] = '0' + (c >> 6); buf[2] = '0' + ((c >> 3) & 7); buf[3] = '0' + (c & 7); buf[4] = '\0'; break; case '\'': case '"': case '\\': buf[0] = '\\'; buf[1] = c; buf[2] = '\0'; break; default: buf[0] = c; buf[1] = '\0'; break; } return(&buf[0]); } static void logit(const char *, ...) __attribute__((__format__(__printf__,1,2))); static void logit(const char *fmt, ...) { va_list ap; if (logf == 0) { logf = fopen("curses.log","w"); setlinebuf(logf); } va_start(ap,fmt); vfprintf(logf,fmt,ap); va_end(ap); } INT_VOID_WRAP(cbreak) INT_VOID_WRAP(endwin) WINDOW *__wrap_initscr(void) { logit("initscr()\n"); return(__real_initscr()); } int __wrap_mvprintw(int x, int y, const char *fmt, ...) { va_list ap; FILE *f; char *s; int sl; int rv; static int wf(void *cookie __attribute__((__unused__)), const char *buf, int len) { s = realloc(s,sl+len); bcopy(buf,s+sl,len); sl += len; return(len); } static int cf(void *cookie __attribute__((__unused__))) { int i; logit("mvprintw(%d,%d,\"%%s\",\"",x,y); for (i=0;i