xref: /netbsd-src/external/gpl3/gcc.old/dist/libcc1/callbacks.cc (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
1 /* Callback management.
2    Copyright (C) 2014-2020 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
hash_method(const void * a)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
eq_method(const void * a,const void * b)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 
callbacks()52 cc1_plugin::callbacks::callbacks ()
53   : m_registry (htab_create_alloc (10, hash_method, eq_method,
54 				   free, xcalloc, free))
55 {
56 }
57 
~callbacks()58 cc1_plugin::callbacks::~callbacks ()
59 {
60   htab_delete (m_registry);
61 }
62 
63 void
add_callback(const char * name,cc1_plugin::callback_ftype * func)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 *
find_callback(const char * name)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 }
91