1*84d9c625SLionel Sambuc /* $NetBSD: term_private.h,v 1.11 2013/01/24 10:41:28 roy Exp $ */ 251e66a47SVivek Prakash 351e66a47SVivek Prakash /* 4*84d9c625SLionel Sambuc * Copyright (c) 2009, 2010, 2013 The NetBSD Foundation, Inc. 551e66a47SVivek Prakash * 651e66a47SVivek Prakash * This code is derived from software contributed to The NetBSD Foundation 751e66a47SVivek Prakash * by Roy Marples. 851e66a47SVivek Prakash * 951e66a47SVivek Prakash * Redistribution and use in source and binary forms, with or without 1051e66a47SVivek Prakash * modification, are permitted provided that the following conditions 1151e66a47SVivek Prakash * are met: 1251e66a47SVivek Prakash * 1. Redistributions of source code must retain the above copyright 1351e66a47SVivek Prakash * notice, this list of conditions and the following disclaimer. 1451e66a47SVivek Prakash * 2. Redistributions in binary form must reproduce the above copyright 1551e66a47SVivek Prakash * notice, this list of conditions and the following disclaimer in the 1651e66a47SVivek Prakash * documentation and/or other materials provided with the distribution. 1751e66a47SVivek Prakash * 1851e66a47SVivek Prakash * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1951e66a47SVivek Prakash * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2051e66a47SVivek Prakash * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2151e66a47SVivek Prakash * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2251e66a47SVivek Prakash * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2351e66a47SVivek Prakash * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2451e66a47SVivek Prakash * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2551e66a47SVivek Prakash * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2651e66a47SVivek Prakash * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2751e66a47SVivek Prakash * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2851e66a47SVivek Prakash */ 2951e66a47SVivek Prakash 3051e66a47SVivek Prakash #ifndef _TERM_PRIVATE_H_ 3151e66a47SVivek Prakash #define _TERM_PRIVATE_H_ 3251e66a47SVivek Prakash 3351e66a47SVivek Prakash /* This header should only be used by libterminfo, tic and infocmp. */ 3451e66a47SVivek Prakash 3551e66a47SVivek Prakash /* The terminfo database structure is private to us, 3651e66a47SVivek Prakash * so it's documented here. 3751e66a47SVivek Prakash * terminfo defines the largest number as 32767 and the largest 3851e66a47SVivek Prakash * compiled entry as 4093 bytes long. 3951e66a47SVivek Prakash * Thus, we store all numbers as uint16_t, including string length. 4051e66a47SVivek Prakash * All strings are prefixed by length, including the null terminator. 4151e66a47SVivek Prakash * The largest string length we can handle is 65535 bytes, 4251e66a47SVivek Prakash * including the null terminator. 4351e66a47SVivek Prakash * The largest capability block we can handle is 65535 bytes. 4451e66a47SVivek Prakash * This means that we exceed the current terminfo defined limits. 450c3ae37fSLionel Sambuc * 460c3ae37fSLionel Sambuc * Version 1 capabilities are defined as: 470c3ae37fSLionel Sambuc * header byte (always 1) 480c3ae37fSLionel Sambuc * name 4951e66a47SVivek Prakash * description, 5051e66a47SVivek Prakash * cap length, num flags, index, char, 5151e66a47SVivek Prakash * cap length, num numbers, index, number, 5251e66a47SVivek Prakash * cap length, num strings, index, string, 530c3ae37fSLionel Sambuc * cap length, num undefined caps, name, type (char), flag, number, string 540c3ae37fSLionel Sambuc * 550c3ae37fSLionel Sambuc * Version 2 entries are aliases and defined as: 560c3ae37fSLionel Sambuc * header byte (always 2) 570c3ae37fSLionel Sambuc * 32bit id of the corresponding terminal in the file 580c3ae37fSLionel Sambuc * name 590c3ae37fSLionel Sambuc * 600c3ae37fSLionel Sambuc * The database itself is created using cdbw(3) and the numbers are 6151e66a47SVivek Prakash * always stored as little endian. 6251e66a47SVivek Prakash */ 6351e66a47SVivek Prakash 6451e66a47SVivek Prakash #include <sys/types.h> 6551e66a47SVivek Prakash 6651e66a47SVivek Prakash #define _TERMINFO 6751e66a47SVivek Prakash 6851e66a47SVivek Prakash /* We use the same ncurses tic macros so that our data is identical 6951e66a47SVivek Prakash * when a caller uses the long name macros to access te terminfo data 7051e66a47SVivek Prakash * directly. */ 7151e66a47SVivek Prakash #define ABSENT_BOOLEAN ((signed char)-1) /* 255 */ 7251e66a47SVivek Prakash #define ABSENT_NUMERIC (-1) 7351e66a47SVivek Prakash #define ABSENT_STRING (char *)0 7451e66a47SVivek Prakash #define CANCELLED_BOOLEAN ((signed char)-2) /* 254 */ 7551e66a47SVivek Prakash #define CANCELLED_NUMERIC (-2) 7651e66a47SVivek Prakash #define CANCELLED_STRING (char *)(-1) 7751e66a47SVivek Prakash #define VALID_BOOLEAN(s) ((unsigned char)(s) <= 1) /* reject "-1" */ 7851e66a47SVivek Prakash #define VALID_NUMERIC(s) ((s) >= 0) 7951e66a47SVivek Prakash #define VALID_STRING(s) ((s) != CANCELLED_STRING && (s) != ABSENT_STRING) 8051e66a47SVivek Prakash 8151e66a47SVivek Prakash typedef struct { 8251e66a47SVivek Prakash const char *id; 8351e66a47SVivek Prakash char type; 8451e66a47SVivek Prakash char flag; 8551e66a47SVivek Prakash short num; 8651e66a47SVivek Prakash const char *str; 8751e66a47SVivek Prakash } TERMUSERDEF; 8851e66a47SVivek Prakash 8951e66a47SVivek Prakash typedef struct { 9051e66a47SVivek Prakash int fildes; 9151e66a47SVivek Prakash /* We need to expose these so that the macros work */ 9251e66a47SVivek Prakash const char *name; 9351e66a47SVivek Prakash const char *desc; 9451e66a47SVivek Prakash signed char *flags; 9551e66a47SVivek Prakash short *nums; 9651e66a47SVivek Prakash const char **strs; 9751e66a47SVivek Prakash /* Storage area for terminfo data */ 9851e66a47SVivek Prakash char *_area; 9951e66a47SVivek Prakash size_t _arealen; 10051e66a47SVivek Prakash size_t _nuserdefs; 10151e66a47SVivek Prakash TERMUSERDEF *_userdefs; 10251e66a47SVivek Prakash /* So we don't rely on the global ospeed */ 10351e66a47SVivek Prakash short _ospeed; 10451e66a47SVivek Prakash /* Output buffer for tparm */ 10551e66a47SVivek Prakash char *_buf; 10651e66a47SVivek Prakash size_t _buflen; 10751e66a47SVivek Prakash size_t _bufpos; 10851e66a47SVivek Prakash /* A-Z static variables for tparm */ 10951e66a47SVivek Prakash long _snums[26]; 11051e66a47SVivek Prakash /* aliases of the terminal, | separated */ 11151e66a47SVivek Prakash const char *_alias; 11251e66a47SVivek Prakash } TERMINAL; 11351e66a47SVivek Prakash 11451e66a47SVivek Prakash extern const char * _ti_database; 11551e66a47SVivek Prakash 11651e66a47SVivek Prakash ssize_t _ti_flagindex(const char *); 11751e66a47SVivek Prakash ssize_t _ti_numindex(const char *); 11851e66a47SVivek Prakash ssize_t _ti_strindex(const char *); 11951e66a47SVivek Prakash const char * _ti_flagid(ssize_t); 12051e66a47SVivek Prakash const char * _ti_numid(ssize_t); 12151e66a47SVivek Prakash const char * _ti_strid(ssize_t); 12251e66a47SVivek Prakash int _ti_getterm(TERMINAL *, const char *, int); 12351e66a47SVivek Prakash void _ti_setospeed(TERMINAL *); 12451e66a47SVivek Prakash 12551e66a47SVivek Prakash /* libterminfo can compile terminfo strings too */ 12651e66a47SVivek Prakash #define TIC_WARNING (1 << 0) 12751e66a47SVivek Prakash #define TIC_DESCRIPTION (1 << 1) 12851e66a47SVivek Prakash #define TIC_ALIAS (1 << 2) 12951e66a47SVivek Prakash #define TIC_COMMENT (1 << 3) 13051e66a47SVivek Prakash #define TIC_EXTRA (1 << 4) 13151e66a47SVivek Prakash 13251e66a47SVivek Prakash #define UINT16_T_MAX 0xffff 13351e66a47SVivek Prakash 13451e66a47SVivek Prakash typedef struct { 13551e66a47SVivek Prakash char *buf; 13651e66a47SVivek Prakash size_t buflen; 13751e66a47SVivek Prakash size_t bufpos; 13851e66a47SVivek Prakash size_t entries; 13951e66a47SVivek Prakash } TBUF; 14051e66a47SVivek Prakash 14151e66a47SVivek Prakash typedef struct { 14251e66a47SVivek Prakash char *name; 14351e66a47SVivek Prakash char *alias; 14451e66a47SVivek Prakash char *desc; 14551e66a47SVivek Prakash TBUF flags; 14651e66a47SVivek Prakash TBUF nums; 14751e66a47SVivek Prakash TBUF strs; 14851e66a47SVivek Prakash TBUF extras; 14951e66a47SVivek Prakash } TIC; 15051e66a47SVivek Prakash 15151e66a47SVivek Prakash char *_ti_grow_tbuf(TBUF *, size_t); 15251e66a47SVivek Prakash char *_ti_get_token(char **, char); 15351e66a47SVivek Prakash char *_ti_find_cap(TBUF *, char, short); 15451e66a47SVivek Prakash char *_ti_find_extra(TBUF *, const char *); 15551e66a47SVivek Prakash size_t _ti_store_extra(TIC *, int, char *, char, char, short, 15651e66a47SVivek Prakash char *, size_t, int); 15751e66a47SVivek Prakash TIC *_ti_compile(char *, int); 15851e66a47SVivek Prakash ssize_t _ti_flatten(uint8_t **, const TIC *); 15951e66a47SVivek Prakash void _ti_freetic(TIC *); 160*84d9c625SLionel Sambuc 161*84d9c625SLionel Sambuc #define TPARM_MAX 9 /* not likely to change */ 162*84d9c625SLionel Sambuc int _ti_parm_analyse(const char *, int *, int); 16351e66a47SVivek Prakash #endif 164