Skip to content

Commit 028f94d

Browse files
committed
COMMON: implement DEFINEKEY undo #92
1 parent 4a84e59 commit 028f94d

File tree

5 files changed

+85
-12
lines changed

5 files changed

+85
-12
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
sub foo
2+
? "f"
3+
end
4+
5+
definekey 2, foo
6+
definekey 1, foo
7+
definekey 1, foo
8+
definekey 1, foo
9+
definekey 1, 1
10+
definekey 1, 2
11+
definekey 1, 3
12+
definekey 1, 2
13+
definekey 1, 3
14+
definekey 2, 0
15+
definekey 2, 0
16+
definekey 2, 0
17+
definekey 2, 0
18+
19+
definekey asc("x"), foo
20+
definekey asc("x"), foo
21+
definekey asc("y"), foo
22+
definekey asc("z"), foo
23+
definekey asc("f"), foo
24+
definekey asc("x"), 0
25+
definekey asc("y"), 0
26+
definekey asc("z"), 0
27+
28+
if (instr(sbver, "SDL") <> 0) then
29+
while 1
30+
? ".";
31+
delay 10
32+
wend
33+
endif
34+

src/common/blib.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2835,14 +2835,20 @@ void cmd_definekey(void) {
28352835

28362836
if (!prog_error) {
28372837
par_getcomma();
2838-
2839-
if (code_peek() != kwTYPE_CALL_UDF) {
2840-
err_syntax(kwDEFINEKEY, "%I,%G");
2841-
} else {
2838+
switch (code_peek()) {
2839+
case kwTYPE_INT:
2840+
prog_ip++;
2841+
keymap_remove(key, code_getint());
2842+
break;
2843+
case kwTYPE_CALL_UDF:
28422844
keymap_add(key, prog_ip);
28432845

28442846
// skip ahead to avoid immediate call
28452847
prog_ip += BC_CTRLSZ + 1;
2848+
break;
2849+
default:
2850+
err_syntax(kwDEFINEKEY, "%I,%G");
2851+
break;
28462852
}
28472853
}
28482854
v_free(&var);

src/common/keymap.c

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ struct key_map_s {
3030
int key; // key definition
3131
};
3232

33-
key_map_s* keymap = 0;
33+
key_map_s *keymap = 0;
3434

3535
/**
3636
* Prepare task_t exec.keymap for keymap handling at program init
@@ -42,7 +42,7 @@ void keymap_init() {
4242
/**
4343
* Handler for keymap_free()
4444
*/
45-
void keymap_delete(key_map_s* km) {
45+
void keymap_delete(key_map_s *km) {
4646
if (km) {
4747
keymap_delete(km->next);
4848
free(km);
@@ -61,13 +61,13 @@ void keymap_free() {
6161
* DEFINEKEY command handler to add a keymap
6262
*/
6363
void keymap_add(uint32_t key, bcip_t ip) {
64-
key_map_s* km = (key_map_s*) malloc(sizeof (key_map_s));
64+
key_map_s *km = (key_map_s *)malloc(sizeof(key_map_s));
6565
km->next = 0;
6666
km->ip = ip;
6767
km->key = key;
6868

6969
// add the new mapping onto the linked list
70-
key_map_s* head = keymap;
70+
key_map_s *head = keymap;
7171
if (!head) {
7272
keymap = km;
7373
} else {
@@ -78,12 +78,44 @@ void keymap_add(uint32_t key, bcip_t ip) {
7878
}
7979
}
8080

81+
/**
82+
* DEFINEKEY key, 0
83+
*/
84+
void keymap_remove(uint32_t key, int level) {
85+
key_map_s *head = keymap;
86+
key_map_s *prev = head;
87+
int size = 0;
88+
89+
while (head) {
90+
if (head->key == key) {
91+
key_map_s *current = head;
92+
prev->next = head->next;
93+
head = head->next;
94+
free(current);
95+
if (current == prev) {
96+
prev = head;
97+
}
98+
if (current == keymap) {
99+
keymap = head;
100+
}
101+
} else {
102+
prev = head;
103+
head = head->next;
104+
size++;
105+
}
106+
}
107+
if (!size) {
108+
keymap = 0;
109+
}
110+
}
111+
112+
81113
/**
82114
* invokes the handler for the given key
83115
*/
84116
int keymap_invoke(uint32_t key) {
85117
int result = 0;
86-
key_map_s* head = keymap;
118+
key_map_s *head = keymap;
87119
while (head) {
88120
if (head->key == key) {
89121
bcip_t ip = prog_ip; // store current ip
@@ -175,7 +207,7 @@ void timer_free(timer_s *timer) {
175207
}
176208

177209
void timer_add(var_num_t interval, bcip_t ip) {
178-
timer_s* timer = (timer_s*) malloc(sizeof (timer_s));
210+
timer_s *timer = (timer_s *)malloc(sizeof (timer_s));
179211
timer->next = NULL;
180212
timer->ip = ip;
181213
timer->interval = interval;
@@ -195,7 +227,7 @@ void timer_add(var_num_t interval, bcip_t ip) {
195227
}
196228

197229
void timer_run(uint32_t now) {
198-
timer_s* timer = prog_timer;
230+
timer_s *timer = prog_timer;
199231
while (timer) {
200232
if (timer->value == 0) {
201233
// start timer

src/common/keymap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ extern "C" {
8787
void keymap_init();
8888
void keymap_free();
8989
void keymap_add(uint32_t key, bcip_t ip);
90+
void keymap_remove(uint32_t key, int level);
9091
int keymap_invoke(uint32_t key);
9192
int keymap_kbhit();
9293
int keymap_kbpeek();

src/platform/console/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ TEST_DIR=../../../samples/distro-examples/tests
2828
UNIT_TESTS=array break byref eval-test iifs matrices metaa ongoto \
2929
uds hash pass1 call_tau short-circuit strings stack-test \
3030
replace-test read-data proc optchk letbug ptr ref \
31-
trycatch chain stream-files split-join sprint all scope goto
31+
trycatch chain stream-files split-join sprint all scope goto keymap
3232

3333
test: ${bin_PROGRAMS}
3434
@for utest in $(UNIT_TESTS); do \

0 commit comments

Comments
 (0)