17da4ea4fSMasatake YAMATO /* 240dde795SMasatake YAMATO * Copyright (c) 2020, Masatake YAMATO 340dde795SMasatake YAMATO * Copyright (c) 2020, Red Hat, Inc. 47da4ea4fSMasatake YAMATO * 57da4ea4fSMasatake YAMATO * This source code is released for free distribution under the terms of the 67da4ea4fSMasatake YAMATO * GNU General Public License version 2 or (at your option) any later version. 77da4ea4fSMasatake YAMATO */ 87da4ea4fSMasatake YAMATO 97da4ea4fSMasatake YAMATO #ifndef DSL_H 107da4ea4fSMasatake YAMATO #define DSL_H 117da4ea4fSMasatake YAMATO 127da4ea4fSMasatake YAMATO /* 137da4ea4fSMasatake YAMATO * INCLUDES 147da4ea4fSMasatake YAMATO */ 15e475a54fSMasatake YAMATO #include "es.h" 1655ac1afeSMasatake YAMATO #include "readtags.h" 177da4ea4fSMasatake YAMATO 187da4ea4fSMasatake YAMATO 197da4ea4fSMasatake YAMATO /* 207da4ea4fSMasatake YAMATO * TYPES 217da4ea4fSMasatake YAMATO */ 2264199f0cSMasatake YAMATO enum eDSLEngineType { 23c68e9a79SMasatake YAMATO DSL_INTERNAL_PSEUDO, 244b279ed6SMasatake YAMATO DSL_COMMON, 2564199f0cSMasatake YAMATO DSL_QUALIFIER, 266a93d1bcSMasatake YAMATO DSL_SORTER, 27*d453aacfSMasatake YAMATO DSL_FORMATTER, 2864199f0cSMasatake YAMATO DSL_ENGINE_COUNT 2964199f0cSMasatake YAMATO }; 3064199f0cSMasatake YAMATO typedef enum eDSLEngineType DSLEngineType; 3164199f0cSMasatake YAMATO 322961cad2SMasatake YAMATO struct sDSLEnv { 332961cad2SMasatake YAMATO enum eDSLEngineType engine; 342961cad2SMasatake YAMATO const tagEntry *entry; 356a93d1bcSMasatake YAMATO const tagEntry *alt_entry; 362961cad2SMasatake YAMATO }; 372961cad2SMasatake YAMATO typedef struct sDSLEnv DSLEnv; 382961cad2SMasatake YAMATO 392961cad2SMasatake YAMATO typedef EsObject* (* DSLProc) (EsObject *args, DSLEnv *env); 40d1659f79SMasatake YAMATO typedef EsObject* (* DSLMacro) (EsObject *expr); 412961cad2SMasatake YAMATO 4255ac1afeSMasatake YAMATO 4355ac1afeSMasatake YAMATO enum eDSLPAttr { 4455ac1afeSMasatake YAMATO DSL_PATTR_MEMORABLE = 1UL << 0, 455c4f6841SMasatake YAMATO DSL_PATTR_SELF_EVAL = 1UL << 1, 465c4f6841SMasatake YAMATO DSL_PATTR_CHECK_ARITY = 1UL << 2, 475c4f6841SMasatake YAMATO DSL_PATTR_CHECK_ARITY_OPT = 1UL << 3 | DSL_PATTR_CHECK_ARITY, 4855ac1afeSMasatake YAMATO }; 4955ac1afeSMasatake YAMATO typedef enum eDSLPAttr DSLPAttr; 5055ac1afeSMasatake YAMATO 5191d575f2SMasatake YAMATO typedef struct sDSLProcBind DSLProcBind; 5291d575f2SMasatake YAMATO struct sDSLProcBind { 5355ac1afeSMasatake YAMATO const char *name; 5455ac1afeSMasatake YAMATO DSLProc proc; 5555ac1afeSMasatake YAMATO EsObject* cache; 5655ac1afeSMasatake YAMATO DSLPAttr flags; 5755ac1afeSMasatake YAMATO int arity; 5855ac1afeSMasatake YAMATO const char* helpstr; 59d1659f79SMasatake YAMATO DSLMacro macro; 6055ac1afeSMasatake YAMATO }; 617da4ea4fSMasatake YAMATO 625ae71397SMasatake YAMATO typedef struct sDSLCode DSLCode; 635ae71397SMasatake YAMATO 647da4ea4fSMasatake YAMATO #define DSL_ERR_UNBOUND_VARIABLE (es_error_intern("unbound-variable")) 657da4ea4fSMasatake YAMATO #define DSL_ERR_TOO_FEW_ARGUMENTS (es_error_intern("too-few-arguments")) 667da4ea4fSMasatake YAMATO #define DSL_ERR_TOO_MANY_ARGUMENTS (es_error_intern("too-many-arguments")) 676a93d1bcSMasatake YAMATO #define DSL_ERR_STRING_REQUIRED (es_error_intern("string-required")) 686a93d1bcSMasatake YAMATO #define DSL_ERR_BOOLEAN_REQUIRED (es_error_intern("boolean-required")) 696a93d1bcSMasatake YAMATO #define DSL_ERR_INTEGER_REQUIRED (es_error_intern("integer-required")) 707da4ea4fSMasatake YAMATO #define DSL_ERR_NUMBER_REQUIRED (es_error_intern("number-required")) 718d371d3dSMasatake YAMATO #define DSL_ERR_CALLABLE_REQUIRED (es_error_intern("callable-required")) 727da4ea4fSMasatake YAMATO #define DSL_ERR_WRONG_TYPE_ARGUMENT (es_error_intern("wrong-type-argument")) 736a93d1bcSMasatake YAMATO #define DSL_ERR_NO_ALT_ENTRY (es_error_intern("the-alternative-entry-unavailable")) 747da4ea4fSMasatake YAMATO 757da4ea4fSMasatake YAMATO 767da4ea4fSMasatake YAMATO /* 777da4ea4fSMasatake YAMATO * MACROS 787da4ea4fSMasatake YAMATO */ 797da4ea4fSMasatake YAMATO #define dsl_throw(e,o) return es_error_set_object(DSL_ERR_##e, o) 807da4ea4fSMasatake YAMATO 817da4ea4fSMasatake YAMATO 8255ac1afeSMasatake YAMATO /* 8355ac1afeSMasatake YAMATO * Function declarations 8455ac1afeSMasatake YAMATO */ 854b279ed6SMasatake YAMATO 864b279ed6SMasatake YAMATO /* Return 1 if no error. */ 8787ba242aSMasatake YAMATO int dsl_init (DSLEngineType engine, DSLProcBind *engine_pbinds, int count); 8891d575f2SMasatake YAMATO DSLProcBind *dsl_lookup (DSLEngineType engine, EsObject *name); 89aebbb07cSMasatake YAMATO void dsl_help (DSLEngineType engine, FILE *fp); 90604273b8SMasatake YAMATO void dsl_cache_reset (DSLEngineType engine); 915ae71397SMasatake YAMATO DSLCode *dsl_compile (DSLEngineType engine, EsObject *expr); 925ae71397SMasatake YAMATO EsObject *dsl_eval (DSLCode *code, DSLEnv *env); 935ae71397SMasatake YAMATO void dsl_release (DSLEngineType engine, DSLCode *code); 9440dde795SMasatake YAMATO 956a93d1bcSMasatake YAMATO /* This should be remove when we have a real compiler. */ 966a93d1bcSMasatake YAMATO EsObject *dsl_compile_and_eval (EsObject *expr, DSLEnv *env); 976a93d1bcSMasatake YAMATO 986a93d1bcSMasatake YAMATO 996a93d1bcSMasatake YAMATO EsObject* dsl_entry_xget_string (const tagEntry *entry, const char* name); 1006a93d1bcSMasatake YAMATO 101c55f91acSMasatake YAMATO EsObject* dsl_entry_name (const tagEntry *entry); 102c55f91acSMasatake YAMATO EsObject* dsl_entry_input (const tagEntry *entry); 103c55f91acSMasatake YAMATO EsObject* dsl_entry_pattern (const tagEntry *entry); 104254eb09bSMasatake YAMATO EsObject* dsl_entry_line (const tagEntry *entry); 105254eb09bSMasatake YAMATO 106254eb09bSMasatake YAMATO EsObject* dsl_entry_access (const tagEntry *entry); 107254eb09bSMasatake YAMATO EsObject* dsl_entry_end (const tagEntry *entry); 108ec8c7771SMasatake YAMATO EsObject* dsl_entry_extras (const tagEntry *entry); 109254eb09bSMasatake YAMATO EsObject* dsl_entry_file (const tagEntry *entry); 110c55f91acSMasatake YAMATO EsObject* dsl_entry_inherits (const tagEntry *entry); 111254eb09bSMasatake YAMATO EsObject* dsl_entry_implementation (const tagEntry *entry); 112254eb09bSMasatake YAMATO EsObject* dsl_entry_kind (const tagEntry *entry); 113254eb09bSMasatake YAMATO EsObject* dsl_entry_language (const tagEntry *entry); 114ec8c7771SMasatake YAMATO EsObject* dsl_entry_scope (const tagEntry *entry); 115c55f91acSMasatake YAMATO EsObject* dsl_entry_scope_kind (const tagEntry *entry); 116c55f91acSMasatake YAMATO EsObject* dsl_entry_scope_name (const tagEntry *entry); 117254eb09bSMasatake YAMATO EsObject* dsl_entry_signature (const tagEntry *entry); 118ec8c7771SMasatake YAMATO EsObject* dsl_entry_typeref (const tagEntry *entry); 119ff1ad3aaSMasatake YAMATO EsObject* dsl_entry_typeref_kind (const tagEntry *entry); 120ff1ad3aaSMasatake YAMATO EsObject* dsl_entry_typeref_name (const tagEntry *entry); 121254eb09bSMasatake YAMATO EsObject* dsl_entry_roles (const tagEntry *entry); 122ec8c7771SMasatake YAMATO EsObject* dsl_entry_xpath (const tagEntry *entry); 123c55f91acSMasatake YAMATO 124c4504f7fSMasatake YAMATO void dsl_report_error (const char *msg, EsObject *obj); 125c4504f7fSMasatake YAMATO 1267da4ea4fSMasatake YAMATO #endif 127