/* 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)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 */