/* Copyright 1989-93 GROUPE BULL -- See license conditions in file COPYRIGHT */
/**************\
*              *
*  KlO  Atom   *
*  DEFINITIONS *
*              *
\**************/

#ifndef INCLUDE_Kl_ATOM_H
#define INCLUDE_Kl_ATOM_H

/* type */

/* all symbols inherits from this structure 
 * in fact all derived atoms can have up to 5 fields (max is KlActive)
 * so that they stay in the same malloc bucket
 */

typedef struct _KlAtom {
    KlKLONE_HEADER;			/* common part (external infos) */
    char *p_name;
    KlO p_list;				/* p-list of properties */	
    KlO c_val;				/* private part (internal infos) */
    Int unbound;			/* flag if makunbounded */
    KlO dummy;
}      *KlAtom;

typedef struct _KlConstant {
    KlKLONE_HEADER;
    char *p_name;
    KlO p_list;				/* p-list of properties */
    KlO c_val;
    Int unbound;			/* flag if makunbounded */
    KlO dummy;
}          *KlConstant;

typedef struct _KlKeyword {
    KlKLONE_HEADER;
    char *p_name;			/* its atoms p_name with : prepended */
    KlO p_list;				/* p-list of properties */
    KlAtom atom;
    KlO k_val;
    Int k_count;
}         *KlKeyword;

typedef struct _KlActive {
    KlKLONE_HEADER;
    char *p_name;			/* same as for atoms */
    KlO p_list;				/* p-list of properties */
    KlO data;				/* private data passed to funcs */
    KlMethod get;			/* (*get) (data) */
    KlMethod set;			/* (*set) (value, data) */
}        *KlActive;

typedef struct _KlKloneActive {
    KlKLONE_HEADER;
    char *p_name;			/* same as for atoms */
    KlO p_list;				/* p-list of properties */
    KlO data;				/* stored Klone data */
    KlO get;				/* (get obj data) */
    KlO set;				/* (set obj value) */
}        *KlKloneActive;

/* acessors can be in the symbol hashtable (if var is a symbol) */
typedef struct _KlAccessor {
    KlKLONE_HEADER;
    char *p_name;			/* same as for atoms "foo.bar" */
    KlO p_list;				/* p-list of properties */
    KlO var;				/* left part: foo (symbol or expr) */
    KlAtom field;			/* right part: bar (symbol) */
    Int fieldnum;			/* caches field order number */
}        *KlAccessor;
typedef struct _KlAccessorNum {
    KlKLONE_HEADER;
    char *p_name;			/* same as for atoms "foo.3" */
    KlO p_list;				/* p-list of properties */
    KlO var;				/* left part: foo (symbol or expr) */
    KlO field;			/* right part: 3 (number) */
    Int fieldnum;			/* caches number value */
}        *KlAccessorNum;

typedef struct _KlSymbolSlot {
    KlKLONE_HEADER;
    KlAtom symbol;
}        *KlSymbolSlot;

/* exported functions */

EXT KlAtom KlIntern();
EXT KlAtom KlInternBytes();
EXT KlO KlAtomEval();
EXT KlO KlAtomPrint();
EXT KlO KlAtomFree();
EXT KlO KlAtomExecute();
EXT KlO KlAtomSetq();
EXT KlO KlAtomEqual();
EXT KlAtom find_next_prefixed_atom();
EXT KlO KlAtomUnbind();
extern KlConstant KlConstantMake();
extern KlO KlAtomCoerce();
extern KlO KlKeywordCoerce();
extern KlKeyword KlKeywordMakeFromAtom();
EXT KlActive KlActiveMake();
EXT KlO KlActiveEval();
EXT KlO KlActiveExecute();
EXT KlO KlActiveSetq();
EXT KlAtom KlInternDotPrefixed();
EXT KlO KlActivePointerToIntGet();
EXT KlO KlActivePointerToIntSet();
extern KlO KlSymbolSlotCoerce();
extern KlAtom KlDeclareSubType();
extern KlActive KlActivePointerToBooleanMake();
extern KlActive KlActivePointerToKloneStringMake();
extern KlAtom KlErrorCodeMakeS();
extern KlAtom KlErrorCodeMakeSRecoverable();
extern KlO KlAtomOf();
extern KlAccessor KlAccessorMake();
EXT KlAtom KlInternBytesNoDot();
EXT char *KlEmptyAtomName INIT("");	/* a unique object */
#define KlIsANamedSymbol(s) \
    (KlIsASymbol(s) && (((KlAtom) (s))->p_name != KlEmptyAtomName))

#define KlKeywordMake(a) ((KlKeyword) KlIntern(a))	/* backward compat */

/* macro to access the fields */

#define KlActiveSet(a) ((a)->set)
#define KlActiveGet(a) ((a)->get)
#define KlActiveData(a) ((a)->data)

#define KlAtomPList(a) ((KlList)((a)->p_list))
#define KlAtomPListSet(a, v) (((a)->p_list) = ((KlO) (v)))

/* exported variables */

EXT KlKeyword *KlValidKeywords;
EXT KlKeyword *KlValidKeywordsPtr;

EXT int KlKCount 
INIT(2);				/* the current keyword func call */
EXT int KlAtomCreated 
INIT(0);				/* set to 1 by KlIntern */
EXT KlAtom KlCurVariable;		/* to print errors */
EXT KlAtom KlTmpAtom;			/* temp to declare atoms */

/* atoms */
EXT KlAtom KlA_progn;			/* the progn atom */
EXT KlActive KlA_star_package;		/* *package* */
EXT KlAtom KlA_nil_symbol;		/* internal use only */
EXT KlAtom KlA_documentation;		/* internal use only */
EXT KlAtom KlA_print_binary;		/* format of prints for strings */
EXT KlAtom KlA_print_readably;		/* format of prints for strings */
EXT KlAtom KlA_print;			/* print for list pretty-printing */
EXT KlAtom KlA_load_path;		/* list of directories */
EXT KlAtom KlA_load_ext;		/* extension possible for files */
EXT KlAtom KlA_EOF;			/* EOF for catching */
EXT KlAtom KlA_EOP;			/* EOP (end-of-pipe) */
EXT KlAtom KlA_ERROR;			/* Error for catching */
EXT KlAtom KlA_ALL;			/* catch-all tag */
EXT KlAtom KlA_error_handlers;		/* list of error handlers */
EXT KlAtom KlA_error_handlers_orig;	/* default error handler */
EXT KlAtom KlA_error_correctors;	/* list of error correctors */
EXT KlAtom KlA_smartloader;		/* smartloader */
EXT KlAtom KlA_is_in_error_handler;	/* flag not to recurse in errors */
EXT KlAtom KlA_identity;		/* identity */
EXT KlAtom KlA_quote;			/* ' */
EXT KlAtom KlA_backquote;		/* ` */
EXT KlAtom KlA_unquote;			/* , */
EXT KlAtom KlA_unquotesplicing;		/* ,@ */
EXT KlAtom KlA_KlVersionNumber;		/* *version* */
EXT KlAtom KlA_KlApplicationName;	/* *application-name* */
EXT KlAtom KlA_KlMachineName;		/* *machine* */
EXT KlAtom KlA_Class;			/* Class */
EXT KlAtom KlA_Object;			/* Object */
EXT KlAtom KlA_Expr;			/* Expr */
EXT KlAtom KlA_Subr;			/* Subr */
EXT KlAtom KlA_GenericFunction;		/* GenericFunction */
EXT KlAtom KlA_read;			/* read */
EXT KlAtom KlA_write;			/* write */
EXT KlAtom KlA_continue;		/* continue */
EXT KlAtom KlA_lambda;			/* lambda */
EXT KlAtom KlA_lambdaq;			/* lambdaq */
EXT KlAtom KlA_lambdam;			/* lambdam */
EXT KlAtom KlA_Int;			/* for structs */
EXT KlAtom KlA_String;
EXT KlAtom KlA_make_instance;
EXT KlAtom KlA_init;
EXT KlAtom KlA_free;
EXT KlAtom KlA_execute;
EXT KlAtom KlA_equal;
EXT KlAtom KlA_assign;
EXT KlAtom KlA_add;
EXT KlAtom KlA_nth;
EXT KlAtom KlA_hash;
EXT KlAtom KlA_eval;
EXT KlAtom KlA_copy;
EXT KlAtom KlA_setq;
EXT KlAtom KlA_get;
EXT KlAtom KlA_put;
EXT KlAtom KlA_delete;
EXT KlAtom KlA_insert;
EXT KlAtom KlA_class;
EXT KlAtom KlA_object;
EXT KlAtom KlA_selector;
EXT KlAtom KlA_slot;
EXT KlAtom KlA_name;
EXT KlAtom KlA_body;
EXT KlAtom KlA_correctable;
EXT KlAtom KlA_length;
EXT KlAtom KlA_apply;
EXT KlAtom KlA_make_subr;
EXT KlAtom KlA_is_in_dbtk_break;
EXT KlAtom KlA_depth;
EXT KlAtom KlA_slots;
EXT KlAtom KlA_size;
EXT KlAtom KlA_exithook;
EXT KlAtom KlA_socket_last_bind;
EXT KlAtom KlA_keep_streams_exec;
EXT KlAtom KlA_SHARP;


/* markers */
EXT KlAtom KlA_Moptional;		/* &optional marker */
EXT KlAtom KlA_Mrest;			/* &rest marker */
EXT KlAtom KlA_Mkey;			/* &key marker */
EXT KlAtom KlA_Maux;			/* &aux marker */
EXT KlAtom KlA_Mwhole;			/* &whole marker */
EXT KlAtom KlA_Mallow_other_keys;	/* &allow-other-keys marker */

/* keywords */
EXT KlKeyword KlK_direction;
EXT KlKeyword KlK_if_exists;
EXT KlKeyword KlK_type;
EXT KlKeyword KlK_buffered;
EXT KlKeyword KlK_output;
EXT KlKeyword KlK_input;
EXT KlKeyword KlK_error;
EXT KlKeyword KlK_io;
EXT KlKeyword KlK_overwrite;
EXT KlKeyword KlK_string;
EXT KlKeyword KlK_supersede;
EXT KlKeyword KlK_append;
EXT KlKeyword KlK_initial_element;
EXT KlKeyword KlK_real;
EXT KlKeyword KlK_user;
EXT KlKeyword KlK_sys;
EXT KlKeyword KlK_cpu;
EXT KlKeyword KlK_all;
EXT KlKeyword KlK_initform;
EXT KlKeyword KlK_documentation;
EXT KlKeyword KlK_nil;
EXT KlKeyword KlK_true;
EXT KlKeyword KlK_writer;
EXT KlKeyword KlK_metaclass;
EXT KlKeyword KlK_name;
EXT KlKeyword KlK_father;
EXT KlKeyword KlK_son;
EXT KlKeyword KlK_brother;
EXT KlKeyword KlK_methods;
EXT KlKeyword KlK_slots;
EXT KlKeyword KlK_STAR_inits;
EXT KlKeyword KlK_exo_hooks;
EXT KlKeyword KlK_file;
EXT KlKeyword KlK_blocking;
EXT KlKeyword KlK_timeout;
EXT KlKeyword KlK_nohup;
EXT KlKeyword KlK_if_does_not_exist;
EXT KlKeyword KlK_tcp;
EXT KlKeyword KlK_udp;
EXT KlKeyword KlK_pipe;
#ifdef KLSES
EXT KlKeyword KlK_handler;
EXT KlKeyword KlK_cache;
#endif /* SES */


/* actives */
EXT KlActive  KlA_StackMaxSize;

/* error messages
 */

EXT KlAtom KlE_UNDEFINED_VARIABLE;
EXT KlAtom KlE_BAD_NUMBER_OF_ARGS;
EXT KlAtom KlE_UNDEFINED_FUNCTION;
EXT KlAtom KlE_BAD_DEFUN;
EXT KlAtom KlE_BAD_ARG_TYPE;
EXT KlAtom KlE_RELEASING_ATOM;
EXT KlAtom KlE_BAD_LOCAL_SYNTAX;
EXT KlAtom KlE_SYNTAX_ERROR;
EXT KlAtom KlE_INTERNAL_ERROR;
EXT KlAtom KlE_TIME_EXCEEDED;
EXT KlAtom KlE_CANNOT_SET;
EXT KlAtom KlE_CANNOT_GET_C_VALUE;
EXT KlAtom KlE_NON_KlO;
EXT KlAtom KlE_UNDEFINED_METHOD;
EXT KlAtom KlE_NO_COERCION;
EXT KlAtom KlE_ERROR_OPENING_FILE;
EXT KlAtom KlE_BAD_DIRECTORY;
EXT KlAtom KlE_STREAM_ERROR;
EXT KlAtom KlE_INVALID_KEYWORD;
EXT KlAtom KlE_INVALID_KEYWORD_VALUE;
EXT KlAtom KlE_BAD_DO_SYNTAX;
EXT KlAtom KlE_DIVIDE_BY_ZERO;
EXT KlAtom KlE_NO_ELEMENT;
EXT KlAtom KlE_NO_METHOD;
EXT KlAtom KlE_NO_CLASS;
EXT KlAtom KlE_BAD_CLASS_DEF;
EXT KlAtom KlE_NO_PREVIOUS_METHOD;
EXT KlAtom KlE_MAX_ARITY;
EXT KlAtom KlE_STACK_OVERFLOKl;
EXT KlAtom KlE_NO_CATCH;
EXT KlAtom KlE_NO_PUT;
EXT KlAtom KlE_NO_APPEND;
EXT KlAtom KlE_BAD_COMPARE_CALL;
EXT KlAtom KlE_BAD_REGEXPR;
EXT KlAtom KlE_BAD_SYMBCHAR;
EXT KlAtom KlE_BAD_LAMBDALIST;
EXT KlAtom KlE_BREAK;
EXT KlAtom KlE_DBTK_BREAK;
EXT KlAtom KlE_ERROR;
EXT KlAtom KlE_CANNOT_LOAD_FILE;
EXT KlAtom KlE_BAD_ACCESS;
EXT KlAtom KlE_NOT_A_METHOD;
EXT KlAtom KlE_COMMA_OUTSIDE_BACKQUOTE;
EXT KlAtom KlE_NO_MODIFY;
EXT KlAtom KlE_UNDEFINED_INTERNAL_METHOD;
EXT KlAtom KlE_NUMBER_OUT_OF_RANGE;
EXT KlAtom KlE_BAD_LOCATOR;

#ifdef CHECK_FILE_TYPE_ON_LOAD
EXT KlAtom KlE_INVALID_LOAD_FILE;
#endif /* CHECK_FILE_TYPE_ON_LOAD */
EXT KlAtom KlE_NO_METACLASS_INSTANCE;
EXT KlAtom KlE_CANNOT_DECLARE_GENERIC;
EXT KlAtom KlE_NUMERIC_ERROR;
EXT KlAtom KlE_INVALID_IDENTIFIER;
#ifdef DEBUG2
EXT KlAtom KlE_BAD_STACK;
#endif
#ifdef KLSES 
EXT KlAtom KlE_SES_IO_ERROR;
EXT KlAtom KlE_SES_INTERNAL_ERROR;
EXT KlAtom KlE_SES_BAD_ARGUMENT;
EXT KlAtom KlE_SES_BAD_ERROR;
EXT KlAtom KlE_SES_NOT_FOUND;
#endif

/* types */

EXT KlType KlAtomType;
EXT KlType KlKeywordType;
EXT KlType KlConstantType;
EXT KlType KlActiveType;
EXT KlType KlKloneActiveType;
EXT KlType KlSymbolSlotType;
EXT KlType KlAccessorType;
EXT KlType KlAccessorNumType;

EXT KlO KlMallocStats();
#ifdef STATS
EXT KlO KlHashstats();
#endif					/* STATS */

/* macros */

#define KlIsASymbol(obj) KlHasTrait(obj, KlTrait_symbol)
#define KlMustBeSymbol(o, n) KlArgumentMustHaveTrait(o, n, KlTrait_symbol)

#define KlIsAKeyword(obj) ((obj)->type == KlKeywordType)
#define KlMustBeKeyword(o, n) KlArgumentMustBe(o, n, KlKeywordType)

#define KlIsAnAtom(obj) ((obj)->type == KlAtomType)
#define KlMustBeAtom(o, n) KlArgumentMustBe(o, n, KlAtomType)

#define KlIsAConstant(obj) ((obj)->type == KlConstantType)
#define KlMustBeConstant(o, n) KlArgumentMustBe(o, n, KlConstantType)

#define KlIsAActive(obj) ((obj)->type == KlActiveType)
#define KlMustBeActive(o, n) KlArgumentMustBe(o, n, KlActiveType)

#define KlAtomDefined(obj) ((obj)->c_val != KlUndef)

#define KlIsAnAccessor(obj) ((obj)->type == KlAccessorType)
#define KlMustBeAccessor(o, n) KlArgumentMustBe(o, n, KlAccessorType)

#ifdef DEBUG
#define KlKeyVal(key, def) (\
    *KlValidKeywordsPtr++ = key, *KlValidKeywordsPtr = 0,\
    ((KlValidKeywordsPtr - KlValidKeywords)<KLMAX_KEYWORDS ? 0 : \
     (*KlFatalError)(11, KLMAX_KEYWORDS)), \
    (key->k_count-- == KlKCount ? key->k_val : ((KlO) (def))))
#else /* !DEBUG */
#define KlKeyVal(key, def) (\
    *KlValidKeywordsPtr++ = key, *KlValidKeywordsPtr = 0,\
    (key->k_count-- == KlKCount ? key->k_val : ((KlO) (def))))
#endif /* !DEBUG */

#define KlEnvVal(atom, def) \
    ((atom->c_val != KlUndef) ? atom->c_val : ((KlO) (def)))

#define KlIsAMarker(obj) \
    ((obj)->type == KlAtomType && ((KlAtom)(obj)->p_name[0] == '&'))

#define KlAtomOrKey(obj) \
    (KlIsAKeyword(obj) ? ((KlKeyword)(obj))->atom : ((KlAtom) obj))

#define KlKeyFromAtom(obj) \
    (KlIsAKeyword(obj) ? ((KlKeyword)(obj)) : KlKeywordMakeFromAtom(obj))

#endif					/* INCLUDE_Kl_ATOM_H */


syntax highlighted by Code2HTML, v. 0.9.1