fork for IVI
[profile/ivi/vim.git] / src / nbdebug.c
1 /* vi:set ts=8 sts=8 sw=8:
2  *
3  * VIM - Vi IMproved    by Bram Moolenaar
4  *                      Visual Workshop integration by Gordon Prieur
5  *
6  * Do ":help uganda"  in Vim to read copying and usage conditions.
7  * Do ":help credits" in Vim to see a list of people who contributed.
8  * See README.txt for an overview of the Vim source code.
9  */
10
11 /*
12  * NetBeans Debugging Tools. What are these tools and why are they important?
13  * There are two main tools here. The first tool is a tool for delaying or
14  * stopping gvim during startup.  The second tool is a protocol log tool.
15  *
16  * The startup delay tool is called nbdebug_wait(). This is very important for
17  * debugging startup problems because gvim will be started automatically from
18  * netbeans and cannot be run directly from a debugger. The only way to debug
19  * a gvim started by netbeans is by attaching a debugger to it. Without this
20  * tool all starup code will have completed before you can get the pid and
21  * attach.
22  *
23  * The second tool is a log tool.
24  *
25  * This code must have NBDEBUG defined for it to be compiled into vim/gvim.
26  */
27
28 #ifdef NBDEBUG
29
30 #include "vim.h"
31
32 FILE            *nb_debug = NULL;
33 u_int            nb_dlevel = 0;         /* nb_debug verbosity level */
34
35 void             nbdb(char *, ...);
36
37 static int       lookup(char *);
38 #ifdef USE_NB_ERRORHANDLER
39 static int       errorHandler(Display *, XErrorEvent *);
40 #endif
41
42 /*
43  * nbdebug_wait -   This function can be used to delay or stop execution of vim.
44  *                  Its normally used to delay startup while attaching a
45  *                  debugger to a running process. Since workshop starts gvim
46  *                  from a background process this is the only way to debug
47  *                  startup problems.
48  */
49
50 void nbdebug_wait(
51         u_int            wait_flags,    /* tells what to do */
52         char            *wait_var,      /* wait environment variable */
53         u_int            wait_secs)     /* how many seconds to wait */
54 {
55
56         init_homedir();                 /* not inited yet */
57 #ifdef USE_WDDUMP
58         WDDump(0, 0, 0);
59 #endif
60
61         /* for debugging purposes only */
62         if (wait_flags & WT_ENV && wait_var && getenv(wait_var) != NULL) {
63                 sleep(atoi(getenv(wait_var)));
64         } else if (wait_flags & WT_WAIT && lookup("~/.gvimwait")) {
65                 sleep(wait_secs > 0 && wait_secs < 120 ? wait_secs : 20);
66         } else if (wait_flags & WT_STOP && lookup("~/.gvimstop")) {
67                 int w = 1;
68                 while (w) {
69                         ;
70                 }
71         }
72 }    /* end nbdebug_wait */
73
74
75 void
76 nbdebug_log_init(
77         char            *log_var,       /* env var with log file */
78         char            *level_var)     /* env var with nb_debug level */
79 {
80         char            *file;          /* possible nb_debug output file */
81         char            *cp;            /* nb_dlevel pointer */
82
83         if (log_var && (file = getenv(log_var)) != NULL) {
84                 time_t now;
85
86                 nb_debug = fopen(file, "a");
87                 time(&now);
88                 fprintf(nb_debug, "%s", asctime(localtime(&now)));
89                 if (level_var && (cp = getenv(level_var)) != NULL) {
90                         nb_dlevel = strtoul(cp, NULL, 0);
91                 } else {
92                         nb_dlevel = NB_TRACE;   /* default level */
93                 }
94 #ifdef USE_NB_ERRORHANDLER
95                 XSetErrorHandler(errorHandler);
96 #endif
97         }
98
99 }    /* end nbdebug_log_init */
100
101
102 void
103 nbdbg(
104         char            *fmt,
105         ...)
106 {
107         va_list          ap;
108
109         if (nb_debug != NULL && nb_dlevel & NB_TRACE) {
110                 va_start(ap, fmt);
111                 vfprintf(nb_debug, fmt, ap);
112                 va_end(ap);
113                 fflush(nb_debug);
114         }
115
116 }    /* end nbdbg */
117
118
119 static int
120 lookup(
121         char            *file)
122 {
123         char             buf[BUFSIZ];
124
125         expand_env((char_u *) file, (char_u *) buf, BUFSIZ);
126         return
127 #ifndef FEAT_GUI_W32
128                 (access(buf, F_OK) == 0);
129 #else
130                 (access(buf, 0) == 0);
131 #endif
132
133 }    /* end lookup */
134
135 #ifdef USE_NB_ERRORHANDLER
136 static int
137 errorHandler(
138         Display         *dpy,
139         XErrorEvent     *err)
140 {
141         char             msg[256];
142         char             buf[256];
143
144         XGetErrorText(dpy, err->error_code, msg, sizeof(msg));
145         nbdbg("\n\nNBDEBUG Vim: X Error of failed request: %s\n", msg);
146
147         sprintf(buf, "%d", err->request_code);
148         XGetErrorDatabaseText(dpy,
149             "XRequest", buf, "Unknown", msg, sizeof(msg));
150         nbdbg("\tMajor opcode of failed request: %d (%s)\n",
151             err->request_code, msg);
152         if (err->request_code > 128) {
153                 nbdbg("\tMinor opcode of failed request: %d\n",
154                     err->minor_code);
155         }
156
157         return 0;
158 }
159 #endif
160
161
162 #endif /* NBDEBUG */