xref: /Universal-ctags/dsl/dsl.h (revision d453aacfb88c1c59e3850594e8437c4ed9b52ebf)
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