File: label.c

package info (click to toggle)
faucc 20160511-1
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 1,460 kB
  • ctags: 2,914
  • sloc: ansic: 38,788; yacc: 1,602; xml: 519; sh: 436; lex: 378; makefile: 125
file content (101 lines) | stat: -rw-r--r-- 1,830 bytes parent folder | download | duplicates (3)
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* $Id: label.c,v 1.4 2009/01/27 15:40:22 potyra Exp $ 
 *
 * Copyright (C) 2008-2009 FAUcc Team <info@faumachine.org>.
 * This program is free software. You can redistribute it and/or modify it
 * under the terms of the GNU General Public License, either version 2 of
 * the License, or (at your option) any later version. See COPYING.
 */

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "label.h"
#include "stmt.h"

struct label *
label_new(const char *identifier)
{
	struct label *label;

	label = malloc(sizeof *label);
	assert(label);

	memset(label, 0, sizeof *label);

	label->identifier = identifier;

	return label;
}

static void
label_free(struct label *label)
{
	if (! label->ref_first
	 && ! label->def_first) {
#if 0
		free(label);
#endif
	}
}

void
label_ref_add(struct label *label, struct stmt *s)
{
	s->ref_prev = label->ref_last;
	s->ref_next = NULL;
	if (s->ref_prev) {
		s->ref_prev->ref_next = s;
	} else {
		label->ref_first = s;
	}
	label->ref_last = s;
}

void
label_ref_del(struct label *label, struct stmt *s)
{
	if (s->ref_prev) {
		s->ref_prev->ref_next = s->ref_next;
	} else {
		label->ref_first = s->ref_next;
	}
	if (s->ref_next) {
		s->ref_next->ref_prev = s->ref_prev;
	} else {
		label->ref_last = s->ref_prev;
	}

	label_free(label);
}

void
label_def_add(struct label *label, struct stmt *s)
{
	s->def_prev = label->def_last;
	s->def_next = NULL;
	if (s->def_prev) {
		s->def_prev->def_next = s;
	} else {
		label->def_first = s;
	}
	label->def_last = s;
}

void
label_def_del(struct label *label, struct stmt *s)
{
	if (s->def_prev) {
		s->def_prev->def_next = s->def_next;
	} else {
		label->def_first = s->def_next;
	}
	if (s->def_next) {
		s->def_next->def_prev = s->def_prev;
	} else {
		label->def_last = s->def_prev;
	}

	label_free(label);
}