Man Linux: Main Page and Category List

NAME

       ref - Display a C function header

SYNOPSIS

       ref [options]...  [restrictions]...

VERSION

       This page describes the Elvis 2.2_0 version of ref.  See elvis(1).

DESCRIPTION

       ref quickly locates and displays the header of a function.  To do this,
       ref looks in the "tags" file for the line that describes the  function,
       and  then  scans the source file for the function.  When it locates the
       function, it displays an introductory comment (if there  is  one),  the
       function’s declaration, and the declarations of all arguments.

OPTIONS

       -t     Output  tag  info, instead of the function header.  The tag info
              consists of the three standard fields from each tag.  The fields
              will  be separated by tab characters, just like records from the
              traditional tags file format.  Consequently, you can use "ref -t
              -a  >oldtags"  to  convert a new-style tags file back to an old-
              style tags file.

       -v     Output verbose tag info, instead of the  function  header.   The
              verbose  tag  info  shows the names and values of all attributes
              for each matching tag.  Each  name/value  pair  is  shown  on  a
              separate  line.   It  also shows the "match" factor that is used
              for sorting tags which have the same tagname.

       -h     Output HTML browser info, instead of the function header.   This
              is  an  HTML  table  with  hypertext links into the source files
              where the tags are defined.  You can  use  Netscape  or  another
              browser  to  use  this,  but  they  won’t move the cursor to the
              correct line within the source file; only Elvis knows how to  do
              that.

              This resembles Elvis:browse command.

       -c     Don’t  output  introductory  comments before each tag definition
              line.

       -d     Don’t output other lines of the definition.  The line where  the
              tag  is  defined  is  shown but any preceding or following lines
              which are part of the definition will be omitted.

       -a     List all matching tags.  (Without this option,  ref  would  only
              output the single most likely tag.)

       -s     Search  all  tags  files.   Without  this option, ref would stop
              searching after processing the first tags file  which  contained
              any tags which met the restrictions.

       -p tagpath
              List  of  directories  or  tags  files  to  search  through.  By
              default, ref would use the value from  the  TAGPATH  environment
              variable or a hardcoded default value for each operating system.

       -l taglength
              Only check the first taglength characters  of  tag  names.   The
              default behavior is to check all characters.

RESTRICTIONS AND HINTS

       Other  than  options, any argument on ref’s command line is interpreted
       as a restriction or sorting hint.  Elvis parses all of the restrictions
       and  sorting  hints,  and  then  scans the tags files (i.e., every file
       listed in the tag path, or a  file  named  "tags"  in  every  directory
       listed  in  the tag path).  Tags which fail to meet any restriction are
       discarded.

       Other tags are inserted into a list.  The list is sorted  primarily  by
       each  tag’s  tagname.   If multiple tags have the same overloaded name,
       then those tags will be sorted according to the sorting hints.  In  the
       absence  of  hints,  the  tags will be added in the same order in which
       they appear in the tags file.

       The restrictions can be given in any of the following forms:

       name:value[,value...]
              Reject tags  which  have  an  attribute  named  name,  but  that
              attribute’s value isn’t in the list of acceptable values.  E.g.,
              "class:Foo" rejects tags from a  different  class,  but  accepts
              tags which have no class.

       name:=value[,value...]
              Reject  tags  which  have  an  attribute  named  name,  but that
              attribute’s value isn’t in the list of acceptable values.   Also
              reject  tags  which  don’t  have an attribute named name.  E.g.,
              "class:=Foo" only accepts tags which have class "Foo".

       name:/value[,value...]
              Like "name:value" except that the tagaddress field  is  required
              to  contain  value  as  a substring.  So "class:/Foo" would find
              tags in class "Foo" PLUS  global  tags  whose  address  mentions
              "Foo" - probably friends of the Foo class.

       value[,value...]
              Short for tagname:value[,value...]

       The sorting hints follow a similar form:

       name:+value[,value...]
              Pretend  that  recent  successful  searches had attributes named
              "name" with the given values.  This causes any similar  tags  in
              the new search to appear near the top of the list.

       name:-value[,value...]
              Pretend  that  recent failed searches had attribute named "name"
              with the given values.  This causes any similar tags in the  new
              search to appear near the bottom of the list.

       A  null  value string matches anything.  So "struct:=" would accept any
       tag with a "struct" attribute, and reject those without it.  This would
       be handy when you’re trying to do tag lookup for a word which follows a
       ’.’ character - you know it is a field name, but you  don’t  know  from
       which struct type.

       Note  that  if you invoke ref without giving any restrictions, then all
       tags will match and will (if invoked with the -a flag) be output.

A REAL-WORLD EXAMPLE

       While converting some code from K&R C to ANSI C, I needed  to  generate
       extern declarations for all the functions.  To find the global function
       headers, I used the command...

                 ref -a kind:f file:dummy

       The "-a" causes ref to output all headers, instead of  just  the  first
       one  that  it  finds.  "kind:f" causes it to exclude any non-functions.
       "file:dummy" is tricky -- it causes ref to exclude static tags from all
       files  except  "dummy",  and since there were no C functions defined in
       any file named "dummy", all statics were excluded.  I only got globals.

       Once  I  had  a  list  of  all global functions, I still had to do some
       editing to convert them into ANSI declarations (ref  couldn’t  help  me
       there)  but at least I could be confident that my list of functions was
       complete and accurate.

       For each source file, I  also  needed  to  find  the  static  functions
       defined there, so for each "file.c" I used the command...

                 ref -a kind:f file:=file.c

       This  is  very  similar to the earlier command.  The main difference is
       that we’re using "file:=" (with an ’=’, to exclude globals) and a  real
       file  name  (instead  of "dummy") so we do include the static tags from
       that particular file.

INTERACTION WITH ELVIS

       ref is used by elvis(1)’s shift-K command.  If the cursor is located on
       a word such as "splat", in the file "foo.c", then Elvis will invoke ref
       with the command "ref splat file:foo.c".

       Elvis’ "smartargs" option also uses ref to look up the arguments for  a
       given function.

TAGS

       A  tag  is a collection of attributes.  Each attribute has a name and a
       value.  Every tag has attributes with the following names:

       tagname
              The name of the tag;  usually  the  same  as  the  function  (or
              whatever) that the tag refers to.

       tagfile
              The name of your source code file, in which the tag’s definition
              occurred.

       tagaddress
              Either a line number, or a "nomagic" regular  expression,  which
              allows  Elvis  or ref to locate the tag’s definition within your
              source file.

       In addition, any tag can have additional, optional  attributes.   These
       extra  tags  are  meant  to  serve as hints, describing the contexts in
       which the tagname is permitted to occur in your source code.  The  list
       of  additional  attribute  names  is  not preset; any tags file can use
       whatever seem appropriate.  The following are typical:

       kind   This value is a single letter indicating the lexical type of the
              tag.  It can be "f" for functions, "v" for variables, and so on.

       file   If the tag can only be used within a single  source  file,  then
              this  should  be  the name of that file.  E.g., in C, a "static"
              function can only be  used  in  the  function  in  which  it  is
              defined,  so  if  a function is static then its tag will usually
              have a file attribute, and its value will be the same as that of
              its tagfile attribute.

       function
              For  local  variables.   The  value is name of function in which
              they’re defined.

       struct For fields of a struct or union.  The value is the name  of  the
              struct  or  union.   If it has no name (not even a typedef) then
              "struct=struct" is better than nothing.

       enum   For values in an enum data type.  The value is the name  of  the
              enum  type.   If  it  has  no  name  (not  even  a typedef) then
              "enum=enum" is better than nothing.

       class  Member functions of a class in C++ could use  this  to  identify
              which  class  they’re  in.   The  class name itself, however, is
              global so it doesn’t have a class attribute.

       scope  Intended mostly for class member functions.  It will usually  be
              "public"  or  "private",  so  users can restrict tag searches to
              only public members.

       arity  For functions.  Its value is the number of arguments.

       Currently, the hacked-up version of ctags(1)  (sometimes  installed  as
       elvtags(1))  included  with  Elvis  will  only generate kind, file, and
       class hints, and it doesn’t do a very good job on class hints.

THE TAGS FILE

       The tags file is a text file, in which each  line  describes  a  single
       tag.  Each line is divided into fields, delimited by tab characters.

       The  first  3  fields  are  implicitly  defined to be the values of the
       tagname, tagfile, and tagaddress attributes, in that order.  Note  that
       this is identical to the traditional format of the tags file.

       If  there are other fields, then semicolon-doublequote will be appended
       to the tagaddress field; vi ignores anything after that, so  the  extra
       fields  won’t  interfere  with  vi’s  ability  to perform tag searches.
       Other editors such as Elvis and Vim use the extra fields though.

       The extra fields are required to  have  the  format  "<tab>name:value".
       I.e.,  a  ’:’  is required, and everything before the ’:’ is used as an
       attribute name, and everything after it is used as this tag’s value for
       that attribute.  There are two exceptions:

       *  If an extra field lacks a colon, then the field is assumed to be the
          value of  an  attribute  named  "kind".   (Some  versions  of  ctags
          generate a single-letter "kind" value to indicate whether a tag is a
          function, variable, typedef, etc.)  Since nearly all tags have  this
          field,  omitting  "kind:" significantly reduces the size of the tags
          file, and the time needed to search it.

       *  Static tags are usually marked with "file:", with no file name after
          the  ":".   In this case the file name is understood to be identical
          to the "tagfile" field.  This does more than just reduce the size of
          the  tags  file  --  "tagfile"  values are relative to the directory
          containing the tags file, and this rule offers a way to make  "file"
          values be relative, too.

       Different  tags  may  have  differently  named  hints.  Since each hint
       includes an explicit name with each  value,  they  can  appear  in  any
       order, and you can omit any which don’t apply to a given tag.

       Ref  and  Elvis store attribute names are stored in a fixed-size array,
       which is shared among all tags from a given  file.   Consequently,  the
       number  of  distinct attribute names within a tags file is limited.  As
       currently configured, that limit is 10 names - the 3 standard ones plus
       up to 7 other names for hints.

THE REFS FILE

       When  ref has found a tag entry and is searching for the source of that
       tag, if it can’t read the original source file then it will try to read
       a  file  named  "refs".   The  "refs" file should contain a copy of all
       source code, with the bodies of functions  replaced  by  "{}".   Elvis’
       version of ctags(1) can generate a "refs" file.

FILES

       The following files can be found in any directory named in the tagpath.

       tags   List  of  function  names  and  their  locations,  generated  by
              ctags(1).

       refs   Function headers extracted from source files (optional).

ENVIRONMENT

       TAGPATH
              List  of  directories  or  files to be searched.  In the case of
              directories,  ref  looks  for  a  file  named  "tags"  in   that
              directory.   The  elements  in  the list are separated by either
              colons (for  Unix)  or  semicolons  (for  most  other  operating
              systems).  For each operating system, ref has a built-in default
              which is probably adequate.

NOTES

       You might want to  generate  a  "tags"  file  for  the  directory  that
       contains  the  source code for standard C library on your system.  This
       will allow ref to serve as a quick reference for any  library  function
       in addition to your project’s functions.

       If  licensing  restrictions  prevent you from making the library source
       readable by everybody, then you can have  Elvis’  version  of  ctags(1)
       (often  installed as "elvtags") generate a "refs" file, and make "refs"
       readable by everybody.  If your system doesn’t come  with  the  library
       source  code,  then perhaps you can produce something workable from the
       lint(1) libraries.

SEE ALSO

       elvis(1), ctags(1), lint(1)

       Note that on most Unix  systems,  the  Elvis  version  of  ctags(1)  is
       installed as elvtags(1).

AUTHOR

       Steve Kirkendall
       kirkenda@cs.pdx.edu