Przeglądaj źródła

Move printing values into a separate function

Lucas Stadler 8 lat temu
rodzic
commit
34e3adcb5f
1 zmienionych plików z 27 dodań i 16 usunięć
  1. 27 16
      scm/inc/driver.c

+ 27 - 16
scm/inc/driver.c

@ -2,6 +2,7 @@
2 2
3 3
#include <stdio.h>
4 4
#include <stdlib.h>
5
#include <string.h>
5 6
6 7
#define fixnum_mask  3 // 11
7 8
#define fixnum_tag   0 // 00
@ -22,28 +23,38 @@
22 23
23 24
#define MAX_MEMORY (1 << 20)
24 25
25
int scheme_entry(void *memory);
26
int scheme_entry(int *memory);
27
28
void print_value(int *val) {
29
	if ((*val & fixnum_mask) == fixnum_tag) {
30
		printf("%d", *val >> fixnum_shift);
31
	} else if ((*val & char_mask) == char_tag) {
32
		printf("#\\%c", *val >> char_shift);
33
	} else if ((*val & boolean_mask) == boolean_tag) {
34
		printf("#%s", (*val >> boolean_shift) == 1 ? "t" : "f");
35
	} else if (*val == empty_list) {
36
		printf("()");
37
	} else if ((*val & cons_mask) == cons_tag) {
38
		printf("(");
39
		printf("?");
40
		printf(" ");
41
		printf("?");
42
		printf(")");
43
	} else {
44
		printf("\nError: unhandled value: %d\n", *val);
45
		exit(1);
46
	}
47
}
26 48
27 49
int main(int argc, char **argv) {
28
	void *mem = malloc(MAX_MEMORY);
50
	int *mem = (int*)malloc(MAX_MEMORY * sizeof(int));
29 51
	if (mem == NULL) {
30 52
		perror("malloc");
31 53
		exit(1);
32 54
	}
55
	memset(mem, 0, MAX_MEMORY * sizeof(int));
33 56
	int val = scheme_entry(mem);
34
	if ((val & fixnum_mask) == fixnum_tag) {
35
		printf("%d\n", val >> fixnum_shift);
36
	} else if ((val & char_mask) == char_tag) {
37
		printf("#\\%c\n", val >> char_shift);
38
	} else if ((val & boolean_mask) == boolean_tag) {
39
		printf("#%s\n", (val >> boolean_shift) == 1 ? "t" : "f");
40
	} else if ((val & cons_mask) == cons_tag) {
41
		printf("cons!\n");
42
	} else if (val == empty_list) {
43
		printf("()\n");
44
	} else {
45
		printf("Error: unhandled value: %d\n", val);
46
		return 1;
47
	}
57
	print_value(&val);
58
	printf("\n");
48 59
	return 0;
49 60
}