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