Lines Matching +full:no +full:- +full:map
3 /*-
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46 * the extended-key map.
48 * An extended-key (key) is a sequence of keystrokes introduced
50 * number of characters. This module maintains a map (the
51 * el->el_keymacro.map)
52 * to convert these extended-key sequences into input strs
58 * are in el->el_keymacro.map, adding the key "abc" will cause
62 * -------------
73 * The Nodes of the el->el_keymacro.map. The el->el_keymacro.map is a
108 el->el_keymacro.buf = el_calloc(KEY_BUFSIZ, in keymacro_init()
109 sizeof(*el->el_keymacro.buf)); in keymacro_init()
110 if (el->el_keymacro.buf == NULL) in keymacro_init()
111 return -1; in keymacro_init()
112 el->el_keymacro.map = NULL; in keymacro_init()
124 el_free(el->el_keymacro.buf); in keymacro_end()
125 el->el_keymacro.buf = NULL; in keymacro_end()
126 node__free(el->el_keymacro.map); in keymacro_end()
137 el->el_keymacro.val.cmd = (el_action_t) cmd; in keymacro_map_cmd()
138 return &el->el_keymacro.val; in keymacro_map_cmd()
149 el->el_keymacro.val.str = str; in keymacro_map_str()
150 return &el->el_keymacro.val; in keymacro_map_str()
155 * Takes all nodes on el->el_keymacro.map and puts them on free list.
156 * Then initializes el->el_keymacro.map with arrow keys
163 node__put(el, el->el_keymacro.map); in keymacro_reset()
164 el->el_keymacro.map = NULL; in keymacro_reset()
170 * Calls the recursive function with entry point el->el_keymacro.map
171 * Looks up *ch in map and then reads characters until a
174 * Returns NULL in val.str and XK_STR for no match.
182 return node_trav(el, el->el_keymacro.map, ch, val); in keymacro_get()
187 * Adds key to the el->el_keymacro.map and associates the value in
188 * val with it. If key is already is in el->el_keymacro.map, the new
198 (void) fprintf(el->el_errfile, in keymacro_add()
199 "keymacro_add: Null extended-key not allowed.\n"); in keymacro_add()
202 if (ntype == XK_CMD && val->cmd == ED_SEQUENCE_LEAD_IN) { in keymacro_add()
203 (void) fprintf(el->el_errfile, in keymacro_add()
204 "keymacro_add: sequence-lead-in command not allowed\n"); in keymacro_add()
207 if (el->el_keymacro.map == NULL) in keymacro_add()
209 el->el_keymacro.map = node__get(key[0]); in keymacro_add()
212 /* Now recurse through el->el_keymacro.map */ in keymacro_add()
213 (void) node__try(el, el->el_keymacro.map, key, val, ntype); in keymacro_add()
222 keymacro_clear(EditLine *el, el_action_t *map, const wchar_t *in) in keymacro_clear() argument
224 if (*in > N_KEYS) /* can't be in the map */ in keymacro_clear()
226 if ((map[(unsigned char)*in] == ED_SEQUENCE_LEAD_IN) && in keymacro_clear()
227 ((map == el->el_map.key && in keymacro_clear()
228 el->el_map.alt[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN) || in keymacro_clear()
229 (map == el->el_map.alt && in keymacro_clear()
230 el->el_map.key[(unsigned char)*in] != ED_SEQUENCE_LEAD_IN))) in keymacro_clear()
244 (void) fprintf(el->el_errfile, in keymacro_delete()
245 "keymacro_delete: Null extended-key not allowed.\n"); in keymacro_delete()
246 return -1; in keymacro_delete()
248 if (el->el_keymacro.map == NULL) in keymacro_delete()
251 (void) node__delete(el, &el->el_keymacro.map, key); in keymacro_delete()
258 * Print entire el->el_keymacro.map if null
264 /* do nothing if el->el_keymacro.map is empty and null key specified */ in keymacro_print()
265 if (el->el_keymacro.map == NULL && *key == 0) in keymacro_print()
268 el->el_keymacro.buf[0] = '"'; in keymacro_print()
269 if (node_lookup(el, key, el->el_keymacro.map, (size_t)1) <= -1) in keymacro_print()
271 (void) fprintf(el->el_errfile, "Unbound extended key \"%ls" in keymacro_print()
286 if (ptr->ch == *ch) { in node_trav()
288 if (ptr->next) { in node_trav()
292 return node_trav(el, ptr->next, ch, val); in node_trav()
294 *val = ptr->val; in node_trav()
295 if (ptr->type != XK_CMD) in node_trav()
297 return ptr->type; in node_trav()
300 /* no match found here */ in node_trav()
301 if (ptr->sibling) { in node_trav()
303 return node_trav(el, ptr->sibling, ch, val); in node_trav()
305 /* no next sibling -- mismatch */ in node_trav()
306 val->str = NULL; in node_trav()
321 if (ptr->ch != *str) { in node__try()
324 for (xm = ptr; xm->sibling != NULL; xm = xm->sibling) in node__try()
325 if (xm->sibling->ch == *str) in node__try()
327 if (xm->sibling == NULL) in node__try()
328 xm->sibling = node__get(*str); /* setup new node */ in node__try()
329 ptr = xm->sibling; in node__try()
333 if (ptr->next != NULL) { in node__try()
334 node__put(el, ptr->next); in node__try()
336 ptr->next = NULL; in node__try()
338 switch (ptr->type) { in node__try()
343 if (ptr->val.str) in node__try()
344 el_free(ptr->val.str); in node__try()
347 EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", in node__try()
348 ptr->type)); in node__try()
352 switch (ptr->type = ntype) { in node__try()
354 ptr->val = *val; in node__try()
357 if ((ptr->val.str = wcsdup(val->str)) == NULL) in node__try()
358 return -1; in node__try()
361 EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype)); in node__try()
366 if (ptr->next == NULL) in node__try()
367 ptr->next = node__get(*str); /* setup new node */ in node__try()
368 (void) node__try(el, ptr->next, str, val, ntype); in node__try()
385 if (ptr->ch != *str) { in node__delete()
388 for (xm = ptr; xm->sibling != NULL; xm = xm->sibling) in node__delete()
389 if (xm->sibling->ch == *str) in node__delete()
391 if (xm->sibling == NULL) in node__delete()
394 ptr = xm->sibling; in node__delete()
399 *inptr = ptr->sibling; in node__delete()
401 prev_ptr->sibling = ptr->sibling; in node__delete()
402 ptr->sibling = NULL; in node__delete()
405 } else if (ptr->next != NULL && in node__delete()
406 node__delete(el, &ptr->next, str) == 1) { in node__delete()
407 if (ptr->next != NULL) in node__delete()
410 *inptr = ptr->sibling; in node__delete()
412 prev_ptr->sibling = ptr->sibling; in node__delete()
413 ptr->sibling = NULL; in node__delete()
431 if (ptr->next != NULL) { in node__put()
432 node__put(el, ptr->next); in node__put()
433 ptr->next = NULL; in node__put()
435 node__put(el, ptr->sibling); in node__put()
437 switch (ptr->type) { in node__put()
442 if (ptr->val.str != NULL) in node__put()
443 el_free(ptr->val.str); in node__put()
446 EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ptr->type)); in node__put()
464 ptr->ch = ch; in node__get()
465 ptr->type = XK_NOD; in node__get()
466 ptr->val.str = NULL; in node__get()
467 ptr->next = NULL; in node__get()
468 ptr->sibling = NULL; in node__get()
477 node__free(k->sibling); in node__free()
478 node__free(k->next); in node__free()
493 return -1; /* cannot have null ptr */ in node_lookup()
496 /* no more chars in str. node_enum from here. */ in node_lookup()
500 /* If match put this char into el->el_keymacro.buf. Recurse */ in node_lookup()
501 if (ptr->ch == *str) { in node_lookup()
503 used = ct_visual_char(el->el_keymacro.buf + cnt, in node_lookup()
504 KEY_BUFSIZ - cnt, ptr->ch); in node_lookup()
505 if (used == -1) in node_lookup()
506 return -1; /* ran out of buffer space */ in node_lookup()
507 if (ptr->next != NULL) in node_lookup()
509 return (node_lookup(el, str + 1, ptr->next, in node_lookup()
515 el->el_keymacro.buf[px] = '"'; in node_lookup()
516 el->el_keymacro.buf[px + 1] = '\0'; in node_lookup()
517 keymacro_kprint(el, el->el_keymacro.buf, in node_lookup()
518 &ptr->val, ptr->type); in node_lookup()
521 return -1; in node_lookup()
522 /* mismatch -- str still has chars */ in node_lookup()
525 /* no match found try sibling */ in node_lookup()
526 if (ptr->sibling) in node_lookup()
527 return (node_lookup(el, str, ptr->sibling, in node_lookup()
530 return -1; in node_lookup()
544 if (cnt >= KEY_BUFSIZ - 5) { /* buffer too small */ in node_enum()
545 el->el_keymacro.buf[++cnt] = '"'; in node_enum()
546 el->el_keymacro.buf[++cnt] = '\0'; in node_enum()
547 (void) fprintf(el->el_errfile, in node_enum()
549 (void) fprintf(el->el_errfile, " \"%ls...\"\n", in node_enum()
550 el->el_keymacro.buf); in node_enum()
555 (void) fprintf(el->el_errfile, in node_enum()
558 return -1; in node_enum()
561 used = ct_visual_char(el->el_keymacro.buf + cnt, KEY_BUFSIZ - cnt, in node_enum()
562 ptr->ch); in node_enum()
563 if (ptr->next == NULL) { in node_enum()
565 el->el_keymacro.buf[cnt + (size_t)used ] = '"'; in node_enum()
566 el->el_keymacro.buf[cnt + (size_t)used + 1] = '\0'; in node_enum()
567 keymacro_kprint(el, el->el_keymacro.buf, &ptr->val, ptr->type); in node_enum()
569 (void) node_enum(el, ptr->next, cnt + (size_t)used); in node_enum()
572 if (ptr->sibling) in node_enum()
573 (void) node_enum(el, ptr->sibling, cnt); in node_enum()
588 static const char fmt[] = "%-15s-> %s\n"; in keymacro_kprint()
593 (void) keymacro__decode_str(val->str, unparsbuf, in keymacro_kprint()
596 (void) fprintf(el->el_outfile, fmt, in keymacro_kprint()
597 ct_encode_string(key, &el->el_scratch), unparsbuf); in keymacro_kprint()
600 for (fp = el->el_map.help; fp->name; fp++) in keymacro_kprint()
601 if (val->cmd == fp->func) { in keymacro_kprint()
602 wcstombs(unparsbuf, fp->name, sizeof(unparsbuf)); in keymacro_kprint()
603 unparsbuf[sizeof(unparsbuf) -1] = '\0'; in keymacro_kprint()
604 (void) fprintf(el->el_outfile, fmt, in keymacro_kprint()
605 ct_encode_string(key, &el->el_scratch), unparsbuf); in keymacro_kprint()
609 if (fp->name == NULL) in keymacro_kprint()
610 (void) fprintf(el->el_outfile, in keymacro_kprint()
616 EL_ABORT((el->el_errfile, "Bad XK_ type %d\n", ntype)); in keymacro_kprint()
620 (void) fprintf(el->el_outfile, fmt, ct_encode_string(key, in keymacro_kprint()
621 &el->el_scratch), "no input"); in keymacro_kprint()
653 while (l-- > 0) { in keymacro__decode_str()
654 ssize_t n = ct_encode_char(b, (size_t)(eb - b), *p2++); in keymacro__decode_str()
655 if (n == -1) /* ran out of space */ in keymacro__decode_str()
666 if ((size_t)(b - buf) >= len) in keymacro__decode_str()
667 buf[len - 1] = '\0'; in keymacro__decode_str()
668 return (size_t)(b - buf); in keymacro__decode_str()