1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Keeping a unique copy of strings.
2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2002-2003, 2008-2012 Free Software Foundation, Inc.
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This file is part of Bison, the GNU Compiler Compiler.
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation, either version 3 of the License, or
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef UNIQSTR_H_
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define UNIQSTR_H_
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*-----------------------------------------.
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Pointers to unique copies of C strings.  |
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`-----------------------------------------*/
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef char const *uniqstr;
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Return the uniqstr for STR.  */
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectuniqstr uniqstr_new (char const *str);
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Return a uniqstr built by vsprintf.  In order to simply concatenate
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   strings, use UNIQSTR_CONCAT, which is a convenient wrapper around
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   this function.  */
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wanguniqstr uniqstr_vsprintf (char const *format, ...)
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  __attribute__ ((__format__ (__printf__, 1, 2)));
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Two uniqstr values have the same value iff they are the same.  */
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define UNIQSTR_EQ(USTR1, USTR2) (!!((USTR1) == (USTR2)))
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Compare two uniqstr a la strcmp: negative for <, nul for =, and
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   positive for >.  Undefined order, relies on addresses.  */
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define UNIQSTR_CMP(USTR1, USTR2) ((USTR1) - (USTR2))
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/*--------------------------------------.
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project| Initializing, destroying, debugging.  |
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project`--------------------------------------*/
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Create the string table.  */
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid uniqstrs_new (void);
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Die if STR is not a uniqstr.  */
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid uniqstr_assert (char const *str);
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Free all the memory allocated for symbols.  */
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid uniqstrs_free (void);
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Report them all.  */
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid uniqstrs_print (void);
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/*----------------.
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang| Concatenation.  |
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang`----------------*/
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Concatenate at most 20 strings and return a uniqstr.  The goal of
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   this macro is to make the caller's code a little more succinct
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   without a trivial uniqstr_vsprintf format string to maintain
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (for example, "%s%s%s") while still benefitting from gcc's type
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   checking.  Unfortunately, because of the missing format string in the
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   macro invocation, the argument number reported by gcc for a bad
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   argument type is 1 too large.  */
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define UNIQSTR_CONCAT(...)                                            \
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  uniqstr_vsprintf (UNIQSTR_GEN_FORMAT (__VA_ARGS__,                   \
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        "%s", "%s", "%s", "%s", "%s",  \
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        "%s", "%s", "%s", "%s", "%s",  \
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        "%s", "%s", "%s", "%s", "%s",  \
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                                        "%s", "%s", "%s", "%s", "%s"), \
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                    __VA_ARGS__)
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define UNIQSTR_GEN_FORMAT(F1,  F2,  F3,  F4,  F5,  \
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           F6,  F7,  F8,  F9,  F10, \
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           F11, F12, F13, F14, F15, \
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           F16, F17, F18, F19, F20, \
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                           ...)                     \
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  UNIQSTR_GEN_FORMAT_ (__VA_ARGS__,                 \
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       "", "", "", "", "",          \
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       "", "", "", "", "",          \
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       "", "", "", "", "",          \
8905436638acc7c010349a69c3395f1a57c642dc62Ying Wang                       "", "", "", "", "")
9005436638acc7c010349a69c3395f1a57c642dc62Ying Wang
9105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define UNIQSTR_GEN_FORMAT_(F1,  F2,  F3,  F4,  F5,       \
9205436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            F6,  F7,  F8,  F9,  F10,      \
9305436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            F11, F12, F13, F14, F15,      \
9405436638acc7c010349a69c3395f1a57c642dc62Ying Wang                            F16, F17, F18, F19, F20, ...) \
9505436638acc7c010349a69c3395f1a57c642dc62Ying Wang  F1  F2  F3  F4  F5  F6  F7  F8  F9  F10                 \
9605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  F11 F12 F13 F14 F15 F16 F17 F18 F19 F20
9705436638acc7c010349a69c3395f1a57c642dc62Ying Wang
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* ! defined UNIQSTR_H_ */
99