xref: /Universal-ctags/dsl/qualifier.c (revision d742dcb0e13d8d69a234a11405ffa12adc217b8f)
1e46cda7eSMasatake YAMATO /*
2e46cda7eSMasatake YAMATO *   Copyright (c) 2016, Masatake YAMATO
3e46cda7eSMasatake YAMATO *   Copyright (c) 2016, Red Hat, Inc.
4e46cda7eSMasatake YAMATO *
5e46cda7eSMasatake YAMATO *   This source code is released for free distribution under the terms of the
6e46cda7eSMasatake YAMATO *   GNU General Public License version 2 or (at your option) any later version.
7e46cda7eSMasatake YAMATO */
8e46cda7eSMasatake YAMATO 
9c10b1536SMasatake YAMATO /*
10c10b1536SMasatake YAMATO  * INCLUDES
11c10b1536SMasatake YAMATO  */
12e46cda7eSMasatake YAMATO #include "qualifier.h"
137da4ea4fSMasatake YAMATO #include "dsl.h"
14e475a54fSMasatake YAMATO #include "es.h"
15e46cda7eSMasatake YAMATO 
16e46cda7eSMasatake YAMATO #include <stdlib.h>
17e46cda7eSMasatake YAMATO 
18e46cda7eSMasatake YAMATO /*
19c10b1536SMasatake YAMATO  * TYPES
20e46cda7eSMasatake YAMATO  */
21c10b1536SMasatake YAMATO struct sQCode
22c10b1536SMasatake YAMATO {
235ae71397SMasatake YAMATO 	DSLCode *dsl;
24c10b1536SMasatake YAMATO };
2555ac1afeSMasatake YAMATO 
26e46cda7eSMasatake YAMATO 
27e46cda7eSMasatake YAMATO /*
28c10b1536SMasatake YAMATO  * DATA DEFINITIONS
29e46cda7eSMasatake YAMATO  */
30e46cda7eSMasatake YAMATO 
31c10b1536SMasatake YAMATO 
32c10b1536SMasatake YAMATO /*
33c10b1536SMasatake YAMATO  * FUNCTION DEFINITIONS
34c10b1536SMasatake YAMATO  */
initialize(void)359f026e7bSMasatake YAMATO static int initialize (void)
36e46cda7eSMasatake YAMATO {
37394a715bSMasatake YAMATO 	static int initialized;
38394a715bSMasatake YAMATO 
39394a715bSMasatake YAMATO 	if (initialized)
409f026e7bSMasatake YAMATO 		return 1;
41394a715bSMasatake YAMATO 
42*d742dcb0SMasatake YAMATO 	if (!dsl_init (DSL_QUALIFIER, NULL, 0))
434b279ed6SMasatake YAMATO 	{
444b279ed6SMasatake YAMATO 		fprintf(stderr, "MEMORY EXHAUSTED\n");
459f026e7bSMasatake YAMATO 		return 0;
464b279ed6SMasatake YAMATO 	}
47e46cda7eSMasatake YAMATO 
48394a715bSMasatake YAMATO 	initialized = 1;
499f026e7bSMasatake YAMATO 	return 1;
50e46cda7eSMasatake YAMATO }
51e46cda7eSMasatake YAMATO 
q_compile(EsObject * exp)52e46cda7eSMasatake YAMATO QCode  *q_compile (EsObject *exp)
53e46cda7eSMasatake YAMATO {
54e78e6e3dSMasatake YAMATO 	QCode *code;
55e46cda7eSMasatake YAMATO 
569f026e7bSMasatake YAMATO 	if (!initialize ())
579f026e7bSMasatake YAMATO 		exit (1);
58e46cda7eSMasatake YAMATO 
59e78e6e3dSMasatake YAMATO 	code = malloc (sizeof (QCode));
60e78e6e3dSMasatake YAMATO 	if (code == NULL)
619f026e7bSMasatake YAMATO 	{
629f026e7bSMasatake YAMATO 		fprintf(stderr, "MEMORY EXHAUSTED\n");
6380a0eeb3SMasatake YAMATO 		return NULL;
649f026e7bSMasatake YAMATO 	}
65e78e6e3dSMasatake YAMATO 
665ae71397SMasatake YAMATO 	code->dsl = dsl_compile (DSL_QUALIFIER, exp);
6780a0eeb3SMasatake YAMATO 	if (code->dsl == NULL)
6880a0eeb3SMasatake YAMATO 	{
6980a0eeb3SMasatake YAMATO 		fprintf(stderr, "MEMORY EXHAUSTED or SYNTAX ERROR\n");
7080a0eeb3SMasatake YAMATO 		free (code);
7180a0eeb3SMasatake YAMATO 		return NULL;
7280a0eeb3SMasatake YAMATO 	}
73e78e6e3dSMasatake YAMATO 	return code;
74e46cda7eSMasatake YAMATO }
75e46cda7eSMasatake YAMATO 
q_is_acceptable(QCode * code,tagEntry * entry)76e46cda7eSMasatake YAMATO enum QRESULT q_is_acceptable  (QCode *code, tagEntry *entry)
77e46cda7eSMasatake YAMATO {
78e46cda7eSMasatake YAMATO 	EsObject *r;
79e46cda7eSMasatake YAMATO 	int i;
80e46cda7eSMasatake YAMATO 
812961cad2SMasatake YAMATO 	DSLEnv env = {
822961cad2SMasatake YAMATO 		.engine = DSL_QUALIFIER,
832961cad2SMasatake YAMATO 		.entry  = entry,
842961cad2SMasatake YAMATO 	};
85e46cda7eSMasatake YAMATO 	es_autounref_pool_push ();
865ae71397SMasatake YAMATO 	r = dsl_eval (code->dsl, &env);
87e46cda7eSMasatake YAMATO 	if (es_object_equal (r, es_false))
88e46cda7eSMasatake YAMATO 		i = Q_REJECT;
89e46cda7eSMasatake YAMATO 	else if (es_error_p (r))
90e46cda7eSMasatake YAMATO 	{
91c4504f7fSMasatake YAMATO 		dsl_report_error ("GOT ERROR in QUALIFYING", r);
92e46cda7eSMasatake YAMATO 		i = Q_ERROR;
93e46cda7eSMasatake YAMATO 	}
94e46cda7eSMasatake YAMATO 	else
95e46cda7eSMasatake YAMATO 		i = Q_ACCEPT;
96e46cda7eSMasatake YAMATO 	es_autounref_pool_pop ();
97e46cda7eSMasatake YAMATO 
98604273b8SMasatake YAMATO 	dsl_cache_reset (DSL_QUALIFIER);
99e46cda7eSMasatake YAMATO 
100e46cda7eSMasatake YAMATO 	return i;
101e46cda7eSMasatake YAMATO }
102e46cda7eSMasatake YAMATO 
q_destroy(QCode * code)103e46cda7eSMasatake YAMATO void q_destroy (QCode *code)
104e46cda7eSMasatake YAMATO {
1055ae71397SMasatake YAMATO 	dsl_release (DSL_QUALIFIER, code->dsl);
106e46cda7eSMasatake YAMATO 	free (code);
107e46cda7eSMasatake YAMATO }
108e46cda7eSMasatake YAMATO 
q_help(FILE * fp)109e46cda7eSMasatake YAMATO void q_help (FILE *fp)
110e46cda7eSMasatake YAMATO {
11187ba242aSMasatake YAMATO 	if (!initialize ())
11287ba242aSMasatake YAMATO 		exit (1);
113aebbb07cSMasatake YAMATO 	dsl_help (DSL_QUALIFIER, fp);
114e46cda7eSMasatake YAMATO }
115