aboutsummaryrefslogtreecommitdiff
path: root/core/c/frontend/tokenizer/hide_set.odin
blob: ec8b77e6e8d910c5ba5a4b0b21f98b70e9d2df21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package c_frontend_tokenizer

// NOTE(bill): This is a really dumb approach for a hide set,
// but it's really simple and probably fast enough in practice


Hide_Set :: struct {
	next: ^Hide_Set,
	name: string,
}


new_hide_set :: proc(name: string) -> ^Hide_Set {
	hs := new(Hide_Set)
	hs.name = name
	return hs
}

hide_set_contains :: proc(hs: ^Hide_Set, name: string) -> bool {
	for h := hs; h != nil; h = h.next {
		if h.name == name {
			return true
		}
	}
	return false
}


hide_set_union :: proc(a, b: ^Hide_Set) -> ^Hide_Set {
	head: Hide_Set
	curr := &head

	for h := a; h != nil; h = h.next {
		curr.next = new_hide_set(h.name)
		curr = curr.next
	}
	curr.next = b
	return head.next
}


hide_set_intersection :: proc(a, b: ^Hide_Set) -> ^Hide_Set {
	head: Hide_Set
	curr := &head

	for h := a; h != nil; h = h.next {
		if hide_set_contains(b, h.name) {
			curr.next = new_hide_set(h.name)
			curr = curr.next
		}
	}
	return head.next
}


add_hide_set :: proc(tok: ^Token, hs: ^Hide_Set) -> ^Token {
	head: Token
	curr := &head

	tok := tok
	for ; tok != nil; tok = tok.next {
		t := copy_token(tok)
		t.hide_set = hide_set_union(t.hide_set, hs)
		curr.next = t
		curr = curr.next
	}
	return head.next
}