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