505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * CDDL HEADER START
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * The contents of this file are subject to the terms of the
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Common Development and Distribution License, Version 1.0 only
505d05c73a6e56769f263d4803b22eddd168ee24gtb * (the "License"). You may not use this file except in compliance
505d05c73a6e56769f263d4803b22eddd168ee24gtb * with the License.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
505d05c73a6e56769f263d4803b22eddd168ee24gtb * or http://www.opensolaris.org/os/licensing.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * See the License for the specific language governing permissions
505d05c73a6e56769f263d4803b22eddd168ee24gtb * and limitations under the License.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * When distributing Covered Code, include this CDDL HEADER in each
505d05c73a6e56769f263d4803b22eddd168ee24gtb * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * If applicable, add the following below this CDDL HEADER, with the
505d05c73a6e56769f263d4803b22eddd168ee24gtb * fields enclosed by brackets "[]" replaced with your own identifying
505d05c73a6e56769f263d4803b22eddd168ee24gtb * information: Portions Copyright [yyyy] [name of copyright owner]
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * CDDL HEADER END
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * Use is subject to license terms.
505d05c73a6e56769f263d4803b22eddd168ee24gtb */
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb#ifndef _PARSEPROTO_H
505d05c73a6e56769f263d4803b22eddd168ee24gtb#define _PARSEPROTO_H
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb#pragma ident "%Z%%M% %I% %E% SMI"
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb#ifdef __cplusplus
505d05c73a6e56769f263d4803b22eddd168ee24gtbextern "C" {
505d05c73a6e56769f263d4803b22eddd168ee24gtb#endif
505d05c73a6e56769f263d4803b22eddd168ee24gtb
505d05c73a6e56769f263d4803b22eddd168ee24gtb/*
505d05c73a6e56769f263d4803b22eddd168ee24gtb * DECL - parse C type declarations.
505d05c73a6e56769f263d4803b22eddd168ee24gtb *
505d05c73a6e56769f263d4803b22eddd168ee24gtb * 1) Does not understand struct, union or enum definitions.
505d05c73a6e56769f263d4803b22eddd168ee24gtb * 2) Does not understand auto, static, extern or typedef storage class
505d05c73a6e56769f263d4803b22eddd168ee24gtb * specifiers.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * 3) Does not support initialization.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * 4) Does not support type definition.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * 5) Only understands array dimension specified as constant decimal
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * integer or identifier.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * Supported Operations
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_Parse convert string to a decl_t.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_Destroy Free space associated with a (previously returned)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_t. The function follows the argument list.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_SetName set identifier.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_GetName return identifier.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_ToString convert a (previously returned) decl_t into a
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * printable representation.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_GetArgLength return length of argument list.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_GetNext return the next decl_t associated with the given
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_t.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_GetDeclSpec return the declaration specifier.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_GetDSName return identifier associated with a
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * declaration specifier.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_GetType return the type_t associated with a decl_t.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_IsVarargs return true if the given decl_t is a varargs function.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_IsFunction return true if the given decl_t is a function.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_GetNext return the next type_t associated with a given type_t.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_IsArray return true if the given type_t is an array.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_GetArraySize return size of array.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_IsPtrTo return true if the given type_t is a pointer to ... .
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_GetPtrToTypeQual return type qualifiers for a pointer to ... .
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_IsFunction return true if the given type_t is a function.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_GetArgLength return length of argument list.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_IsVarargs return true if function signature includes ... .
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_GetArg return the decl_t associated with a given type_t.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type_IsPtrFun return true if the given type_t is a pointer* to a
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * function.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/* Include Files */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#include <stdio.h>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#include <ctype.h>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#include <string.h>
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/* Macros and Constants */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#define loop for (;;)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#define STT_isvoid(s) ((s) & (TS_VOID))
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#define STT_isfloat(s) ((s) & (TS_FLOAT | TS_DOUBLE))
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#define STT_ischar(s) ((s) & (TS_CHAR))
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#define STT_isint(s) ((s) & \
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan (TS_SHORT | TS_INT | TS_LONG | TS_LONGLONG | TS_CHAR))
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#define STT_isarith(s) (STT_isfloat(s) || STT_isint(s))
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#define STT_isbasic(s) (STT_isarith(s) || STT_isvoid(s))
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#define STT_isderived(s) ((s) & (TS_STRUCT | TS_UNION | TS_ENUM | TS_TYPEDEF))
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#define STT_has_explicit_sign(s) ((s) & (TS_SIGNED | TS_UNSIGNED))
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/* Data Declarations */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * The overall type encoding is thus:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * decl_t encodes a declaration which consists of:
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * identifier
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * declaration specifier (storage class specifier, type specifier,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type qualifier)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type modifiers (array, function, pointer to)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * ancillary (varargs?, argument list)
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * The argument list is an ordered, NULL terminated, linked list.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * An empty argument list (== NULL) indicates an unknown argument
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * list, i.e. "()".
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * declaration specifiers are encoded as bits in an enum (stt_t).
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * type modifiers are encoded as a linked list of variant records,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * i.e. "array of ..."
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * "function returning ..." and "pointer to ...".
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * An empty list of type modifiers (== NULL) indicates a "plain" type.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * OK, here goes some ASCII art...
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * base object
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * V
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * ---------- ---------- ---------- ----------
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * | | | | | | | |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * | decl_t | --> | type_t | --> | type_t | ... | type_t | --> NULL
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * | | | | |(DD_FUN)| | |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * ---------- ---------- ---------- ----------
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * | |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * | |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * V V
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * A ---------- ----------
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * NULL r | | | |
505d05c73a6e56769f263d4803b22eddd168ee24gtb * g | decl_t | --> | type_t | ... --> NULL
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * u | | | |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * m ---------- ----------
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * e |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * n |
505d05c73a6e56769f263d4803b22eddd168ee24gtb * t V
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * ----------
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * L | |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * i | decl_t | ... --> NULL
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * s | |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * t ----------
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * ...
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * |
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * V
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan *
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * NULL
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/*
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * The encoding of a declaration specifier is done primarily with an
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * stt_t type.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan * This type must support bit-wise operations.
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalantypedef enum {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan SCS_MASK = 0x000000ff, /* storage class specifiers */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan SCS_NONE = 0x00000000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan SCS_REGISTER = 0x00000001,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan SCS_TYPEDEF = 0x00000002,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan SCS_EXTERN = 0x00000004,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan SCS_AUTO = 0x00000008,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan SCS_STATIC = 0x00000010,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_MASK = 0x00ffff00, /* type specifiers */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_NO_TS = 0x00000000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_CHAR = 0x00000100,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_SHORT = 0x00000200,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_INT = 0x00000400,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_LONG = 0x00000800,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_SIGNED = 0x00001000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_UNSIGNED = 0x00002000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_ENUM = 0x00004000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_FLOAT = 0x00010000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_DOUBLE = 0x00020000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_STRUCT = 0x00040000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_UNION = 0x00080000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_TYPEDEF = 0x00100000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_VOID = 0x00200000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TS_LONGLONG = 0x00400000, /* non-ANSI type: long long */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TQ_MASK = 0x0f000000, /* type qualifiers */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TQ_NONE = 0x00000000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TQ_CONST = 0x01000000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TQ_VOLATILE = 0x02000000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TQ_RESTRICT = 0x04000000,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan TQ_RESTRICT_KYWD = 0x08000000
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan} stt_t;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalantypedef enum { /* declarator options */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan DD_NONE = 0,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan DD_ARY = 1, /* array of [size] ... */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan DD_FUN = 2, /* function [taking and] returning ... */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan DD_PTR = 3 /* [tq] pointer to ... */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan} decl_type_t;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalantypedef enum {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan DTS_DECL = 0,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan DTS_CAST = 1,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan DTS_RET = 3
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan} decl_dts_t;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalantypedef struct {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan stt_t ds_stt; /* scs|ts|tq */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char *ds_id; /* id for struct|union|enum|typedef */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan} decl_spec_t;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalantypedef struct _declarator decl_t;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalantypedef struct _type {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan struct _type *t_next; /* next type_t or NULL */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan decl_type_t t_dt; /* oneof DD_* */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /* DD_FUN */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan int t_nargs; /* number of arguments */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan int t_ellipsis; /* a varargs? */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan decl_t *t_args; /* list of arguments */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /* DD_PTR */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan stt_t t_stt; /* type qualifier, TQ_* */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan /* DD_ARY */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char *t_sizestr; /* size as a string */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan} type_t;
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanstruct _declarator {
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan char *d_name; /* name of declarator */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan decl_spec_t *d_ds; /* ts|scs|tq */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan type_t *d_type; /* list of attributes or NULL */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan int d_ellipsis; /* a varargs? */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan decl_t *d_next; /* next link in chain (arglist) */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan};
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan/* External Declarations */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern char *declspec_ToString(char *, decl_spec_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern void decl_Destroy(decl_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern int decl_GetArgLength(decl_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern decl_t *decl_SetName(decl_t *, char *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern char *decl_GetName(decl_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern type_t *decl_GetType(decl_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern int decl_IsVarargs(decl_t *dp);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern char *decl_ToString(char *, decl_dts_t, decl_t *,
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan const char *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern const char *decl_Parse(char *, decl_t **);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern void decl_GetTraceInfo(decl_t *, char *, char *, decl_t **);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern char *decl_ToFormal(decl_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern int type_IsArray(type_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern int type_IsPtrTo(type_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern int type_IsFunction(type_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern int type_IsVarargs(type_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern int type_IsPtrFun(type_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalanextern decl_t *decl_AddArgNames(decl_t *);
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#ifdef __cplusplus
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan}
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#endif
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan#endif /* _PARSEPROTO_H */
159d09a20817016f09b3ea28d1bdada4a336bb91Mark Phalan