#ifndef LPC_H
#define LPC_H
/* It is usually better to include "lpc_incl.h" instead of including this
   directly */
typedef struct {
    unsigned short ref;
} refed_t;
union u {
    const char *string;
    long number;
    float real;
    refed_t *refed; /* any of the block below */
#ifndef NO_BUFFER_TYPE
    struct buffer_s *buf;
#endif
    struct object_s *ob;
    struct array_s *arr;
    struct mapping_s *map;
    struct funptr_s *fp;
    struct svalue_s *lvalue;
    struct ref_s *ref;
    unsigned char *lvalue_byte;
    void (*error_handler) (void);
};
/*
 * The value stack element.
 * If it is a string, then the way that the string has been allocated
 * differently, which will affect how it should be freed.
 */
typedef struct svalue_s {
    short type;
    short subtype;
    union u u;
} svalue_t;
typedef struct ref_s {
    unsigned short ref;
    struct ref_s *next, *prev;
    struct control_stack_s *csp;
    svalue_t *lvalue;
    svalue_t sv;
} ref_t;
/* values for type field of svalue struct */
#define T_INVALID       0x0
#define T_LVALUE        0x1
#define T_NUMBER        0x2
#define T_STRING        0x4
#define T_REAL          0x80
#define T_ARRAY         0x8
#define T_OBJECT        0x10
#define T_MAPPING       0x20
#define T_FUNCTION      0x40
#ifndef NO_BUFFER_TYPE
#define T_BUFFER        0x100
#endif
#define T_CLASS         0x200
#define T_LVALUE_BYTE   0x400   /* byte-sized lvalue */
#define T_LVALUE_RANGE  0x800
#define T_ERROR_HANDLER 0x1000
#define T_FREED         0x2000
#define T_REF           0x4000
#ifdef NO_BUFFER_TYPE
#define T_REFED (T_ARRAY|T_OBJECT|T_MAPPING|T_FUNCTION|T_CLASS|T_REF)
#else
#define T_REFED (T_ARRAY|T_OBJECT|T_MAPPING|T_FUNCTION|T_BUFFER|T_CLASS|T_REF)
#endif
#define T_ANY (T_REFED|T_STRING|T_NUMBER|T_REAL)
/* values for subtype field of svalue struct */
#define STRING_COUNTED  0x1 /* has a length an ref count */
#define STRING_HASHED   0x2 /* is in the shared string table */
#define STRING_MALLOC   STRING_COUNTED
#define STRING_SHARED   (STRING_COUNTED | STRING_HASHED)
#define STRING_CONSTANT 0
#define T_UNDEFINED     0x4     /* undefinedp() returns true */
#endif