File: stack.c

package info (click to toggle)
rlinetd 0.5.9
  • links: PTS
  • area: main
  • in suites: woody
  • size: 1,308 kB
  • ctags: 521
  • sloc: sh: 9,157; ansic: 2,686; yacc: 1,389; lex: 120; makefile: 93; perl: 19
file content (41 lines) | stat: -rw-r--r-- 881 bytes parent folder | download | duplicates (2)
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
#include <stdlib.h>

#include "bytecode.h"
#include "error.h"
#include "stack.h"

void rlstk_push(struct rl_stack *s, rl_opcode_t val) {
	if(s->top == STACKSIZE)
		rl_fatal(EX_SOFTWARE, "Stack overflow");
	s->data[s->top++] = val;
}

rl_opcode_t rlstk_pop(struct rl_stack *s) {
	if(!s->top)
		rl_fatal(EX_SOFTWARE, "Stack underflow");
	return s->data[--s->top];
}

rl_opcode_t rlstk_peek(struct rl_stack *s, int offset) {
	if(offset >= s->top)
		rl_fatal(EX_SOFTWARE, "Stack peek undefined");
	return s->data[s->top - offset - 1];
}

void rlstk_poke(struct rl_stack *s, int offset, rl_opcode_t val) {
	if(offset >= s->top)
		rl_fatal(EX_SOFTWARE, "Stack peek undefined");
	s->data[s->top - offset - 1] = val;
}

struct rl_stack *rlstk_new() {
	struct rl_stack *s;

	s = malloc(sizeof(*s));
	memset(s, 0, sizeof(*s));
	return s;
}

void rlstk_free(struct rl_stack *s) {
	free(s);
}