sima/autoconf/
sima/hosts/i386/
sima/mudlib/
sima/mudlib/kernel/
sima/mudlib/obj/
sima/mudlib/sys/
sima/synhash/mips/
/* Copright 1992-1995 Joern Rennecke */

#ifndef LEX_H
#define LEX_H

#include "alloc.h"

#ifndef LEXDEBUG
#define LEXDEBUG YYDEBUG
#endif
#ifndef YYDEBUG
#define YYDEBUG 0
#endif
#define MBUF_SIZE 4096
#define MNAME_SIZE 256

#define I_TYPE_UNKNOWN	0
#define I_TYPE_LIMBO	1
#define I_TYPE_GLOBAL	2 /* function, variable AND efuns/simul_efuns */
#define I_TYPE_PARAM	3
#define I_TYPE_LOCAL	4
#define I_TYPE_RESWORD	5
#define I_TYPE_DEFINE	6
#define I_TYPE_DEFARG	7

/*
 * The expected newline character is '\n' . '\r' '\n' and '\n' \r' is
 * tolerated, but not recommended.
 * Some characters are set aside to encode tokens from macro expansion.
 * Their codes are selected so that they are in a range with '\0',
 * which marks the end of the mmapped file, and '\n' . In ASCII, which is the
 * expected character set, the only legal character that gets 'trapped' is
 * '\t'. In EBCDIC it should be pretty much the same unless you want to
 * turn on the card puncher while compiling LPC :-)
 */

/* LC is short for 'Lexical scanner Code */
#define LC_EOF          '\0'
#define LC_DEFARG       '\1' /* ASCII SOH */
#define LC_IDENT        '\2' /* ASCII STX */
#define LC_STRING       '\3'
#define LC_POP          '\4' /* ASCII EOT */
#define LC_MAX_SPECIAL  LC_POP
#define LC_NL           '\n'
#define LC_MAX          LC_NL

struct expand_stack {
    /* argument text goes here */
    /* argument pointers go here */
    struct expand_stack *pop;
    char *ret;
    char **arg;
};

struct defn {
    union {
	char *str;
	char *(*fun)(char *, char **, struct expand_stack *);
	struct token *tokens; /* negative indexing */
    } exps;
    short nargs;
    char permanent;
    char special;
};

struct s_reswords {
    char *name;
    int code;
    int32 value;
};

struct ident {
    char *name;
    p_int namelen;
    short type;
    uint16 hash;
    struct ident *next; /* next in hash chain */
    struct ident *inferior;
    union ident_u /* TRANSPARENT_UNION */ {
        struct ident_global {
            short function, variable, efun, sim_efun;
        } global;
        struct defn define;
	int defarg;
	struct {
	    int code;
	    uint32 value;
	} terminal;
	int param;
        struct { int16 offset; uint8 vtype; uint16 line; } local;
    } u;
    struct ident *next_all;
};

#define NEW_IDENT(id, id_type, init) \
    ((id)->type == I_TYPE_UNKNOWN ? \
	((id)->type = (id_type), id->u = (init), (id)) : \
	((id)->type != (id_type) ? \
	    new_ident((id), (id_type), (init)) : (id)))

struct efun_shadow {
    struct ident *shadow;
    struct efun_shadow *next;
};

struct idhash_ret { char *p; int32 hash; };

struct string_concat {
    char *start;
    struct string_concat *next;
};

extern struct incstate *inctop;
extern int pragma_strong_types;
extern int current_line;
extern svalue all_proto_closures;

extern int yylex();
extern struct ident *make_shared_identifier(char *, mp_int, uint16, int);
extern void free_shared_identifier(struct ident*);
extern void commandline_define(char *);
extern struct idhash_ret idhash(char *p);
extern void lex_open(int, svalue);
void store_include_info(svalue);
void store_include_end(void);
svalue concat_strings(char *str, mp_int length,
        struct string_concat *next);
void lex_close(p_int);
struct ident *new_ident(struct ident *, int, union ident_u);

#endif /* LEX_H */