Cthulhu  0.2.10
Cthulhu compiler collection
query_ast.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: LGPL-3.0-only
2 #include "query_ast.h"
3 
4 #include "arena/arena.h"
5 #include "base/panic.h"
6 #include "scan/scan.h"
7 
8 static query_ast_t *query_ast_new(scan_t *scan, query_ast_type_t type)
9 {
10  CTASSERT(scan != NULL);
11 
12  arena_t *arena = scan_get_arena(scan);
13  query_ast_t *ast = ARENA_MALLOC(sizeof(query_ast_t), "query", scan, arena);
14  ast->kind = type;
15 
16  return ast;
17 }
18 
20 {
21  query_ast_t *ast = query_ast_new(scan, eQueryObject);
22  ast->name = name;
23 
24  ARENA_IDENTIFY(ast->name.text, "name", ast, scan_get_arena(scan));
25 
26  return ast;
27 }
28 
30 {
31  query_ast_t *ast = query_ast_new(scan, eQueryField);
32  ast->object = object;
33  ast->field = field;
34 
35  ARENA_IDENTIFY(ast->object, "object", ast, scan_get_arena(scan));
36  ARENA_IDENTIFY(ast->field.text, "field", ast, scan_get_arena(scan));
37 
38  return ast;
39 }
40 
41 query_ast_t *query_ast_index(scan_t *scan, query_ast_t *object, mpz_t index)
42 {
43  query_ast_t *ast = query_ast_new(scan, eQueryIndex);
44  ast->object = object;
45  mpz_init_set(ast->index, index);
46  return ast;
47 }
48 
50 {
51  query_ast_t *ast = query_ast_new(scan, eQueryMap);
52  ast->object = object;
53  ast->field = field;
54 
55  ARENA_IDENTIFY(ast->object, "object", ast, scan_get_arena(scan));
56  ARENA_IDENTIFY(ast->field.text, "field", ast, scan_get_arena(scan));
57 
58  return ast;
59 }
CT_NODISCARD CT_PUREFN CT_SCAN_API arena_t * scan_get_arena(const scan_t *scan)
get the arena of a scanner
Definition: scan.c:113
#define ARENA_IDENTIFY(ptr, name, parent, arena)
rename and reparent a pointer in a custom allocator
Definition: arena.h:409
#define ARENA_MALLOC(size, name, parent, arena)
allocate memory from a custom allocator
Definition: arena.h:392
#define CTASSERT(expr)
assert a condition, prints the condition as a message
Definition: panic.h:130
query_ast_t * query_ast_field(scan_t *scan, query_ast_t *object, text_t field)
Definition: query_ast.c:29
query_ast_t * query_ast_object(scan_t *scan, text_t name)
Definition: query_ast.c:19
query_ast_t * query_ast_index(scan_t *scan, query_ast_t *object, mpz_t index)
Definition: query_ast.c:41
query_ast_t * query_ast_map(scan_t *scan, query_ast_t *object, text_t field)
Definition: query_ast.c:49
query_ast_type_t
Definition: query_ast.h:15
@ eQueryObject
Definition: query_ast.h:16
@ eQueryIndex
Definition: query_ast.h:19
@ eQueryField
Definition: query_ast.h:17
@ eQueryMap
Definition: query_ast.h:18
an allocator object
Definition: arena.h:86
query_ast_type_t kind
Definition: query_ast.h:26
text_t name
Definition: query_ast.h:41
mpz_t index
Definition: query_ast.h:36
text_t field
Definition: query_ast.h:33
query_ast_t * object
Definition: query_ast.h:30
a source file scanner
Definition: scan.h:24
a range of text
Definition: text.h:14