summaryrefslogtreecommitdiff
path: root/src/user/app/kbasic/commands.c
blob: b88e57e25dfa7b41bf64c7833e4300aa00a5773b (plain) (blame)
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#include "basic.h"

static int fg_color = 7, bg_color = 0;


/* Assign a variable a value. */
void assignment()
{
	int *var;
	int value;

	/* get the variable name */
	get_token();
	if(!isalpha(*token)) {
		serror(4);
		return;
	}

	var = find_var(token);

	/* get the equals sign */
	get_token();
	if(*token!='=') {
		serror(3);
		return;
	}

	/* get the value to assign to var */
	get_exp(&value);

	/* assign the value */
	*var = value;
}

/* Execute a simple version of the BASIC PRINT statement */
void exec_print()
{
	int answer;
	int len=0, spaces;
	char last_delim;

	do {
		get_token(); /* get next list item */
		if(tok==EOL || tok==FINISHED) break;
		if(token_type==QUOTE) { /* is string */
			printf("%s", token);
			len += strlen(token);
			get_token();
		}
		else { /* is expression */
			putback();
			get_exp(&answer);
			get_token();
			len += printf("%d", answer);
		}
		last_delim = *token; 

		if(*token==';') {
			/* compute number of spaces to move to next tab */
			spaces = 8 - (len % 8); 
			len += spaces; /* add in the tabbing position */
			while(spaces) { 
				printf(" ");
				spaces--;
			}
		}
		else if(*token==',') /* do nothing */;
		else if(tok!=EOL && tok!=FINISHED) serror(0); 
	} while (*token==';' || *token==',');

	if(tok==EOL || tok==FINISHED) {
		if(last_delim != ';' && last_delim!=',') printf("\n");
	}
	else serror(0); /* error is not , or ; */

}

/* Execute a simple form of the BASIC INPUT command */
void input()
{
	int *var;
	int tmp;

	get_token(); /* see if prompt string is present */
	if(token_type==QUOTE) {
		printf("%s", token); /* if so, print it and check for comma */
		get_token();
		if(*token!=',') serror(1);
		get_token();
	}
	else printf("? "); /* otherwise, prompt with / */

	var = find_var(token); /* get the input var */

	scanf("%d", var); /* read input */

	/* flush input */
	while ((tmp = getchar()) != '\n' && tmp != EOF);
}


/* COLOR statement */
void color() {
	get_exp(&fg_color);

	get_token();
	if (*token == ',') {
		get_exp(&bg_color);
	} else if (token_type != DELIMITER) {
		serror(0);
	}
	set_color();
}

void set_color() {
	printf("\x1b[%dm\x1b[%dm\x1b[%dm", fg_color % 8 + 30, (fg_color > 7 ? 1 : 22), bg_color % 16 + 40);
}