summaryrefslogtreecommitdiffstats
path: root/funtools/man/man7/funtext.7
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/man/man7/funtext.7')
-rw-r--r--funtools/man/man7/funtext.7713
1 files changed, 713 insertions, 0 deletions
diff --git a/funtools/man/man7/funtext.7 b/funtools/man/man7/funtext.7
new file mode 100644
index 0000000..b24b317
--- /dev/null
+++ b/funtools/man/man7/funtext.7
@@ -0,0 +1,713 @@
+.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sh \" Subsection heading
+.br
+.if t .Sp
+.ne 5
+.PP
+\fB\\$1\fR
+.PP
+..
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. | will give a
+.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to
+.\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C'
+.\" expand to `' in nroff, nothing in troff, for use with C<>.
+.tr \(*W-|\(bv\*(Tr
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. nr % 0
+. rr F
+.\}
+.\"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.hy 0
+.if n .na
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "funtext 7"
+.TH funtext 7 "April 14, 2011" "version 1.4.5" "SAORD Documentation"
+.SH "NAME"
+Funtext \- Support for Column\-based Text Files
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+This document contains a summary of the options for processing column-based
+text files.
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+Funtools will automatically sense and process \*(L"standard\*(R"
+column-based text files as if they were \s-1FITS\s0 binary tables without any
+change in Funtools syntax. In particular, you can filter text files
+using the same syntax as \s-1FITS\s0 binary tables:
+.PP
+.Vb 3
+\& fundisp foo.txt'[cir 512 512 .1]'
+\& fundisp \-T foo.txt > foo.rdb
+\& funtable foo.txt'[pha=1:10,cir 512 512 10]' foo.fits
+.Ve
+.PP
+The first example displays a filtered selection of a text file. The
+second example converts a text file to an \s-1RDB\s0 file. The third example
+converts a filtered selection of a text file to a \s-1FITS\s0 binary table.
+.PP
+Text files can also be used in Funtools image programs. In this case,
+you must provide binning parameters (as with raw event files), using
+the bincols keyword specifier:
+.PP
+.Vb 1
+\& bincols=([xname[:tlmin[:tlmax:[binsiz]]]],[yname[:tlmin[:tlmax[:binsiz]]]
+.Ve
+.PP
+For example:
+.PP
+.Vb 1
+\& funcnts foo'[bincols=(x:1024,y:1024)]' "ann 512 512 0 10 n=10"
+.Ve
+.PP
+\&\fBStandard Text Files\fR
+.PP
+Standard text files have the following characteristics:
+.IP "\(bu" 4
+Optional comment lines start with #
+.IP "\(bu" 4
+Optional blank lines are considered comments
+.IP "\(bu" 4
+An optional table header consists of the following (in order):
+.RS 4
+.IP "\(bu" 4
+a single line of alpha-numeric column names
+.IP "\(bu" 4
+an optional line of unit strings containing the same number of cols
+.IP "\(bu" 4
+an optional line of dashes containing the same number of cols
+.RE
+.RS 4
+.RE
+.IP "\(bu" 4
+Data lines follow the optional header and (for the present) consist of
+ the same number of columns as the header.
+.IP "\(bu" 4
+Standard delimiters such as space, tab, comma, semi\-colon, and bar.
+.PP
+Examples:
+.PP
+.Vb 5
+\& # rdb file
+\& foo1 foo2 foo3 foos
+\& ---- ---- ---- ----
+\& 1 2.2 3 xxxx
+\& 10 20.2 30 yyyy
+.Ve
+.PP
+.Vb 5
+\& # multiple consecutive whitespace and dashes
+\& foo1 foo2 foo3 foos
+\& --- ---- ---- ----
+\& 1 2.2 3 xxxx
+\& 10 20.2 30 yyyy
+.Ve
+.PP
+.Vb 2
+\& # comma delims and blank lines
+\& foo1,foo2,foo3,foos
+.Ve
+.PP
+.Vb 2
+\& 1,2.2,3,xxxx
+\& 10,20.2,30,yyyy
+.Ve
+.PP
+.Vb 4
+\& # bar delims with null values
+\& foo1|foo2|foo3|foos
+\& 1||3|xxxx
+\& 10|20.2||yyyy
+.Ve
+.PP
+.Vb 3
+\& # header-less data
+\& 1 2.2 3 xxxx
+\& 10 20.2 30 yyyy
+.Ve
+.PP
+The default set of token delimiters consists of spaces, tabs, commas,
+semi\-colons, and vertical bars. Several parsers are used
+simultaneously to analyze a line of text in different ways. One way
+of analyzing a line is to allow a combination of spaces, tabs, and
+commas to be squashed into a single delimiter (no null values between
+consecutive delimiters). Another way is to allow tab, semi\-colon, and
+vertical bar delimiters to support null values, i.e. two consecutive
+delimiters implies a null value (e.g. \s-1RDB\s0 file). A successful parser
+is one which returns a consistent number of columns for all rows, with
+each column having a consistent data type. More than one parser can
+be successful. For now, it is assumed that successful parsers all
+return the same tokens for a given line. (Theoretically, there are
+pathological cases, which will be taken care of as needed). Bad parsers
+are discarded on the fly.
+.PP
+If the header does not exist, then names \*(L"col1\*(R", \*(L"col2\*(R", etc. are
+assigned to the columns to allow filtering. Furthermore, data types
+for each column are determined by the data types found in the columns
+of the first data line, and can be one of the following: string, int,
+and double. Thus, all of the above examples return the following
+display:
+.PP
+.Vb 4
+\& fundisp foo'[foo1>5]'
+\& FOO1 FOO2 FOO3 FOOS
+\& ---------- --------------------- ---------- ------------
+\& 10 20.20000000 30 yyyy
+.Ve
+.PP
+\&\fBComments Convert to Header Params\fR
+.PP
+Comments which precede data rows are converted into header parameters and
+will be written out as such using funimage or funhead. Two styles of comments
+are recognized:
+.PP
+1. FITS-style comments have an equal sign \*(L"=\*(R" between the keyword and
+value and an optional slash \*(L"/\*(R" to signify a comment. The strict \s-1FITS\s0
+rules on column positions are not enforced. In addition, strings only
+need to be quoted if they contain whitespace. For example, the following
+are valid FITS-style comments:
+.PP
+.Vb 5
+\& # fits0 = 100
+\& # fits1 = /usr/local/bin
+\& # fits2 = "/usr/local/bin /opt/local/bin"
+\& # fits3c = /usr/local/bin /opt/local/bin /usr/bin
+\& # fits4c = "/usr/local/bin /opt/local/bin" / path dir
+.Ve
+.PP
+Note that the fits3c comment is not quoted and therefore its value is the
+single token \*(L"/usr/local/bin\*(R" and the comment is \*(L"opt/local/bin /usr/bin\*(R".
+This is different from the quoted comment in fits4c.
+.PP
+2. Free-form comments can have an optional colon separator between the
+keyword and value. In the absence of quote, all tokens after the
+keyword are part of the value, i.e. no comment is allowed. If a string
+is quoted, then slash \*(L"/\*(R" after the string will signify a comment.
+For example:
+.PP
+.Vb 4
+\& # com1 /usr/local/bin
+\& # com2 "/usr/local/bin /opt/local/bin"
+\& # com3 /usr/local/bin /opt/local/bin /usr/bin
+\& # com4c "/usr/local/bin /opt/local/bin" / path dir
+.Ve
+.PP
+.Vb 4
+\& # com11: /usr/local/bin
+\& # com12: "/usr/local/bin /opt/local/bin"
+\& # com13: /usr/local/bin /opt/local/bin /usr/bin
+\& # com14c: "/usr/local/bin /opt/local/bin" / path dir
+.Ve
+.PP
+Note that com3 and com13 are not quoted, so the whole string is part of
+the value, while comz4c and com14c are quoted and have comments following
+the values.
+.PP
+Some text files have column name and data type information in the header.
+You can specify the format of column information contained in the
+header using the \*(L"hcolfmt=\*(R" specification. See below for a detailed
+description.
+.PP
+\&\fBMultiple Tables in a Single File\fR
+.PP
+Multiple tables are supported in a single file. If an RDB-style file
+is sensed, then a ^L (vertical tab) will signify end of
+table. Otherwise, an end of table is sensed when a new header (i.e.,
+all alphanumeric columns) is found. (Note that this heuristic does not
+work for single column tables where the column type is \s-1ASCII\s0 and the
+table that follows also has only one column.) You also can specify
+characters that signal an end of table condition using the \fBeot=\fR
+keyword. See below for details.
+.PP
+You can access the nth table (starting from 1) in a multi-table file
+by enclosing the table number in brackets, as with a \s-1FITS\s0 extension:
+.PP
+.Vb 1
+\& fundisp foo'[2]'
+.Ve
+.PP
+The above example will display the second table in the file.
+(Index values start at 1 in oder to maintain logical compatibility
+with \s-1FITS\s0 files, where extension numbers also start at 1).
+.PP
+\&\fB\s-1\f(BITEXT\s0()\fB Specifier\fR
+.PP
+As with \s-1\fIARRAY\s0()\fR and \s-1\fIEVENTS\s0()\fR specifiers for raw image arrays and raw
+event lists respectively, you can use \s-1\fITEXT\s0()\fR on text files to pass
+key=value options to the parsers. An empty set of keywords is
+equivalent to not having \s-1\fITEXT\s0()\fR at all, that is:
+.PP
+.Vb 2
+\& fundisp foo
+\& fundisp foo'[TEXT()]'
+.Ve
+.PP
+are equivalent. A multi-table index number is placed before the \s-1\fITEXT\s0()\fR
+specifier as the first token, when indexing into a multi\-table:
+.PP
+.Vb 1
+\& fundisp foo'[2,TEXT(...)]'
+.Ve
+.PP
+The filter specification is placed after the \s-1\fITEXT\s0()\fR specifier, separated
+by a comma, or in an entirely separate bracket:
+.PP
+.Vb 2
+\& fundisp foo'[TEXT(...),circle 512 512 .1]'
+\& fundisp foo'[2,TEXT(...)][circle 512 512 .1]'
+.Ve
+.PP
+\&\fB\f(BIText()\fB Keyword Options\fR
+.PP
+The following is a list of keywords that can be used within the \s-1\fITEXT\s0()\fR
+specifier (the first three are the most important):
+.IP "\(bu" 4
+delims=\*(L"[delims]\*(R"
+.Sp
+Specify token delimiters for this file. Only a single parser having these
+delimiters will be used to process the file.
+.Sp
+.Vb 2
+\& fundisp foo.fits'[TEXT(delims="!")]'
+\& fundisp foo.fits'[TEXT(delims="\et%")]'
+.Ve
+.IP "\(bu" 4
+comchars=\*(L"[comchars]\*(R"
+.Sp
+Specify comment characters. You must include \*(L"\en\*(R" to allow blank lines.
+These comment characters will be used for all standard parsers (unless delims
+are also specified).
+.Sp
+.Vb 1
+\& fundisp foo.fits'[TEXT(comchars="!\en")]'
+.Ve
+.IP "\(bu" 4
+cols=\*(L"[name1:type1 ...]\*(R"
+.Sp
+Specify names and data type of columns. This overrides header
+names and/or data types in the first data row or default names and
+data types for header-less tables.
+.Sp
+.Vb 1
+\& fundisp foo.fits'[TEXT(cols="x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e")]'
+.Ve
+.Sp
+If the column specifier is the only keyword, then the cols= is not
+required (in analogy with \s-1\fIEVENTS\s0()\fR):
+.Sp
+.Vb 1
+\& fundisp foo.fits'[TEXT(x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e)]'
+.Ve
+.Sp
+Of course, an index is allowed in this case:
+.Sp
+.Vb 1
+\& fundisp foo.fits'[2,TEXT(x:I,y:I,pha:I,pi:I,time:D,dx:E,dy:e)]'
+.Ve
+.IP "\(bu" 4
+eot=\*(L"[eot delim]\*(R"
+.Sp
+Specify end of table string specifier for multi-table files. \s-1RDB\s0
+files support ^L. The end of table specifier is a string and the whole
+string must be found alone on a line to signify \s-1EOT\s0. For example:
+.Sp
+.Vb 1
+\& fundisp foo.fits'[TEXT(eot="END")]'
+.Ve
+.Sp
+will end the table when a line contains \*(L"\s-1END\s0\*(R" is found. Multiple lines
+are supported, so that:
+.Sp
+.Vb 1
+\& fundisp foo.fits'[TEXT(eot="END\enGAME")]'
+.Ve
+.Sp
+will end the table when a line contains \*(L"\s-1END\s0\*(R" followed by a line
+containing \*(L"\s-1GAME\s0\*(R".
+.Sp
+In the absence of an \s-1EOT\s0 delimiter, a new table will be sensed when a new
+header (all alphanumeric columns) is found.
+.IP "\(bu" 4
+null1=\*(L"[datatype]\*(R"
+.Sp
+Specify data type of a single null value in row 1.
+Since column data types are determined by the first row, a null value
+in that row will result in an error and a request to specify names and
+data types using cols=. If you only have a one null in row 1, you don't
+need to specify all names and columns. Instead, use null1=\*(L"type\*(R" to
+specify its data type.
+.IP "\(bu" 4
+alen=[n]
+.Sp
+Specify size in bytes for \s-1ASCII\s0 type columns.
+\&\s-1FITS\s0 binary tables only support fixed length \s-1ASCII\s0 columns, so a
+size value must be specified. The default is 16 bytes.
+.IP "\(bu" 4
+nullvalues=[\*(L"true\*(R"|\*(L"false\*(R"]
+.Sp
+Specify whether to expect null values.
+Give the parsers a hint as to whether null values should be allowed. The
+default is to try to determine this from the data.
+.IP "\(bu" 4
+whitespace=[\*(L"true\*(R"|\*(L"false\*(R"]
+.Sp
+Specify whether surrounding white space should be kept as part of
+string tokens. By default surrounding white space is removed from
+tokens.
+.IP "\(bu" 4
+header=[\*(L"true\*(R"|\*(L"false\*(R"]
+.Sp
+Specify whether to require a header. This is needed by tables
+containing all string columns (and with no row containing dashes), in
+order to be able to tell whether the first row is a header or part of
+the data. The default is false, meaning that the first row will be
+data. If a row dashes are present, the previous row is considered the
+column name row.
+.IP "\(bu" 4
+units=[\*(L"true\*(R"|\*(L"false\*(R"]
+.Sp
+Specify whether to require a units line.
+Give the parsers a hint as to whether a row specifying units should be
+allowed. The default is to try to determine this from the data.
+.IP "\(bu" 4
+i2f=[\*(L"true\*(R"|\*(L"false\*(R"]
+.Sp
+Specify whether to allow int to float conversions.
+If a column in row 1 contains an integer value, the data type for that
+column will be set to int. If a subsequent row contains a float in
+that same column, an error will be signaled. This flag specifies that,
+instead of an error, the float should be silently truncated to
+int. Usually, you will want an error to be signaled, so that you can
+specify the data type using cols= (or by changing the value of
+the column in row 1).
+.IP "\(bu" 4
+comeot=[\*(L"true\*(R"|\*(L"false\*(R"|0|1|2]
+.Sp
+Specify whether comment signifies end of table.
+If comeot is 0 or false, then comments do not signify end of table and
+can be interspersed with data rows. If the value is true or 1 (the
+default for standard parsers), then non-blank lines (e.g. lines
+beginning with '#') signify end of table but blanks are allowed
+between rows. If the value is 2, then all comments, including blank
+lines, signify end of table.
+.IP "\(bu" 4
+lazyeot=[\*(L"true\*(R"|\*(L"false\*(R"]
+.Sp
+Specify whether \*(L"lazy\*(R" end of table should be permitted (default is
+true for standard formats, except rdb format where explicit ^L is required
+between tables). A lazy \s-1EOT\s0 can occur when a new table starts directly
+after an old one, with no special \s-1EOT\s0 delimiter. A check for this \s-1EOT\s0
+condition is begun when a given row contains all string tokens. If, in
+addition, there is a mismatch between the number of tokens in the
+previous row and this row, or a mismatch between the number of string
+tokens in the prev row and this row, a new table is assumed to have
+been started. For example:
+.Sp
+.Vb 4
+\& ival1 sval3
+\& ----- -----
+\& 1 two
+\& 3 four
+.Ve
+.Sp
+.Vb 4
+\& jval1 jval2 tval3
+\& ----- ----- ------
+\& 10 20 thirty
+\& 40 50 sixty
+.Ve
+.Sp
+Here the line \*(L"jval1 ...\*(R" contains all string tokens. In addition,
+the number of tokens in this line (3) differs from the number of
+tokens in the previous line (2). Therefore a new table is assumed
+to have started. Similarly:
+.Sp
+.Vb 4
+\& ival1 ival2 sval3
+\& ----- ----- -----
+\& 1 2 three
+\& 4 5 six
+.Ve
+.Sp
+.Vb 4
+\& jval1 jval2 tval3
+\& ----- ----- ------
+\& 10 20 thirty
+\& 40 50 sixty
+.Ve
+.Sp
+Again, the line \*(L"jval1 ...\*(R" contains all string tokens. The number of
+string tokens in the previous row (1) differs from the number of
+tokens in the current \fIrow\fR\|(3). We therefore assume a new table as been
+started. This lazy \s-1EOT\s0 test is not performed if lazyeot is explicitly
+set to false.
+.IP "\(bu" 4
+hcolfmt=[header column format]
+.Sp
+Some text files have column name and data type information in the header.
+For example, VizieR catalogs have headers containing both column names
+and data types:
+.Sp
+.Vb 3
+\& #Column e_Kmag (F6.3) ?(k_msigcom) K total magnitude uncertainty (4) [ucd=ERROR]
+\& #Column Rflg (A3) (rd_flg) Source of JHK default mag (6) [ucd=REFER_CODE]
+\& #Column Xflg (I1) [0,2] (gal_contam) Extended source contamination (10) [ucd=CODE_MISC]
+.Ve
+.Sp
+while Sextractor files have headers containing column names alone:
+.Sp
+.Vb 4
+\& # 1 X_IMAGE Object position along x [pixel]
+\& # 2 Y_IMAGE Object position along y [pixel]
+\& # 3 ALPHA_J2000 Right ascension of barycenter (J2000) [deg]
+\& # 4 DELTA_J2000 Declination of barycenter (J2000) [deg]
+.Ve
+.Sp
+The hcolfmt specification allows you to describe which header lines
+contain column name and data type information. It consists of a string
+defining the format of the column line, using \*(L"$col\*(R" (or \*(L"$name\*(R") to
+specify placement of the column name, \*(L"$fmt\*(R" to specify placement of the
+data format, and \*(L"$skip\*(R" to specify tokens to ignore. You also can
+specify tokens explicitly (or, for those users familiar with how
+sscanf works, you can specify scanf skip specifiers using \*(L"%*\*(R").
+For example, the VizieR hcolfmt above might be specified in several ways:
+.Sp
+.Vb 3
+\& Column $col ($fmt) # explicit specification of "Column" string
+\& $skip $col ($fmt) # skip one token
+\& %*s $col ($fmt) # skip one string (using scanf format)
+.Ve
+.Sp
+while the Sextractor format might be specified using:
+.Sp
+.Vb 2
+\& $skip $col # skip one token
+\& %*d $col # skip one int (using scanf format)
+.Ve
+.Sp
+You must ensure that the hcolfmt statement only senses actual column
+definitions, with no false positives or negatives. For example, the
+first Sextractor specification, \*(L"$skip \f(CW$col\fR\*(R", will consider any header
+line containing two tokens to be a column name specifier, while the
+second one, \*(L"%*d \f(CW$col\fR\*(R", requires an integer to be the first token. In
+general, it is preferable to specify formats as explicitly as
+possible.
+.Sp
+Note that the VizieR-style header info is sensed automatically by the
+funtools standard VizieR-like parser, using the hcolfmt \*(L"Column \f(CW$col\fR
+($fmt)\*(R". There is no need for explicit use of hcolfmt in this case.
+.IP "\(bu" 4
+debug=[\*(L"true\*(R"|\*(L"false\*(R"]
+.Sp
+Display debugging information during parsing.
+.PP
+\&\fBEnvironment Variables\fR
+.PP
+Environment variables are defined to allow many of these \s-1\fITEXT\s0()\fR values to be
+set without having to include them in \s-1\fITEXT\s0()\fR every time a file is processed:
+.PP
+.Vb 10
+\& keyword environment variable
+\& ------- --------------------
+\& delims TEXT_DELIMS
+\& comchars TEXT_COMCHARS
+\& cols TEXT_COLUMNS
+\& eot TEXT_EOT
+\& null1 TEXT_NULL1
+\& alen TEXT_ALEN
+\& bincols TEXT_BINCOLS
+\& hcolfmt TEXT_HCOLFMT
+.Ve
+.PP
+\&\fBRestrictions and Problems\fR
+.PP
+As with raw event files, the '+' (copy extensions) specifier is not
+supported for programs such as funtable.
+.PP
+String to int and int to string data conversions are allowed by the
+text parsers. This is done more by force of circumstance than by
+conviction: these transitions often happens with VizieR catalogs,
+which we want to support fully. One consequence of allowing these
+transitions is that the text parsers can get confused by columns which
+contain a valid integer in the first row and then switch to a
+string. Consider the following table:
+.PP
+.Vb 4
+\& xxx yyy zzz
+\& ---- ---- ----
+\& 111 aaa bbb
+\& ccc 222 ddd
+.Ve
+.PP
+The xxx column has an integer value in row one a string in row two,
+while the yyy column has the reverse. The parser will erroneously
+treat the first column as having data type int:
+.PP
+.Vb 5
+\& fundisp foo.tab
+\& XXX YYY ZZZ
+\& ---------- ------------ ------------
+\& 111 'aaa' 'bbb'
+\& 1667457792 '222' 'ddd'
+.Ve
+.PP
+while the second column is processed correctly. This situation can be avoided
+in any number of ways, all of which force the data type of the first column
+to be a string. For example, you can edit the file and explicitly quote the
+first row of the column:
+.PP
+.Vb 4
+\& xxx yyy zzz
+\& ---- ---- ----
+\& "111" aaa bbb
+\& ccc 222 ddd
+.Ve
+.PP
+.Vb 5
+\& [sh] fundisp foo.tab
+\& XXX YYY ZZZ
+\& ------------ ------------ ------------
+\& '111' 'aaa' 'bbb'
+\& 'ccc' '222' 'ddd'
+.Ve
+.PP
+You can edit the file and explicitly set the data type of the first column:
+.PP
+.Vb 4
+\& xxx:3A yyy zzz
+\& ------ ---- ----
+\& 111 aaa bbb
+\& ccc 222 ddd
+.Ve
+.PP
+.Vb 5
+\& [sh] fundisp foo.tab
+\& XXX YYY ZZZ
+\& ------------ ------------ ------------
+\& '111' 'aaa' 'bbb'
+\& 'ccc' '222' 'ddd'
+.Ve
+.PP
+You also can explicitly set the column names and data types of all columns,
+without editing the file:
+.PP
+.Vb 5
+\& [sh] fundisp foo.tab'[TEXT(xxx:3A,yyy:3A,zzz:3a)]'
+\& XXX YYY ZZZ
+\& ------------ ------------ ------------
+\& '111' 'aaa' 'bbb'
+\& 'ccc' '222' 'ddd'
+.Ve
+.PP
+The issue of data type transitions (which to allow and which to disallow)
+is still under discussion.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+See funtools(7) for a list of Funtools help pages