<!-- 
  ****************************************************************************
  * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc.              *
  *                                                                          *
  * Permission is hereby granted, free of charge, to any person obtaining a  *
  * copy of this software and associated documentation files (the            *
  * "Software"), to deal in the Software without restriction, including      *
  * without limitation the rights to use, copy, modify, merge, publish,      *
  * distribute, distribute with modifications, sublicense, and/or sell       *
  * copies of the Software, and to permit persons to whom the Software is    *
  * furnished to do so, subject to the following conditions:                 *
  *                                                                          *
  * The above copyright notice and this permission notice shall be included  *
  * in all copies or substantial portions of the Software.                   *
  *                                                                          *
  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
  *                                                                          *
  * Except as contained in this notice, the name(s) of the above copyright   *
  * holders shall not be used in advertising or otherwise to promote the     *
  * sale, use or other dealings in this Software without prior written       *
  * authorization.                                                           *
  ****************************************************************************
  * @Id: tic.1m,v 1.60 2014/05/24 22:00:11 tom Exp @
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="generator" content="Manpage converted by man2html - see http://invisible-island.net/scripts/readme.html#others_scripts">
<TITLE>tic 1m</TITLE>
<link rev=made href="mailto:bug-ncurses@gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</HEAD>
<BODY>
<H1 class="no-header">tic 1m</H1>
<PRE>
<STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>                                                         <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>




</PRE>
<H2><a name="h2-NAME">NAME</a></H2><PRE>
       <STRONG>tic</STRONG> - the <EM>terminfo</EM> entry-description compiler


</PRE>
<H2><a name="h2-SYNOPSIS">SYNOPSIS</a></H2><PRE>
       <STRONG>tic</STRONG>  [<STRONG>-01CDGIKLNTUVacfgrstx</STRONG>]  [<STRONG>-e</STRONG> <EM>names</EM>] [<STRONG>-o</STRONG> <EM>dir</EM>] [<STRONG>-R</STRONG> <EM>sub-</EM>
       <EM>set</EM>] [<STRONG>-v</STRONG>[<EM>n</EM>]] [<STRONG>-w</STRONG>[<EM>n</EM>]] <EM>file</EM>


</PRE>
<H2><a name="h2-DESCRIPTION">DESCRIPTION</a></H2><PRE>
       The <STRONG>tic</STRONG> command translates a  <STRONG>terminfo</STRONG>  file  from  source
       format  into compiled format.  The compiled format is nec-
       essary for use with the library routines in <STRONG><A HREF="ncurses.3x.html">ncurses(3x)</A></STRONG>.

       As described in <STRONG><A HREF="term.5.html">term(5)</A></STRONG>, the  database  may  be  either  a
       directory  tree  (one file per terminal entry) or a hashed
       database (one record per entry).  The <STRONG>tic</STRONG>  command  writes
       only one type of entry, depending on how it was built:

       <STRONG>o</STRONG>   For  directory  trees,  the top-level directory, e.g.,
           /usr/share/terminfo, specifies  the  location  of  the
           database.

       <STRONG>o</STRONG>   For  hashed  databases,  a filename is needed.  If the
           given file is not found by that name, but can be found
           by adding the suffix ".db", then that is used.

           The  default  name for the hashed database is the same
           as the default directory name  (only  adding  a  ".db"
           suffix).

       In  either  case  (directory or hashed database), <STRONG>tic</STRONG> will
       create the container if it does not exist.  For  a  direc-
       tory,  this  would  be the "terminfo" leaf, versus a "ter-
       minfo.db" file.

       The results are normally placed  in  the  system  terminfo
       database   <STRONG>/usr/share/terminfo</STRONG>.    The  compiled  terminal
       description can be placed in a  different  terminfo  data-
       base.  There are two ways to achieve this:

       <STRONG>o</STRONG>   First,  you  may override the system default either by
           using the <STRONG>-o</STRONG> option, or by setting the  variable  <STRONG>TER-</STRONG>
           <STRONG>MINFO</STRONG>  in  your  shell environment to a valid database
           location.

       <STRONG>o</STRONG>   Secondly, if <STRONG>tic</STRONG> cannot write  in  <EM>/usr/share/terminfo</EM>
           or  the  location  specified using your TERMINFO vari-
           able, it looks for the directory  <EM>$HOME/.terminfo</EM>  (or
           hashed  database <EM>$HOME/.terminfo.db)</EM>; if that location
           exists, the entry is placed there.

       Libraries that read terminfo entries are expected to check
       in succession

       <STRONG>o</STRONG>   a  location  specified  with  the TERMINFO environment
           variable,

       <STRONG>o</STRONG>   <EM>$HOME/.terminfo</EM>,

       <STRONG>o</STRONG>   directories listed in  the  TERMINFO_DIRS  environment
           variable,

       <STRONG>o</STRONG>   a       compiled-in      list      of      directories
           (/usr/local/ncurses/share/terminfo:/usr/share/ter-
           minfo), and

       <STRONG>o</STRONG>   the system terminfo database (<EM>/usr/share/terminfo</EM>).


</PRE>
<H3><a name="h3-OPTIONS">OPTIONS</a></H3><PRE>
       <STRONG>-0</STRONG>     restricts the output to a single line

       <STRONG>-1</STRONG>     restricts the output to a single column

       <STRONG>-a</STRONG>     tells  <STRONG>tic</STRONG>  to  retain  commented-out  capabilities
              rather than discarding them.  Capabilities are com-
              mented  by prefixing them with a period.  This sets
              the <STRONG>-x</STRONG> option, because it treats the  commented-out
              entries  as  user-defined  names.  If the source is
              termcap, accept the 2-character names  required  by
              version 6.  Otherwise these are ignored.

       <STRONG>-C</STRONG>     Force  source translation to termcap format.  Note:
              this differs from the <STRONG>-C</STRONG> option of  <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>  in
              that it does not merely translate capability names,
              but also translates  terminfo  strings  to  termcap
              format.  Capabilities that are not translatable are
              left in the entry under their  terminfo  names  but
              commented  out with two preceding dots.  The actual
              format  used  incorporates  some  improvements  for
              escaped  characters  from  terminfo  format.  For a
              stricter BSD-compatible  translation,  add  the  <STRONG>-K</STRONG>
              option.

              If  this  is combined with <STRONG>-c</STRONG>, <STRONG>tic</STRONG> makes additional
              checks to report cases where the terminfo values do
              not  have an exact equivalent in termcap form.  For
              example:

              <STRONG>o</STRONG>   <STRONG>sgr</STRONG> usually will not convert,  because  termcap
                  lacks  the  ability  to work with more than two
                  parameters, and because termcap lacks  many  of
                  the  arithmetic/logical  operators used in ter-
                  minfo.

              <STRONG>o</STRONG>   capabilities with more than one delay  or  with
                  delays  before  the  end of the string will not
                  convert completely.

       <STRONG>-c</STRONG>     tells <STRONG>tic</STRONG> to only check <EM>file</EM> for errors,  including
              syntax  problems and bad use links.  If you specify
              <STRONG>-C</STRONG> (<STRONG>-I</STRONG>) with this option, the code will print warn-
              ings about entries which, after use resolution, are
              more than 1023 (4096) bytes long.  Due to  a  fixed
              buffer  length  in older termcap libraries, as well
              as buggy checking for the buffer length (and a doc-
              umented limit in terminfo), these entries may cause
              core dumps with other implementations.

              <STRONG>tic</STRONG> checks string capabilities to ensure that those
              with parameters will be valid expressions.  It does
              this check only for the predefined string capabili-
              ties;  those  which  are defined with the <STRONG>-x</STRONG> option
              are ignored.

       <STRONG>-D</STRONG>     tells <STRONG>tic</STRONG> to print the database locations  that  it
              knows about, and exit.  The first location shown is
              the one to which it would write  compiled  terminal
              descriptions.   If  <STRONG>tic</STRONG>  is  not  able  to  find  a
              writable database location according to  the  rules
              summarized  above,  it  will print a diagnostic and
              exit with an error rather than printing a  list  of
              database locations.

       <STRONG>-e</STRONG> <EM>names</EM>
              Limit  writes  and  translations  to  the following
              comma-separated list of terminals.  If any name  or
              alias of a terminal matches one of the names in the
              list, the entry will be written  or  translated  as
              normal.   Otherwise no output will be generated for
              it.  The option value is interpreted as a file con-
              taining  the  list  if  it  contains a '/'.  (Note:
              depending on how tic was compiled, this option  may
              require <STRONG>-I</STRONG> or <STRONG>-C</STRONG>.)

       <STRONG>-f</STRONG>     Display  complex  terminfo  strings  which  contain
              if/then/else/endif expressions indented  for  read-
              ability.

       <STRONG>-G</STRONG>     Display  constant  literals  in decimal form rather
              than their character equivalents.

       <STRONG>-g</STRONG>     Display constant character literals in quoted  form
              rather than their decimal equivalents.

       <STRONG>-I</STRONG>     Force source translation to terminfo format.

       <STRONG>-K</STRONG>     Suppress  some  longstanding  ncurses extensions to
              termcap format, e.g., "\s" for space.

       <STRONG>-L</STRONG>     Force source translation to terminfo  format  using
              the long C variable names listed in &lt;<STRONG>term.h</STRONG>&gt;

       <STRONG>-N</STRONG>     Disable smart defaults.  Normally, when translating
              from termcap to terminfo, the compiler makes a num-
              ber  of  assumptions  about  the defaults of string
              capabilities <STRONG>reset1_string</STRONG>,  <STRONG>carriage_return</STRONG>,  <STRONG>cur-</STRONG>
              <STRONG>sor_left</STRONG>,  <STRONG>cursor_down</STRONG>,  <STRONG>scroll_forward</STRONG>,  <STRONG>tab</STRONG>, <STRONG>new-</STRONG>
              <STRONG>line</STRONG>, <STRONG>key_backspace</STRONG>, <STRONG>key_left</STRONG>, and  <STRONG>key_down</STRONG>,  then
              attempts  to  use  obsolete termcap capabilities to
              deduce correct values.  It also normally suppresses
              output of obsolete termcap capabilities such as <STRONG>bs</STRONG>.
              This option forces a more literal translation  that
              also preserves the obsolete capabilities.

       <STRONG>-o</STRONG><EM>dir</EM>  Write  compiled entries to given database location.
              Overrides the TERMINFO environment variable.

       <STRONG>-R</STRONG><EM>subset</EM>
              Restrict output to a given subset.  This option  is
              for  use  with  archaic  versions  of terminfo like
              those on SVr1, Ultrix, or HP/UX that do not support
              the  full set of SVR4/XSI Curses terminfo; and out-
              right broken ports like AIX 3.x that have their own
              extensions  incompatible  with SVr4/XSI.  Available
              subsets  are  "SVr1",  "Ultrix",  "HP",  "BSD"  and
              "AIX"; see <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> for details.

       <STRONG>-r</STRONG>     Force  entry  resolution (so there are no remaining
              tc capabilities) even  when  doing  translation  to
              termcap format.  This may be needed if you are pre-
              paring a termcap file for a termcap  library  (such
              as  GNU  termcap through version 1.3 or BSD termcap
              through 4.3BSD) that does not  handle  multiple  tc
              capabilities per entry.

       <STRONG>-s</STRONG>     Summarize the compile by showing the database loca-
              tion into which entries are written, and the number
              of entries which are compiled.

       <STRONG>-T</STRONG>     eliminates size-restrictions on the generated text.
              This is mainly useful  for  testing  and  analysis,
              since  the compiled descriptions are limited (e.g.,
              1023 for termcap, 4096 for terminfo).

       <STRONG>-t</STRONG>     tells <STRONG>tic</STRONG> to  discard  commented-out  capabilities.
              Normally when translating from terminfo to termcap,
              untranslatable capabilities are commented-out.

       <STRONG>-U</STRONG>   tells <STRONG>tic</STRONG> to not post-process the data after  parsing
            the  source  file.  Normally, it infers data which is
            commonly missing in older terminfo data, or in  term-
            caps.

       <STRONG>-V</STRONG>   reports the version of ncurses which was used in this
            program, and exits.

       <STRONG>-v</STRONG><EM>n</EM>  specifies that (verbose) output be written  to  stan-
            dard  error trace information showing <STRONG>tic</STRONG>'s progress.
            The optional parameter <EM>n</EM> is a number from  1  to  10,
            inclusive,  indicating the desired level of detail of
            information.  If <EM>n</EM> is omitted, the default  level  is
            1.   If  <EM>n</EM> is specified and greater than 1, the level
            of detail is increased.

            The debug flag levels are as follows:

            1      Names of files created and linked

            2      Information related to the "use" facility

            3      Statistics from the hashing algorithm

            5      String-table memory allocations

            7      Entries into the string-table

            8      List of tokens encountered by scanner

            9      All values computed  in  construction  of  the
                   hash table

            If  the debug level <EM>n</EM> is not given, it is taken to be
            one.

       <STRONG>-w</STRONG><EM>n</EM>  specifies the width of the output.  The parameter  is
            optional.  If it is omitted, it defaults to 60.

       <STRONG>-x</STRONG>   Treat unknown capabilities as user-defined.  That is,
            if you supply a capability name which  <STRONG>tic</STRONG>  does  not
            recognize, it will infer its type (boolean, number or
            string) from the syntax and make  an  extended  table
            entry  for  that.   User-defined  capability  strings
            whose name begins with "k" are  treated  as  function
            keys.


</PRE>
<H3><a name="h3-PARAMETERS">PARAMETERS</a></H3><PRE>
       <EM>file</EM>   contains one or more <STRONG>terminfo</STRONG> terminal descriptions
              in source format [see <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>].  Each  descrip-
              tion  in  the  file describes the capabilities of a
              particular terminal.

              If <EM>file</EM> is "-", then the  data  is  read  from  the
              standard input.  The <EM>file</EM> parameter may also be the
              path of a character-device.


</PRE>
<H3><a name="h3-PROCESSING">PROCESSING</a></H3><PRE>
       All but one of the capabilities recognized by <STRONG>tic</STRONG> are doc-
       umented in <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.  The exception is the <STRONG>use</STRONG> capabil-
       ity.

       When a <STRONG>use</STRONG>=<EM>entry</EM>-<EM>name</EM> field is discovered  in  a  terminal
       entry  currently  being  compiled, <STRONG>tic</STRONG> reads in the binary
       from <STRONG>/usr/share/terminfo</STRONG> to complete the entry.   (Entries
       created  from <EM>file</EM> will be used first.  <STRONG>tic</STRONG> duplicates the
       capabilities in <EM>entry</EM>-<EM>name</EM> for the current entry, with the
       exception   of  those  capabilities  that  explicitly  are
       defined in the current entry.

       When   an   entry,   e.g.,   <STRONG>entry_name_1</STRONG>,   contains    a
       <STRONG>use=</STRONG><EM>entry</EM>_<EM>name</EM>_<EM>2</EM>   field,  any  canceled  capabilities  in
       <EM>entry</EM>_<EM>name</EM>_<EM>2</EM> must also appear in <STRONG>entry_name_1</STRONG> before  <STRONG>use=</STRONG>
       for these capabilities to be canceled in <STRONG>entry_name_1</STRONG>.

       Total compiled entries cannot exceed 4096 bytes.  The name
       field cannot exceed 512 bytes.  Terminal  names  exceeding
       the  maximum  alias  length (32 characters on systems with
       long filenames, 14 characters otherwise) will be truncated
       to  the maximum alias length and a warning message will be
       printed.


</PRE>
<H2><a name="h2-COMPATIBILITY">COMPATIBILITY</a></H2><PRE>
       There is some evidence that historic  <STRONG>tic</STRONG>  implementations
       treated  description  fields with no whitespace in them as
       additional aliases or short names.  This <STRONG>tic</STRONG> does  not  do
       that,  but  it  does  warn  when description fields may be
       treated that way and check them for dangerous characters.


</PRE>
<H2><a name="h2-EXTENSIONS">EXTENSIONS</a></H2><PRE>
       Unlike the SVr4 <STRONG>tic</STRONG> command, this implementation can actu-
       ally  compile  termcap  sources.  In fact, entries in ter-
       minfo and termcap syntax can be mixed in a  single  source
       file.  See <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG> for the list of termcap names taken
       to be equivalent to terminfo names.

       The SVr4 manual pages are  not  clear  on  the  resolution
       rules  for  <STRONG>use</STRONG>  capabilities.  This implementation of <STRONG>tic</STRONG>
       will find <STRONG>use</STRONG> targets anywhere in the source file, or any-
       where  in the file tree rooted at <STRONG>TERMINFO</STRONG> (if <STRONG>TERMINFO</STRONG> is
       defined), or in the user's <EM>$HOME/.terminfo</EM> database (if it
       exists),  or  (finally) anywhere in the system's file tree
       of compiled entries.

       The error messages from this <STRONG>tic</STRONG> have the same  format  as
       GNU  C  error  messages,  and can be parsed by GNU Emacs's
       compile facility.

       The <STRONG>-0</STRONG>, <STRONG>-1</STRONG>, <STRONG>-C</STRONG>, <STRONG>-G</STRONG>, <STRONG>-I</STRONG>, <STRONG>-N</STRONG>, <STRONG>-R</STRONG>, <STRONG>-T</STRONG>, <STRONG>-V</STRONG>, <STRONG>-a</STRONG>,  <STRONG>-e</STRONG>,  <STRONG>-f</STRONG>,  <STRONG>-g</STRONG>,
       <STRONG>-o</STRONG>,  <STRONG>-r</STRONG>,  <STRONG>-s</STRONG>,  <STRONG>-t</STRONG>  and  <STRONG>-x</STRONG> options are not supported under
       SVr4.  The SVr4 <STRONG>-c</STRONG> mode does not report bad use links.

       System V does not compile entries to or read entries  from
       your  <EM>$HOME/.terminfo</EM>  database unless TERMINFO is explic-
       itly set to it.


</PRE>
<H2><a name="h2-FILES">FILES</a></H2><PRE>
       <STRONG>/usr/share/terminfo/?/*</STRONG>
            Compiled terminal description database.


</PRE>
<H2><a name="h2-SEE-ALSO">SEE ALSO</a></H2><PRE>
       <STRONG><A HREF="infocmp.1m.html">infocmp(1m)</A></STRONG>,   <STRONG><A HREF="captoinfo.1m.html">captoinfo(1m)</A></STRONG>,   <STRONG><A HREF="infotocap.1m.html">infotocap(1m)</A></STRONG>,    <STRONG><A HREF="toe.1m.html">toe(1m)</A></STRONG>,
       <STRONG><A HREF="ncurses.3x.html">curses(3x)</A></STRONG>, <STRONG><A HREF="term.5.html">term(5)</A></STRONG>.  <STRONG><A HREF="terminfo.5.html">terminfo(5)</A></STRONG>.

       This describes <STRONG>ncurses</STRONG> version 6.0 (patch 20150808).


</PRE>
<H2><a name="h2-AUTHOR">AUTHOR</a></H2><PRE>
       Eric S. Raymond &lt;esr@snark.thyrsus.com&gt; and
       Thomas E. Dickey &lt;dickey@invisible-island.net&gt;



                                                                <STRONG><A HREF="tic.1m.html">tic(1m)</A></STRONG>
</PRE>
<div class="nav">
<ul>
<li><a href="#h2-NAME">NAME</a></li>
<li><a href="#h2-SYNOPSIS">SYNOPSIS</a></li>
<li><a href="#h2-DESCRIPTION">DESCRIPTION</a>
<ul>
<li><a href="#h3-OPTIONS">OPTIONS</a></li>
<li><a href="#h3-PARAMETERS">PARAMETERS</a></li>
<li><a href="#h3-PROCESSING">PROCESSING</a></li>
</ul>
</li>
<li><a href="#h2-COMPATIBILITY">COMPATIBILITY</a></li>
<li><a href="#h2-EXTENSIONS">EXTENSIONS</a></li>
<li><a href="#h2-FILES">FILES</a></li>
<li><a href="#h2-SEE-ALSO">SEE ALSO</a></li>
<li><a href="#h2-AUTHOR">AUTHOR</a></li>
</ul>
</div>
</BODY>
</HTML>
