Merge branch 'vendor/GCC50' - gcc 5.0 snapshot 1 FEB 2015
[dragonfly.git] / contrib / gcc-5.0 / libcc1 / callbacks.cc
1 /* Callback management.
2    Copyright (C) 2014 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include <cc1plugin-config.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include "callbacks.hh"
24 #include "libiberty.h"
25
26 // An entry in the hash table.
27 struct method
28 {
29   const char *name;
30   cc1_plugin::callback_ftype *func;
31 };
32
33 // Hash function for struct method.
34 static hashval_t
35 hash_method (const void *a)
36 {
37   const struct method *m = (const struct method *) a;
38
39   return htab_hash_string (m->name);
40 }
41
42 // Equality function for struct method.
43 static int
44 eq_method (const void *a, const void *b)
45 {
46   const struct method *ma = (const struct method *) a;
47   const struct method *mb = (const struct method *) b;
48
49   return strcmp (ma->name, mb->name) == 0;
50 }
51
52 cc1_plugin::callbacks::callbacks ()
53   : m_registry (htab_create_alloc (10, hash_method, eq_method,
54                                    free, xcalloc, free))
55 {
56 }
57
58 cc1_plugin::callbacks::~callbacks ()
59 {
60   htab_delete (m_registry);
61 }
62
63 void
64 cc1_plugin::callbacks::add_callback (const char *name,
65                                      cc1_plugin::callback_ftype *func)
66 {
67   method m;
68   method **slot;
69
70   m.name = name;
71   m.func = func;
72
73   slot = (method **) htab_find_slot (m_registry, &m, INSERT);
74   *slot = XNEW (method);
75   **slot = m;
76 }
77
78 cc1_plugin::callback_ftype *
79 cc1_plugin::callbacks::find_callback (const char *name)
80 {
81   method m, *found;
82
83   m.name = name;
84
85   found = (method *) htab_find (m_registry, &m);
86   if (found == NULL)
87     return NULL;
88
89   return found->func;
90 }