Version 5.0.0-rc3 started.
[mp-5.x.git] / mp_keyseq.mpsl
blobaf777fb4990390a1bba7111a41b6114d083218b2
1 /*
3     Minimum Profit 5.x
4     A Programmer's Text Editor
6     Key sequences support (mainly for ANSI strings).
8     Copyright (C) 1991-2007 Angel Ortega <angel@triptico.com>
10     This program is free software; you can redistribute it and/or
11     modify it under the terms of the GNU General Public License
12     as published by the Free Software Foundation; either version 2
13     of the License, or (at your option) any later version.
15     This program is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18     GNU General Public License for more details.
20     You should have received a copy of the GNU General Public License
21     along with this program; if not, write to the Free Software
22     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24     http://www.triptico.com
28 mp.keyseq = {
29         'store'         => {},
30         'pending'       => [],
31         'tmp'           => [],
32         'ptr'           => NULL
35 sub mp.pending_key() { shift(mp.keyseq.pending); }
37 sub mp.process_keyseq(key)
39         local k;
41         if(mp.keyseq.ptr == NULL)
42                 mp.keyseq.ptr = mp.keyseq.store;
44         /* store the key in the temporal queue */
45         push(mp.keyseq.tmp, key);
47         /* get the key in the current pointer */
48         k = mp.keyseq.ptr[key];
50         if(k == NULL)
51         {
52                 /* no hash for key? string not found;
53                    return back all the stored keys
54                    and restart over */
55                 mp.keyseq.pending = mp.keyseq.tmp;
56                 mp.keyseq.tmp = [];
57                 key = mp.pending_key();
58                 mp.keyseq.ptr = NULL;
59         }
60         else
61         if(is_hash(k))
62         {
63                 /* is the value itself a hash? keep searching */
64                 mp.keyseq.ptr = k;
65                 key = NULL;
66         }
67         else
68         {
69                 /* value is scalar; it's the keycode, so
70                    return it and restart over */
71                 key = k;
72                 mp.keyseq.pending = [];
73                 mp.keyseq.tmp = [];
74                 mp.keyseq.ptr = NULL;
75         }
77         return(key);
81 sub mp.add_keyseq(seq, keycode)
83         local p = mp.keyseq.store;
84         local l = split(NULL, seq);
85         local v = pop(l);
87         /* split by character and store as a chain of hashes
88            with the keycode as the final, scalar value */
89         foreach(local k, l)
90         {
91                 if(! p[k]) p[k] = {};
92                 p = p[k];
93         }
95         p[v] = keycode;