163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * Copyright (c) 2004 Tim J. Robbins.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * All rights reserved.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * Redistribution and use in source and binary forms, with or without
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * modification, are permitted provided that the following conditions
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * 1. Redistributions of source code must retain the above copyright
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * notice, this list of conditions and the following disclaimer.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * 2. Redistributions in binary form must reproduce the above copyright
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * notice, this list of conditions and the following disclaimer in the
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * documentation and/or other materials provided with the distribution.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * SUCH DAMAGE.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * "Character map" ADT. Stores mappings between pairs of characters in a
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * splay tree, with a lookup table cache to simplify looking up the first
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * bunch of characters (which are presumably more common than others).
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amorestatic struct cmapnode *cmap_splay(struct cmapnode *, wint_t);
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * cmap_alloc --
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * Allocate a character map.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * cmap_add --
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * Add a mapping from "from" to "to" to the map.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amorecmap_add(struct cmap *cm, wint_t from, wint_t to)
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore return (false);
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore return (true);
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore cmn = cm->cm_root = cmap_splay(cm->cm_root, from);
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore return (true);
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore return (false);
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore return (true);
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * cmap_lookup_hard --
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * Look up the mapping for a character without using the cache.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore return (cm->cm_def == CM_DEF_SELF ? ch : cm->cm_def);
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * cmap_cache --
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * Update the cache.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore cm->cm_cache[ch] = cmap_lookup_hard(cm, ch);
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * cmap_default --
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * Change the value that characters without mappings map to, and
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * return the old value. The special character value CM_MAP_SELF
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * means characters map to themselves.
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amorestatic struct cmapnode *
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore struct cmapnode N, *l, *r, *y;
163bd69b3c164dda2a59c7f08ca788e7d6ba9beaGarrett D'Amore * Based on public domain code from Sleator.