2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License, Version 1.0 only
2N/A * (the "License"). You may not use this file except in compliance
2N/A * with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A/*
2N/A * Copyright 1997 Sun Microsystems, Inc. All rights reserved.
2N/A * Use is subject to license terms.
2N/A */
2N/A
2N/A/* Copyright (c) 1988 AT&T */
2N/A/* All Rights Reserved */
2N/A
2N/A/*
2N/A * University Copyright- Copyright (c) 1982, 1986, 1988
2N/A * The Regents of the University of California
2N/A * All Rights Reserved
2N/A *
2N/A * University Acknowledgment- Portions of this document are derived from
2N/A * software developed by the University of California, Berkeley, and its
2N/A * contributors.
2N/A */
2N/A
2N/A#pragma ident "%Z%%M% %I% %E% SMI"
2N/A
2N/A/*LINTLIBRARY*/
2N/A
2N/A#include <stdlib.h>
2N/A#include <string.h>
2N/A#include <sys/types.h>
2N/A#include "curses_inc.h"
2N/A
2N/A/*
2N/A * Set a new key or a new macro.
2N/A *
2N/A * rcvchars: the pattern identifying the key
2N/A * keyval: the value to return when the key is recognized
2N/A * macro: if this is not a function key but a macro,
2N/A * tgetch() will block on macros.
2N/A */
2N/A
2N/Aint
2N/Anewkey(char *rcvchars, short keyval, bool macro)
2N/A{
2N/A _KEY_MAP **keys, *key_info,
2N/A **prev_keys = cur_term->_keys;
2N/A short *numkeys = &cur_term->_ksz;
2N/A char *str;
2N/A size_t len;
2N/A
2N/A if ((!rcvchars) || (*rcvchars == '\0') || (keyval < 0) ||
2N/A (((keys = (_KEY_MAP **) malloc(sizeof (_KEY_MAP *) *
2N/A (*numkeys + 1))) == NULL))) {
2N/A goto bad;
2N/A }
2N/A
2N/A len = strlen(rcvchars) + 1;
2N/A
2N/A if ((key_info = (_KEY_MAP *) malloc(sizeof (_KEY_MAP) + len)) ==
2N/A NULL) {
2N/A free(keys);
2N/Abad :
2N/A term_errno = TERM_BAD_MALLOC;
2N/A#ifdef DEBUG
2N/A strcpy(term_parm_err, "newkey");
2N/A#endif /* DEBUG */
2N/A return (ERR);
2N/A }
2N/A
2N/A if (macro) {
2N/A (void) memcpy((char *) keys, (char *) prev_keys,
2N/A (*numkeys * sizeof (_KEY_MAP *)));
2N/A keys[*numkeys] = key_info;
2N/A } else {
2N/A short *first = &(cur_term->_first_macro);
2N/A
2N/A (void) memcpy((char *) keys, (char *) prev_keys,
2N/A (*first * sizeof (_KEY_MAP *)));
2N/A (void) memcpy((char *) &(keys[*first + 1]),
2N/A (char *) &(prev_keys[*first]),
2N/A ((*numkeys - *first) * sizeof (_KEY_MAP *)));
2N/A keys[(*first)++] = key_info;
2N/A cur_term->_lastmacro_ordered++;
2N/A }
2N/A if (prev_keys != NULL)
2N/A free(prev_keys);
2N/A cur_term->_keys = keys;
2N/A
2N/A (*numkeys)++;
2N/A key_info->_sends = str = (char *) key_info + sizeof (_KEY_MAP);
2N/A (void) memcpy(str, rcvchars, len);
2N/A key_info->_keyval = keyval;
2N/A cur_term->funckeystarter[*str] |= (macro ? _MACRO : _KEY);
2N/A
2N/A return (OK);
2N/A}