Integrate adding files with the file manager
[anjuta-git-plugin.git] / plugins / valgrind / vgtoolview.c
blobf57400ed7c22824ae04d6906ef89698b89acb000
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3 * Authors: Jeffrey Stedfast <fejj@ximian.com>
5 * Copyright 2003 Ximian, Inc. (www.ximian.com)
6 * Copyright (C) Massimo Cora' 2005 <maxcvs@gmail.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25 #ifdef HAVE_CONFIG_H
26 #include <config.h>
27 #endif
29 #include <stdarg.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <sys/stat.h>
33 #include <unistd.h>
34 #include <errno.h>
36 #include "vgtoolview.h"
39 static void vg_tool_view_class_init (VgToolViewClass *klass);
40 static void vg_tool_view_init (VgToolView *view);
41 static void vg_tool_view_destroy (GtkObject *obj);
42 static void vg_tool_view_finalize (GObject *obj);
44 static void tool_view_clear (VgToolView *view);
45 static void tool_view_reset (VgToolView *view);
46 static void tool_view_connect (VgToolView *view, int sockfd);
47 static int tool_view_step (VgToolView *view);
48 static void tool_view_disconnect (VgToolView *view);
49 static int tool_view_save_log (VgToolView *view, gchar* uri);
50 static int tool_view_load_log (VgToolView *view, VgActions *actions, gchar* uri);
51 static void tool_view_cut (VgToolView *view);
52 static void tool_view_copy (VgToolView *view);
53 static void tool_view_paste (VgToolView *view);
54 static void tool_view_show_rules (VgToolView *view);
57 static GtkVBoxClass *parent_class = NULL;
59 static void
60 destroy_array_and_content (GPtrArray **array)
62 g_return_if_fail (array != NULL);
63 if (*array)
65 g_ptr_array_foreach (*array, (GFunc)g_free, NULL);
66 g_ptr_array_free (*array, TRUE);
67 *array = NULL;
71 static void
72 allocate_array_and_content (GPtrArray **array, va_list va_args)
74 gchar* item;
76 g_return_if_fail (array != NULL);
77 g_return_if_fail (*array == NULL);
79 *array = g_ptr_array_new ();
80 for (item = va_arg (va_args, gchar *); item; item = va_arg (va_args, gchar *))
81 g_ptr_array_add (*array, g_strdup (item));
85 GType
86 vg_tool_view_get_type (void)
88 static GType type = 0;
90 if (!type) {
91 static const GTypeInfo info = {
92 sizeof (VgToolViewClass),
93 NULL, /* base_class_init */
94 NULL, /* base_class_finalize */
95 (GClassInitFunc) vg_tool_view_class_init,
96 NULL, /* class_finalize */
97 NULL, /* class_data */
98 sizeof (VgToolView),
99 0, /* n_preallocs */
100 (GInstanceInitFunc) vg_tool_view_init,
103 type = g_type_register_static (GTK_TYPE_VBOX, "VgToolView", &info, 0);
106 return type;
109 static void
110 vg_tool_view_class_init (VgToolViewClass *klass)
112 GObjectClass *object_class = G_OBJECT_CLASS (klass);
113 GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (klass);
115 parent_class = g_type_class_ref (GTK_TYPE_VBOX);
117 object_class->finalize = vg_tool_view_finalize;
118 gtk_object_class->destroy = vg_tool_view_destroy;
120 /* virtual methods */
121 klass->clear = tool_view_clear;
122 klass->reset = tool_view_reset;
123 klass->connect = tool_view_connect;
124 klass->step = tool_view_step;
125 klass->disconnect = tool_view_disconnect;
126 klass->save_log = tool_view_save_log;
127 klass->load_log = tool_view_load_log;
128 klass->cut = tool_view_cut;
129 klass->copy = tool_view_copy;
130 klass->paste = tool_view_paste;
131 klass->show_rules = tool_view_show_rules;
134 static void
135 vg_tool_view_init (VgToolView *view)
137 view->argv = NULL;
138 view->symtab = NULL;
139 view->srcdir = NULL;
140 view->rules = NULL;
142 view->argv_array = NULL;
143 view->srcdir_array = NULL;
146 static void
147 vg_tool_view_finalize (GObject *obj)
149 G_OBJECT_CLASS (parent_class)->finalize (obj);
152 static void
153 vg_tool_view_destroy (GtkObject *obj)
155 VgToolView *view = VG_TOOL_VIEW (obj);
156 destroy_array_and_content (&view->srcdir_array);
157 destroy_array_and_content (&view->argv_array);
159 GTK_OBJECT_CLASS (parent_class)->destroy (obj);
163 void
164 vg_tool_view_set_argv (VgToolView *view, char *arg0, ...)
166 va_list va_args;
167 g_return_if_fail (VG_IS_TOOL_VIEW (view));
168 destroy_array_and_content (&view->argv_array);
170 va_start (va_args, arg0);
171 allocate_array_and_content (&view->argv_array, va_args);
172 va_end (va_args);
174 view->argv = (const char**)view->argv_array->pdata;
177 void
178 vg_tool_view_set_srcdir (VgToolView *view, char *srcdir0, ...)
180 va_list va_args;
181 g_return_if_fail (VG_IS_TOOL_VIEW (view));
182 destroy_array_and_content (&view->srcdir_array);
184 va_start (va_args, srcdir0);
185 allocate_array_and_content (&view->srcdir_array, va_args);
186 va_end (va_args);
188 view->srcdir = (const char**)view->srcdir_array->pdata;
192 void
193 vg_tool_view_set_symtab (VgToolView *view, SymTab *symtab)
195 g_return_if_fail (VG_IS_TOOL_VIEW (view));
197 view->symtab = symtab;
201 static void
202 tool_view_clear (VgToolView *view)
208 void
209 vg_tool_view_clear (VgToolView *view)
211 g_return_if_fail (VG_IS_TOOL_VIEW (view));
213 VG_TOOL_VIEW_GET_CLASS (view)->clear (view);
217 static void
218 tool_view_reset (VgToolView *view)
224 void
225 vg_tool_view_reset (VgToolView *view)
227 g_return_if_fail (VG_IS_TOOL_VIEW (view));
229 VG_TOOL_VIEW_GET_CLASS (view)->reset (view);
233 static void
234 tool_view_connect (VgToolView *view, int sockfd)
240 void
241 vg_tool_view_connect (VgToolView *view, int sockfd)
243 g_return_if_fail (VG_IS_TOOL_VIEW (view));
245 VG_TOOL_VIEW_GET_CLASS (view)->connect (view, sockfd);
249 static int
250 tool_view_step (VgToolView *view)
252 return -1;
257 vg_tool_view_step (VgToolView *view)
259 g_return_val_if_fail (VG_IS_TOOL_VIEW (view), -1);
261 return VG_TOOL_VIEW_GET_CLASS (view)->step (view);
265 static void
266 tool_view_disconnect (VgToolView *view)
272 void
273 vg_tool_view_disconnect (VgToolView *view)
275 g_return_if_fail (VG_IS_TOOL_VIEW (view));
277 VG_TOOL_VIEW_GET_CLASS (view)->disconnect (view);
281 static int
282 tool_view_save_log (VgToolView *view, gchar* uri)
284 errno = ENOTSUP;
285 return -1;
290 vg_tool_view_save_log (VgToolView *view, gchar *uri)
292 g_return_val_if_fail (VG_IS_TOOL_VIEW (view), -1);
294 return VG_TOOL_VIEW_GET_CLASS (view)->save_log (view, uri);
298 static int
299 tool_view_load_log (VgToolView *view, VgActions *actions, gchar* uri)
301 errno = ENOTSUP;
302 return -1;
307 vg_tool_view_load_log (VgToolView *view, VgActions *actions, gchar *uri)
309 g_return_val_if_fail (VG_IS_TOOL_VIEW (view), -1);
311 return VG_TOOL_VIEW_GET_CLASS (view)->load_log (view, actions, uri);
315 static void
316 tool_view_cut (VgToolView *view)
322 void
323 vg_tool_view_cut (VgToolView *view)
325 g_return_if_fail (VG_IS_TOOL_VIEW (view));
327 VG_TOOL_VIEW_GET_CLASS (view)->cut (view);
331 static void
332 tool_view_copy (VgToolView *view)
338 void
339 vg_tool_view_copy (VgToolView *view)
341 g_return_if_fail (VG_IS_TOOL_VIEW (view));
343 VG_TOOL_VIEW_GET_CLASS (view)->copy (view);
347 static void
348 tool_view_paste (VgToolView *view)
354 void
355 vg_tool_view_paste (VgToolView *view)
357 g_return_if_fail (VG_IS_TOOL_VIEW (view));
359 VG_TOOL_VIEW_GET_CLASS (view)->paste (view);
363 static void
364 tool_view_show_rules (VgToolView *view)
366 if (view->rules == NULL)
367 return;
369 if (GTK_WIDGET_MAPPED (view->rules))
370 gdk_window_raise (view->rules->window);
371 else
372 gtk_widget_show (view->rules);
376 void
377 vg_tool_view_show_rules (VgToolView *view)
379 g_return_if_fail (VG_IS_TOOL_VIEW (view));
381 VG_TOOL_VIEW_GET_CLASS (view)->show_rules (view);
386 static char *
387 path_concat (const char *dirname, int dirlen, const char *basename, int baselen)
389 char *path, *p;
391 p = path = g_malloc (dirlen + baselen + 2);
392 memcpy (path, dirname, dirlen);
393 p += dirlen;
394 *p++ = '/';
395 memcpy (p, basename, baselen);
396 p[baselen] = '\0';
398 return path;
401 static gboolean
402 path_is_rx (const char *path)
404 struct stat st;
406 if (stat (path, &st) != -1 && S_ISREG (st.st_mode)) {
407 if (access (path, R_OK | X_OK) != -1)
408 return TRUE;
411 return FALSE;
415 char *
416 vg_tool_view_scan_path (const char *program)
418 const char *pathenv, *path, *p;
419 char *filename;
420 int len;
422 if (program[0] == '/') {
423 if (path_is_rx (program))
424 return g_strdup (program);
426 return NULL;
429 if (!(pathenv = getenv ("PATH")))
430 return NULL;
432 path = pathenv;
433 len = strlen (program);
434 while ((p = strchr (path, ':'))) {
435 if (p > path) {
436 filename = path_concat (path, (p - path), program, len);
437 if (path_is_rx (filename))
438 return filename;
440 g_free (filename);
443 path = p + 1;
446 if (path[0] != '\0') {
447 filename = g_strdup_printf ("%s/%s", path, program);
448 if (path_is_rx (filename))
449 return filename;
451 g_free (filename);
454 return NULL;