1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Muscle table manager for Bison.
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Foundation, Inc.
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of Bison, the GNU Compiler Compiler.
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Bison is free software; you can redistribute it and/or modify
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation; either version 2, or (at your option)
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   any later version.
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Bison is distributed in the hope that it will be useful,
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   along with Bison; see the file COPYING.  If not, write to
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Boston, MA 02110-1301, USA.  */
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <config.h>
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h"
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <hash.h>
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <quotearg.h>
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "files.h"
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "muscle_tab.h"
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "getargs.h"
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef struct
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  const char *key;
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char *value;
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} muscle_entry;
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* An obstack used to create some entries.  */
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct obstack muscle_obstack;
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Initial capacity of muscles hash table.  */
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define HT_INITIAL_CAPACITY 257
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct hash_table *muscle_table = NULL;
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthash_compare_muscles (void const *x, void const *y)
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_entry const *m1 = x;
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_entry const *m2 = y;
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return strcmp (m1->key, m2->key) == 0;
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic size_t
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecthash_muscle (const void *x, size_t tablesize)
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_entry const *m = x;
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return hash_string (m->key, tablesize);
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------------------------------------.
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Create the MUSCLE_TABLE, and initialize it with default values.  |
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Also set up the MUSCLE_OBSTACK.                                  |
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------------------------------------*/
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmuscle_init (void)
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Initialize the muscle obstack.  */
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_init (&muscle_obstack);
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_table = hash_initialize (HT_INITIAL_CAPACITY, NULL, hash_muscle,
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				  hash_compare_muscles, free);
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Version and input file.  */
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  MUSCLE_INSERT_STRING ("version", VERSION);
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  MUSCLE_INSERT_C_STRING ("file_name", grammar_file);
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------.
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Free all the memory consumed by the muscle machinery only.  |
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------*/
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmuscle_free (void)
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  hash_free (muscle_table);
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_free (&muscle_obstack, NULL);
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------.
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Insert (KEY, VALUE).  If KEY already existed, overwrite the |
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| previous value.                                             |
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------*/
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmuscle_insert (const char *key, char *value)
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_entry probe;
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_entry *entry;
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  probe.key = key;
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  entry = hash_lookup (muscle_table, &probe);
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!entry)
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* First insertion in the hash. */
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      entry = xmalloc (sizeof *entry);
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      entry->key = key;
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      hash_insert (muscle_table, entry);
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  entry->value = value;
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------------.
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Append VALUE to the current value of KEY.  If KEY did not already  |
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| exist, create it.  Use MUSCLE_OBSTACK.  De-allocate the previously |
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| associated value.  Copy VALUE and SEPARATOR.                       |
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------------*/
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmuscle_grow (const char *key, const char *val, const char *separator)
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_entry probe;
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_entry *entry = NULL;
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  probe.key = key;
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  entry = hash_lookup (muscle_table, &probe);
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!entry)
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* First insertion in the hash. */
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      entry = xmalloc (sizeof *entry);
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      entry->key = key;
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      hash_insert (muscle_table, entry);
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      entry->value = xstrdup (val);
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Grow the current value. */
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      char *new_val;
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      obstack_sgrow (&muscle_obstack, entry->value);
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      free (entry->value);
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      obstack_sgrow (&muscle_obstack, separator);
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      obstack_sgrow (&muscle_obstack, val);
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      obstack_1grow (&muscle_obstack, 0);
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      new_val = obstack_finish (&muscle_obstack);
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      entry->value = xstrdup (new_val);
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      obstack_free (&muscle_obstack, new_val);
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------------------------.
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Append VALUE to the current value of KEY, using muscle_grow.  But |
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| in addition, issue a synchronization line for the location LOC.   |
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------------------------*/
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmuscle_code_grow (const char *key, const char *val, location loc)
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char *extension = NULL;
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_fgrow1 (&muscle_obstack, "]b4_syncline(%d, [[", loc.start.line);
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  MUSCLE_OBSTACK_SGROW (&muscle_obstack,
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			quotearg_style (c_quoting_style, loc.start.file));
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_sgrow (&muscle_obstack, "]])[\n");
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_sgrow (&muscle_obstack, val);
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_1grow (&muscle_obstack, 0);
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  extension = obstack_finish (&muscle_obstack);
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_grow (key, extension, "");
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------------------------------------------.
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| MUSCLE is an M4 list of pairs.  Create or extend it with the pair  |
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| (A1, A2).  Note that because the muscle values are output *double* |
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| quoted, one needs to strip the first level of quotes to reach the  |
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| list itself.                                                       |
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------------------------------------------*/
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid muscle_pair_list_grow (const char *muscle,
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project			    const char *a1, const char *a2)
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  char *pair;
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_fgrow2 (&muscle_obstack, "[[[%s]], [[%s]]]", a1, a2);
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_1grow (&muscle_obstack, 0);
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  pair = obstack_finish (&muscle_obstack);
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_grow (muscle, pair, ",\n");
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  obstack_free (&muscle_obstack, pair);
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-------------------------------.
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Find the value of muscle KEY.  |
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-------------------------------*/
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar *
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmuscle_find (const char *key)
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_entry probe;
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  muscle_entry *result = NULL;
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  probe.key = key;
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  result = hash_lookup (muscle_table, &probe);
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return result ? result->value : NULL;
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*------------------------------------------------.
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the definition of ENTRY as a m4_define.  |
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`------------------------------------------------*/
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline bool
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmuscle_m4_output (muscle_entry *entry, FILE *out)
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (out, "m4_define([b4_%s],\n", entry->key);
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (out, "[[%s]])\n\n\n", entry->value);
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return true;
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic bool
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmuscle_m4_output_processor (void *entry, void *out)
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return muscle_m4_output (entry, out);
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*----------------------------------------------------------------.
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Output the definition of all the current muscles into a list of |
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| m4_defines.                                                     |
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`----------------------------------------------------------------*/
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectmuscles_m4_output (FILE *out)
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  hash_do_for_each (muscle_table, muscle_m4_output_processor, out);
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
242