diff options
| author | Peter Wemm <peter@FreeBSD.org> | 1995-12-30 19:02:48 +0000 |
|---|---|---|
| committer | Peter Wemm <peter@FreeBSD.org> | 1995-12-30 19:02:48 +0000 |
| commit | 6065a0be1165c4cd506d8eb4a71f22af440fef64 (patch) | |
| tree | 48ddeda3c6c8d8572cc34bf52ccf9cb9bd97d488 /gnu | |
| parent | a5b996a7ecea192e05c848269fbfb40c1e7c50ef (diff) | |
Notes
Diffstat (limited to 'gnu')
57 files changed, 0 insertions, 77994 deletions
diff --git a/gnu/lib/libg++/include/regex.h b/gnu/lib/libg++/include/regex.h deleted file mode 100644 index 9e404e8da100..000000000000 --- a/gnu/lib/libg++/include/regex.h +++ /dev/null @@ -1,272 +0,0 @@ -/* Definitions for data structures callers pass the regex library. - - Copyright (C) 1985, 1989-92 Free Software Foundation, Inc. - -This file is part of the GNU C++ Library. This library is free -software; you can redistribute it and/or modify it under the terms of -the GNU Library General Public License as published by the Free -Software Foundation; either version 2 of the License, or (at your -option) any later version. This library is distributed in the hope -that it will be useful, but WITHOUT ANY WARRANTY; without even the -implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -PURPOSE. See the GNU Library General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the Free Software -Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __REGEXP_LIBRARY -#define __REGEXP_LIBRARY - -#if defined(SHORT_NAMES) || defined(VMS) -#define re_compile_pattern recmppat -#define re_pattern_buffer repatbuf -#define re_registers reregs -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* Define number of parens for which we record the beginnings and ends. - This affects how much space the `struct re_registers' type takes up. */ -#ifndef RE_NREGS -#define RE_NREGS 10 -#endif - -#define BYTEWIDTH 8 - - -/* Maximum number of duplicates an interval can allow. */ -#ifndef RE_DUP_MAX /* kludge for AIX, which defines it */ -#define RE_DUP_MAX ((1 << 15) - 1) -#endif - -/* This defines the various regexp syntaxes. */ -extern int obscure_syntax; - - -/* The following bits are used in the obscure_syntax variable to choose among - alternative regexp syntaxes. */ - -/* If this bit is set, plain parentheses serve as grouping, and backslash - parentheses are needed for literal searching. - If not set, backslash-parentheses are grouping, and plain parentheses - are for literal searching. */ -#define RE_NO_BK_PARENS 1 - -/* If this bit is set, plain | serves as the `or'-operator, and \| is a - literal. - If not set, \| serves as the `or'-operator, and | is a literal. */ -#define RE_NO_BK_VBAR (1 << 1) - -/* If this bit is not set, plain + or ? serves as an operator, and \+, \? are - literals. - If set, \+, \? are operators and plain +, ? are literals. */ -#define RE_BK_PLUS_QM (1 << 2) - -/* If this bit is set, | binds tighter than ^ or $. - If not set, the contrary. */ -#define RE_TIGHT_VBAR (1 << 3) - -/* If this bit is set, then treat newline as an OR operator. - If not set, treat it as a normal character. */ -#define RE_NEWLINE_OR (1 << 4) - -/* If this bit is set, then special characters may act as normal - characters in some contexts. Specifically, this applies to: - ^ -- only special at the beginning, or after ( or |; - $ -- only special at the end, or before ) or |; - *, +, ? -- only special when not after the beginning, (, or |. - If this bit is not set, special characters (such as *, ^, and $) - always have their special meaning regardless of the surrounding - context. */ -#define RE_CONTEXT_INDEP_OPS (1 << 5) - -/* If this bit is not set, then \ before anything inside [ and ] is taken as - a real \. - If set, then such a \ escapes the following character. This is a - special case for awk. */ -#define RE_AWK_CLASS_HACK (1 << 6) - -/* If this bit is set, then \{ and \} or { and } serve as interval operators. - If not set, then \{ and \} and { and } are treated as literals. */ -#define RE_INTERVALS (1 << 7) - -/* If this bit is not set, then \{ and \} serve as interval operators and - { and } are literals. - If set, then { and } serve as interval operators and \{ and \} are - literals. */ -#define RE_NO_BK_CURLY_BRACES (1 << 8) - -/* If this bit is set, then character classes are supported; they are: - [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], - [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. - If not set, then character classes are not supported. */ -#define RE_CHAR_CLASSES (1 << 9) - -/* If this bit is set, then the dot re doesn't match a null byte. - If not set, it does. */ -#define RE_DOT_NOT_NULL (1 << 10) - -/* If this bit is set, then [^...] doesn't match a newline. - If not set, it does. */ -#define RE_HAT_NOT_NEWLINE (1 << 11) - -/* If this bit is set, back references are recognized. - If not set, they aren't. */ -#define RE_NO_BK_REFS (1 << 12) - -/* If this bit is set, back references must refer to a preceding - subexpression. If not set, a back reference to a nonexistent - subexpression is treated as literal characters. */ -#define RE_NO_EMPTY_BK_REF (1 << 13) - -/* If this bit is set, bracket expressions can't be empty. - If it is set, they can be empty. */ -#define RE_NO_EMPTY_BRACKETS (1 << 14) - -/* If this bit is set, then *, +, ? and { cannot be first in an re or - immediately after a |, or a (. Furthermore, a | cannot be first or - last in an re, or immediately follow another | or a (. Also, a ^ - cannot appear in a nonleading position and a $ cannot appear in a - nontrailing position (outside of bracket expressions, that is). */ -#define RE_CONTEXTUAL_INVALID_OPS (1 << 15) - -/* If this bit is set, then +, ? and | aren't recognized as operators. - If it's not, they are. */ -#define RE_LIMITED_OPS (1 << 16) - -/* If this bit is set, then an ending range point has to collate higher - or equal to the starting range point. - If it's not set, then when the ending range point collates higher - than the starting range point, the range is just considered empty. */ -#define RE_NO_EMPTY_RANGES (1 << 17) - -/* If this bit is set, then a hyphen (-) can't be an ending range point. - If it isn't, then it can. */ -#define RE_NO_HYPHEN_RANGE_END (1 << 18) - - -/* Define combinations of bits for the standard possibilities. */ -#define RE_SYNTAX_POSIX_AWK (RE_NO_BK_PARENS | RE_NO_BK_VBAR \ - | RE_CONTEXT_INDEP_OPS) -#define RE_SYNTAX_AWK (RE_NO_BK_PARENS | RE_NO_BK_VBAR \ - | RE_CONTEXT_INDEP_OPS | RE_AWK_CLASS_HACK) -#define RE_SYNTAX_EGREP (RE_NO_BK_PARENS | RE_NO_BK_VBAR \ - | RE_CONTEXT_INDEP_OPS | RE_NEWLINE_OR) -#define RE_SYNTAX_GREP (RE_BK_PLUS_QM | RE_NEWLINE_OR) -#define RE_SYNTAX_EMACS 0 -#define RE_SYNTAX_POSIX_BASIC (RE_INTERVALS | RE_BK_PLUS_QM \ - | RE_CHAR_CLASSES | RE_DOT_NOT_NULL \ - | RE_HAT_NOT_NEWLINE | RE_NO_EMPTY_BK_REF \ - | RE_NO_EMPTY_BRACKETS | RE_LIMITED_OPS \ - | RE_NO_EMPTY_RANGES | RE_NO_HYPHEN_RANGE_END) - -#define RE_SYNTAX_POSIX_EXTENDED (RE_INTERVALS | RE_NO_BK_CURLY_BRACES \ - | RE_NO_BK_VBAR | RE_NO_BK_PARENS \ - | RE_HAT_NOT_NEWLINE | RE_CHAR_CLASSES \ - | RE_NO_EMPTY_BRACKETS | RE_CONTEXTUAL_INVALID_OPS \ - | RE_NO_BK_REFS | RE_NO_EMPTY_RANGES \ - | RE_NO_HYPHEN_RANGE_END) - - -/* This data structure is used to represent a compiled pattern. */ - -struct re_pattern_buffer - { - char *buffer; /* Space holding the compiled pattern commands. */ - long allocated; /* Size of space that `buffer' points to. */ - long used; /* Length of portion of buffer actually occupied */ - char *fastmap; /* Pointer to fastmap, if any, or zero if none. */ - /* re_search uses the fastmap, if there is one, - to skip over totally implausible characters. */ - char *translate; /* Translate table to apply to all characters before - comparing, or zero for no translation. - The translation is applied to a pattern when it is - compiled and to data when it is matched. */ - char fastmap_accurate; - /* Set to zero when a new pattern is stored, - set to one when the fastmap is updated from it. */ - char can_be_null; /* Set to one by compiling fastmap - if this pattern might match the null string. - It does not necessarily match the null string - in that case, but if this is zero, it cannot. - 2 as value means can match null string - but at end of range or before a character - listed in the fastmap. */ - }; - - -/* search.c (search_buffer) needs this one value. It is defined both in - regex.c and here. */ -#define RE_EXACTN_VALUE 1 - - -/* Structure to store register contents data in. - - Pass the address of such a structure as an argument to re_match, etc., - if you want this information back. - - For i from 1 to RE_NREGS - 1, start[i] records the starting index in - the string of where the ith subexpression matched, and end[i] records - one after the ending index. start[0] and end[0] are analogous, for - the entire pattern. */ - -struct re_registers - { - int start[RE_NREGS]; - int end[RE_NREGS]; - }; - - - -#if defined(__STDC__) || defined(__cplusplus) - -extern char *re_compile_pattern (const char *, int, struct re_pattern_buffer *); -/* Is this really advertised? */ -extern void re_compile_fastmap (struct re_pattern_buffer *); -extern int re_search (struct re_pattern_buffer *, char*, int, int, int, - struct re_registers *); -extern int re_search_2 (struct re_pattern_buffer *, char *, int, - char *, int, int, int, - struct re_registers *, int); -extern int re_match (struct re_pattern_buffer *, char *, int, int, - struct re_registers *); -extern int re_match_2 (struct re_pattern_buffer *, char *, int, - char *, int, int, struct re_registers *, int); - -#if 0 -/* 4.2 bsd compatibility. */ -extern char *re_comp (char *); -extern int re_exec (char *); -#endif - -#else /* !__STDC__ */ - -#define const /* nothing */ -extern char *re_compile_pattern (); -/* Is this really advertised? */ -extern void re_compile_fastmap (); -extern int re_search (), re_search_2 (); -extern int re_match (), re_match_2 (); - -#if 0 -/* 4.2 bsd compatibility. */ -extern char *re_comp (); -extern int re_exec (); -#endif - -#endif /* __STDC__ */ - - -#ifdef SYNTAX_TABLE -extern char *re_syntax_table; -#endif - -#ifdef __cplusplus -extern int re_max_failures; -} -#endif - -#endif /* !__REGEXP_LIBRARY */ diff --git a/gnu/usr.bin/awk/gawk.texi b/gnu/usr.bin/awk/gawk.texi deleted file mode 100644 index b2802623136d..000000000000 --- a/gnu/usr.bin/awk/gawk.texi +++ /dev/null @@ -1,11270 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header (This is for running Texinfo on a region.) -@setfilename gawk.info -@settitle The GAWK Manual -@c @smallbook -@c %**end of header (This is for running Texinfo on a region.) - -@ifinfo -@synindex fn cp -@synindex vr cp -@end ifinfo -@iftex -@syncodeindex fn cp -@syncodeindex vr cp -@end iftex - -@c If "finalout" is commented out, the printed output will show -@c black boxes that mark lines that are too long. Thus, it is -@c unwise to comment it out when running a master in case there are -@c overfulls which are deemed okay. - -@iftex -@finalout -@end iftex - -@c ===> NOTE! <== -@c Determine the edition number in *four* places by hand: -@c 1. First ifinfo section 2. title page 3. copyright page 4. top node -@c To find the locations, search for !!set - -@ifinfo -This file documents @code{awk}, a program that you can use to select -particular records in a file and perform operations upon them. - -This is Edition 0.15 of @cite{The GAWK Manual}, @* -for the 2.15 version of the GNU implementation @* -of AWK. - -Copyright (C) 1989, 1991, 1992, 1993 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. -@end ifinfo - -@setchapternewpage odd - -@c !!set edition, date, version -@titlepage -@title The GAWK Manual -@subtitle Edition 0.15 -@subtitle April 1993 -@author Diane Barlow Close -@author Arnold D. Robbins -@author Paul H. Rubin -@author Richard Stallman - -@c Include the Distribution inside the titlepage environment so -@c that headings are turned off. Headings on and off do not work. - -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1989, 1991, 1992, 1993 Free Software Foundation, Inc. -@sp 2 - -@c !!set edition, date, version -This is Edition 0.15 of @cite{The GAWK Manual}, @* -for the 2.15 version of the GNU implementation @* -of AWK. - -@sp 2 -Published by the Free Software Foundation @* -675 Massachusetts Avenue @* -Cambridge, MA 02139 USA @* -Printed copies are available for $20 each. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. -@end titlepage - -@ifinfo -@node Top, Preface, (dir), (dir) -@comment node-name, next, previous, up -@top General Introduction -@c Preface or Licensing nodes should come right after the Top -@c node, in `unnumbered' sections, then the chapter, `What is gawk'. - -This file documents @code{awk}, a program that you can use to select -particular records in a file and perform operations upon them. - -@c !!set edition, date, version -This is Edition 0.15 of @cite{The GAWK Manual}, @* -for the 2.15 version of the GNU implementation @* -of AWK. - -@end ifinfo - -@menu -* Preface:: What you can do with @code{awk}; brief history - and acknowledgements. -* Copying:: Your right to copy and distribute @code{gawk}. -* This Manual:: Using this manual. - Includes sample input files that you can use. -* Getting Started:: A basic introduction to using @code{awk}. - How to run an @code{awk} program. - Command line syntax. -* Reading Files:: How to read files and manipulate fields. -* Printing:: How to print using @code{awk}. Describes the - @code{print} and @code{printf} statements. - Also describes redirection of output. -* One-liners:: Short, sample @code{awk} programs. -* Patterns:: The various types of patterns - explained in detail. -* Actions:: The various types of actions are - introduced here. Describes - expressions and the various operators in - detail. Also describes comparison expressions. -* Expressions:: Expressions are the basic building - blocks of statements. -* Statements:: The various control statements are - described in detail. -* Arrays:: The description and use of arrays. - Also includes array-oriented control - statements. -* Built-in:: The built-in functions are summarized here. -* User-defined:: User-defined functions are described in detail. -* Built-in Variables:: Built-in Variables -* Command Line:: How to run @code{gawk}. -* Language History:: The evolution of the @code{awk} language. -* Installation:: Installing @code{gawk} under - various operating systems. -* Gawk Summary:: @code{gawk} Options and Language Summary. -* Sample Program:: A sample @code{awk} program with a - complete explanation. -* Bugs:: Reporting Problems and Bugs. -* Notes:: Something about the - implementation of @code{gawk}. -* Glossary:: An explanation of some unfamiliar terms. -* Index:: -@end menu - -@node Preface, Copying, Top, Top -@comment node-name, next, previous, up -@unnumbered Preface - -@iftex -@cindex what is @code{awk} -@end iftex -If you are like many computer users, you would frequently like to make -changes in various text files wherever certain patterns appear, or -extract data from parts of certain lines while discarding the rest. To -write a program to do this in a language such as C or Pascal is a -time-consuming inconvenience that may take many lines of code. The job -may be easier with @code{awk}. - -The @code{awk} utility interprets a special-purpose programming language -that makes it possible to handle simple data-reformatting jobs easily -with just a few lines of code. - -The GNU implementation of @code{awk} is called @code{gawk}; it is fully -upward compatible with the System V Release 4 version of -@code{awk}. @code{gawk} is also upward compatible with the @sc{posix} -(draft) specification of the @code{awk} language. This means that all -properly written @code{awk} programs should work with @code{gawk}. -Thus, we usually don't distinguish between @code{gawk} and other @code{awk} -implementations in this manual.@refill - -@cindex uses of @code{awk} -This manual teaches you what @code{awk} does and how you can use -@code{awk} effectively. You should already be familiar with basic -system commands such as @code{ls}. Using @code{awk} you can: @refill - -@itemize @bullet -@item -manage small, personal databases - -@item -generate reports - -@item -validate data -@item -produce indexes, and perform other document preparation tasks - -@item -even experiment with algorithms that can be adapted later to other computer -languages -@end itemize - -@iftex -This manual has the difficult task of being both tutorial and reference. -If you are a novice, feel free to skip over details that seem too complex. -You should also ignore the many cross references; they are for the -expert user, and for the on-line Info version of the manual. -@end iftex - -@menu -* History:: The history of @code{gawk} and - @code{awk}. Acknowledgements. -@end menu - -@node History, , Preface, Preface -@comment node-name, next, previous, up -@unnumberedsec History of @code{awk} and @code{gawk} - -@cindex acronym -@cindex history of @code{awk} -The name @code{awk} comes from the initials of its designers: Alfred V. -Aho, Peter J. Weinberger, and Brian W. Kernighan. The original version of -@code{awk} was written in 1977. In 1985 a new version made the programming -language more powerful, introducing user-defined functions, multiple input -streams, and computed regular expressions. -This new version became generally available with System V Release 3.1. -The version in System V Release 4 added some new features and also cleaned -up the behavior in some of the ``dark corners'' of the language. -The specification for @code{awk} in the @sc{posix} Command Language -and Utilities standard further clarified the language based on feedback -from both the @code{gawk} designers, and the original @code{awk} -designers.@refill - -The GNU implementation, @code{gawk}, was written in 1986 by Paul Rubin -and Jay Fenlason, with advice from Richard Stallman. John Woods -contributed parts of the code as well. In 1988 and 1989, David Trueman, with -help from Arnold Robbins, thoroughly reworked @code{gawk} for compatibility -with the newer @code{awk}. Current development (1992) focuses on bug fixes, -performance improvements, and standards compliance. - -We need to thank many people for their assistance in producing this -manual. Jay Fenlason contributed many ideas and sample programs. Richard -Mlynarik and Robert J. Chassell gave helpful comments on early drafts of this -manual. The paper @cite{A Supplemental Document for @code{awk}} by John W. -Pierce of the Chemistry Department at UC San Diego, pinpointed several -issues relevant both to @code{awk} implementation and to this manual, that -would otherwise have escaped us. David Trueman, Pat Rankin, and Michal -Jaegermann also contributed sections of the manual.@refill - -The following people provided many helpful comments on this edition of -the manual: Rick Adams, Michael Brennan, Rich Burridge, Diane Close, -Christopher (``Topher'') Eliot, Michael Lijewski, Pat Rankin, Miriam Robbins, -and Michal Jaegermann. Robert J. Chassell provided much valuable advice on -the use of Texinfo. - -Finally, we would like to thank Brian Kernighan of Bell Labs for invaluable -assistance during the testing and debugging of @code{gawk}, and for -help in clarifying numerous points about the language.@refill - -@node Copying, This Manual, Preface, Top -@unnumbered GNU GENERAL PUBLIC LICENSE -@center Version 2, June 1991 - -@display -Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. -675 Mass Ave, Cambridge, MA 02139, USA - -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. -@end display - -@c fakenode --- for prepinfo -@unnumberedsec Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software---to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - -@iftex -@c fakenode --- for prepinfo -@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -@end iftex -@ifinfo -@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -@end ifinfo - -@enumerate -@item -This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The ``Program'', below, -refers to any such program or work, and a ``work based on the Program'' -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term ``modification''.) Each licensee is addressed as ``you''. - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - -@item -You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - -@item -You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - -@enumerate a -@item -You must cause the modified files to carry prominent notices -stating that you changed the files and the date of any change. - -@item -You must cause any work that you distribute or publish, that in -whole or in part contains or is derived from the Program or any -part thereof, to be licensed as a whole at no charge to all third -parties under the terms of this License. - -@item -If the modified program normally reads commands interactively -when run, you must cause it, when started running for such -interactive use in the most ordinary way, to print or display an -announcement including an appropriate copyright notice and a -notice that there is no warranty (or else, saying that you provide -a warranty) and that users may redistribute the program under -these conditions, and telling the user how to view a copy of this -License. (Exception: if the Program itself is interactive but -does not normally print such an announcement, your work based on -the Program is not required to print an announcement.) -@end enumerate - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - -@item -You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - -@enumerate a -@item -Accompany it with the complete corresponding machine-readable -source code, which must be distributed under the terms of Sections -1 and 2 above on a medium customarily used for software interchange; or, - -@item -Accompany it with a written offer, valid for at least three -years, to give any third party, for a charge no more than your -cost of physically performing source distribution, a complete -machine-readable copy of the corresponding source code, to be -distributed under the terms of Sections 1 and 2 above on a medium -customarily used for software interchange; or, - -@item -Accompany it with the information you received as to the offer -to distribute corresponding source code. (This alternative is -allowed only for noncommercial distribution and only if you -received the program in object code or executable form with such -an offer, in accord with Subsection b above.) -@end enumerate - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - -@item -You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - -@item -You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - -@item -Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - -@item -If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - -@item -If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - -@item -The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and ``any -later version'', you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - -@item -If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - -@iftex -@c fakenode --- for prepinfo -@heading NO WARRANTY -@end iftex -@ifinfo -@center NO WARRANTY -@end ifinfo - -@item -BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - -@item -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. -@end enumerate - -@iftex -@c fakenode --- for prepinfo -@heading END OF TERMS AND CONDITIONS -@end iftex -@ifinfo -@center END OF TERMS AND CONDITIONS -@end ifinfo - -@page -@c fakenode --- for prepinfo -@unnumberedsec How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the ``copyright'' line and a pointer to where the full notice is found. - -@smallexample -@var{one line to give the program's name and a brief idea of what it does.} -Copyright (C) 19@var{yy} @var{name of author} - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -@end smallexample - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - -@smallexample -Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} -Gnomovision comes with ABSOLUTELY NO WARRANTY; for details -type `show w'. -This is free software, and you are welcome to redistribute it -under certain conditions; type `show c' for details. -@end smallexample - -The hypothetical commands @samp{show w} and @samp{show c} should show -the appropriate parts of the General Public License. Of course, the -commands you use may be called something other than @samp{show w} and -@samp{show c}; they could even be mouse-clicks or menu items---whatever -suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a ``copyright disclaimer'' for the program, if -necessary. Here is a sample; alter the names: - -@smallexample -Yoyodyne, Inc., hereby disclaims all copyright interest in the program -`Gnomovision' (which makes passes at compilers) written by James Hacker. - -@var{signature of Ty Coon}, 1 April 1989 -Ty Coon, President of Vice -@end smallexample - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. - -@node This Manual, Getting Started, Copying, Top -@chapter Using this Manual -@cindex manual, using this -@cindex using this manual -@cindex language, @code{awk} -@cindex program, @code{awk} -@cindex @code{awk} language -@cindex @code{awk} program - -The term @code{awk} refers to a particular program, and to the language you -use to tell this program what to do. When we need to be careful, we call -the program ``the @code{awk} utility'' and the language ``the @code{awk} -language.'' The term @code{gawk} refers to a version of @code{awk} developed -as part the GNU project. The purpose of this manual is to explain -both the -@code{awk} language and how to run the @code{awk} utility.@refill - -While concentrating on the features of @code{gawk}, the manual will also -attempt to describe important differences between @code{gawk} and other -@code{awk} implementations. In particular, any features that are not -in the @sc{posix} standard for @code{awk} will be noted. @refill - -The term @dfn{@code{awk} program} refers to a program written by you in -the @code{awk} programming language.@refill - -@xref{Getting Started, ,Getting Started with @code{awk}}, for the bare -essentials you need to know to start using @code{awk}. - -Some useful ``one-liners'' are included to give you a feel for the -@code{awk} language (@pxref{One-liners, ,Useful ``One-liners''}). - -@ignore -@strong{I deleted four paragraphs here because they would confuse the -beginner more than help him. They mention terms such as ``field,'' -``pattern,'' ``action,'' ``built-in function'' which the beginner -doesn't know.} - -@strong{If you can find a way to introduce several of these concepts here, -enough to give the reader a map of what is to follow, that might -be useful. I'm not sure that can be done without taking up more -space than ought to be used here. There may be no way to win.} - -@strong{ADR: I'd like to tackle this in phase 2 of my editing.} -@end ignore - -A sample @code{awk} program has been provided for you -(@pxref{Sample Program}).@refill - -If you find terms that you aren't familiar with, try looking them -up in the glossary (@pxref{Glossary}).@refill - -The entire @code{awk} language is summarized for quick reference in -@ref{Gawk Summary, ,@code{gawk} Summary}. Look there if you just need -to refresh your memory about a particular feature.@refill - -Most of the time complete @code{awk} programs are used as examples, but in -some of the more advanced sections, only the part of the @code{awk} program -that illustrates the concept being described is shown.@refill - -@menu -* Sample Data Files:: Sample data files for use in the @code{awk} - programs illustrated in this manual. -@end menu - -@node Sample Data Files, , This Manual, This Manual -@section Data Files for the Examples - -@cindex input file, sample -@cindex sample input file -@cindex @file{BBS-list} file -Many of the examples in this manual take their input from two sample -data files. The first, called @file{BBS-list}, represents a list of -computer bulletin board systems together with information about those systems. -The second data file, called @file{inventory-shipped}, contains -information about shipments on a monthly basis. Each line of these -files is one @dfn{record}. - -In the file @file{BBS-list}, each record contains the name of a computer -bulletin board, its phone number, the board's baud rate, and a code for -the number of hours it is operational. An @samp{A} in the last column -means the board operates 24 hours a day. A @samp{B} in the last -column means the board operates evening and weekend hours, only. A -@samp{C} means the board operates only on weekends. - -@example -aardvark 555-5553 1200/300 B -alpo-net 555-3412 2400/1200/300 A -barfly 555-7685 1200/300 A -bites 555-1675 2400/1200/300 A -camelot 555-0542 300 C -core 555-2912 1200/300 C -fooey 555-1234 2400/1200/300 B -foot 555-6699 1200/300 B -macfoo 555-6480 1200/300 A -sdace 555-3430 2400/1200/300 A -sabafoo 555-2127 1200/300 C -@end example - -@cindex @file{inventory-shipped} file -The second data file, called @file{inventory-shipped}, represents -information about shipments during the year. -Each record contains the month of the year, the number -of green crates shipped, the number of red boxes shipped, the number of -orange bags shipped, and the number of blue packages shipped, -respectively. There are 16 entries, covering the 12 months of one year -and 4 months of the next year.@refill - -@example -Jan 13 25 15 115 -Feb 15 32 24 226 -Mar 15 24 34 228 -Apr 31 52 63 420 -May 16 34 29 208 -Jun 31 42 75 492 -Jul 24 34 67 436 -Aug 15 34 47 316 -Sep 13 55 37 277 -Oct 29 54 68 525 -Nov 20 87 82 577 -Dec 17 35 61 401 - -Jan 21 36 64 620 -Feb 26 58 80 652 -Mar 24 75 70 495 -Apr 21 70 74 514 -@end example - -@ifinfo -If you are reading this in GNU Emacs using Info, you can copy the regions -of text showing these sample files into your own test files. This way you -can try out the examples shown in the remainder of this document. You do -this by using the command @kbd{M-x write-region} to copy text from the Info -file into a file for use with @code{awk} -(@xref{Misc File Ops, , , emacs, GNU Emacs Manual}, -for more information). Using this information, create your own -@file{BBS-list} and @file{inventory-shipped} files, and practice what you -learn in this manual. -@end ifinfo - -@node Getting Started, Reading Files, This Manual, Top -@chapter Getting Started with @code{awk} -@cindex script, definition of -@cindex rule, definition of -@cindex program, definition of -@cindex basic function of @code{gawk} - -The basic function of @code{awk} is to search files for lines (or other -units of text) that contain certain patterns. When a line matches one -of the patterns, @code{awk} performs specified actions on that line. -@code{awk} keeps processing input lines in this way until the end of the -input file is reached.@refill - -When you run @code{awk}, you specify an @code{awk} @dfn{program} which -tells @code{awk} what to do. The program consists of a series of -@dfn{rules}. (It may also contain @dfn{function definitions}, but that -is an advanced feature, so we will ignore it for now. -@xref{User-defined, ,User-defined Functions}.) Each rule specifies one -pattern to search for, and one action to perform when that pattern is found. - -Syntactically, a rule consists of a pattern followed by an action. The -action is enclosed in curly braces to separate it from the pattern. -Rules are usually separated by newlines. Therefore, an @code{awk} -program looks like this: - -@example -@var{pattern} @{ @var{action} @} -@var{pattern} @{ @var{action} @} -@dots{} -@end example - -@menu -* Very Simple:: A very simple example. -* Two Rules:: A less simple one-line example with two rules. -* More Complex:: A more complex example. -* Running gawk:: How to run @code{gawk} programs; - includes command line syntax. -* Comments:: Adding documentation to @code{gawk} programs. -* Statements/Lines:: Subdividing or combining statements into lines. -* When:: When to use @code{gawk} and - when to use other things. -@end menu - -@node Very Simple, Two Rules, Getting Started, Getting Started -@section A Very Simple Example - -@cindex @samp{print $0} -The following command runs a simple @code{awk} program that searches the -input file @file{BBS-list} for the string of characters: @samp{foo}. (A -string of characters is usually called, a @dfn{string}. -The term @dfn{string} is perhaps based on similar usage in English, such -as ``a string of pearls,'' or, ``a string of cars in a train.'') - -@example -awk '/foo/ @{ print $0 @}' BBS-list -@end example - -@noindent -When lines containing @samp{foo} are found, they are printed, because -@w{@samp{print $0}} means print the current line. (Just @samp{print} by -itself means the same thing, so we could have written that -instead.) - -You will notice that slashes, @samp{/}, surround the string @samp{foo} -in the actual @code{awk} program. The slashes indicate that @samp{foo} -is a pattern to search for. This type of pattern is called a -@dfn{regular expression}, and is covered in more detail later -(@pxref{Regexp, ,Regular Expressions as Patterns}). There are -single-quotes around the @code{awk} program so that the shell won't -interpret any of it as special shell characters.@refill - -Here is what this program prints: - -@example -@group -fooey 555-1234 2400/1200/300 B -foot 555-6699 1200/300 B -macfoo 555-6480 1200/300 A -sabafoo 555-2127 1200/300 C -@end group -@end example - -@cindex action, default -@cindex pattern, default -@cindex default action -@cindex default pattern -In an @code{awk} rule, either the pattern or the action can be omitted, -but not both. If the pattern is omitted, then the action is performed -for @emph{every} input line. If the action is omitted, the default -action is to print all lines that match the pattern. - -Thus, we could leave out the action (the @code{print} statement and the curly -braces) in the above example, and the result would be the same: all -lines matching the pattern @samp{foo} would be printed. By comparison, -omitting the @code{print} statement but retaining the curly braces makes an -empty action that does nothing; then no lines would be printed. - -@node Two Rules, More Complex, Very Simple, Getting Started -@section An Example with Two Rules -@cindex how @code{awk} works - -The @code{awk} utility reads the input files one line at a -time. For each line, @code{awk} tries the patterns of each of the rules. -If several patterns match then several actions are run, in the order in -which they appear in the @code{awk} program. If no patterns match, then -no actions are run. - -After processing all the rules (perhaps none) that match the line, -@code{awk} reads the next line (however, -@pxref{Next Statement, ,The @code{next} Statement}). This continues -until the end of the file is reached.@refill - -For example, the @code{awk} program: - -@example -/12/ @{ print $0 @} -/21/ @{ print $0 @} -@end example - -@noindent -contains two rules. The first rule has the string @samp{12} as the -pattern and @samp{print $0} as the action. The second rule has the -string @samp{21} as the pattern and also has @samp{print $0} as the -action. Each rule's action is enclosed in its own pair of braces. - -This @code{awk} program prints every line that contains the string -@samp{12} @emph{or} the string @samp{21}. If a line contains both -strings, it is printed twice, once by each rule. - -If we run this program on our two sample data files, @file{BBS-list} and -@file{inventory-shipped}, as shown here: - -@example -awk '/12/ @{ print $0 @} - /21/ @{ print $0 @}' BBS-list inventory-shipped -@end example - -@noindent -we get the following output: - -@example -aardvark 555-5553 1200/300 B -alpo-net 555-3412 2400/1200/300 A -barfly 555-7685 1200/300 A -bites 555-1675 2400/1200/300 A -core 555-2912 1200/300 C -fooey 555-1234 2400/1200/300 B -foot 555-6699 1200/300 B -macfoo 555-6480 1200/300 A -sdace 555-3430 2400/1200/300 A -sabafoo 555-2127 1200/300 C -sabafoo 555-2127 1200/300 C -Jan 21 36 64 620 -Apr 21 70 74 514 -@end example - -@noindent -Note how the line in @file{BBS-list} beginning with @samp{sabafoo} -was printed twice, once for each rule. - -@node More Complex, Running gawk, Two Rules, Getting Started -@comment node-name, next, previous, up -@section A More Complex Example - -Here is an example to give you an idea of what typical @code{awk} -programs do. This example shows how @code{awk} can be used to -summarize, select, and rearrange the output of another utility. It uses -features that haven't been covered yet, so don't worry if you don't -understand all the details. - -@example -ls -l | awk '$5 == "Nov" @{ sum += $4 @} - END @{ print sum @}' -@end example - -This command prints the total number of bytes in all the files in the -current directory that were last modified in November (of any year). -(In the C shell you would need to type a semicolon and then a backslash -at the end of the first line; in a @sc{posix}-compliant shell, such as the -Bourne shell or the Bourne-Again shell, you can type the example as shown.) - -The @w{@samp{ls -l}} part of this example is a command that gives you a -listing of the files in a directory, including file size and date. -Its output looks like this:@refill - -@example --rw-r--r-- 1 close 1933 Nov 7 13:05 Makefile --rw-r--r-- 1 close 10809 Nov 7 13:03 gawk.h --rw-r--r-- 1 close 983 Apr 13 12:14 gawk.tab.h --rw-r--r-- 1 close 31869 Jun 15 12:20 gawk.y --rw-r--r-- 1 close 22414 Nov 7 13:03 gawk1.c --rw-r--r-- 1 close 37455 Nov 7 13:03 gawk2.c --rw-r--r-- 1 close 27511 Dec 9 13:07 gawk3.c --rw-r--r-- 1 close 7989 Nov 7 13:03 gawk4.c -@end example - -@noindent -The first field contains read-write permissions, the second field contains -the number of links to the file, and the third field identifies the owner of -the file. The fourth field contains the size of the file in bytes. The -fifth, sixth, and seventh fields contain the month, day, and time, -respectively, that the file was last modified. Finally, the eighth field -contains the name of the file. - -The @code{$5 == "Nov"} in our @code{awk} program is an expression that -tests whether the fifth field of the output from @w{@samp{ls -l}} -matches the string @samp{Nov}. Each time a line has the string -@samp{Nov} in its fifth field, the action @samp{@{ sum += $4 @}} is -performed. This adds the fourth field (the file size) to the variable -@code{sum}. As a result, when @code{awk} has finished reading all the -input lines, @code{sum} is the sum of the sizes of files whose -lines matched the pattern. (This works because @code{awk} variables -are automatically initialized to zero.)@refill - -After the last line of output from @code{ls} has been processed, the -@code{END} rule is executed, and the value of @code{sum} is -printed. In this example, the value of @code{sum} would be 80600.@refill - -These more advanced @code{awk} techniques are covered in later sections -(@pxref{Actions, ,Overview of Actions}). Before you can move on to more -advanced @code{awk} programming, you have to know how @code{awk} interprets -your input and displays your output. By manipulating fields and using -@code{print} statements, you can produce some very useful and spectacular -looking reports.@refill - -@node Running gawk, Comments, More Complex, Getting Started -@section How to Run @code{awk} Programs - -@ignore -Date: Mon, 26 Aug 91 09:48:10 +0200 -From: gatech!vsoc07.cern.ch!matheys (Jean-Pol Matheys (CERN - ECP Division)) -To: uunet.UU.NET!skeeve!arnold -Subject: RE: status check - -The introduction of Chapter 2 (i.e. before 2.1) should include -the whole of section 2.4 - it's better to tell people how to run awk programs -before giving any examples - -ADR --- he's right. but for now, don't do this because the rest of the -chapter would need some rewriting. -@end ignore - -@cindex command line formats -@cindex running @code{awk} programs -There are several ways to run an @code{awk} program. If the program is -short, it is easiest to include it in the command that runs @code{awk}, -like this: - -@example -awk '@var{program}' @var{input-file1} @var{input-file2} @dots{} -@end example - -@noindent -where @var{program} consists of a series of patterns and actions, as -described earlier. - -When the program is long, it is usually more convenient to put it in a file -and run it with a command like this: - -@example -awk -f @var{program-file} @var{input-file1} @var{input-file2} @dots{} -@end example - -@menu -* One-shot:: Running a short throw-away @code{awk} program. -* Read Terminal:: Using no input files (input from - terminal instead). -* Long:: Putting permanent @code{awk} programs in files. -* Executable Scripts:: Making self-contained @code{awk} programs. -@end menu - -@node One-shot, Read Terminal, Running gawk, Running gawk -@subsection One-shot Throw-away @code{awk} Programs - -Once you are familiar with @code{awk}, you will often type simple -programs at the moment you want to use them. Then you can write the -program as the first argument of the @code{awk} command, like this: - -@example -awk '@var{program}' @var{input-file1} @var{input-file2} @dots{} -@end example - -@noindent -where @var{program} consists of a series of @var{patterns} and -@var{actions}, as described earlier. - -@cindex single quotes, why needed -This command format instructs the shell to start @code{awk} and use the -@var{program} to process records in the input file(s). There are single -quotes around @var{program} so that the shell doesn't interpret any -@code{awk} characters as special shell characters. They also cause the -shell to treat all of @var{program} as a single argument for -@code{awk} and allow @var{program} to be more than one line long.@refill - -This format is also useful for running short or medium-sized @code{awk} -programs from shell scripts, because it avoids the need for a separate -file for the @code{awk} program. A self-contained shell script is more -reliable since there are no other files to misplace. - -@node Read Terminal, Long, One-shot, Running gawk -@subsection Running @code{awk} without Input Files - -@cindex standard input -@cindex input, standard -You can also run @code{awk} without any input files. If you type the -command line:@refill - -@example -awk '@var{program}' -@end example - -@noindent -then @code{awk} applies the @var{program} to the @dfn{standard input}, -which usually means whatever you type on the terminal. This continues -until you indicate end-of-file by typing @kbd{Control-d}. - -For example, if you execute this command: - -@example -awk '/th/' -@end example - -@noindent -whatever you type next is taken as data for that @code{awk} -program. If you go on to type the following data: - -@example -Kathy -Ben -Tom -Beth -Seth -Karen -Thomas -@kbd{Control-d} -@end example - -@noindent -then @code{awk} prints this output: - -@example -Kathy -Beth -Seth -@end example - -@noindent -@cindex case sensitivity -@cindex pattern, case sensitive -as matching the pattern @samp{th}. Notice that it did not recognize -@samp{Thomas} as matching the pattern. The @code{awk} language is -@dfn{case sensitive}, and matches patterns exactly. (However, you can -override this with the variable @code{IGNORECASE}. -@xref{Case-sensitivity, ,Case-sensitivity in Matching}.) - -@node Long, Executable Scripts, Read Terminal, Running gawk -@subsection Running Long Programs - -@cindex running long programs -@cindex @samp{-f} option -@cindex program file -@cindex file, @code{awk} program -Sometimes your @code{awk} programs can be very long. In this case it is -more convenient to put the program into a separate file. To tell -@code{awk} to use that file for its program, you type:@refill - -@example -awk -f @var{source-file} @var{input-file1} @var{input-file2} @dots{} -@end example - -The @samp{-f} instructs the @code{awk} utility to get the @code{awk} program -from the file @var{source-file}. Any file name can be used for -@var{source-file}. For example, you could put the program:@refill - -@example -/th/ -@end example - -@noindent -into the file @file{th-prog}. Then this command: - -@example -awk -f th-prog -@end example - -@noindent -does the same thing as this one: - -@example -awk '/th/' -@end example - -@noindent -which was explained earlier (@pxref{Read Terminal, ,Running @code{awk} without Input Files}). -Note that you don't usually need single quotes around the file name that you -specify with @samp{-f}, because most file names don't contain any of the shell's -special characters. Notice that in @file{th-prog}, the @code{awk} -program did not have single quotes around it. The quotes are only needed -for programs that are provided on the @code{awk} command line. - -If you want to identify your @code{awk} program files clearly as such, -you can add the extension @file{.awk} to the file name. This doesn't -affect the execution of the @code{awk} program, but it does make -``housekeeping'' easier. - -@node Executable Scripts, , Long, Running gawk -@c node-name, next, previous, up -@subsection Executable @code{awk} Programs -@cindex executable scripts -@cindex scripts, executable -@cindex self contained programs -@cindex program, self contained -@cindex @samp{#!} - -Once you have learned @code{awk}, you may want to write self-contained -@code{awk} scripts, using the @samp{#!} script mechanism. You can do -this on many Unix systems @footnote{The @samp{#!} mechanism works on -Unix systems derived from Berkeley Unix, System V Release 4, and some System -V Release 3 systems.} (and someday on GNU).@refill - -For example, you could create a text file named @file{hello}, containing -the following (where @samp{BEGIN} is a feature we have not yet -discussed): - -@example -#! /bin/awk -f - -# a sample awk program -BEGIN @{ print "hello, world" @} -@end example - -@noindent -After making this file executable (with the @code{chmod} command), you -can simply type: - -@example -hello -@end example - -@noindent -at the shell, and the system will arrange to run @code{awk} @footnote{The -line beginning with @samp{#!} lists the full pathname of an interpreter -to be run, and an optional initial command line argument to pass to that -interpreter. The operating system then runs the interpreter with the given -argument and the full argument list of the executed program. The first argument -in the list is the full pathname of the @code{awk} program. The rest of the -argument list will either be options to @code{awk}, or data files, -or both.} as if you had typed:@refill - -@example -awk -f hello -@end example - -@noindent -Self-contained @code{awk} scripts are useful when you want to write a -program which users can invoke without knowing that the program is -written in @code{awk}. - -@cindex shell scripts -@cindex scripts, shell -If your system does not support the @samp{#!} mechanism, you can get a -similar effect using a regular shell script. It would look something -like this: - -@example -: The colon makes sure this script is executed by the Bourne shell. -awk '@var{program}' "$@@" -@end example - -Using this technique, it is @emph{vital} to enclose the @var{program} in -single quotes to protect it from interpretation by the shell. If you -omit the quotes, only a shell wizard can predict the results. - -The @samp{"$@@"} causes the shell to forward all the command line -arguments to the @code{awk} program, without interpretation. The first -line, which starts with a colon, is used so that this shell script will -work even if invoked by a user who uses the C shell. -@c Someday: (See @cite{The Bourne Again Shell}, by ??.) - -@node Comments, Statements/Lines, Running gawk, Getting Started -@section Comments in @code{awk} Programs -@cindex @samp{#} -@cindex comments -@cindex use of comments -@cindex documenting @code{awk} programs -@cindex programs, documenting - -A @dfn{comment} is some text that is included in a program for the sake -of human readers, and that is not really part of the program. Comments -can explain what the program does, and how it works. Nearly all -programming languages have provisions for comments, because programs are -typically hard to understand without their extra help. - -In the @code{awk} language, a comment starts with the sharp sign -character, @samp{#}, and continues to the end of the line. The -@code{awk} language ignores the rest of a line following a sharp sign. -For example, we could have put the following into @file{th-prog}:@refill - -@smallexample -# This program finds records containing the pattern @samp{th}. This is how -# you continue comments on additional lines. -/th/ -@end smallexample - -You can put comment lines into keyboard-composed throw-away @code{awk} -programs also, but this usually isn't very useful; the purpose of a -comment is to help you or another person understand the program at -a later time.@refill - -@node Statements/Lines, When, Comments, Getting Started -@section @code{awk} Statements versus Lines - -Most often, each line in an @code{awk} program is a separate statement or -separate rule, like this: - -@example -awk '/12/ @{ print $0 @} - /21/ @{ print $0 @}' BBS-list inventory-shipped -@end example - -But sometimes statements can be more than one line, and lines can -contain several statements. You can split a statement into multiple -lines by inserting a newline after any of the following:@refill - -@example -, @{ ? : || && do else -@end example - -@noindent -A newline at any other point is considered the end of the statement. -(Splitting lines after @samp{?} and @samp{:} is a minor @code{gawk} -extension. The @samp{?} and @samp{:} referred to here is the -three operand conditional expression described in -@ref{Conditional Exp, ,Conditional Expressions}.)@refill - -@cindex backslash continuation -@cindex continuation of lines -If you would like to split a single statement into two lines at a point -where a newline would terminate it, you can @dfn{continue} it by ending the -first line with a backslash character, @samp{\}. This is allowed -absolutely anywhere in the statement, even in the middle of a string or -regular expression. For example: - -@example -awk '/This program is too long, so continue it\ - on the next line/ @{ print $1 @}' -@end example - -@noindent -We have generally not used backslash continuation in the sample programs in -this manual. Since in @code{gawk} there is no limit on the length of a line, -it is never strictly necessary; it just makes programs prettier. We have -preferred to make them even more pretty by keeping the statements short. -Backslash continuation is most useful when your @code{awk} program is in a -separate source file, instead of typed in on the command line. You should -also note that many @code{awk} implementations are more picky about where -you may use backslash continuation. For maximal portability of your @code{awk} -programs, it is best not to split your lines in the middle of a regular -expression or a string.@refill - -@strong{Warning: backslash continuation does not work as described above -with the C shell.} Continuation with backslash works for @code{awk} -programs in files, and also for one-shot programs @emph{provided} you -are using a @sc{posix}-compliant shell, such as the Bourne shell or the -Bourne-again shell. But the C shell used on Berkeley Unix behaves -differently! There, you must use two backslashes in a row, followed by -a newline.@refill - -@cindex multiple statements on one line -When @code{awk} statements within one rule are short, you might want to put -more than one of them on a line. You do this by separating the statements -with a semicolon, @samp{;}. -This also applies to the rules themselves. -Thus, the previous program could have been written:@refill - -@example -/12/ @{ print $0 @} ; /21/ @{ print $0 @} -@end example - -@noindent -@strong{Note:} the requirement that rules on the same line must be -separated with a semicolon is a recent change in the @code{awk} -language; it was done for consistency with the treatment of statements -within an action. - -@node When, , Statements/Lines, Getting Started -@section When to Use @code{awk} - -@cindex when to use @code{awk} -@cindex applications of @code{awk} -You might wonder how @code{awk} might be useful for you. Using additional -utility programs, more advanced patterns, field separators, arithmetic -statements, and other selection criteria, you can produce much more -complex output. The @code{awk} language is very useful for producing -reports from large amounts of raw data, such as summarizing information -from the output of other utility programs like @code{ls}. -(@xref{More Complex, ,A More Complex Example}.) - -Programs written with @code{awk} are usually much smaller than they would -be in other languages. This makes @code{awk} programs easy to compose and -use. Often @code{awk} programs can be quickly composed at your terminal, -used once, and thrown away. Since @code{awk} programs are interpreted, you -can avoid the usually lengthy edit-compile-test-debug cycle of software -development. - -Complex programs have been written in @code{awk}, including a complete -retargetable assembler for 8-bit microprocessors (@pxref{Glossary}, for -more information) and a microcode assembler for a special purpose Prolog -computer. However, @code{awk}'s capabilities are strained by tasks of -such complexity. - -If you find yourself writing @code{awk} scripts of more than, say, a few -hundred lines, you might consider using a different programming -language. Emacs Lisp is a good choice if you need sophisticated string -or pattern matching capabilities. The shell is also good at string and -pattern matching; in addition, it allows powerful use of the system -utilities. More conventional languages, such as C, C++, and Lisp, offer -better facilities for system programming and for managing the complexity -of large programs. Programs in these languages may require more lines -of source code than the equivalent @code{awk} programs, but they are -easier to maintain and usually run more efficiently.@refill - -@node Reading Files, Printing, Getting Started, Top -@chapter Reading Input Files - -@cindex reading files -@cindex input -@cindex standard input -@vindex FILENAME -In the typical @code{awk} program, all input is read either from the -standard input (by default the keyboard, but often a pipe from another -command) or from files whose names you specify on the @code{awk} command -line. If you specify input files, @code{awk} reads them in order, reading -all the data from one before going on to the next. The name of the current -input file can be found in the built-in variable @code{FILENAME} -(@pxref{Built-in Variables}).@refill - -The input is read in units called records, and processed by the -rules one record at a time. By default, each record is one line. Each -record is split automatically into fields, to make it more -convenient for a rule to work on its parts. - -On rare occasions you will need to use the @code{getline} command, -which can do explicit input from any number of files -(@pxref{Getline, ,Explicit Input with @code{getline}}).@refill - -@menu -* Records:: Controlling how data is split into records. -* Fields:: An introduction to fields. -* Non-Constant Fields:: Non-constant Field Numbers. -* Changing Fields:: Changing the Contents of a Field. -* Field Separators:: The field separator and how to change it. -* Constant Size:: Reading constant width data. -* Multiple Line:: Reading multi-line records. -* Getline:: Reading files under explicit program control - using the @code{getline} function. -* Close Input:: Closing an input file (so you can read from - the beginning once more). -@end menu - -@node Records, Fields, Reading Files, Reading Files -@section How Input is Split into Records - -@cindex record separator -The @code{awk} language divides its input into records and fields. -Records are separated by a character called the @dfn{record separator}. -By default, the record separator is the newline character, defining -a record to be a single line of text.@refill - -@iftex -@cindex changing the record separator -@end iftex -@vindex RS -Sometimes you may want to use a different character to separate your -records. You can use a different character by changing the built-in -variable @code{RS}. The value of @code{RS} is a string that says how -to separate records; the default value is @code{"\n"}, the string containing -just a newline character. This is why records are, by default, single lines. - -@code{RS} can have any string as its value, but only the first character -of the string is used as the record separator. The other characters are -ignored. @code{RS} is exceptional in this regard; @code{awk} uses the -full value of all its other built-in variables.@refill - -@ignore -Someday this should be true! - -The value of @code{RS} is not limited to a one-character string. It can -be any regular expression (@pxref{Regexp, ,Regular Expressions as Patterns}). -In general, each record -ends at the next string that matches the regular expression; the next -record starts at the end of the matching string. This general rule is -actually at work in the usual case, where @code{RS} contains just a -newline: a record ends at the beginning of the next matching string (the -next newline in the input) and the following record starts just after -the end of this string (at the first character of the following line). -The newline, since it matches @code{RS}, is not part of either record.@refill -@end ignore - -You can change the value of @code{RS} in the @code{awk} program with the -assignment operator, @samp{=} (@pxref{Assignment Ops, ,Assignment Expressions}). -The new record-separator character should be enclosed in quotation marks to make -a string constant. Often the right time to do this is at the beginning -of execution, before any input has been processed, so that the very -first record will be read with the proper separator. To do this, use -the special @code{BEGIN} pattern -(@pxref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}). For -example:@refill - -@example -awk 'BEGIN @{ RS = "/" @} ; @{ print $0 @}' BBS-list -@end example - -@noindent -changes the value of @code{RS} to @code{"/"}, before reading any input. -This is a string whose first character is a slash; as a result, records -are separated by slashes. Then the input file is read, and the second -rule in the @code{awk} program (the action with no pattern) prints each -record. Since each @code{print} statement adds a newline at the end of -its output, the effect of this @code{awk} program is to copy the input -with each slash changed to a newline. - -Another way to change the record separator is on the command line, -using the variable-assignment feature -(@pxref{Command Line, ,Invoking @code{awk}}).@refill - -@example -awk '@{ print $0 @}' RS="/" BBS-list -@end example - -@noindent -This sets @code{RS} to @samp{/} before processing @file{BBS-list}. - -Reaching the end of an input file terminates the current input record, -even if the last character in the file is not the character in @code{RS}. - -@ignore -@c merge the preceding paragraph and this stuff into one paragraph -@c and put it in an `expert info' section. -This produces correct behavior in the vast majority of cases, although -the following (extreme) pipeline prints a surprising @samp{1}. (There -is one field, consisting of a newline.) - -@example -echo | awk 'BEGIN @{ RS = "a" @} ; @{ print NF @}' -@end example - -@end ignore - -The empty string, @code{""} (a string of no characters), has a special meaning -as the value of @code{RS}: it means that records are separated only -by blank lines. @xref{Multiple Line, ,Multiple-Line Records}, for more details. - -@cindex number of records, @code{NR} or @code{FNR} -@vindex NR -@vindex FNR -The @code{awk} utility keeps track of the number of records that have -been read so far from the current input file. This value is stored in a -built-in variable called @code{FNR}. It is reset to zero when a new -file is started. Another built-in variable, @code{NR}, is the total -number of input records read so far from all files. It starts at zero -but is never automatically reset to zero. - -If you change the value of @code{RS} in the middle of an @code{awk} run, -the new value is used to delimit subsequent records, but the record -currently being processed (and records already processed) are not -affected. - -@node Fields, Non-Constant Fields, Records, Reading Files -@section Examining Fields - -@cindex examining fields -@cindex fields -@cindex accessing fields -When @code{awk} reads an input record, the record is -automatically separated or @dfn{parsed} by the interpreter into chunks -called @dfn{fields}. By default, fields are separated by whitespace, -like words in a line. -Whitespace in @code{awk} means any string of one or more spaces and/or -tabs; other characters such as newline, formfeed, and so on, that are -considered whitespace by other languages are @emph{not} considered -whitespace by @code{awk}.@refill - -The purpose of fields is to make it more convenient for you to refer to -these pieces of the record. You don't have to use them---you can -operate on the whole record if you wish---but fields are what make -simple @code{awk} programs so powerful. - -@cindex @code{$} (field operator) -@cindex operators, @code{$} -To refer to a field in an @code{awk} program, you use a dollar-sign, -@samp{$}, followed by the number of the field you want. Thus, @code{$1} -refers to the first field, @code{$2} to the second, and so on. For -example, suppose the following is a line of input:@refill - -@example -This seems like a pretty nice example. -@end example - -@noindent -Here the first field, or @code{$1}, is @samp{This}; the second field, or -@code{$2}, is @samp{seems}; and so on. Note that the last field, -@code{$7}, is @samp{example.}. Because there is no space between the -@samp{e} and the @samp{.}, the period is considered part of the seventh -field.@refill - -No matter how many fields there are, the last field in a record can be -represented by @code{$NF}. So, in the example above, @code{$NF} would -be the same as @code{$7}, which is @samp{example.}. Why this works is -explained below (@pxref{Non-Constant Fields, ,Non-constant Field Numbers}). -If you try to refer to a field beyond the last one, such as @code{$8} -when the record has only 7 fields, you get the empty string.@refill - -@vindex NF -@cindex number of fields, @code{NF} -Plain @code{NF}, with no @samp{$}, is a built-in variable whose value -is the number of fields in the current record. - -@code{$0}, which looks like an attempt to refer to the zeroth field, is -a special case: it represents the whole input record. This is what you -would use if you weren't interested in fields. - -Here are some more examples: - -@example -awk '$1 ~ /foo/ @{ print $0 @}' BBS-list -@end example - -@noindent -This example prints each record in the file @file{BBS-list} whose first -field contains the string @samp{foo}. The operator @samp{~} is called a -@dfn{matching operator} (@pxref{Comparison Ops, ,Comparison Expressions}); -it tests whether a string (here, the field @code{$1}) matches a given regular -expression.@refill - -By contrast, the following example: - -@example -awk '/foo/ @{ print $1, $NF @}' BBS-list -@end example - -@noindent -looks for @samp{foo} in @emph{the entire record} and prints the first -field and the last field for each input record containing a -match.@refill - -@node Non-Constant Fields, Changing Fields, Fields, Reading Files -@section Non-constant Field Numbers - -The number of a field does not need to be a constant. Any expression in -the @code{awk} language can be used after a @samp{$} to refer to a -field. The value of the expression specifies the field number. If the -value is a string, rather than a number, it is converted to a number. -Consider this example:@refill - -@example -awk '@{ print $NR @}' -@end example - -@noindent -Recall that @code{NR} is the number of records read so far: 1 in the -first record, 2 in the second, etc. So this example prints the first -field of the first record, the second field of the second record, and so -on. For the twentieth record, field number 20 is printed; most likely, -the record has fewer than 20 fields, so this prints a blank line. - -Here is another example of using expressions as field numbers: - -@example -awk '@{ print $(2*2) @}' BBS-list -@end example - -The @code{awk} language must evaluate the expression @code{(2*2)} and use -its value as the number of the field to print. The @samp{*} sign -represents multiplication, so the expression @code{2*2} evaluates to 4. -The parentheses are used so that the multiplication is done before the -@samp{$} operation; they are necessary whenever there is a binary -operator in the field-number expression. This example, then, prints the -hours of operation (the fourth field) for every line of the file -@file{BBS-list}.@refill - -If the field number you compute is zero, you get the entire record. -Thus, @code{$(2-2)} has the same value as @code{$0}. Negative field -numbers are not allowed. - -The number of fields in the current record is stored in the built-in -variable @code{NF} (@pxref{Built-in Variables}). The expression -@code{$NF} is not a special feature: it is the direct consequence of -evaluating @code{NF} and using its value as a field number. - -@node Changing Fields, Field Separators, Non-Constant Fields, Reading Files -@section Changing the Contents of a Field - -@cindex field, changing contents of -@cindex changing contents of a field -@cindex assignment to fields -You can change the contents of a field as seen by @code{awk} within an -@code{awk} program; this changes what @code{awk} perceives as the -current input record. (The actual input is untouched: @code{awk} never -modifies the input file.) - -Consider this example: - -@smallexample -awk '@{ $3 = $2 - 10; print $2, $3 @}' inventory-shipped -@end smallexample - -@noindent -The @samp{-} sign represents subtraction, so this program reassigns -field three, @code{$3}, to be the value of field two minus ten, -@code{$2 - 10}. (@xref{Arithmetic Ops, ,Arithmetic Operators}.) -Then field two, and the new value for field three, are printed. - -In order for this to work, the text in field @code{$2} must make sense -as a number; the string of characters must be converted to a number in -order for the computer to do arithmetic on it. The number resulting -from the subtraction is converted back to a string of characters which -then becomes field three. -@xref{Conversion, ,Conversion of Strings and Numbers}.@refill - -When you change the value of a field (as perceived by @code{awk}), the -text of the input record is recalculated to contain the new field where -the old one was. Therefore, @code{$0} changes to reflect the altered -field. Thus, - -@smallexample -awk '@{ $2 = $2 - 10; print $0 @}' inventory-shipped -@end smallexample - -@noindent -prints a copy of the input file, with 10 subtracted from the second -field of each line. - -You can also assign contents to fields that are out of range. For -example: - -@smallexample -awk '@{ $6 = ($5 + $4 + $3 + $2) ; print $6 @}' inventory-shipped -@end smallexample - -@noindent -We've just created @code{$6}, whose value is the sum of fields -@code{$2}, @code{$3}, @code{$4}, and @code{$5}. The @samp{+} sign -represents addition. For the file @file{inventory-shipped}, @code{$6} -represents the total number of parcels shipped for a particular month. - -Creating a new field changes the internal @code{awk} copy of the current -input record---the value of @code{$0}. Thus, if you do @samp{print $0} -after adding a field, the record printed includes the new field, with -the appropriate number of field separators between it and the previously -existing fields. - -This recomputation affects and is affected by several features not yet -discussed, in particular, the @dfn{output field separator}, @code{OFS}, -which is used to separate the fields (@pxref{Output Separators}), and -@code{NF} (the number of fields; @pxref{Fields, ,Examining Fields}). -For example, the value of @code{NF} is set to the number of the highest -field you create.@refill - -Note, however, that merely @emph{referencing} an out-of-range field -does @emph{not} change the value of either @code{$0} or @code{NF}. -Referencing an out-of-range field merely produces a null string. For -example:@refill - -@smallexample -if ($(NF+1) != "") - print "can't happen" -else - print "everything is normal" -@end smallexample - -@noindent -should print @samp{everything is normal}, because @code{NF+1} is certain -to be out of range. (@xref{If Statement, ,The @code{if} Statement}, -for more information about @code{awk}'s @code{if-else} statements.)@refill - -It is important to note that assigning to a field will change the -value of @code{$0}, but will not change the value of @code{NF}, -even when you assign the null string to a field. For example: - -@smallexample -echo a b c d | awk '@{ OFS = ":"; $2 = "" ; print ; print NF @}' -@end smallexample - -@noindent -prints - -@smallexample -a::c:d -4 -@end smallexample - -@noindent -The field is still there, it just has an empty value. You can tell -because there are two colons in a row. - -@node Field Separators, Constant Size, Changing Fields, Reading Files -@section Specifying how Fields are Separated -@vindex FS -@cindex fields, separating -@cindex field separator, @code{FS} -@cindex @samp{-F} option - -(This section is rather long; it describes one of the most fundamental -operations in @code{awk}. If you are a novice with @code{awk}, we -recommend that you re-read this section after you have studied the -section on regular expressions, @ref{Regexp, ,Regular Expressions as Patterns}.) - -The way @code{awk} splits an input record into fields is controlled by -the @dfn{field separator}, which is a single character or a regular -expression. @code{awk} scans the input record for matches for the -separator; the fields themselves are the text between the matches. For -example, if the field separator is @samp{oo}, then the following line: - -@smallexample -moo goo gai pan -@end smallexample - -@noindent -would be split into three fields: @samp{m}, @samp{@ g} and @samp{@ gai@ -pan}. - -The field separator is represented by the built-in variable @code{FS}. -Shell programmers take note! @code{awk} does not use the name @code{IFS} -which is used by the shell.@refill - -You can change the value of @code{FS} in the @code{awk} program with the -assignment operator, @samp{=} (@pxref{Assignment Ops, ,Assignment Expressions}). -Often the right time to do this is at the beginning of execution, -before any input has been processed, so that the very first record -will be read with the proper separator. To do this, use the special -@code{BEGIN} pattern -(@pxref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}). -For example, here we set the value of @code{FS} to the string -@code{","}:@refill - -@smallexample -awk 'BEGIN @{ FS = "," @} ; @{ print $2 @}' -@end smallexample - -@noindent -Given the input line, - -@smallexample -John Q. Smith, 29 Oak St., Walamazoo, MI 42139 -@end smallexample - -@noindent -this @code{awk} program extracts the string @samp{@ 29 Oak St.}. - -@cindex field separator, choice of -@cindex regular expressions as field separators -Sometimes your input data will contain separator characters that don't -separate fields the way you thought they would. For instance, the -person's name in the example we've been using might have a title or -suffix attached, such as @samp{John Q. Smith, LXIX}. From input -containing such a name: - -@smallexample -John Q. Smith, LXIX, 29 Oak St., Walamazoo, MI 42139 -@end smallexample - -@noindent -the previous sample program would extract @samp{@ LXIX}, instead of -@samp{@ 29 Oak St.}. If you were expecting the program to print the -address, you would be surprised. So choose your data layout and -separator characters carefully to prevent such problems. - -As you know, by default, fields are separated by whitespace sequences -(spaces and tabs), not by single spaces: two spaces in a row do not -delimit an empty field. The default value of the field separator is a -string @w{@code{" "}} containing a single space. If this value were -interpreted in the usual way, each space character would separate -fields, so two spaces in a row would make an empty field between them. -The reason this does not happen is that a single space as the value of -@code{FS} is a special case: it is taken to specify the default manner -of delimiting fields. - -If @code{FS} is any other single character, such as @code{","}, then -each occurrence of that character separates two fields. Two consecutive -occurrences delimit an empty field. If the character occurs at the -beginning or the end of the line, that too delimits an empty field. The -space character is the only single character which does not follow these -rules. - -More generally, the value of @code{FS} may be a string containing any -regular expression. Then each match in the record for the regular -expression separates fields. For example, the assignment:@refill - -@smallexample -FS = ", \t" -@end smallexample - -@noindent -makes every area of an input line that consists of a comma followed by a -space and a tab, into a field separator. (@samp{\t} stands for a -tab.)@refill - -For a less trivial example of a regular expression, suppose you want -single spaces to separate fields the way single commas were used above. -You can set @code{FS} to @w{@code{"[@ ]"}}. This regular expression -matches a single space and nothing else. - -@c the following index entry is an overfull hbox. --mew 30jan1992 -@cindex field separator: on command line -@cindex command line, setting @code{FS} on -@code{FS} can be set on the command line. You use the @samp{-F} argument to -do so. For example: - -@smallexample -awk -F, '@var{program}' @var{input-files} -@end smallexample - -@noindent -sets @code{FS} to be the @samp{,} character. Notice that the argument uses -a capital @samp{F}. Contrast this with @samp{-f}, which specifies a file -containing an @code{awk} program. Case is significant in command options: -the @samp{-F} and @samp{-f} options have nothing to do with each other. -You can use both options at the same time to set the @code{FS} argument -@emph{and} get an @code{awk} program from a file.@refill - -@c begin expert info -The value used for the argument to @samp{-F} is processed in exactly the -same way as assignments to the built-in variable @code{FS}. This means that -if the field separator contains special characters, they must be escaped -appropriately. For example, to use a @samp{\} as the field separator, you -would have to type: - -@smallexample -# same as FS = "\\" -awk -F\\\\ '@dots{}' files @dots{} -@end smallexample - -@noindent -Since @samp{\} is used for quoting in the shell, @code{awk} will see -@samp{-F\\}. Then @code{awk} processes the @samp{\\} for escape -characters (@pxref{Constants, ,Constant Expressions}), finally yielding -a single @samp{\} to be used for the field separator. -@c end expert info - -As a special case, in compatibility mode -(@pxref{Command Line, ,Invoking @code{awk}}), if the -argument to @samp{-F} is @samp{t}, then @code{FS} is set to the tab -character. (This is because if you type @samp{-F\t}, without the quotes, -at the shell, the @samp{\} gets deleted, so @code{awk} figures that you -really want your fields to be separated with tabs, and not @samp{t}s. -Use @samp{-v FS="t"} on the command line if you really do want to separate -your fields with @samp{t}s.)@refill - -For example, let's use an @code{awk} program file called @file{baud.awk} -that contains the pattern @code{/300/}, and the action @samp{print $1}. -Here is the program: - -@smallexample -/300/ @{ print $1 @} -@end smallexample - -Let's also set @code{FS} to be the @samp{-} character, and run the -program on the file @file{BBS-list}. The following command prints a -list of the names of the bulletin boards that operate at 300 baud and -the first three digits of their phone numbers:@refill - -@smallexample -awk -F- -f baud.awk BBS-list -@end smallexample - -@noindent -It produces this output: - -@smallexample -aardvark 555 -alpo -barfly 555 -bites 555 -camelot 555 -core 555 -fooey 555 -foot 555 -macfoo 555 -sdace 555 -sabafoo 555 -@end smallexample - -@noindent -Note the second line of output. If you check the original file, you will -see that the second line looked like this: - -@smallexample -alpo-net 555-3412 2400/1200/300 A -@end smallexample - -The @samp{-} as part of the system's name was used as the field -separator, instead of the @samp{-} in the phone number that was -originally intended. This demonstrates why you have to be careful in -choosing your field and record separators. - -The following program searches the system password file, and prints -the entries for users who have no password: - -@smallexample -awk -F: '$2 == ""' /etc/passwd -@end smallexample - -@noindent -Here we use the @samp{-F} option on the command line to set the field -separator. Note that fields in @file{/etc/passwd} are separated by -colons. The second field represents a user's encrypted password, but if -the field is empty, that user has no password. - -@c begin expert info -According to the @sc{posix} standard, @code{awk} is supposed to behave -as if each record is split into fields at the time that it is read. -In particular, this means that you can change the value of @code{FS} -after a record is read, but before any of the fields are referenced. -The value of the fields (i.e. how they were split) should reflect the -old value of @code{FS}, not the new one. - -However, many implementations of @code{awk} do not do this. Instead, -they defer splitting the fields until a field reference actually happens, -using the @emph{current} value of @code{FS}! This behavior can be difficult -to diagnose. The following example illustrates the results of the two methods. -(The @code{sed} command prints just the first line of @file{/etc/passwd}.) - -@smallexample -sed 1q /etc/passwd | awk '@{ FS = ":" ; print $1 @}' -@end smallexample - -@noindent -will usually print - -@smallexample -root -@end smallexample - -@noindent -on an incorrect implementation of @code{awk}, while @code{gawk} -will print something like - -@smallexample -root:nSijPlPhZZwgE:0:0:Root:/: -@end smallexample -@c end expert info - -@c begin expert info -There is an important difference between the two cases of @samp{FS = @w{" "}} -(a single blank) and @samp{FS = @w{"[ \t]+"}} (which is a regular expression -matching one or more blanks or tabs). For both values of @code{FS}, fields -are separated by runs of blanks and/or tabs. However, when the value of -@code{FS} is @code{" "}, @code{awk} will strip leading and trailing whitespace -from the record, and then decide where the fields are. - -For example, the following expression prints @samp{b}: - -@smallexample -echo ' a b c d ' | awk '@{ print $2 @}' -@end smallexample - -@noindent -However, the following prints @samp{a}: - -@smallexample -echo ' a b c d ' | awk 'BEGIN @{ FS = "[ \t]+" @} ; @{ print $2 @}' -@end smallexample - -@noindent -In this case, the first field is null. - -The stripping of leading and trailing whitespace also comes into -play whenever @code{$0} is recomputed. For instance, this pipeline - -@smallexample -echo ' a b c d' | awk '@{ print; $2 = $2; print @}' -@end smallexample - -@noindent -produces this output: - -@smallexample - a b c d -a b c d -@end smallexample - -@noindent -The first @code{print} statement prints the record as it was read, -with leading whitespace intact. The assignment to @code{$2} rebuilds -@code{$0} by concatenating @code{$1} through @code{$NF} together, -separated by the value of @code{OFS}. Since the leading whitespace -was ignored when finding @code{$1}, it is not part of the new @code{$0}. -Finally, the last @code{print} statement prints the new @code{$0}. -@c end expert info - -The following table summarizes how fields are split, based on the -value of @code{FS}. - -@table @code -@item FS == " " -Fields are separated by runs of whitespace. Leading and trailing -whitespace are ignored. This is the default. - -@item FS == @var{any single character} -Fields are separated by each occurrence of the character. Multiple -successive occurrences delimit empty fields, as do leading and -trailing occurrences. - -@item FS == @var{regexp} -Fields are separated by occurrences of characters that match @var{regexp}. -Leading and trailing matches of @var{regexp} delimit empty fields. -@end table - -@node Constant Size, Multiple Line, Field Separators, Reading Files -@section Reading Fixed-width Data - -(This section discusses an advanced, experimental feature. If you are -a novice @code{awk} user, you may wish to skip it on the first reading.) - -@code{gawk} 2.13 introduced a new facility for dealing with fixed-width fields -with no distinctive field separator. Data of this nature arises typically -in one of at least two ways: the input for old FORTRAN programs where -numbers are run together, and the output of programs that did not anticipate -the use of their output as input for other programs. - -An example of the latter is a table where all the columns are lined up by -the use of a variable number of spaces and @emph{empty fields are just -spaces}. Clearly, @code{awk}'s normal field splitting based on @code{FS} -will not work well in this case. (Although a portable @code{awk} program -can use a series of @code{substr} calls on @code{$0}, this is awkward and -inefficient for a large number of fields.)@refill - -The splitting of an input record into fixed-width fields is specified by -assigning a string containing space-separated numbers to the built-in -variable @code{FIELDWIDTHS}. Each number specifies the width of the field -@emph{including} columns between fields. If you want to ignore the columns -between fields, you can specify the width as a separate field that is -subsequently ignored. - -The following data is the output of the @code{w} utility. It is useful -to illustrate the use of @code{FIELDWIDTHS}. - -@smallexample - 10:06pm up 21 days, 14:04, 23 users -User tty login@ idle JCPU PCPU what -hzuo ttyV0 8:58pm 9 5 vi p24.tex -hzang ttyV3 6:37pm 50 -csh -eklye ttyV5 9:53pm 7 1 em thes.tex -dportein ttyV6 8:17pm 1:47 -csh -gierd ttyD3 10:00pm 1 elm -dave ttyD4 9:47pm 4 4 w -brent ttyp0 26Jun91 4:46 26:46 4:41 bash -dave ttyq4 26Jun9115days 46 46 wnewmail -@end smallexample - -The following program takes the above input, converts the idle time to -number of seconds and prints out the first two fields and the calculated -idle time. (This program uses a number of @code{awk} features that -haven't been introduced yet.)@refill - -@smallexample -BEGIN @{ FIELDWIDTHS = "9 6 10 6 7 7 35" @} -NR > 2 @{ - idle = $4 - sub(/^ */, "", idle) # strip leading spaces - if (idle == "") idle = 0 - if (idle ~ /:/) @{ split(idle, t, ":"); idle = t[1] * 60 + t[2] @} - if (idle ~ /days/) @{ idle *= 24 * 60 * 60 @} - - print $1, $2, idle -@} -@end smallexample - -Here is the result of running the program on the data: - -@smallexample -hzuo ttyV0 0 -hzang ttyV3 50 -eklye ttyV5 0 -dportein ttyV6 107 -gierd ttyD3 1 -dave ttyD4 0 -brent ttyp0 286 -dave ttyq4 1296000 -@end smallexample - -Another (possibly more practical) example of fixed-width input data -would be the input from a deck of balloting cards. In some parts of -the United States, voters make their choices by punching holes in computer -cards. These cards are then processed to count the votes for any particular -candidate or on any particular issue. Since a voter may choose not to -vote on some issue, any column on the card may be empty. An @code{awk} -program for processing such data could use the @code{FIELDWIDTHS} feature -to simplify reading the data.@refill - -@c of course, getting gawk to run on a system with card readers is -@c another story! - -This feature is still experimental, and will likely evolve over time. - -@node Multiple Line, Getline, Constant Size, Reading Files -@section Multiple-Line Records - -@cindex multiple line records -@cindex input, multiple line records -@cindex reading files, multiple line records -@cindex records, multiple line -In some data bases, a single line cannot conveniently hold all the -information in one entry. In such cases, you can use multi-line -records. - -The first step in doing this is to choose your data format: when records -are not defined as single lines, how do you want to define them? -What should separate records? - -One technique is to use an unusual character or string to separate -records. For example, you could use the formfeed character (written -@code{\f} in @code{awk}, as in C) to separate them, making each record -a page of the file. To do this, just set the variable @code{RS} to -@code{"\f"} (a string containing the formfeed character). Any -other character could equally well be used, as long as it won't be part -of the data in a record.@refill - -@ignore -Another technique is to have blank lines separate records. The string -@code{"^\n+"} is a regular expression that matches any sequence of -newlines starting at the beginning of a line---in other words, it -matches a sequence of blank lines. If you set @code{RS} to this string, -a record always ends at the first blank line encountered. In -addition, a regular expression always matches the longest possible -sequence when there is a choice. So the next record doesn't start until -the first nonblank line that follows---no matter how many blank lines -appear in a row, they are considered one record-separator. -@end ignore - -Another technique is to have blank lines separate records. By a special -dispensation, a null string as the value of @code{RS} indicates that -records are separated by one or more blank lines. If you set @code{RS} -to the null string, a record always ends at the first blank line -encountered. And the next record doesn't start until the first nonblank -line that follows---no matter how many blank lines appear in a row, they -are considered one record-separator. (End of file is also considered -a record separator.)@refill -@c !!! This use of `end of file' is confusing. Needs to be clarified. - -The second step is to separate the fields in the record. One way to do -this is to put each field on a separate line: to do this, just set the -variable @code{FS} to the string @code{"\n"}. (This simple regular -expression matches a single newline.) - -Another way to separate fields is to divide each of the lines into fields -in the normal manner. This happens by default as a result of a special -feature: when @code{RS} is set to the null string, the newline character -@emph{always} acts as a field separator. This is in addition to whatever -field separations result from @code{FS}. - -The original motivation for this special exception was probably so that -you get useful behavior in the default case (i.e., @w{@code{FS == " "}}). -This feature can be a problem if you really don't want the -newline character to separate fields, since there is no way to -prevent it. However, you can work around this by using the @code{split} -function to break up the record manually -(@pxref{String Functions, ,Built-in Functions for String Manipulation}).@refill - -@ignore -Here are two ways to use records separated by blank lines and break each -line into fields normally: - -@example -awk 'BEGIN @{ RS = ""; FS = "[ \t\n]+" @} @{ print $1 @}' BBS-list - -@exdent @r{or} - -awk 'BEGIN @{ RS = "^\n+"; FS = "[ \t\n]+" @} @{ print $1 @}' BBS-list -@end example -@end ignore - -@ignore -Here is how to use records separated by blank lines and break each -line into fields normally: - -@example -awk 'BEGIN @{ RS = ""; FS = "[ \t\n]+" @} ; @{ print $1 @}' BBS-list -@end example -@end ignore - -@node Getline, Close Input, Multiple Line, Reading Files -@section Explicit Input with @code{getline} - -@findex getline -@cindex input, explicit -@cindex explicit input -@cindex input, @code{getline} command -@cindex reading files, @code{getline} command -So far we have been getting our input files from @code{awk}'s main -input stream---either the standard input (usually your terminal) or the -files specified on the command line. The @code{awk} language has a -special built-in command called @code{getline} that -can be used to read input under your explicit control.@refill - -This command is quite complex and should @emph{not} be used by -beginners. It is covered here because this is the chapter on input. -The examples that follow the explanation of the @code{getline} command -include material that has not been covered yet. Therefore, come back -and study the @code{getline} command @emph{after} you have reviewed the -rest of this manual and have a good knowledge of how @code{awk} works. - -@vindex ERRNO -@cindex differences: @code{gawk} and @code{awk} -@code{getline} returns 1 if it finds a record, and 0 if the end of the -file is encountered. If there is some error in getting a record, such -as a file that cannot be opened, then @code{getline} returns @minus{}1. -In this case, @code{gawk} sets the variable @code{ERRNO} to a string -describing the error that occurred. - -In the following examples, @var{command} stands for a string value that -represents a shell command. - -@table @code -@item getline -The @code{getline} command can be used without arguments to read input -from the current input file. All it does in this case is read the next -input record and split it up into fields. This is useful if you've -finished processing the current record, but you want to do some special -processing @emph{right now} on the next record. Here's an -example:@refill - -@example -awk '@{ - if (t = index($0, "/*")) @{ - if (t > 1) - tmp = substr($0, 1, t - 1) - else - tmp = "" - u = index(substr($0, t + 2), "*/") - while (u == 0) @{ - getline - t = -1 - u = index($0, "*/") - @} - if (u <= length($0) - 2) - $0 = tmp substr($0, t + u + 3) - else - $0 = tmp - @} - print $0 -@}' -@end example - -This @code{awk} program deletes all C-style comments, @samp{/* @dots{} -*/}, from the input. By replacing the @samp{print $0} with other -statements, you could perform more complicated processing on the -decommented input, like searching for matches of a regular -expression. (This program has a subtle problem---can you spot it?) - -@c the program to remove comments doesn't work if one -@c comment ends and another begins on the same line. (Your -@c idea for restart would be useful here). --- brennan@boeing.com - -This form of the @code{getline} command sets @code{NF} (the number of -fields; @pxref{Fields, ,Examining Fields}), @code{NR} (the number of -records read so far; @pxref{Records, ,How Input is Split into Records}), -@code{FNR} (the number of records read from this input file), and the -value of @code{$0}. - -@strong{Note:} the new value of @code{$0} is used in testing -the patterns of any subsequent rules. The original value -of @code{$0} that triggered the rule which executed @code{getline} -is lost. By contrast, the @code{next} statement reads a new record -but immediately begins processing it normally, starting with the first -rule in the program. @xref{Next Statement, ,The @code{next} Statement}. - -@item getline @var{var} -This form of @code{getline} reads a record into the variable @var{var}. -This is useful when you want your program to read the next record from -the current input file, but you don't want to subject the record to the -normal input processing. - -For example, suppose the next line is a comment, or a special string, -and you want to read it, but you must make certain that it won't trigger -any rules. This version of @code{getline} allows you to read that line -and store it in a variable so that the main -read-a-line-and-check-each-rule loop of @code{awk} never sees it. - -The following example swaps every two lines of input. For example, given: - -@example -wan -tew -free -phore -@end example - -@noindent -it outputs: - -@example -tew -wan -phore -free -@end example - -@noindent -Here's the program: - -@example -@group -awk '@{ - if ((getline tmp) > 0) @{ - print tmp - print $0 - @} else - print $0 -@}' -@end group -@end example - -The @code{getline} function used in this way sets only the variables -@code{NR} and @code{FNR} (and of course, @var{var}). The record is not -split into fields, so the values of the fields (including @code{$0}) and -the value of @code{NF} do not change.@refill - -@item getline < @var{file} -@cindex input redirection -@cindex redirection of input -This form of the @code{getline} function takes its input from the file -@var{file}. Here @var{file} is a string-valued expression that -specifies the file name. @samp{< @var{file}} is called a @dfn{redirection} -since it directs input to come from a different place. - -This form is useful if you want to read your input from a particular -file, instead of from the main input stream. For example, the following -program reads its input record from the file @file{foo.input} when it -encounters a first field with a value equal to 10 in the current input -file.@refill - -@example -awk '@{ - if ($1 == 10) @{ - getline < "foo.input" - print - @} else - print -@}' -@end example - -Since the main input stream is not used, the values of @code{NR} and -@code{FNR} are not changed. But the record read is split into fields in -the normal manner, so the values of @code{$0} and other fields are -changed. So is the value of @code{NF}. - -This does not cause the record to be tested against all the patterns -in the @code{awk} program, in the way that would happen if the record -were read normally by the main processing loop of @code{awk}. However -the new record is tested against any subsequent rules, just as when -@code{getline} is used without a redirection. - -@item getline @var{var} < @var{file} -This form of the @code{getline} function takes its input from the file -@var{file} and puts it in the variable @var{var}. As above, @var{file} -is a string-valued expression that specifies the file from which to read. - -In this version of @code{getline}, none of the built-in variables are -changed, and the record is not split into fields. The only variable -changed is @var{var}. - -For example, the following program copies all the input files to the -output, except for records that say @w{@samp{@@include @var{filename}}}. -Such a record is replaced by the contents of the file -@var{filename}.@refill - -@example -awk '@{ - if (NF == 2 && $1 == "@@include") @{ - while ((getline line < $2) > 0) - print line - close($2) - @} else - print -@}' -@end example - -Note here how the name of the extra input file is not built into -the program; it is taken from the data, from the second field on -the @samp{@@include} line.@refill - -The @code{close} function is called to ensure that if two identical -@samp{@@include} lines appear in the input, the entire specified file is -included twice. @xref{Close Input, ,Closing Input Files and Pipes}.@refill - -One deficiency of this program is that it does not process nested -@samp{@@include} statements the way a true macro preprocessor would. - -@item @var{command} | getline -You can @dfn{pipe} the output of a command into @code{getline}. A pipe is -simply a way to link the output of one program to the input of another. In -this case, the string @var{command} is run as a shell command and its output -is piped into @code{awk} to be used as input. This form of @code{getline} -reads one record from the pipe. - -For example, the following program copies input to output, except for lines -that begin with @samp{@@execute}, which are replaced by the output produced by -running the rest of the line as a shell command: - -@example -awk '@{ - if ($1 == "@@execute") @{ - tmp = substr($0, 10) - while ((tmp | getline) > 0) - print - close(tmp) - @} else - print -@}' -@end example - -@noindent -The @code{close} function is called to ensure that if two identical -@samp{@@execute} lines appear in the input, the command is run for -each one. @xref{Close Input, ,Closing Input Files and Pipes}. - -Given the input: - -@example -foo -bar -baz -@@execute who -bletch -@end example - -@noindent -the program might produce: - -@example -foo -bar -baz -hack ttyv0 Jul 13 14:22 -hack ttyp0 Jul 13 14:23 (gnu:0) -hack ttyp1 Jul 13 14:23 (gnu:0) -hack ttyp2 Jul 13 14:23 (gnu:0) -hack ttyp3 Jul 13 14:23 (gnu:0) -bletch -@end example - -@noindent -Notice that this program ran the command @code{who} and printed the result. -(If you try this program yourself, you will get different results, showing -you who is logged in on your system.) - -This variation of @code{getline} splits the record into fields, sets the -value of @code{NF} and recomputes the value of @code{$0}. The values of -@code{NR} and @code{FNR} are not changed. - -@item @var{command} | getline @var{var} -The output of the command @var{command} is sent through a pipe to -@code{getline} and into the variable @var{var}. For example, the -following program reads the current date and time into the variable -@code{current_time}, using the @code{date} utility, and then -prints it.@refill - -@example -awk 'BEGIN @{ - "date" | getline current_time - close("date") - print "Report printed on " current_time -@}' -@end example - -In this version of @code{getline}, none of the built-in variables are -changed, and the record is not split into fields. -@end table - -@node Close Input, , Getline, Reading Files -@section Closing Input Files and Pipes -@cindex closing input files and pipes -@findex close - -If the same file name or the same shell command is used with -@code{getline} more than once during the execution of an @code{awk} -program, the file is opened (or the command is executed) only the first time. -At that time, the first record of input is read from that file or command. -The next time the same file or command is used in @code{getline}, another -record is read from it, and so on. - -This implies that if you want to start reading the same file again from -the beginning, or if you want to rerun a shell command (rather than -reading more output from the command), you must take special steps. -What you must do is use the @code{close} function, as follows: - -@example -close(@var{filename}) -@end example - -@noindent -or - -@example -close(@var{command}) -@end example - -The argument @var{filename} or @var{command} can be any expression. Its -value must exactly equal the string that was used to open the file or -start the command---for example, if you open a pipe with this: - -@example -"sort -r names" | getline foo -@end example - -@noindent -then you must close it with this: - -@example -close("sort -r names") -@end example - -Once this function call is executed, the next @code{getline} from that -file or command will reopen the file or rerun the command. - -@iftex -@vindex ERRNO -@cindex differences: @code{gawk} and @code{awk} -@end iftex -@code{close} returns a value of zero if the close succeeded. -Otherwise, the value will be non-zero. -In this case, @code{gawk} sets the variable @code{ERRNO} to a string -describing the error that occurred. - -@node Printing, One-liners, Reading Files, Top -@chapter Printing Output - -@cindex printing -@cindex output -One of the most common things that actions do is to output or @dfn{print} -some or all of the input. For simple output, use the @code{print} -statement. For fancier formatting use the @code{printf} statement. -Both are described in this chapter. - -@menu -* Print:: The @code{print} statement. -* Print Examples:: Simple examples of @code{print} statements. -* Output Separators:: The output separators and how to change them. -* OFMT:: Controlling Numeric Output With @code{print}. -* Printf:: The @code{printf} statement. -* Redirection:: How to redirect output to multiple - files and pipes. -* Special Files:: File name interpretation in @code{gawk}. - @code{gawk} allows access to - inherited file descriptors. -@end menu - -@node Print, Print Examples, Printing, Printing -@section The @code{print} Statement -@cindex @code{print} statement - -The @code{print} statement does output with simple, standardized -formatting. You specify only the strings or numbers to be printed, in a -list separated by commas. They are output, separated by single spaces, -followed by a newline. The statement looks like this: - -@example -print @var{item1}, @var{item2}, @dots{} -@end example - -@noindent -The entire list of items may optionally be enclosed in parentheses. The -parentheses are necessary if any of the item expressions uses a -relational operator; otherwise it could be confused with a redirection -(@pxref{Redirection, ,Redirecting Output of @code{print} and @code{printf}}). -The relational operators are @samp{==}, -@samp{!=}, @samp{<}, @samp{>}, @samp{>=}, @samp{<=}, @samp{~} and -@samp{!~} (@pxref{Comparison Ops, ,Comparison Expressions}).@refill - -The items printed can be constant strings or numbers, fields of the -current record (such as @code{$1}), variables, or any @code{awk} -expressions. The @code{print} statement is completely general for -computing @emph{what} values to print. With two exceptions, -you cannot specify @emph{how} to print them---how many -columns, whether to use exponential notation or not, and so on. -(@xref{Output Separators}, and -@ref{OFMT, ,Controlling Numeric Output with @code{print}}.) -For that, you need the @code{printf} statement -(@pxref{Printf, ,Using @code{printf} Statements for Fancier Printing}).@refill - -The simple statement @samp{print} with no items is equivalent to -@samp{print $0}: it prints the entire current record. To print a blank -line, use @samp{print ""}, where @code{""} is the null, or empty, -string. - -To print a fixed piece of text, use a string constant such as -@w{@code{"Hello there"}} as one item. If you forget to use the -double-quote characters, your text will be taken as an @code{awk} -expression, and you will probably get an error. Keep in mind that a -space is printed between any two items. - -Most often, each @code{print} statement makes one line of output. But it -isn't limited to one line. If an item value is a string that contains a -newline, the newline is output along with the rest of the string. A -single @code{print} can make any number of lines this way. - -@node Print Examples, Output Separators, Print, Printing -@section Examples of @code{print} Statements - -Here is an example of printing a string that contains embedded newlines: - -@example -awk 'BEGIN @{ print "line one\nline two\nline three" @}' -@end example - -@noindent -produces output like this: - -@example -line one -line two -line three -@end example - -Here is an example that prints the first two fields of each input record, -with a space between them: - -@example -awk '@{ print $1, $2 @}' inventory-shipped -@end example - -@noindent -Its output looks like this: - -@example -Jan 13 -Feb 15 -Mar 15 -@dots{} -@end example - -A common mistake in using the @code{print} statement is to omit the comma -between two items. This often has the effect of making the items run -together in the output, with no space. The reason for this is that -juxtaposing two string expressions in @code{awk} means to concatenate -them. For example, without the comma: - -@example -awk '@{ print $1 $2 @}' inventory-shipped -@end example - -@noindent -prints: - -@example -@group -Jan13 -Feb15 -Mar15 -@dots{} -@end group -@end example - -Neither example's output makes much sense to someone unfamiliar with the -file @file{inventory-shipped}. A heading line at the beginning would make -it clearer. Let's add some headings to our table of months (@code{$1}) and -green crates shipped (@code{$2}). We do this using the @code{BEGIN} pattern -(@pxref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}) to force the headings to be printed only once: - -@example -awk 'BEGIN @{ print "Month Crates" - print "----- ------" @} - @{ print $1, $2 @}' inventory-shipped -@end example - -@noindent -Did you already guess what happens? This program prints the following: - -@example -@group -Month Crates ------ ------ -Jan 13 -Feb 15 -Mar 15 -@dots{} -@end group -@end example - -@noindent -The headings and the table data don't line up! We can fix this by printing -some spaces between the two fields: - -@example -awk 'BEGIN @{ print "Month Crates" - print "----- ------" @} - @{ print $1, " ", $2 @}' inventory-shipped -@end example - -You can imagine that this way of lining up columns can get pretty -complicated when you have many columns to fix. Counting spaces for two -or three columns can be simple, but more than this and you can get -``lost'' quite easily. This is why the @code{printf} statement was -created (@pxref{Printf, ,Using @code{printf} Statements for Fancier Printing}); -one of its specialties is lining up columns of data.@refill - -@node Output Separators, OFMT, Print Examples, Printing -@section Output Separators - -@cindex output field separator, @code{OFS} -@vindex OFS -@vindex ORS -@cindex output record separator, @code{ORS} -As mentioned previously, a @code{print} statement contains a list -of items, separated by commas. In the output, the items are normally -separated by single spaces. But they do not have to be spaces; a -single space is only the default. You can specify any string of -characters to use as the @dfn{output field separator} by setting the -built-in variable @code{OFS}. The initial value of this variable -is the string @w{@code{" "}}, that is, just a single space.@refill - -The output from an entire @code{print} statement is called an -@dfn{output record}. Each @code{print} statement outputs one output -record and then outputs a string called the @dfn{output record separator}. -The built-in variable @code{ORS} specifies this string. The initial -value of the variable is the string @code{"\n"} containing a newline -character; thus, normally each @code{print} statement makes a separate line. - -You can change how output fields and records are separated by assigning -new values to the variables @code{OFS} and/or @code{ORS}. The usual -place to do this is in the @code{BEGIN} rule -(@pxref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}), so -that it happens before any input is processed. You may also do this -with assignments on the command line, before the names of your input -files.@refill - -The following example prints the first and second fields of each input -record separated by a semicolon, with a blank line added after each -line:@refill - -@example -@group -awk 'BEGIN @{ OFS = ";"; ORS = "\n\n" @} - @{ print $1, $2 @}' BBS-list -@end group -@end example - -If the value of @code{ORS} does not contain a newline, all your output -will be run together on a single line, unless you output newlines some -other way. - -@node OFMT, Printf, Output Separators, Printing -@section Controlling Numeric Output with @code{print} -@vindex OFMT -When you use the @code{print} statement to print numeric values, -@code{awk} internally converts the number to a string of characters, -and prints that string. @code{awk} uses the @code{sprintf} function -to do this conversion. For now, it suffices to say that the @code{sprintf} -function accepts a @dfn{format specification} that tells it how to format -numbers (or strings), and that there are a number of different ways that -numbers can be formatted. The different format specifications are discussed -more fully in -@ref{Printf, ,Using @code{printf} Statements for Fancier Printing}.@refill - -The built-in variable @code{OFMT} contains the default format specification -that @code{print} uses with @code{sprintf} when it wants to convert a -number to a string for printing. By supplying different format specifications -as the value of @code{OFMT}, you can change how @code{print} will print -your numbers. As a brief example: - -@example -@group -awk 'BEGIN @{ OFMT = "%d" # print numbers as integers - print 17.23 @}' -@end group -@end example - -@noindent -will print @samp{17}. - -@node Printf, Redirection, OFMT, Printing -@section Using @code{printf} Statements for Fancier Printing -@cindex formatted output -@cindex output, formatted - -If you want more precise control over the output format than -@code{print} gives you, use @code{printf}. With @code{printf} you can -specify the width to use for each item, and you can specify various -stylistic choices for numbers (such as what radix to use, whether to -print an exponent, whether to print a sign, and how many digits to print -after the decimal point). You do this by specifying a string, called -the @dfn{format string}, which controls how and where to print the other -arguments. - -@menu -* Basic Printf:: Syntax of the @code{printf} statement. -* Control Letters:: Format-control letters. -* Format Modifiers:: Format-specification modifiers. -* Printf Examples:: Several examples. -@end menu - -@node Basic Printf, Control Letters, Printf, Printf -@subsection Introduction to the @code{printf} Statement - -@cindex @code{printf} statement, syntax of -The @code{printf} statement looks like this:@refill - -@example -printf @var{format}, @var{item1}, @var{item2}, @dots{} -@end example - -@noindent -The entire list of arguments may optionally be enclosed in parentheses. The -parentheses are necessary if any of the item expressions uses a -relational operator; otherwise it could be confused with a redirection -(@pxref{Redirection, ,Redirecting Output of @code{print} and @code{printf}}). -The relational operators are @samp{==}, -@samp{!=}, @samp{<}, @samp{>}, @samp{>=}, @samp{<=}, @samp{~} and -@samp{!~} (@pxref{Comparison Ops, ,Comparison Expressions}).@refill - -@cindex format string -The difference between @code{printf} and @code{print} is the argument -@var{format}. This is an expression whose value is taken as a string; it -specifies how to output each of the other arguments. It is called -the @dfn{format string}. - -The format string is the same as in the @sc{ansi} C library function -@code{printf}. Most of @var{format} is text to be output verbatim. -Scattered among this text are @dfn{format specifiers}, one per item. -Each format specifier says to output the next item at that place in the -format.@refill - -The @code{printf} statement does not automatically append a newline to its -output. It outputs only what the format specifies. So if you want -a newline, you must include one in the format. The output separator -variables @code{OFS} and @code{ORS} have no effect on @code{printf} -statements.@refill - -@node Control Letters, Format Modifiers, Basic Printf, Printf -@subsection Format-Control Letters -@cindex @code{printf}, format-control characters -@cindex format specifier - -A format specifier starts with the character @samp{%} and ends with a -@dfn{format-control letter}; it tells the @code{printf} statement how -to output one item. (If you actually want to output a @samp{%}, write -@samp{%%}.) The format-control letter specifies what kind of value to -print. The rest of the format specifier is made up of optional -@dfn{modifiers} which are parameters such as the field width to use.@refill - -Here is a list of the format-control letters: - -@table @samp -@item c -This prints a number as an ASCII character. Thus, @samp{printf "%c", -65} outputs the letter @samp{A}. The output for a string value is -the first character of the string. - -@item d -This prints a decimal integer. - -@item i -This also prints a decimal integer. - -@item e -This prints a number in scientific (exponential) notation. -For example, - -@example -printf "%4.3e", 1950 -@end example - -@noindent -prints @samp{1.950e+03}, with a total of four significant figures of -which three follow the decimal point. The @samp{4.3} are @dfn{modifiers}, -discussed below. - -@item f -This prints a number in floating point notation. - -@item g -This prints a number in either scientific notation or floating point -notation, whichever uses fewer characters. -@ignore -From: gatech!ames!elroy!cit-vax!EQL.Caltech.Edu!rankin (Pat Rankin) - -In the description of printf formats (p.43), the information for %g -is incorrect (mainly, it's too much of an oversimplification). It's -wrong in the AWK book too, and in the gawk man page. I suggested to -David Trueman before 2.13 was released that the latter be revised, so -that it matched gawk's behavior (rather than trying to change gawk to -match the docs ;-). The documented description is nice and simple, but -it doesn't match the actual underlying behavior of %g in the various C -run-time libraries that gawk relies on. The precision value for g format -is different than for f and e formats, so it's inaccurate to say 'g' is -the shorter of 'e' or 'f'. For 'g', precision represents the number of -significant digits rather than the number of decimal places, and it has -special rules about how to format numbers with range between 10E-1 and -10E-4. All in all, it's pretty messy, and I had to add that clumsy -GFMT_WORKAROUND code because the VMS run-time library doesn't conform to -the ANSI-C specifications. -@end ignore - -@item o -This prints an unsigned octal integer. - -@item s -This prints a string. - -@item x -This prints an unsigned hexadecimal integer. - -@item X -This prints an unsigned hexadecimal integer. However, for the values 10 -through 15, it uses the letters @samp{A} through @samp{F} instead of -@samp{a} through @samp{f}. - -@item % -This isn't really a format-control letter, but it does have a meaning -when used after a @samp{%}: the sequence @samp{%%} outputs one -@samp{%}. It does not consume an argument. -@end table - -@node Format Modifiers, Printf Examples, Control Letters, Printf -@subsection Modifiers for @code{printf} Formats - -@cindex @code{printf}, modifiers -@cindex modifiers (in format specifiers) -A format specification can also include @dfn{modifiers} that can control -how much of the item's value is printed and how much space it gets. The -modifiers come between the @samp{%} and the format-control letter. Here -are the possible modifiers, in the order in which they may appear: - -@table @samp -@item - -The minus sign, used before the width modifier, says to left-justify -the argument within its specified width. Normally the argument -is printed right-justified in the specified width. Thus, - -@example -printf "%-4s", "foo" -@end example - -@noindent -prints @samp{foo }. - -@item @var{width} -This is a number representing the desired width of a field. Inserting any -number between the @samp{%} sign and the format control character forces the -field to be expanded to this width. The default way to do this is to -pad with spaces on the left. For example, - -@example -printf "%4s", "foo" -@end example - -@noindent -prints @samp{ foo}. - -The value of @var{width} is a minimum width, not a maximum. If the item -value requires more than @var{width} characters, it can be as wide as -necessary. Thus, - -@example -printf "%4s", "foobar" -@end example - -@noindent -prints @samp{foobar}. - -Preceding the @var{width} with a minus sign causes the output to be -padded with spaces on the right, instead of on the left. - -@item .@var{prec} -This is a number that specifies the precision to use when printing. -This specifies the number of digits you want printed to the right of the -decimal point. For a string, it specifies the maximum number of -characters from the string that should be printed. -@end table - -The C library @code{printf}'s dynamic @var{width} and @var{prec} -capability (for example, @code{"%*.*s"}) is supported. Instead of -supplying explicit @var{width} and/or @var{prec} values in the format -string, you pass them in the argument list. For example:@refill - -@example -w = 5 -p = 3 -s = "abcdefg" -printf "<%*.*s>\n", w, p, s -@end example - -@noindent -is exactly equivalent to - -@example -s = "abcdefg" -printf "<%5.3s>\n", s -@end example - -@noindent -Both programs output @samp{@w{<@bullet{}@bullet{}abc>}}. (We have -used the bullet symbol ``@bullet{}'' to represent a space, to clearly -show you that there are two spaces in the output.)@refill - -Earlier versions of @code{awk} did not support this capability. You may -simulate it by using concatenation to build up the format string, -like so:@refill - -@example -w = 5 -p = 3 -s = "abcdefg" -printf "<%" w "." p "s>\n", s -@end example - -@noindent -This is not particularly easy to read, however. - -@node Printf Examples, , Format Modifiers, Printf -@subsection Examples of Using @code{printf} - -Here is how to use @code{printf} to make an aligned table: - -@example -awk '@{ printf "%-10s %s\n", $1, $2 @}' BBS-list -@end example - -@noindent -prints the names of bulletin boards (@code{$1}) of the file -@file{BBS-list} as a string of 10 characters, left justified. It also -prints the phone numbers (@code{$2}) afterward on the line. This -produces an aligned two-column table of names and phone numbers:@refill - -@example -@group -aardvark 555-5553 -alpo-net 555-3412 -barfly 555-7685 -bites 555-1675 -camelot 555-0542 -core 555-2912 -fooey 555-1234 -foot 555-6699 -macfoo 555-6480 -sdace 555-3430 -sabafoo 555-2127 -@end group -@end example - -Did you notice that we did not specify that the phone numbers be printed -as numbers? They had to be printed as strings because the numbers are -separated by a dash. This dash would be interpreted as a minus sign if -we had tried to print the phone numbers as numbers. This would have led -to some pretty confusing results. - -We did not specify a width for the phone numbers because they are the -last things on their lines. We don't need to put spaces after them. - -We could make our table look even nicer by adding headings to the tops -of the columns. To do this, use the @code{BEGIN} pattern -(@pxref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}) -to force the header to be printed only once, at the beginning of -the @code{awk} program:@refill - -@example -@group -awk 'BEGIN @{ print "Name Number" - print "---- ------" @} - @{ printf "%-10s %s\n", $1, $2 @}' BBS-list -@end group -@end example - -Did you notice that we mixed @code{print} and @code{printf} statements in -the above example? We could have used just @code{printf} statements to get -the same results: - -@example -@group -awk 'BEGIN @{ printf "%-10s %s\n", "Name", "Number" - printf "%-10s %s\n", "----", "------" @} - @{ printf "%-10s %s\n", $1, $2 @}' BBS-list -@end group -@end example - -@noindent -By outputting each column heading with the same format specification -used for the elements of the column, we have made sure that the headings -are aligned just like the columns. - -The fact that the same format specification is used three times can be -emphasized by storing it in a variable, like this: - -@example -awk 'BEGIN @{ format = "%-10s %s\n" - printf format, "Name", "Number" - printf format, "----", "------" @} - @{ printf format, $1, $2 @}' BBS-list -@end example - -See if you can use the @code{printf} statement to line up the headings and -table data for our @file{inventory-shipped} example covered earlier in the -section on the @code{print} statement -(@pxref{Print, ,The @code{print} Statement}).@refill - -@node Redirection, Special Files, Printf, Printing -@section Redirecting Output of @code{print} and @code{printf} - -@cindex output redirection -@cindex redirection of output -So far we have been dealing only with output that prints to the standard -output, usually your terminal. Both @code{print} and @code{printf} can -also send their output to other places. -This is called @dfn{redirection}.@refill - -A redirection appears after the @code{print} or @code{printf} statement. -Redirections in @code{awk} are written just like redirections in shell -commands, except that they are written inside the @code{awk} program. - -@menu -* File/Pipe Redirection:: Redirecting Output to Files and Pipes. -* Close Output:: How to close output files and pipes. -@end menu - -@node File/Pipe Redirection, Close Output, Redirection, Redirection -@subsection Redirecting Output to Files and Pipes - -Here are the three forms of output redirection. They are all shown for -the @code{print} statement, but they work identically for @code{printf} -also.@refill - -@table @code -@item print @var{items} > @var{output-file} -This type of redirection prints the items onto the output file -@var{output-file}. The file name @var{output-file} can be any -expression. Its value is changed to a string and then used as a -file name (@pxref{Expressions, ,Expressions as Action Statements}).@refill - -When this type of redirection is used, the @var{output-file} is erased -before the first output is written to it. Subsequent writes do not -erase @var{output-file}, but append to it. If @var{output-file} does -not exist, then it is created.@refill - -For example, here is how one @code{awk} program can write a list of -BBS names to a file @file{name-list} and a list of phone numbers to a -file @file{phone-list}. Each output file contains one name or number -per line. - -@smallexample -awk '@{ print $2 > "phone-list" - print $1 > "name-list" @}' BBS-list -@end smallexample - -@item print @var{items} >> @var{output-file} -This type of redirection prints the items onto the output file -@var{output-file}. The difference between this and the -single-@samp{>} redirection is that the old contents (if any) of -@var{output-file} are not erased. Instead, the @code{awk} output is -appended to the file. - -@cindex pipes for output -@cindex output, piping -@item print @var{items} | @var{command} -It is also possible to send output through a @dfn{pipe} instead of into a -file. This type of redirection opens a pipe to @var{command} and writes -the values of @var{items} through this pipe, to another process created -to execute @var{command}.@refill - -The redirection argument @var{command} is actually an @code{awk} -expression. Its value is converted to a string, whose contents give the -shell command to be run. - -For example, this produces two files, one unsorted list of BBS names -and one list sorted in reverse alphabetical order: - -@smallexample -awk '@{ print $1 > "names.unsorted" - print $1 | "sort -r > names.sorted" @}' BBS-list -@end smallexample - -Here the unsorted list is written with an ordinary redirection while -the sorted list is written by piping through the @code{sort} utility. - -Here is an example that uses redirection to mail a message to a mailing -list @samp{bug-system}. This might be useful when trouble is encountered -in an @code{awk} script run periodically for system maintenance. - -@smallexample -report = "mail bug-system" -print "Awk script failed:", $0 | report -print "at record number", FNR, "of", FILENAME | report -close(report) -@end smallexample - -We call the @code{close} function here because it's a good idea to close -the pipe as soon as all the intended output has been sent to it. -@xref{Close Output, ,Closing Output Files and Pipes}, for more information -on this. This example also illustrates the use of a variable to represent -a @var{file} or @var{command}: it is not necessary to always -use a string constant. Using a variable is generally a good idea, -since @code{awk} requires you to spell the string value identically -every time. -@end table - -Redirecting output using @samp{>}, @samp{>>}, or @samp{|} asks the system -to open a file or pipe only if the particular @var{file} or @var{command} -you've specified has not already been written to by your program, or if -it has been closed since it was last written to.@refill - -@node Close Output, , File/Pipe Redirection, Redirection -@subsection Closing Output Files and Pipes -@cindex closing output files and pipes -@findex close - -When a file or pipe is opened, the file name or command associated with -it is remembered by @code{awk} and subsequent writes to the same file or -command are appended to the previous writes. The file or pipe stays -open until @code{awk} exits. This is usually convenient. - -Sometimes there is a reason to close an output file or pipe earlier -than that. To do this, use the @code{close} function, as follows: - -@example -close(@var{filename}) -@end example - -@noindent -or - -@example -close(@var{command}) -@end example - -The argument @var{filename} or @var{command} can be any expression. -Its value must exactly equal the string used to open the file or pipe -to begin with---for example, if you open a pipe with this: - -@example -print $1 | "sort -r > names.sorted" -@end example - -@noindent -then you must close it with this: - -@example -close("sort -r > names.sorted") -@end example - -Here are some reasons why you might need to close an output file: - -@itemize @bullet -@item -To write a file and read it back later on in the same @code{awk} -program. Close the file when you are finished writing it; then -you can start reading it with @code{getline} -(@pxref{Getline, ,Explicit Input with @code{getline}}).@refill - -@item -To write numerous files, successively, in the same @code{awk} -program. If you don't close the files, eventually you may exceed a -system limit on the number of open files in one process. So close -each one when you are finished writing it. - -@item -To make a command finish. When you redirect output through a pipe, -the command reading the pipe normally continues to try to read input -as long as the pipe is open. Often this means the command cannot -really do its work until the pipe is closed. For example, if you -redirect output to the @code{mail} program, the message is not -actually sent until the pipe is closed. - -@item -To run the same program a second time, with the same arguments. -This is not the same thing as giving more input to the first run! - -For example, suppose you pipe output to the @code{mail} program. If you -output several lines redirected to this pipe without closing it, they make -a single message of several lines. By contrast, if you close the pipe -after each line of output, then each line makes a separate message. -@end itemize - -@iftex -@vindex ERRNO -@cindex differences: @code{gawk} and @code{awk} -@end iftex -@code{close} returns a value of zero if the close succeeded. -Otherwise, the value will be non-zero. -In this case, @code{gawk} sets the variable @code{ERRNO} to a string -describing the error that occurred. - -@node Special Files, , Redirection, Printing -@section Standard I/O Streams -@cindex standard input -@cindex standard output -@cindex standard error output -@cindex file descriptors - -Running programs conventionally have three input and output streams -already available to them for reading and writing. These are known as -the @dfn{standard input}, @dfn{standard output}, and @dfn{standard error -output}. These streams are, by default, terminal input and output, but -they are often redirected with the shell, via the @samp{<}, @samp{<<}, -@samp{>}, @samp{>>}, @samp{>&} and @samp{|} operators. Standard error -is used only for writing error messages; the reason we have two separate -streams, standard output and standard error, is so that they can be -redirected separately. - -@iftex -@cindex differences: @code{gawk} and @code{awk} -@end iftex -In other implementations of @code{awk}, the only way to write an error -message to standard error in an @code{awk} program is as follows: - -@smallexample -print "Serious error detected!\n" | "cat 1>&2" -@end smallexample - -@noindent -This works by opening a pipeline to a shell command which can access the -standard error stream which it inherits from the @code{awk} process. -This is far from elegant, and is also inefficient, since it requires a -separate process. So people writing @code{awk} programs have often -neglected to do this. Instead, they have sent the error messages to the -terminal, like this: - -@smallexample -@group -NF != 4 @{ - printf("line %d skipped: doesn't have 4 fields\n", FNR) > "/dev/tty" -@} -@end group -@end smallexample - -@noindent -This has the same effect most of the time, but not always: although the -standard error stream is usually the terminal, it can be redirected, and -when that happens, writing to the terminal is not correct. In fact, if -@code{awk} is run from a background job, it may not have a terminal at all. -Then opening @file{/dev/tty} will fail. - -@code{gawk} provides special file names for accessing the three standard -streams. When you redirect input or output in @code{gawk}, if the file name -matches one of these special names, then @code{gawk} directly uses the -stream it stands for. - -@cindex @file{/dev/stdin} -@cindex @file{/dev/stdout} -@cindex @file{/dev/stderr} -@cindex @file{/dev/fd/} -@table @file -@item /dev/stdin -The standard input (file descriptor 0). - -@item /dev/stdout -The standard output (file descriptor 1). - -@item /dev/stderr -The standard error output (file descriptor 2). - -@item /dev/fd/@var{N} -The file associated with file descriptor @var{N}. Such a file must have -been opened by the program initiating the @code{awk} execution (typically -the shell). Unless you take special pains, only descriptors 0, 1 and 2 -are available. -@end table - -The file names @file{/dev/stdin}, @file{/dev/stdout}, and @file{/dev/stderr} -are aliases for @file{/dev/fd/0}, @file{/dev/fd/1}, and @file{/dev/fd/2}, -respectively, but they are more self-explanatory. - -The proper way to write an error message in a @code{gawk} program -is to use @file{/dev/stderr}, like this: - -@smallexample -NF != 4 @{ - printf("line %d skipped: doesn't have 4 fields\n", FNR) > "/dev/stderr" -@} -@end smallexample - -@code{gawk} also provides special file names that give access to information -about the running @code{gawk} process. Each of these ``files'' provides -a single record of information. To read them more than once, you must -first close them with the @code{close} function -(@pxref{Close Input, ,Closing Input Files and Pipes}). -The filenames are: - -@cindex @file{/dev/pid} -@cindex @file{/dev/pgrpid} -@cindex @file{/dev/ppid} -@cindex @file{/dev/user} -@table @file -@item /dev/pid -Reading this file returns the process ID of the current process, -in decimal, terminated with a newline. - -@item /dev/ppid -Reading this file returns the parent process ID of the current process, -in decimal, terminated with a newline. - -@item /dev/pgrpid -Reading this file returns the process group ID of the current process, -in decimal, terminated with a newline. - -@item /dev/user -Reading this file returns a single record terminated with a newline. -The fields are separated with blanks. The fields represent the -following information: - -@table @code -@item $1 -The value of the @code{getuid} system call. - -@item $2 -The value of the @code{geteuid} system call. - -@item $3 -The value of the @code{getgid} system call. - -@item $4 -The value of the @code{getegid} system call. -@end table - -If there are any additional fields, they are the group IDs returned by -@code{getgroups} system call. -(Multiple groups may not be supported on all systems.)@refill -@end table - -These special file names may be used on the command line as data -files, as well as for I/O redirections within an @code{awk} program. -They may not be used as source files with the @samp{-f} option. - -Recognition of these special file names is disabled if @code{gawk} is in -compatibility mode (@pxref{Command Line, ,Invoking @code{awk}}). - -@quotation -@strong{Caution}: Unless your system actually has a @file{/dev/fd} directory -(or any of the other above listed special files), -the interpretation of these file names is done by @code{gawk} itself. -For example, using @samp{/dev/fd/4} for output will actually write on -file descriptor 4, and not on a new file descriptor that was @code{dup}'ed -from file descriptor 4. Most of the time this does not matter; however, it -is important to @emph{not} close any of the files related to file descriptors -0, 1, and 2. If you do close one of these files, unpredictable behavior -will result. -@end quotation - -@node One-liners, Patterns, Printing, Top -@chapter Useful ``One-liners'' - -@cindex one-liners -Useful @code{awk} programs are often short, just a line or two. Here is a -collection of useful, short programs to get you started. Some of these -programs contain constructs that haven't been covered yet. The description -of the program will give you a good idea of what is going on, but please -read the rest of the manual to become an @code{awk} expert! - -@c Per suggestions from Michal Jaegermann -@ifinfo -Since you are reading this in Info, each line of the example code is -enclosed in quotes, to represent text that you would type literally. -The examples themselves represent shell commands that use single quotes -to keep the shell from interpreting the contents of the program. -When reading the examples, focus on the text between the open and close -quotes. -@end ifinfo - -@table @code -@item awk '@{ if (NF > max) max = NF @} -@itemx @ @ @ @ @ END @{ print max @}' -This program prints the maximum number of fields on any input line. - -@item awk 'length($0) > 80' -This program prints every line longer than 80 characters. The sole -rule has a relational expression as its pattern, and has no action (so the -default action, printing the record, is used). - -@item awk 'NF > 0' -This program prints every line that has at least one field. This is an -easy way to delete blank lines from a file (or rather, to create a new -file similar to the old file but from which the blank lines have been -deleted). - -@item awk '@{ if (NF > 0) print @}' -This program also prints every line that has at least one field. Here we -allow the rule to match every line, then decide in the action whether -to print. - -@item awk@ 'BEGIN@ @{@ for (i = 1; i <= 7; i++) -@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ print int(101 * rand()) @}' -This program prints 7 random numbers from 0 to 100, inclusive. - -@item ls -l @var{files} | awk '@{ x += $4 @} ; END @{ print "total bytes: " x @}' -This program prints the total number of bytes used by @var{files}. - -@item expand@ @var{file}@ |@ awk@ '@{ if (x < length()) x = length() @} -@itemx @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ END @{ print "maximum line length is " x @}' -This program prints the maximum line length of @var{file}. The input -is piped through the @code{expand} program to change tabs into spaces, -so the widths compared are actually the right-margin columns. - -@item awk 'BEGIN @{ FS = ":" @} -@itemx @ @ @ @ @ @{ print $1 | "sort" @}' /etc/passwd -This program prints a sorted list of the login names of all users. - -@item awk '@{ nlines++ @} -@itemx @ @ @ @ @ END@ @{ print nlines @}' -This programs counts lines in a file. - -@item awk 'END @{ print NR @}' -This program also counts lines in a file, but lets @code{awk} do the work. - -@item awk '@{ print NR, $0 @}' -This program adds line numbers to all its input files, -similar to @samp{cat -n}. -@end table - -@node Patterns, Actions, One-liners, Top -@chapter Patterns -@cindex pattern, definition of - -Patterns in @code{awk} control the execution of rules: a rule is -executed when its pattern matches the current input record. This -chapter tells all about how to write patterns. - -@menu -* Kinds of Patterns:: A list of all kinds of patterns. - The following subsections describe - them in detail. -* Regexp:: Regular expressions such as @samp{/foo/}. -* Comparison Patterns:: Comparison expressions such as @code{$1 > 10}. -* Boolean Patterns:: Combining comparison expressions. -* Expression Patterns:: Any expression can be used as a pattern. -* Ranges:: Pairs of patterns specify record ranges. -* BEGIN/END:: Specifying initialization and cleanup rules. -* Empty:: The empty pattern, which matches every record. -@end menu - -@node Kinds of Patterns, Regexp, Patterns, Patterns -@section Kinds of Patterns -@cindex patterns, types of - -Here is a summary of the types of patterns supported in @code{awk}. -@c At the next rewrite, check to see that this order matches the -@c order in the text. It might not matter to a reader, but it's good -@c style. Also, it might be nice to mention all the topics of sections -@c that follow in this list; that way people can scan and know when to -@c expect a specific topic. Specifically please also make an entry -@c for Boolean operators as patterns in the right place. --mew - -@table @code -@item /@var{regular expression}/ -A regular expression as a pattern. It matches when the text of the -input record fits the regular expression. -(@xref{Regexp, ,Regular Expressions as Patterns}.)@refill - -@item @var{expression} -A single expression. It matches when its value, converted to a number, -is nonzero (if a number) or nonnull (if a string). -(@xref{Expression Patterns, ,Expressions as Patterns}.)@refill - -@item @var{pat1}, @var{pat2} -A pair of patterns separated by a comma, specifying a range of records. -(@xref{Ranges, ,Specifying Record Ranges with Patterns}.) - -@item BEGIN -@itemx END -Special patterns to supply start-up or clean-up information to -@code{awk}. (@xref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}.) - -@item @var{null} -The empty pattern matches every input record. -(@xref{Empty, ,The Empty Pattern}.)@refill -@end table - - -@node Regexp, Comparison Patterns, Kinds of Patterns, Patterns -@section Regular Expressions as Patterns -@cindex pattern, regular expressions -@cindex regexp -@cindex regular expressions as patterns - -A @dfn{regular expression}, or @dfn{regexp}, is a way of describing a -class of strings. A regular expression enclosed in slashes (@samp{/}) -is an @code{awk} pattern that matches every input record whose text -belongs to that class. - -The simplest regular expression is a sequence of letters, numbers, or -both. Such a regexp matches any string that contains that sequence. -Thus, the regexp @samp{foo} matches any string containing @samp{foo}. -Therefore, the pattern @code{/foo/} matches any input record containing -@samp{foo}. Other kinds of regexps let you specify more complicated -classes of strings. - -@menu -* Regexp Usage:: How to Use Regular Expressions -* Regexp Operators:: Regular Expression Operators -* Case-sensitivity:: How to do case-insensitive matching. -@end menu - -@node Regexp Usage, Regexp Operators, Regexp, Regexp -@subsection How to Use Regular Expressions - -A regular expression can be used as a pattern by enclosing it in -slashes. Then the regular expression is matched against the -entire text of each record. (Normally, it only needs -to match some part of the text in order to succeed.) For example, this -prints the second field of each record that contains @samp{foo} anywhere: - -@example -awk '/foo/ @{ print $2 @}' BBS-list -@end example - -@cindex regular expression matching operators -@cindex string-matching operators -@cindex operators, string-matching -@cindex operators, regexp matching -@cindex regexp search operators -Regular expressions can also be used in comparison expressions. Then -you can specify the string to match against; it need not be the entire -current input record. These comparison expressions can be used as -patterns or in @code{if}, @code{while}, @code{for}, and @code{do} statements. - -@table @code -@item @var{exp} ~ /@var{regexp}/ -This is true if the expression @var{exp} (taken as a character string) -is matched by @var{regexp}. The following example matches, or selects, -all input records with the upper-case letter @samp{J} somewhere in the -first field:@refill - -@example -awk '$1 ~ /J/' inventory-shipped -@end example - -So does this: - -@example -awk '@{ if ($1 ~ /J/) print @}' inventory-shipped -@end example - -@item @var{exp} !~ /@var{regexp}/ -This is true if the expression @var{exp} (taken as a character string) -is @emph{not} matched by @var{regexp}. The following example matches, -or selects, all input records whose first field @emph{does not} contain -the upper-case letter @samp{J}:@refill - -@example -awk '$1 !~ /J/' inventory-shipped -@end example -@end table - -@cindex computed regular expressions -@cindex regular expressions, computed -@cindex dynamic regular expressions -The right hand side of a @samp{~} or @samp{!~} operator need not be a -constant regexp (i.e., a string of characters between slashes). It may -be any expression. The expression is evaluated, and converted if -necessary to a string; the contents of the string are used as the -regexp. A regexp that is computed in this way is called a @dfn{dynamic -regexp}. For example: - -@example -identifier_regexp = "[A-Za-z_][A-Za-z_0-9]+" -$0 ~ identifier_regexp -@end example - -@noindent -sets @code{identifier_regexp} to a regexp that describes @code{awk} -variable names, and tests if the input record matches this regexp. - -@node Regexp Operators, Case-sensitivity, Regexp Usage, Regexp -@subsection Regular Expression Operators -@cindex metacharacters -@cindex regular expression metacharacters - -You can combine regular expressions with the following characters, -called @dfn{regular expression operators}, or @dfn{metacharacters}, to -increase the power and versatility of regular expressions. - -Here is a table of metacharacters. All characters not listed in the -table stand for themselves. - -@table @code -@item ^ -This matches the beginning of the string or the beginning of a line -within the string. For example: - -@example -^@@chapter -@end example - -@noindent -matches the @samp{@@chapter} at the beginning of a string, and can be used -to identify chapter beginnings in Texinfo source files. - -@item $ -This is similar to @samp{^}, but it matches only at the end of a string -or the end of a line within the string. For example: - -@example -p$ -@end example - -@noindent -matches a record that ends with a @samp{p}. - -@item . -This matches any single character except a newline. For example: - -@example -.P -@end example - -@noindent -matches any single character followed by a @samp{P} in a string. Using -concatenation we can make regular expressions like @samp{U.A}, which -matches any three-character sequence that begins with @samp{U} and ends -with @samp{A}. - -@item [@dots{}] -This is called a @dfn{character set}. It matches any one of the -characters that are enclosed in the square brackets. For example: - -@example -[MVX] -@end example - -@noindent -matches any one of the characters @samp{M}, @samp{V}, or @samp{X} in a -string.@refill - -Ranges of characters are indicated by using a hyphen between the beginning -and ending characters, and enclosing the whole thing in brackets. For -example:@refill - -@example -[0-9] -@end example - -@noindent -matches any digit. - -To include the character @samp{\}, @samp{]}, @samp{-} or @samp{^} in a -character set, put a @samp{\} in front of it. For example: - -@example -[d\]] -@end example - -@noindent -matches either @samp{d}, or @samp{]}.@refill - -This treatment of @samp{\} is compatible with other @code{awk} -implementations, and is also mandated by the @sc{posix} Command Language -and Utilities standard. The regular expressions in @code{awk} are a superset -of the @sc{posix} specification for Extended Regular Expressions (EREs). -@sc{posix} EREs are based on the regular expressions accepted by the -traditional @code{egrep} utility. - -In @code{egrep} syntax, backslash is not syntactically special within -square brackets. This means that special tricks have to be used to -represent the characters @samp{]}, @samp{-} and @samp{^} as members of a -character set. - -In @code{egrep} syntax, to match @samp{-}, write it as @samp{---}, -which is a range containing only @w{@samp{-}.} You may also give @samp{-} -as the first or last character in the set. To match @samp{^}, put it -anywhere except as the first character of a set. To match a @samp{]}, -make it the first character in the set. For example:@refill - -@example -[]d^] -@end example - -@noindent -matches either @samp{]}, @samp{d} or @samp{^}.@refill - -@item [^ @dots{}] -This is a @dfn{complemented character set}. The first character after -the @samp{[} @emph{must} be a @samp{^}. It matches any characters -@emph{except} those in the square brackets (or newline). For example: - -@example -[^0-9] -@end example - -@noindent -matches any character that is not a digit. - -@item | -This is the @dfn{alternation operator} and it is used to specify -alternatives. For example: - -@example -^P|[0-9] -@end example - -@noindent -matches any string that matches either @samp{^P} or @samp{[0-9]}. This -means it matches any string that contains a digit or starts with @samp{P}. - -The alternation applies to the largest possible regexps on either side. -@item (@dots{}) -Parentheses are used for grouping in regular expressions as in -arithmetic. They can be used to concatenate regular expressions -containing the alternation operator, @samp{|}. - -@item * -This symbol means that the preceding regular expression is to be -repeated as many times as possible to find a match. For example: - -@example -ph* -@end example - -@noindent -applies the @samp{*} symbol to the preceding @samp{h} and looks for matches -to one @samp{p} followed by any number of @samp{h}s. This will also match -just @samp{p} if no @samp{h}s are present. - -The @samp{*} repeats the @emph{smallest} possible preceding expression. -(Use parentheses if you wish to repeat a larger expression.) It finds -as many repetitions as possible. For example: - -@example -awk '/\(c[ad][ad]*r x\)/ @{ print @}' sample -@end example - -@noindent -prints every record in the input containing a string of the form -@samp{(car x)}, @samp{(cdr x)}, @samp{(cadr x)}, and so on.@refill - -@item + -This symbol is similar to @samp{*}, but the preceding expression must be -matched at least once. This means that: - -@example -wh+y -@end example - -@noindent -would match @samp{why} and @samp{whhy} but not @samp{wy}, whereas -@samp{wh*y} would match all three of these strings. This is a simpler -way of writing the last @samp{*} example: - -@example -awk '/\(c[ad]+r x\)/ @{ print @}' sample -@end example - -@item ? -This symbol is similar to @samp{*}, but the preceding expression can be -matched once or not at all. For example: - -@example -fe?d -@end example - -@noindent -will match @samp{fed} and @samp{fd}, but nothing else.@refill - -@item \ -This is used to suppress the special meaning of a character when -matching. For example: - -@example -\$ -@end example - -@noindent -matches the character @samp{$}. - -The escape sequences used for string constants -(@pxref{Constants, ,Constant Expressions}) are -valid in regular expressions as well; they are also introduced by a -@samp{\}.@refill -@end table - -In regular expressions, the @samp{*}, @samp{+}, and @samp{?} operators have -the highest precedence, followed by concatenation, and finally by @samp{|}. -As in arithmetic, parentheses can change how operators are grouped.@refill - -@node Case-sensitivity, , Regexp Operators, Regexp -@subsection Case-sensitivity in Matching - -Case is normally significant in regular expressions, both when matching -ordinary characters (i.e., not metacharacters), and inside character -sets. Thus a @samp{w} in a regular expression matches only a lower case -@samp{w} and not an upper case @samp{W}. - -The simplest way to do a case-independent match is to use a character -set: @samp{[Ww]}. However, this can be cumbersome if you need to use it -often; and it can make the regular expressions harder for humans to -read. There are two other alternatives that you might prefer. - -One way to do a case-insensitive match at a particular point in the -program is to convert the data to a single case, using the -@code{tolower} or @code{toupper} built-in string functions (which we -haven't discussed yet; -@pxref{String Functions, ,Built-in Functions for String Manipulation}). -For example:@refill - -@example -tolower($1) ~ /foo/ @{ @dots{} @} -@end example - -@noindent -converts the first field to lower case before matching against it. - -Another method is to set the variable @code{IGNORECASE} to a nonzero -value (@pxref{Built-in Variables}). When @code{IGNORECASE} is not zero, -@emph{all} regexp operations ignore case. Changing the value of -@code{IGNORECASE} dynamically controls the case sensitivity of your -program as it runs. Case is significant by default because -@code{IGNORECASE} (like most variables) is initialized to zero. - -@example -x = "aB" -if (x ~ /ab/) @dots{} # this test will fail - -IGNORECASE = 1 -if (x ~ /ab/) @dots{} # now it will succeed -@end example - -In general, you cannot use @code{IGNORECASE} to make certain rules -case-insensitive and other rules case-sensitive, because there is no way -to set @code{IGNORECASE} just for the pattern of a particular rule. To -do this, you must use character sets or @code{tolower}. However, one -thing you can do only with @code{IGNORECASE} is turn case-sensitivity on -or off dynamically for all the rules at once.@refill - -@code{IGNORECASE} can be set on the command line, or in a @code{BEGIN} -rule. Setting @code{IGNORECASE} from the command line is a way to make -a program case-insensitive without having to edit it. - -The value of @code{IGNORECASE} has no effect if @code{gawk} is in -compatibility mode (@pxref{Command Line, ,Invoking @code{awk}}). -Case is always significant in compatibility mode.@refill - -@node Comparison Patterns, Boolean Patterns, Regexp, Patterns -@section Comparison Expressions as Patterns -@cindex comparison expressions as patterns -@cindex pattern, comparison expressions -@cindex relational operators -@cindex operators, relational - -@dfn{Comparison patterns} test relationships such as equality between -two strings or numbers. They are a special case of expression patterns -(@pxref{Expression Patterns, ,Expressions as Patterns}). They are written -with @dfn{relational operators}, which are a superset of those in C. -Here is a table of them:@refill - -@table @code -@item @var{x} < @var{y} -True if @var{x} is less than @var{y}. - -@item @var{x} <= @var{y} -True if @var{x} is less than or equal to @var{y}. - -@item @var{x} > @var{y} -True if @var{x} is greater than @var{y}. - -@item @var{x} >= @var{y} -True if @var{x} is greater than or equal to @var{y}. - -@item @var{x} == @var{y} -True if @var{x} is equal to @var{y}. - -@item @var{x} != @var{y} -True if @var{x} is not equal to @var{y}. - -@item @var{x} ~ @var{y} -True if @var{x} matches the regular expression described by @var{y}. - -@item @var{x} !~ @var{y} -True if @var{x} does not match the regular expression described by @var{y}. -@end table - -The operands of a relational operator are compared as numbers if they -are both numbers. Otherwise they are converted to, and compared as, -strings (@pxref{Conversion, ,Conversion of Strings and Numbers}, -for the detailed rules). Strings are compared by comparing the first -character of each, then the second character of each, -and so on, until there is a difference. If the two strings are equal until -the shorter one runs out, the shorter one is considered to be less than the -longer one. Thus, @code{"10"} is less than @code{"9"}, and @code{"abc"} -is less than @code{"abcd"}.@refill - -The left operand of the @samp{~} and @samp{!~} operators is a string. -The right operand is either a constant regular expression enclosed in -slashes (@code{/@var{regexp}/}), or any expression, whose string value -is used as a dynamic regular expression -(@pxref{Regexp Usage, ,How to Use Regular Expressions}).@refill - -The following example prints the second field of each input record -whose first field is precisely @samp{foo}. - -@example -awk '$1 == "foo" @{ print $2 @}' BBS-list -@end example - -@noindent -Contrast this with the following regular expression match, which would -accept any record with a first field that contains @samp{foo}: - -@example -awk '$1 ~ "foo" @{ print $2 @}' BBS-list -@end example - -@noindent -or, equivalently, this one: - -@example -awk '$1 ~ /foo/ @{ print $2 @}' BBS-list -@end example - -@node Boolean Patterns, Expression Patterns, Comparison Patterns, Patterns -@section Boolean Operators and Patterns -@cindex patterns, boolean -@cindex boolean patterns - -A @dfn{boolean pattern} is an expression which combines other patterns -using the @dfn{boolean operators} ``or'' (@samp{||}), ``and'' -(@samp{&&}), and ``not'' (@samp{!}). Whether the boolean pattern -matches an input record depends on whether its subpatterns match. - -For example, the following command prints all records in the input file -@file{BBS-list} that contain both @samp{2400} and @samp{foo}.@refill - -@example -awk '/2400/ && /foo/' BBS-list -@end example - -The following command prints all records in the input file -@file{BBS-list} that contain @emph{either} @samp{2400} or @samp{foo}, or -both.@refill - -@example -awk '/2400/ || /foo/' BBS-list -@end example - -The following command prints all records in the input file -@file{BBS-list} that do @emph{not} contain the string @samp{foo}. - -@example -awk '! /foo/' BBS-list -@end example - -Note that boolean patterns are a special case of expression patterns -(@pxref{Expression Patterns, ,Expressions as Patterns}); they are -expressions that use the boolean operators. -@xref{Boolean Ops, ,Boolean Expressions}, for complete information -on the boolean operators.@refill - -The subpatterns of a boolean pattern can be constant regular -expressions, comparisons, or any other @code{awk} expressions. Range -patterns are not expressions, so they cannot appear inside boolean -patterns. Likewise, the special patterns @code{BEGIN} and @code{END}, -which never match any input record, are not expressions and cannot -appear inside boolean patterns. - -@node Expression Patterns, Ranges, Boolean Patterns, Patterns -@section Expressions as Patterns - -Any @code{awk} expression is also valid as an @code{awk} pattern. -Then the pattern ``matches'' if the expression's value is nonzero (if a -number) or nonnull (if a string). - -The expression is reevaluated each time the rule is tested against a new -input record. If the expression uses fields such as @code{$1}, the -value depends directly on the new input record's text; otherwise, it -depends only on what has happened so far in the execution of the -@code{awk} program, but that may still be useful. - -Comparison patterns are actually a special case of this. For -example, the expression @code{$5 == "foo"} has the value 1 when the -value of @code{$5} equals @code{"foo"}, and 0 otherwise; therefore, this -expression as a pattern matches when the two values are equal. - -Boolean patterns are also special cases of expression patterns. - -A constant regexp as a pattern is also a special case of an expression -pattern. @code{/foo/} as an expression has the value 1 if @samp{foo} -appears in the current input record; thus, as a pattern, @code{/foo/} -matches any record containing @samp{foo}. - -Other implementations of @code{awk} that are not yet @sc{posix} compliant -are less general than @code{gawk}: they allow comparison expressions, and -boolean combinations thereof (optionally with parentheses), but not -necessarily other kinds of expressions. - -@node Ranges, BEGIN/END, Expression Patterns, Patterns -@section Specifying Record Ranges with Patterns - -@cindex range pattern -@cindex patterns, range -A @dfn{range pattern} is made of two patterns separated by a comma, of -the form @code{@var{begpat}, @var{endpat}}. It matches ranges of -consecutive input records. The first pattern @var{begpat} controls -where the range begins, and the second one @var{endpat} controls where -it ends. For example,@refill - -@example -awk '$1 == "on", $1 == "off"' -@end example - -@noindent -prints every record between @samp{on}/@samp{off} pairs, inclusive. - -A range pattern starts out by matching @var{begpat} -against every input record; when a record matches @var{begpat}, the -range pattern becomes @dfn{turned on}. The range pattern matches this -record. As long as it stays turned on, it automatically matches every -input record read. It also matches @var{endpat} against -every input record; when that succeeds, the range pattern is turned -off again for the following record. Now it goes back to checking -@var{begpat} against each record. - -The record that turns on the range pattern and the one that turns it -off both match the range pattern. If you don't want to operate on -these records, you can write @code{if} statements in the rule's action -to distinguish them. - -It is possible for a pattern to be turned both on and off by the same -record, if both conditions are satisfied by that record. Then the action is -executed for just that record. - -@node BEGIN/END, Empty, Ranges, Patterns -@section @code{BEGIN} and @code{END} Special Patterns - -@cindex @code{BEGIN} special pattern -@cindex patterns, @code{BEGIN} -@cindex @code{END} special pattern -@cindex patterns, @code{END} -@code{BEGIN} and @code{END} are special patterns. They are not used to -match input records. Rather, they are used for supplying start-up or -clean-up information to your @code{awk} script. A @code{BEGIN} rule is -executed, once, before the first input record has been read. An @code{END} -rule is executed, once, after all the input has been read. For -example:@refill - -@example -awk 'BEGIN @{ print "Analysis of `foo'" @} - /foo/ @{ ++foobar @} - END @{ print "`foo' appears " foobar " times." @}' BBS-list -@end example - -This program finds the number of records in the input file @file{BBS-list} -that contain the string @samp{foo}. The @code{BEGIN} rule prints a title -for the report. There is no need to use the @code{BEGIN} rule to -initialize the counter @code{foobar} to zero, as @code{awk} does this -for us automatically (@pxref{Variables}). - -The second rule increments the variable @code{foobar} every time a -record containing the pattern @samp{foo} is read. The @code{END} rule -prints the value of @code{foobar} at the end of the run.@refill - -The special patterns @code{BEGIN} and @code{END} cannot be used in ranges -or with boolean operators (indeed, they cannot be used with any operators). - -An @code{awk} program may have multiple @code{BEGIN} and/or @code{END} -rules. They are executed in the order they appear, all the @code{BEGIN} -rules at start-up and all the @code{END} rules at termination. - -Multiple @code{BEGIN} and @code{END} sections are useful for writing -library functions, since each library can have its own @code{BEGIN} or -@code{END} rule to do its own initialization and/or cleanup. Note that -the order in which library functions are named on the command line -controls the order in which their @code{BEGIN} and @code{END} rules are -executed. Therefore you have to be careful to write such rules in -library files so that the order in which they are executed doesn't matter. -@xref{Command Line, ,Invoking @code{awk}}, for more information on -using library functions. - -If an @code{awk} program only has a @code{BEGIN} rule, and no other -rules, then the program exits after the @code{BEGIN} rule has been run. -(Older versions of @code{awk} used to keep reading and ignoring input -until end of file was seen.) However, if an @code{END} rule exists as -well, then the input will be read, even if there are no other rules in -the program. This is necessary in case the @code{END} rule checks the -@code{NR} variable. - -@code{BEGIN} and @code{END} rules must have actions; there is no default -action for these rules since there is no current record when they run. - -@node Empty, , BEGIN/END, Patterns -@comment node-name, next, previous, up -@section The Empty Pattern - -@cindex empty pattern -@cindex pattern, empty -An empty pattern is considered to match @emph{every} input record. For -example, the program:@refill - -@example -awk '@{ print $1 @}' BBS-list -@end example - -@noindent -prints the first field of every record. - -@node Actions, Expressions, Patterns, Top -@chapter Overview of Actions -@cindex action, definition of -@cindex curly braces -@cindex action, curly braces -@cindex action, separating statements - -An @code{awk} program or script consists of a series of -rules and function definitions, interspersed. (Functions are -described later. @xref{User-defined, ,User-defined Functions}.) - -A rule contains a pattern and an action, either of which may be -omitted. The purpose of the @dfn{action} is to tell @code{awk} what to do -once a match for the pattern is found. Thus, the entire program -looks somewhat like this: - -@example -@r{[}@var{pattern}@r{]} @r{[}@{ @var{action} @}@r{]} -@r{[}@var{pattern}@r{]} @r{[}@{ @var{action} @}@r{]} -@dots{} -function @var{name} (@var{args}) @{ @dots{} @} -@dots{} -@end example - -An action consists of one or more @code{awk} @dfn{statements}, enclosed -in curly braces (@samp{@{} and @samp{@}}). Each statement specifies one -thing to be done. The statements are separated by newlines or -semicolons. - -The curly braces around an action must be used even if the action -contains only one statement, or even if it contains no statements at -all. However, if you omit the action entirely, omit the curly braces as -well. (An omitted action is equivalent to @samp{@{ print $0 @}}.) - -Here are the kinds of statements supported in @code{awk}: - -@itemize @bullet -@item -Expressions, which can call functions or assign values to variables -(@pxref{Expressions, ,Expressions as Action Statements}). Executing -this kind of statement simply computes the value of the expression and -then ignores it. This is useful when the expression has side effects -(@pxref{Assignment Ops, ,Assignment Expressions}).@refill - -@item -Control statements, which specify the control flow of @code{awk} -programs. The @code{awk} language gives you C-like constructs -(@code{if}, @code{for}, @code{while}, and so on) as well as a few -special ones (@pxref{Statements, ,Control Statements in Actions}).@refill - -@item -Compound statements, which consist of one or more statements enclosed in -curly braces. A compound statement is used in order to put several -statements together in the body of an @code{if}, @code{while}, @code{do} -or @code{for} statement. - -@item -Input control, using the @code{getline} command -(@pxref{Getline, ,Explicit Input with @code{getline}}), and the @code{next} -statement (@pxref{Next Statement, ,The @code{next} Statement}). - -@item -Output statements, @code{print} and @code{printf}. -@xref{Printing, ,Printing Output}.@refill - -@item -Deletion statements, for deleting array elements. -@xref{Delete, ,The @code{delete} Statement}.@refill -@end itemize - -@iftex -The next two chapters cover in detail expressions and control -statements, respectively. We go on to treat arrays and built-in -functions, both of which are used in expressions. Then we proceed -to discuss how to define your own functions. -@end iftex - -@node Expressions, Statements, Actions, Top -@chapter Expressions as Action Statements -@cindex expression - -Expressions are the basic building block of @code{awk} actions. An -expression evaluates to a value, which you can print, test, store in a -variable or pass to a function. But beyond that, an expression can assign a new value to a variable -or a field, with an assignment operator. - -An expression can serve as a statement on its own. Most other kinds of -statements contain one or more expressions which specify data to be -operated on. As in other languages, expressions in @code{awk} include -variables, array references, constants, and function calls, as well as -combinations of these with various operators. - -@menu -* Constants:: String, numeric, and regexp constants. -* Variables:: Variables give names to values for later use. -* Arithmetic Ops:: Arithmetic operations (@samp{+}, @samp{-}, etc.) -* Concatenation:: Concatenating strings. -* Comparison Ops:: Comparison of numbers and strings - with @samp{<}, etc. -* Boolean Ops:: Combining comparison expressions - using boolean operators - @samp{||} (``or''), @samp{&&} (``and'') and @samp{!} (``not''). - -* Assignment Ops:: Changing the value of a variable or a field. -* Increment Ops:: Incrementing the numeric value of a variable. - -* Conversion:: The conversion of strings to numbers - and vice versa. -* Values:: The whole truth about numbers and strings. -* Conditional Exp:: Conditional expressions select - between two subexpressions under control - of a third subexpression. -* Function Calls:: A function call is an expression. -* Precedence:: How various operators nest. -@end menu - -@node Constants, Variables, Expressions, Expressions -@section Constant Expressions -@cindex constants, types of -@cindex string constants - -The simplest type of expression is the @dfn{constant}, which always has -the same value. There are three types of constants: numeric constants, -string constants, and regular expression constants. - -@cindex numeric constant -@cindex numeric value -A @dfn{numeric constant} stands for a number. This number can be an -integer, a decimal fraction, or a number in scientific (exponential) -notation. Note that all numeric values are represented within -@code{awk} in double-precision floating point. Here are some examples -of numeric constants, which all have the same value: - -@example -105 -1.05e+2 -1050e-1 -@end example - -A string constant consists of a sequence of characters enclosed in -double-quote marks. For example: - -@example -"parrot" -@end example - -@noindent -@iftex -@cindex differences between @code{gawk} and @code{awk} -@end iftex -represents the string whose contents are @samp{parrot}. Strings in -@code{gawk} can be of any length and they can contain all the possible -8-bit ASCII characters including ASCII NUL. Other @code{awk} -implementations may have difficulty with some character codes.@refill - -@cindex escape sequence notation -Some characters cannot be included literally in a string constant. You -represent them instead with @dfn{escape sequences}, which are character -sequences beginning with a backslash (@samp{\}). - -One use of an escape sequence is to include a double-quote character in -a string constant. Since a plain double-quote would end the string, you -must use @samp{\"} to represent a single double-quote character as a -part of the string. -The -backslash character itself is another character that cannot be -included normally; you write @samp{\\} to put one backslash in the -string. Thus, the string whose contents are the two characters -@samp{"\} must be written @code{"\"\\"}. - -Another use of backslash is to represent unprintable characters -such as newline. While there is nothing to stop you from writing most -of these characters directly in a string constant, they may look ugly. - -Here is a table of all the escape sequences used in @code{awk}: - -@table @code -@item \\ -Represents a literal backslash, @samp{\}. - -@item \a -Represents the ``alert'' character, control-g, ASCII code 7. - -@item \b -Represents a backspace, control-h, ASCII code 8. - -@item \f -Represents a formfeed, control-l, ASCII code 12. - -@item \n -Represents a newline, control-j, ASCII code 10. - -@item \r -Represents a carriage return, control-m, ASCII code 13. - -@item \t -Represents a horizontal tab, control-i, ASCII code 9. - -@item \v -Represents a vertical tab, control-k, ASCII code 11. - -@item \@var{nnn} -Represents the octal value @var{nnn}, where @var{nnn} are one to three -digits between 0 and 7. For example, the code for the ASCII ESC -(escape) character is @samp{\033}.@refill - -@item \x@var{hh}@dots{} -Represents the hexadecimal value @var{hh}, where @var{hh} are hexadecimal -digits (@samp{0} through @samp{9} and either @samp{A} through @samp{F} or -@samp{a} through @samp{f}). Like the same construct in @sc{ansi} C, the escape -sequence continues until the first non-hexadecimal digit is seen. However, -using more than two hexadecimal digits produces undefined results. (The -@samp{\x} escape sequence is not allowed in @sc{posix} @code{awk}.)@refill -@end table - -A @dfn{constant regexp} is a regular expression description enclosed in -slashes, such as @code{/^beginning and end$/}. Most regexps used in -@code{awk} programs are constant, but the @samp{~} and @samp{!~} -operators can also match computed or ``dynamic'' regexps -(@pxref{Regexp Usage, ,How to Use Regular Expressions}).@refill - -Constant regexps may be used like simple expressions. When a -constant regexp is not on the right hand side of the @samp{~} or -@samp{!~} operators, it has the same meaning as if it appeared -in a pattern, i.e. @samp{($0 ~ /foo/)} -(@pxref{Expression Patterns, ,Expressions as Patterns}). -This means that the two code segments,@refill - -@example -if ($0 ~ /barfly/ || $0 ~ /camelot/) - print "found" -@end example - -@noindent -and - -@example -if (/barfly/ || /camelot/) - print "found" -@end example - -@noindent -are exactly equivalent. One rather bizarre consequence of this rule is -that the following boolean expression is legal, but does not do what the user -intended:@refill - -@example -if (/foo/ ~ $1) print "found foo" -@end example - -This code is ``obviously'' testing @code{$1} for a match against the regexp -@code{/foo/}. But in fact, the expression @code{(/foo/ ~ $1)} actually means -@code{(($0 ~ /foo/) ~ $1)}. In other words, first match the input record -against the regexp @code{/foo/}. The result will be either a 0 or a 1, -depending upon the success or failure of the match. Then match that result -against the first field in the record.@refill - -Since it is unlikely that you would ever really wish to make this kind of -test, @code{gawk} will issue a warning when it sees this construct in -a program.@refill - -Another consequence of this rule is that the assignment statement - -@example -matches = /foo/ -@end example - -@noindent -will assign either 0 or 1 to the variable @code{matches}, depending -upon the contents of the current input record. - -Constant regular expressions are also used as the first argument for -the @code{sub} and @code{gsub} functions -(@pxref{String Functions, ,Built-in Functions for String Manipulation}).@refill - -This feature of the language was never well documented until the -@sc{posix} specification. - -You may be wondering, when is - -@example -$1 ~ /foo/ @{ @dots{} @} -@end example - -@noindent -preferable to - -@example -$1 ~ "foo" @{ @dots{} @} -@end example - -Since the right-hand sides of both @samp{~} operators are constants, -it is more efficient to use the @samp{/foo/} form: @code{awk} can note -that you have supplied a regexp and store it internally in a form that -makes pattern matching more efficient. In the second form, @code{awk} -must first convert the string into this internal form, and then perform -the pattern matching. The first form is also better style; it shows -clearly that you intend a regexp match. - -@node Variables, Arithmetic Ops, Constants, Expressions -@section Variables -@cindex variables, user-defined -@cindex user-defined variables -@c there should be more than one subsection, ideally. Not a big deal. -@c But usually there are supposed to be at least two. One way to get -@c around this is to write the info in the subsection as the info in the -@c section itself and not have any subsections.. --mew - -Variables let you give names to values and refer to them later. You have -already seen variables in many of the examples. The name of a variable -must be a sequence of letters, digits and underscores, but it may not begin -with a digit. Case is significant in variable names; @code{a} and @code{A} -are distinct variables. - -A variable name is a valid expression by itself; it represents the -variable's current value. Variables are given new values with -@dfn{assignment operators} and @dfn{increment operators}. -@xref{Assignment Ops, ,Assignment Expressions}. - -A few variables have special built-in meanings, such as @code{FS}, the -field separator, and @code{NF}, the number of fields in the current -input record. @xref{Built-in Variables}, for a list of them. These -built-in variables can be used and assigned just like all other -variables, but their values are also used or changed automatically by -@code{awk}. Each built-in variable's name is made entirely of upper case -letters. - -Variables in @code{awk} can be assigned either numeric or string -values. By default, variables are initialized to the null string, which -is effectively zero if converted to a number. There is no need to -``initialize'' each variable explicitly in @code{awk}, the way you would in C or most other traditional languages. - -@menu -* Assignment Options:: Setting variables on the command line - and a summary of command line syntax. - This is an advanced method of input. -@end menu - -@node Assignment Options, , Variables, Variables -@subsection Assigning Variables on the Command Line - -You can set any @code{awk} variable by including a @dfn{variable assignment} -among the arguments on the command line when you invoke @code{awk} -(@pxref{Command Line, ,Invoking @code{awk}}). Such an assignment has -this form:@refill - -@example -@var{variable}=@var{text} -@end example - -@noindent -With it, you can set a variable either at the beginning of the -@code{awk} run or in between input files. - -If you precede the assignment with the @samp{-v} option, like this: - -@example --v @var{variable}=@var{text} -@end example - -@noindent -then the variable is set at the very beginning, before even the -@code{BEGIN} rules are run. The @samp{-v} option and its assignment -must precede all the file name arguments, as well as the program text. - -Otherwise, the variable assignment is performed at a time determined by -its position among the input file arguments: after the processing of the -preceding input file argument. For example: - -@example -awk '@{ print $n @}' n=4 inventory-shipped n=2 BBS-list -@end example - -@noindent -prints the value of field number @code{n} for all input records. Before -the first file is read, the command line sets the variable @code{n} -equal to 4. This causes the fourth field to be printed in lines from -the file @file{inventory-shipped}. After the first file has finished, -but before the second file is started, @code{n} is set to 2, so that the -second field is printed in lines from @file{BBS-list}. - -Command line arguments are made available for explicit examination by -the @code{awk} program in an array named @code{ARGV} -(@pxref{Built-in Variables}).@refill - -@code{awk} processes the values of command line assignments for escape -sequences (@pxref{Constants, ,Constant Expressions}). - -@node Arithmetic Ops, Concatenation, Variables, Expressions -@section Arithmetic Operators -@cindex arithmetic operators -@cindex operators, arithmetic -@cindex addition -@cindex subtraction -@cindex multiplication -@cindex division -@cindex remainder -@cindex quotient -@cindex exponentiation - -The @code{awk} language uses the common arithmetic operators when -evaluating expressions. All of these arithmetic operators follow normal -precedence rules, and work as you would expect them to. This example -divides field three by field four, adds field two, stores the result -into field one, and prints the resulting altered input record: - -@example -awk '@{ $1 = $2 + $3 / $4; print @}' inventory-shipped -@end example - -The arithmetic operators in @code{awk} are: - -@table @code -@item @var{x} + @var{y} -Addition. - -@item @var{x} - @var{y} -Subtraction. - -@item - @var{x} -Negation. - -@item + @var{x} -Unary plus. No real effect on the expression. - -@item @var{x} * @var{y} -Multiplication. - -@item @var{x} / @var{y} -Division. Since all numbers in @code{awk} are double-precision -floating point, the result is not rounded to an integer: @code{3 / 4} -has the value 0.75. - -@item @var{x} % @var{y} -@iftex -@cindex differences between @code{gawk} and @code{awk} -@end iftex -Remainder. The quotient is rounded toward zero to an integer, -multiplied by @var{y} and this result is subtracted from @var{x}. -This operation is sometimes known as ``trunc-mod.'' The following -relation always holds: - -@example -b * int(a / b) + (a % b) == a -@end example - -One possibly undesirable effect of this definition of remainder is that -@code{@var{x} % @var{y}} is negative if @var{x} is negative. Thus, - -@example --17 % 8 = -1 -@end example - -In other @code{awk} implementations, the signedness of the remainder -may be machine dependent. - -@item @var{x} ^ @var{y} -@itemx @var{x} ** @var{y} -Exponentiation: @var{x} raised to the @var{y} power. @code{2 ^ 3} has -the value 8. The character sequence @samp{**} is equivalent to -@samp{^}. (The @sc{posix} standard only specifies the use of @samp{^} -for exponentiation.) -@end table - -@node Concatenation, Comparison Ops, Arithmetic Ops, Expressions -@section String Concatenation - -@cindex string operators -@cindex operators, string -@cindex concatenation -There is only one string operation: concatenation. It does not have a -specific operator to represent it. Instead, concatenation is performed by -writing expressions next to one another, with no operator. For example: - -@example -awk '@{ print "Field number one: " $1 @}' BBS-list -@end example - -@noindent -produces, for the first record in @file{BBS-list}: - -@example -Field number one: aardvark -@end example - -Without the space in the string constant after the @samp{:}, the line -would run together. For example: - -@example -awk '@{ print "Field number one:" $1 @}' BBS-list -@end example - -@noindent -produces, for the first record in @file{BBS-list}: - -@example -Field number one:aardvark -@end example - -Since string concatenation does not have an explicit operator, it is -often necessary to insure that it happens where you want it to by -enclosing the items to be concatenated in parentheses. For example, the -following code fragment does not concatenate @code{file} and @code{name} -as you might expect: - -@example -file = "file" -name = "name" -print "something meaningful" > file name -@end example - -@noindent -It is necessary to use the following: - -@example -print "something meaningful" > (file name) -@end example - -We recommend you use parentheses around concatenation in all but the -most common contexts (such as in the right-hand operand of @samp{=}). - -@ignore -@code{gawk} actually now allows a concatenation on the right hand -side of a @code{>} redirection, but other @code{awk}s don't. So for -now we won't mention that fact. -@end ignore - -@node Comparison Ops, Boolean Ops, Concatenation, Expressions -@section Comparison Expressions -@cindex comparison expressions -@cindex expressions, comparison -@cindex relational operators -@cindex operators, relational -@cindex regexp operators - -@dfn{Comparison expressions} compare strings or numbers for -relationships such as equality. They are written using @dfn{relational -operators}, which are a superset of those in C. Here is a table of -them: - -@table @code -@item @var{x} < @var{y} -True if @var{x} is less than @var{y}. - -@item @var{x} <= @var{y} -True if @var{x} is less than or equal to @var{y}. - -@item @var{x} > @var{y} -True if @var{x} is greater than @var{y}. - -@item @var{x} >= @var{y} -True if @var{x} is greater than or equal to @var{y}. - -@item @var{x} == @var{y} -True if @var{x} is equal to @var{y}. - -@item @var{x} != @var{y} -True if @var{x} is not equal to @var{y}. - -@item @var{x} ~ @var{y} -True if the string @var{x} matches the regexp denoted by @var{y}. - -@item @var{x} !~ @var{y} -True if the string @var{x} does not match the regexp denoted by @var{y}. - -@item @var{subscript} in @var{array} -True if array @var{array} has an element with the subscript @var{subscript}. -@end table - -Comparison expressions have the value 1 if true and 0 if false. - -The rules @code{gawk} uses for performing comparisons are based on those -in draft 11.2 of the @sc{posix} standard. The @sc{posix} standard introduced -the concept of a @dfn{numeric string}, which is simply a string that looks -like a number, for example, @code{@w{" +2"}}. - -@vindex CONVFMT -When performing a relational operation, @code{gawk} considers the type of an -operand to be the type it received on its last @emph{assignment}, rather -than the type of its last @emph{use} -(@pxref{Values, ,Numeric and String Values}). -This type is @emph{unknown} when the operand is from an ``external'' source: -field variables, command line arguments, array elements resulting from a -@code{split} operation, and the value of an @code{ENVIRON} element. -In this case only, if the operand is a numeric string, then it is -considered to be of both string type and numeric type. If at least one -operand of a comparison is of string type only, then a string -comparison is performed. Any numeric operand will be converted to a -string using the value of @code{CONVFMT} -(@pxref{Conversion, ,Conversion of Strings and Numbers}). -If one operand of a comparison is numeric, and the other operand is -either numeric or both numeric and string, then @code{gawk} does a -numeric comparison. If both operands have both types, then the -comparison is numeric. Strings are compared -by comparing the first character of each, then the second character of each, -and so on. Thus @code{"10"} is less than @code{"9"}. If there are two -strings where one is a prefix of the other, the shorter string is less than -the longer one. Thus @code{"abc"} is less than @code{"abcd"}.@refill - -Here are some sample expressions, how @code{gawk} compares them, and what -the result of the comparison is. - -@table @code -@item 1.5 <= 2.0 -numeric comparison (true) - -@item "abc" >= "xyz" -string comparison (false) - -@item 1.5 != " +2" -string comparison (true) - -@item "1e2" < "3" -string comparison (true) - -@item a = 2; b = "2" -@itemx a == b -string comparison (true) -@end table - -@example -echo 1e2 3 | awk '@{ print ($1 < $2) ? "true" : "false" @}' -@end example - -@noindent -prints @samp{false} since both @code{$1} and @code{$2} are numeric -strings and thus have both string and numeric types, thus dictating -a numeric comparison. - -The purpose of the comparison rules and the use of numeric strings is -to attempt to produce the behavior that is ``least surprising,'' while -still ``doing the right thing.'' - -String comparisons and regular expression comparisons are very different. -For example, - -@example -$1 == "foo" -@end example - -@noindent -has the value of 1, or is true, if the first field of the current input -record is precisely @samp{foo}. By contrast, - -@example -$1 ~ /foo/ -@end example - -@noindent -has the value 1 if the first field contains @samp{foo}, such as @samp{foobar}. - -The right hand operand of the @samp{~} and @samp{!~} operators may be -either a constant regexp (@code{/@dots{}/}), or it may be an ordinary -expression, in which case the value of the expression as a string is a -dynamic regexp (@pxref{Regexp Usage, ,How to Use Regular Expressions}). - -@cindex regexp as expression -In very recent implementations of @code{awk}, a constant regular -expression in slashes by itself is also an expression. The regexp -@code{/@var{regexp}/} is an abbreviation for this comparison expression: - -@example -$0 ~ /@var{regexp}/ -@end example - -In some contexts it may be necessary to write parentheses around the -regexp to avoid confusing the @code{gawk} parser. For example, -@code{(/x/ - /y/) > threshold} is not allowed, but @code{((/x/) - (/y/)) -> threshold} parses properly. - -One special place where @code{/foo/} is @emph{not} an abbreviation for -@code{$0 ~ /foo/} is when it is the right-hand operand of @samp{~} or -@samp{!~}! @xref{Constants, ,Constant Expressions}, where this is -discussed in more detail. - -@node Boolean Ops, Assignment Ops, Comparison Ops, Expressions -@section Boolean Expressions -@cindex expressions, boolean -@cindex boolean expressions -@cindex operators, boolean -@cindex boolean operators -@cindex logical operations -@cindex and operator -@cindex or operator -@cindex not operator - -A @dfn{boolean expression} is a combination of comparison expressions or -matching expressions, using the boolean operators ``or'' -(@samp{||}), ``and'' (@samp{&&}), and ``not'' (@samp{!}), along with -parentheses to control nesting. The truth of the boolean expression is -computed by combining the truth values of the component expressions. - -Boolean expressions can be used wherever comparison and matching -expressions can be used. They can be used in @code{if}, @code{while} -@code{do} and @code{for} statements. They have numeric values (1 if true, -0 if false), which come into play if the result of the boolean expression -is stored in a variable, or used in arithmetic.@refill - -In addition, every boolean expression is also a valid boolean pattern, so -you can use it as a pattern to control the execution of rules. - -Here are descriptions of the three boolean operators, with an example of -each. It may be instructive to compare these examples with the -analogous examples of boolean patterns -(@pxref{Boolean Patterns, ,Boolean Operators and Patterns}), which -use the same boolean operators in patterns instead of expressions.@refill - -@table @code -@item @var{boolean1} && @var{boolean2} -True if both @var{boolean1} and @var{boolean2} are true. For example, -the following statement prints the current input record if it contains -both @samp{2400} and @samp{foo}.@refill - -@smallexample -if ($0 ~ /2400/ && $0 ~ /foo/) print -@end smallexample - -The subexpression @var{boolean2} is evaluated only if @var{boolean1} -is true. This can make a difference when @var{boolean2} contains -expressions that have side effects: in the case of @code{$0 ~ /foo/ && -($2 == bar++)}, the variable @code{bar} is not incremented if there is -no @samp{foo} in the record. - -@item @var{boolean1} || @var{boolean2} -True if at least one of @var{boolean1} or @var{boolean2} is true. -For example, the following command prints all records in the input -file @file{BBS-list} that contain @emph{either} @samp{2400} or -@samp{foo}, or both.@refill - -@smallexample -awk '@{ if ($0 ~ /2400/ || $0 ~ /foo/) print @}' BBS-list -@end smallexample - -The subexpression @var{boolean2} is evaluated only if @var{boolean1} -is false. This can make a difference when @var{boolean2} contains -expressions that have side effects. - -@item !@var{boolean} -True if @var{boolean} is false. For example, the following program prints -all records in the input file @file{BBS-list} that do @emph{not} contain the -string @samp{foo}. - -@smallexample -awk '@{ if (! ($0 ~ /foo/)) print @}' BBS-list -@end smallexample -@end table - -@node Assignment Ops, Increment Ops, Boolean Ops, Expressions -@section Assignment Expressions -@cindex assignment operators -@cindex operators, assignment -@cindex expressions, assignment - -An @dfn{assignment} is an expression that stores a new value into a -variable. For example, let's assign the value 1 to the variable -@code{z}:@refill - -@example -z = 1 -@end example - -After this expression is executed, the variable @code{z} has the value 1. -Whatever old value @code{z} had before the assignment is forgotten. - -Assignments can store string values also. For example, this would store -the value @code{"this food is good"} in the variable @code{message}: - -@example -thing = "food" -predicate = "good" -message = "this " thing " is " predicate -@end example - -@noindent -(This also illustrates concatenation of strings.) - -The @samp{=} sign is called an @dfn{assignment operator}. It is the -simplest assignment operator because the value of the right-hand -operand is stored unchanged. - -@cindex side effect -Most operators (addition, concatenation, and so on) have no effect -except to compute a value. If you ignore the value, you might as well -not use the operator. An assignment operator is different; it does -produce a value, but even if you ignore the value, the assignment still -makes itself felt through the alteration of the variable. We call this -a @dfn{side effect}. - -@cindex lvalue -The left-hand operand of an assignment need not be a variable -(@pxref{Variables}); it can also be a field -(@pxref{Changing Fields, ,Changing the Contents of a Field}) or -an array element (@pxref{Arrays, ,Arrays in @code{awk}}). -These are all called @dfn{lvalues}, -which means they can appear on the left-hand side of an assignment operator. -The right-hand operand may be any expression; it produces the new value -which the assignment stores in the specified variable, field or array -element.@refill - -It is important to note that variables do @emph{not} have permanent types. -The type of a variable is simply the type of whatever value it happens -to hold at the moment. In the following program fragment, the variable -@code{foo} has a numeric value at first, and a string value later on: - -@example -foo = 1 -print foo -foo = "bar" -print foo -@end example - -@noindent -When the second assignment gives @code{foo} a string value, the fact that -it previously had a numeric value is forgotten. - -An assignment is an expression, so it has a value: the same value that -is assigned. Thus, @code{z = 1} as an expression has the value 1. -One consequence of this is that you can write multiple assignments together: - -@example -x = y = z = 0 -@end example - -@noindent -stores the value 0 in all three variables. It does this because the -value of @code{z = 0}, which is 0, is stored into @code{y}, and then -the value of @code{y = z = 0}, which is 0, is stored into @code{x}. - -You can use an assignment anywhere an expression is called for. For -example, it is valid to write @code{x != (y = 1)} to set @code{y} to 1 -and then test whether @code{x} equals 1. But this style tends to make -programs hard to read; except in a one-shot program, you should -rewrite it to get rid of such nesting of assignments. This is never very -hard. - -Aside from @samp{=}, there are several other assignment operators that -do arithmetic with the old value of the variable. For example, the -operator @samp{+=} computes a new value by adding the right-hand value -to the old value of the variable. Thus, the following assignment adds -5 to the value of @code{foo}: - -@example -foo += 5 -@end example - -@noindent -This is precisely equivalent to the following: - -@example -foo = foo + 5 -@end example - -@noindent -Use whichever one makes the meaning of your program clearer. - -Here is a table of the arithmetic assignment operators. In each -case, the right-hand operand is an expression whose value is converted -to a number. - -@table @code -@item @var{lvalue} += @var{increment} -Adds @var{increment} to the value of @var{lvalue} to make the new value -of @var{lvalue}. - -@item @var{lvalue} -= @var{decrement} -Subtracts @var{decrement} from the value of @var{lvalue}. - -@item @var{lvalue} *= @var{coefficient} -Multiplies the value of @var{lvalue} by @var{coefficient}. - -@item @var{lvalue} /= @var{quotient} -Divides the value of @var{lvalue} by @var{quotient}. - -@item @var{lvalue} %= @var{modulus} -Sets @var{lvalue} to its remainder by @var{modulus}. - -@item @var{lvalue} ^= @var{power} -@itemx @var{lvalue} **= @var{power} -Raises @var{lvalue} to the power @var{power}. -(Only the @code{^=} operator is specified by @sc{posix}.) -@end table - -@ignore -From: gatech!ames!elroy!cit-vax!EQL.Caltech.Edu!rankin (Pat Rankin) - In the discussion of assignment operators, it states that -``foo += 5'' "is precisely equivalent to" ``foo = foo + 5'' (p.77). That -may be true for simple variables, but it's not true for expressions with -side effects, like array references. For proof, try - BEGIN { - foo[rand()] += 5; for (x in foo) print x, foo[x] - bar[rand()] = bar[rand()] + 5; for (x in bar) print x, bar[x] - } -I suspect that the original statement is simply untrue--that '+=' is more -efficient in all cases. - -ADR --- Try to add something about this here for the next go 'round. -@end ignore - -@node Increment Ops, Conversion, Assignment Ops, Expressions -@section Increment Operators - -@cindex increment operators -@cindex operators, increment -@dfn{Increment operators} increase or decrease the value of a variable -by 1. You could do the same thing with an assignment operator, so -the increment operators add no power to the @code{awk} language; but they -are convenient abbreviations for something very common. - -The operator to add 1 is written @samp{++}. It can be used to increment -a variable either before or after taking its value. - -To pre-increment a variable @var{v}, write @code{++@var{v}}. This adds -1 to the value of @var{v} and that new value is also the value of this -expression. The assignment expression @code{@var{v} += 1} is completely -equivalent. - -Writing the @samp{++} after the variable specifies post-increment. This -increments the variable value just the same; the difference is that the -value of the increment expression itself is the variable's @emph{old} -value. Thus, if @code{foo} has the value 4, then the expression @code{foo++} -has the value 4, but it changes the value of @code{foo} to 5. - -The post-increment @code{foo++} is nearly equivalent to writing @code{(foo -+= 1) - 1}. It is not perfectly equivalent because all numbers in -@code{awk} are floating point: in floating point, @code{foo + 1 - 1} does -not necessarily equal @code{foo}. But the difference is minute as -long as you stick to numbers that are fairly small (less than a trillion). - -Any lvalue can be incremented. Fields and array elements are incremented -just like variables. (Use @samp{$(i++)} when you wish to do a field reference -and a variable increment at the same time. The parentheses are necessary -because of the precedence of the field reference operator, @samp{$}.) -@c expert information in the last parenthetical remark - -The decrement operator @samp{--} works just like @samp{++} except that -it subtracts 1 instead of adding. Like @samp{++}, it can be used before -the lvalue to pre-decrement or after it to post-decrement. - -Here is a summary of increment and decrement expressions. - -@table @code -@item ++@var{lvalue} -This expression increments @var{lvalue} and the new value becomes the -value of this expression. - -@item @var{lvalue}++ -This expression causes the contents of @var{lvalue} to be incremented. -The value of the expression is the @emph{old} value of @var{lvalue}. - -@item --@var{lvalue} -Like @code{++@var{lvalue}}, but instead of adding, it subtracts. It -decrements @var{lvalue} and delivers the value that results. - -@item @var{lvalue}-- -Like @code{@var{lvalue}++}, but instead of adding, it subtracts. It -decrements @var{lvalue}. The value of the expression is the @emph{old} -value of @var{lvalue}. -@end table - -@node Conversion, Values, Increment Ops, Expressions -@section Conversion of Strings and Numbers - -@cindex conversion of strings and numbers -Strings are converted to numbers, and numbers to strings, if the context -of the @code{awk} program demands it. For example, if the value of -either @code{foo} or @code{bar} in the expression @code{foo + bar} -happens to be a string, it is converted to a number before the addition -is performed. If numeric values appear in string concatenation, they -are converted to strings. Consider this:@refill - -@example -two = 2; three = 3 -print (two three) + 4 -@end example - -@noindent -This eventually prints the (numeric) value 27. The numeric values of -the variables @code{two} and @code{three} are converted to strings and -concatenated together, and the resulting string is converted back to the -number 23, to which 4 is then added. - -If, for some reason, you need to force a number to be converted to a -string, concatenate the null string with that number. To force a string -to be converted to a number, add zero to that string. - -A string is converted to a number by interpreting a numeric prefix -of the string as numerals: -@code{"2.5"} converts to 2.5, @code{"1e3"} converts to 1000, and @code{"25fix"} -has a numeric value of 25. -Strings that can't be interpreted as valid numbers are converted to -zero. - -@vindex CONVFMT -The exact manner in which numbers are converted into strings is controlled -by the @code{awk} built-in variable @code{CONVFMT} (@pxref{Built-in Variables}). -Numbers are converted using a special version of the @code{sprintf} function -(@pxref{Built-in, ,Built-in Functions}) with @code{CONVFMT} as the format -specifier.@refill - -@code{CONVFMT}'s default value is @code{"%.6g"}, which prints a value with -at least six significant digits. For some applications you will want to -change it to specify more precision. Double precision on most modern -machines gives you 16 or 17 decimal digits of precision. - -Strange results can happen if you set @code{CONVFMT} to a string that doesn't -tell @code{sprintf} how to format floating point numbers in a useful way. -For example, if you forget the @samp{%} in the format, all numbers will be -converted to the same constant string.@refill - -As a special case, if a number is an integer, then the result of converting -it to a string is @emph{always} an integer, no matter what the value of -@code{CONVFMT} may be. Given the following code fragment: - -@example -CONVFMT = "%2.2f" -a = 12 -b = a "" -@end example - -@noindent -@code{b} has the value @code{"12"}, not @code{"12.00"}. - -@ignore -For the 2.14 version, describe the ``stickyness'' of conversions. Right now -the manual assumes everywhere that variables are either numbers or strings; -in fact both kinds of values may be valid. If both happen to be valid, a -conversion isn't necessary and isn't done. Revising the manual to be -consistent with this, though, is too big a job to tackle at the moment. - -7/92: This has sort of been done, only the section isn't completely right! - What to do? -7/92: Pretty much fixed, at least for the short term, thanks to text - from David. -@end ignore - -@vindex OFMT -Prior to the @sc{posix} standard, @code{awk} specified that the value -of @code{OFMT} was used for converting numbers to strings. @code{OFMT} -specifies the output format to use when printing numbers with @code{print}. -@code{CONVFMT} was introduced in order to separate the semantics of -conversions from the semantics of printing. Both @code{CONVFMT} and -@code{OFMT} have the same default value: @code{"%.6g"}. In the vast majority -of cases, old @code{awk} programs will not change their behavior. -However, this use of @code{OFMT} is something to keep in mind if you must -port your program to other implementations of @code{awk}; we recommend -that instead of changing your programs, you just port @code{gawk} itself!@refill - -@node Values, Conditional Exp, Conversion, Expressions -@section Numeric and String Values -@cindex conversion of strings and numbers - -Through most of this manual, we present @code{awk} values (such as constants, -fields, or variables) as @emph{either} numbers @emph{or} strings. This is -a convenient way to think about them, since typically they are used in only -one way, or the other. - -In truth though, @code{awk} values can be @emph{both} string and -numeric, at the same time. Internally, @code{awk} represents values -with a string, a (floating point) number, and an indication that one, -the other, or both representations of the value are valid. - -Keeping track of both kinds of values is important for execution -efficiency: a variable can acquire a string value the first time it -is used as a string, and then that string value can be used until the -variable is assigned a new value. Thus, if a variable with only a numeric -value is used in several concatenations in a row, it only has to be given -a string representation once. The numeric value remains valid, so that -no conversion back to a number is necessary if the variable is later used -in an arithmetic expression. - -Tracking both kinds of values is also important for precise numerical -calculations. Consider the following: - -@smallexample -a = 123.321 -CONVFMT = "%3.1f" -b = a " is a number" -c = a + 1.654 -@end smallexample - -@noindent -The variable @code{a} receives a string value in the concatenation and -assignment to @code{b}. The string value of @code{a} is @code{"123.3"}. -If the numeric value was lost when it was converted to a string, then the -numeric use of @code{a} in the last statement would lose information. -@code{c} would be assigned the value 124.954 instead of 124.975. -Such errors accumulate rapidly, and very adversely affect numeric -computations.@refill - -Once a numeric value acquires a corresponding string value, it stays valid -until a new assignment is made. If @code{CONVFMT} -(@pxref{Conversion, ,Conversion of Strings and Numbers}) changes in the -meantime, the old string value will still be used. For example:@refill - -@smallexample -BEGIN @{ - CONVFMT = "%2.2f" - a = 123.456 - b = a "" # force `a' to have string value too - printf "a = %s\n", a - CONVFMT = "%.6g" - printf "a = %s\n", a - a += 0 # make `a' numeric only again - printf "a = %s\n", a # use `a' as string -@} -@end smallexample - -@noindent -This program prints @samp{a = 123.46} twice, and then prints -@samp{a = 123.456}. - -@xref{Conversion, ,Conversion of Strings and Numbers}, for the rules that -specify how string values are made from numeric values. - -@node Conditional Exp, Function Calls, Values, Expressions -@section Conditional Expressions -@cindex conditional expression -@cindex expression, conditional - -A @dfn{conditional expression} is a special kind of expression with -three operands. It allows you to use one expression's value to select -one of two other expressions. - -The conditional expression looks the same as in the C language: - -@example -@var{selector} ? @var{if-true-exp} : @var{if-false-exp} -@end example - -@noindent -There are three subexpressions. The first, @var{selector}, is always -computed first. If it is ``true'' (not zero and not null) then -@var{if-true-exp} is computed next and its value becomes the value of -the whole expression. Otherwise, @var{if-false-exp} is computed next -and its value becomes the value of the whole expression.@refill - -For example, this expression produces the absolute value of @code{x}: - -@example -x > 0 ? x : -x -@end example - -Each time the conditional expression is computed, exactly one of -@var{if-true-exp} and @var{if-false-exp} is computed; the other is ignored. -This is important when the expressions contain side effects. For example, -this conditional expression examines element @code{i} of either array -@code{a} or array @code{b}, and increments @code{i}. - -@example -x == y ? a[i++] : b[i++] -@end example - -@noindent -This is guaranteed to increment @code{i} exactly once, because each time -one or the other of the two increment expressions is executed, -and the other is not. - -@node Function Calls, Precedence, Conditional Exp, Expressions -@section Function Calls -@cindex function call -@cindex calling a function - -A @dfn{function} is a name for a particular calculation. Because it has -a name, you can ask for it by name at any point in the program. For -example, the function @code{sqrt} computes the square root of a number. - -A fixed set of functions are @dfn{built-in}, which means they are -available in every @code{awk} program. The @code{sqrt} function is one -of these. @xref{Built-in, ,Built-in Functions}, for a list of built-in -functions and their descriptions. In addition, you can define your own -functions in the program for use elsewhere in the same program. -@xref{User-defined, ,User-defined Functions}, for how to do this.@refill - -@cindex arguments in function call -The way to use a function is with a @dfn{function call} expression, -which consists of the function name followed by a list of -@dfn{arguments} in parentheses. The arguments are expressions which -give the raw materials for the calculation that the function will do. -When there is more than one argument, they are separated by commas. If -there are no arguments, write just @samp{()} after the function name. -Here are some examples: - -@example -sqrt(x^2 + y^2) # @r{One argument} -atan2(y, x) # @r{Two arguments} -rand() # @r{No arguments} -@end example - -@strong{Do not put any space between the function name and the -open-parenthesis!} A user-defined function name looks just like the name of -a variable, and space would make the expression look like concatenation -of a variable with an expression inside parentheses. Space before the -parenthesis is harmless with built-in functions, but it is best not to get -into the habit of using space to avoid mistakes with user-defined -functions. - -Each function expects a particular number of arguments. For example, the -@code{sqrt} function must be called with a single argument, the number -to take the square root of: - -@example -sqrt(@var{argument}) -@end example - -Some of the built-in functions allow you to omit the final argument. -If you do so, they use a reasonable default. -@xref{Built-in, ,Built-in Functions}, for full details. If arguments -are omitted in calls to user-defined functions, then those arguments are -treated as local variables, initialized to the null string -(@pxref{User-defined, ,User-defined Functions}).@refill - -Like every other expression, the function call has a value, which is -computed by the function based on the arguments you give it. In this -example, the value of @code{sqrt(@var{argument})} is the square root of the -argument. A function can also have side effects, such as assigning the -values of certain variables or doing I/O. - -Here is a command to read numbers, one number per line, and print the -square root of each one: - -@example -awk '@{ print "The square root of", $1, "is", sqrt($1) @}' -@end example - -@node Precedence, , Function Calls, Expressions -@section Operator Precedence (How Operators Nest) -@cindex precedence -@cindex operator precedence - -@dfn{Operator precedence} determines how operators are grouped, when -different operators appear close by in one expression. For example, -@samp{*} has higher precedence than @samp{+}; thus, @code{a + b * c} -means to multiply @code{b} and @code{c}, and then add @code{a} to the -product (i.e., @code{a + (b * c)}). - -You can overrule the precedence of the operators by using parentheses. -You can think of the precedence rules as saying where the -parentheses are assumed if you do not write parentheses yourself. In -fact, it is wise to always use parentheses whenever you have an unusual -combination of operators, because other people who read the program may -not remember what the precedence is in this case. You might forget, -too; then you could make a mistake. Explicit parentheses will help prevent -any such mistake. - -When operators of equal precedence are used together, the leftmost -operator groups first, except for the assignment, conditional and -exponentiation operators, which group in the opposite order. -Thus, @code{a - b + c} groups as @code{(a - b) + c}; -@code{a = b = c} groups as @code{a = (b = c)}.@refill - -The precedence of prefix unary operators does not matter as long as only -unary operators are involved, because there is only one way to parse -them---innermost first. Thus, @code{$++i} means @code{$(++i)} and -@code{++$x} means @code{++($x)}. However, when another operator follows -the operand, then the precedence of the unary operators can matter. -Thus, @code{$x^2} means @code{($x)^2}, but @code{-x^2} means -@code{-(x^2)}, because @samp{-} has lower precedence than @samp{^} -while @samp{$} has higher precedence. - -Here is a table of the operators of @code{awk}, in order of increasing -precedence: - -@table @asis -@item assignment -@samp{=}, @samp{+=}, @samp{-=}, @samp{*=}, @samp{/=}, @samp{%=}, -@samp{^=}, @samp{**=}. These operators group right-to-left. -(The @samp{**=} operator is not specified by @sc{posix}.) - -@item conditional -@samp{?:}. This operator groups right-to-left. - -@item logical ``or''. -@samp{||}. - -@item logical ``and''. -@samp{&&}. - -@item array membership -@samp{in}. - -@item matching -@samp{~}, @samp{!~}. - -@item relational, and redirection -The relational operators and the redirections have the same precedence -level. Characters such as @samp{>} serve both as relationals and as -redirections; the context distinguishes between the two meanings. - -The relational operators are @samp{<}, @samp{<=}, @samp{==}, @samp{!=}, -@samp{>=} and @samp{>}. - -The I/O redirection operators are @samp{<}, @samp{>}, @samp{>>} and -@samp{|}. - -Note that I/O redirection operators in @code{print} and @code{printf} -statements belong to the statement level, not to expressions. The -redirection does not produce an expression which could be the operand of -another operator. As a result, it does not make sense to use a -redirection operator near another operator of lower precedence, without -parentheses. Such combinations, for example @samp{print foo > a ? b : -c}, result in syntax errors. - -@item concatenation -No special token is used to indicate concatenation. -The operands are simply written side by side. - -@item add, subtract -@samp{+}, @samp{-}. - -@item multiply, divide, mod -@samp{*}, @samp{/}, @samp{%}. - -@item unary plus, minus, ``not'' -@samp{+}, @samp{-}, @samp{!}. - -@item exponentiation -@samp{^}, @samp{**}. These operators group right-to-left. -(The @samp{**} operator is not specified by @sc{posix}.) - -@item increment, decrement -@samp{++}, @samp{--}. - -@item field -@samp{$}. -@end table - -@node Statements, Arrays, Expressions, Top -@chapter Control Statements in Actions -@cindex control statement - -@dfn{Control statements} such as @code{if}, @code{while}, and so on -control the flow of execution in @code{awk} programs. Most of the -control statements in @code{awk} are patterned on similar statements in -C. - -All the control statements start with special keywords such as @code{if} -and @code{while}, to distinguish them from simple expressions. - -Many control statements contain other statements; for example, the -@code{if} statement contains another statement which may or may not be -executed. The contained statement is called the @dfn{body}. If you -want to include more than one statement in the body, group them into a -single compound statement with curly braces, separating them with -newlines or semicolons. - -@menu -* If Statement:: Conditionally execute - some @code{awk} statements. -* While Statement:: Loop until some condition is satisfied. -* Do Statement:: Do specified action while looping until some - condition is satisfied. -* For Statement:: Another looping statement, that provides - initialization and increment clauses. -* Break Statement:: Immediately exit the innermost enclosing loop. -* Continue Statement:: Skip to the end of the innermost - enclosing loop. -* Next Statement:: Stop processing the current input record. -* Next File Statement:: Stop processing the current file. -* Exit Statement:: Stop execution of @code{awk}. -@end menu - -@node If Statement, While Statement, Statements, Statements -@section The @code{if} Statement - -@cindex @code{if} statement -The @code{if}-@code{else} statement is @code{awk}'s decision-making -statement. It looks like this:@refill - -@example -if (@var{condition}) @var{then-body} @r{[}else @var{else-body}@r{]} -@end example - -@noindent -@var{condition} is an expression that controls what the rest of the -statement will do. If @var{condition} is true, @var{then-body} is -executed; otherwise, @var{else-body} is executed (assuming that the -@code{else} clause is present). The @code{else} part of the statement is -optional. The condition is considered false if its value is zero or -the null string, and true otherwise.@refill - -Here is an example: - -@example -if (x % 2 == 0) - print "x is even" -else - print "x is odd" -@end example - -In this example, if the expression @code{x % 2 == 0} is true (that is, -the value of @code{x} is divisible by 2), then the first @code{print} -statement is executed, otherwise the second @code{print} statement is -performed.@refill - -If the @code{else} appears on the same line as @var{then-body}, and -@var{then-body} is not a compound statement (i.e., not surrounded by -curly braces), then a semicolon must separate @var{then-body} from -@code{else}. To illustrate this, let's rewrite the previous example: - -@example -awk '@{ if (x % 2 == 0) print "x is even"; else - print "x is odd" @}' -@end example - -@noindent -If you forget the @samp{;}, @code{awk} won't be able to parse the -statement, and you will get a syntax error. - -We would not actually write this example this way, because a human -reader might fail to see the @code{else} if it were not the first thing -on its line. - -@node While Statement, Do Statement, If Statement, Statements -@section The @code{while} Statement -@cindex @code{while} statement -@cindex loop -@cindex body of a loop - -In programming, a @dfn{loop} means a part of a program that is (or at least can -be) executed two or more times in succession. - -The @code{while} statement is the simplest looping statement in -@code{awk}. It repeatedly executes a statement as long as a condition is -true. It looks like this: - -@example -while (@var{condition}) - @var{body} -@end example - -@noindent -Here @var{body} is a statement that we call the @dfn{body} of the loop, -and @var{condition} is an expression that controls how long the loop -keeps running. - -The first thing the @code{while} statement does is test @var{condition}. -If @var{condition} is true, it executes the statement @var{body}. -(@var{condition} is true when the value -is not zero and not a null string.) After @var{body} has been executed, -@var{condition} is tested again, and if it is still true, @var{body} is -executed again. This process repeats until @var{condition} is no longer -true. If @var{condition} is initially false, the body of the loop is -never executed.@refill - -This example prints the first three fields of each record, one per line. - -@example -awk '@{ i = 1 - while (i <= 3) @{ - print $i - i++ - @} -@}' -@end example - -@noindent -Here the body of the loop is a compound statement enclosed in braces, -containing two statements. - -The loop works like this: first, the value of @code{i} is set to 1. -Then, the @code{while} tests whether @code{i} is less than or equal to -three. This is the case when @code{i} equals one, so the @code{i}-th -field is printed. Then the @code{i++} increments the value of @code{i} -and the loop repeats. The loop terminates when @code{i} reaches 4. - -As you can see, a newline is not required between the condition and the -body; but using one makes the program clearer unless the body is a -compound statement or is very simple. The newline after the open-brace -that begins the compound statement is not required either, but the -program would be hard to read without it. - -@node Do Statement, For Statement, While Statement, Statements -@section The @code{do}-@code{while} Statement - -The @code{do} loop is a variation of the @code{while} looping statement. -The @code{do} loop executes the @var{body} once, then repeats @var{body} -as long as @var{condition} is true. It looks like this: - -@example -do - @var{body} -while (@var{condition}) -@end example - -Even if @var{condition} is false at the start, @var{body} is executed at -least once (and only once, unless executing @var{body} makes -@var{condition} true). Contrast this with the corresponding -@code{while} statement: - -@example -while (@var{condition}) - @var{body} -@end example - -@noindent -This statement does not execute @var{body} even once if @var{condition} -is false to begin with. - -Here is an example of a @code{do} statement: - -@example -awk '@{ i = 1 - do @{ - print $0 - i++ - @} while (i <= 10) -@}' -@end example - -@noindent -prints each input record ten times. It isn't a very realistic example, -since in this case an ordinary @code{while} would do just as well. But -this reflects actual experience; there is only occasionally a real use -for a @code{do} statement.@refill - -@node For Statement, Break Statement, Do Statement, Statements -@section The @code{for} Statement -@cindex @code{for} statement - -The @code{for} statement makes it more convenient to count iterations of a -loop. The general form of the @code{for} statement looks like this:@refill - -@example -for (@var{initialization}; @var{condition}; @var{increment}) - @var{body} -@end example - -@noindent -This statement starts by executing @var{initialization}. Then, as long -as @var{condition} is true, it repeatedly executes @var{body} and then -@var{increment}. Typically @var{initialization} sets a variable to -either zero or one, @var{increment} adds 1 to it, and @var{condition} -compares it against the desired number of iterations. - -Here is an example of a @code{for} statement: - -@example -@group -awk '@{ for (i = 1; i <= 3; i++) - print $i -@}' -@end group -@end example - -@noindent -This prints the first three fields of each input record, one field per -line. - -In the @code{for} statement, @var{body} stands for any statement, but -@var{initialization}, @var{condition} and @var{increment} are just -expressions. You cannot set more than one variable in the -@var{initialization} part unless you use a multiple assignment statement -such as @code{x = y = 0}, which is possible only if all the initial values -are equal. (But you can initialize additional variables by writing -their assignments as separate statements preceding the @code{for} loop.) - -The same is true of the @var{increment} part; to increment additional -variables, you must write separate statements at the end of the loop. -The C compound expression, using C's comma operator, would be useful in -this context, but it is not supported in @code{awk}. - -Most often, @var{increment} is an increment expression, as in the -example above. But this is not required; it can be any expression -whatever. For example, this statement prints all the powers of 2 -between 1 and 100: - -@example -for (i = 1; i <= 100; i *= 2) - print i -@end example - -Any of the three expressions in the parentheses following the @code{for} may -be omitted if there is nothing to be done there. Thus, @w{@samp{for (;x -> 0;)}} is equivalent to @w{@samp{while (x > 0)}}. If the -@var{condition} is omitted, it is treated as @var{true}, effectively -yielding an @dfn{infinite loop} (i.e., a loop that will never -terminate).@refill - -In most cases, a @code{for} loop is an abbreviation for a @code{while} -loop, as shown here: - -@example -@var{initialization} -while (@var{condition}) @{ - @var{body} - @var{increment} -@} -@end example - -@noindent -The only exception is when the @code{continue} statement -(@pxref{Continue Statement, ,The @code{continue} Statement}) is used -inside the loop; changing a @code{for} statement to a @code{while} -statement in this way can change the effect of the @code{continue} -statement inside the loop.@refill - -There is an alternate version of the @code{for} loop, for iterating over -all the indices of an array: - -@example -for (i in array) - @var{do something with} array[i] -@end example - -@noindent -@xref{Arrays, ,Arrays in @code{awk}}, for more information on this -version of the @code{for} loop. - -The @code{awk} language has a @code{for} statement in addition to a -@code{while} statement because often a @code{for} loop is both less work to -type and more natural to think of. Counting the number of iterations is -very common in loops. It can be easier to think of this counting as part -of looping rather than as something to do inside the loop. - -The next section has more complicated examples of @code{for} loops. - -@node Break Statement, Continue Statement, For Statement, Statements -@section The @code{break} Statement -@cindex @code{break} statement -@cindex loops, exiting - -The @code{break} statement jumps out of the innermost @code{for}, -@code{while}, or @code{do}-@code{while} loop that encloses it. The -following example finds the smallest divisor of any integer, and also -identifies prime numbers:@refill - -@smallexample -awk '# find smallest divisor of num - @{ num = $1 - for (div = 2; div*div <= num; div++) - if (num % div == 0) - break - if (num % div == 0) - printf "Smallest divisor of %d is %d\n", num, div - else - printf "%d is prime\n", num @}' -@end smallexample - -When the remainder is zero in the first @code{if} statement, @code{awk} -immediately @dfn{breaks out} of the containing @code{for} loop. This means -that @code{awk} proceeds immediately to the statement following the loop -and continues processing. (This is very different from the @code{exit} -statement which stops the entire @code{awk} program. -@xref{Exit Statement, ,The @code{exit} Statement}.)@refill - -Here is another program equivalent to the previous one. It illustrates how -the @var{condition} of a @code{for} or @code{while} could just as well be -replaced with a @code{break} inside an @code{if}: - -@smallexample -@group -awk '# find smallest divisor of num - @{ num = $1 - for (div = 2; ; div++) @{ - if (num % div == 0) @{ - printf "Smallest divisor of %d is %d\n", num, div - break - @} - if (div*div > num) @{ - printf "%d is prime\n", num - break - @} - @} -@}' -@end group -@end smallexample - -@node Continue Statement, Next Statement, Break Statement, Statements -@section The @code{continue} Statement - -@cindex @code{continue} statement -The @code{continue} statement, like @code{break}, is used only inside -@code{for}, @code{while}, and @code{do}-@code{while} loops. It skips -over the rest of the loop body, causing the next cycle around the loop -to begin immediately. Contrast this with @code{break}, which jumps out -of the loop altogether. Here is an example:@refill - -@example -# print names that don't contain the string "ignore" - -# first, save the text of each line -@{ names[NR] = $0 @} - -# print what we're interested in -END @{ - for (x in names) @{ - if (names[x] ~ /ignore/) - continue - print names[x] - @} -@} -@end example - -If one of the input records contains the string @samp{ignore}, this -example skips the print statement for that record, and continues back to -the first statement in the loop. - -This is not a practical example of @code{continue}, since it would be -just as easy to write the loop like this: - -@example -for (x in names) - if (names[x] !~ /ignore/) - print names[x] -@end example - -@ignore -from brennan@boeing.com: - -page 90, section 9.6. The example is too artificial as -the one line program - - !/ignore/ - -does the same thing. -@end ignore -@c ADR --- he's right, but don't worry about this for now - -The @code{continue} statement in a @code{for} loop directs @code{awk} to -skip the rest of the body of the loop, and resume execution with the -increment-expression of the @code{for} statement. The following program -illustrates this fact:@refill - -@example -awk 'BEGIN @{ - for (x = 0; x <= 20; x++) @{ - if (x == 5) - continue - printf ("%d ", x) - @} - print "" -@}' -@end example - -@noindent -This program prints all the numbers from 0 to 20, except for 5, for -which the @code{printf} is skipped. Since the increment @code{x++} -is not skipped, @code{x} does not remain stuck at 5. Contrast the -@code{for} loop above with the @code{while} loop: - -@example -awk 'BEGIN @{ - x = 0 - while (x <= 20) @{ - if (x == 5) - continue - printf ("%d ", x) - x++ - @} - print "" -@}' -@end example - -@noindent -This program loops forever once @code{x} gets to 5. - -As described above, the @code{continue} statement has no meaning when -used outside the body of a loop. However, although it was never documented, -historical implementations of @code{awk} have treated the @code{continue} -statement outside of a loop as if it were a @code{next} statement -(@pxref{Next Statement, ,The @code{next} Statement}). -By default, @code{gawk} silently supports this usage. However, if -@samp{-W posix} has been specified on the command line -(@pxref{Command Line, ,Invoking @code{awk}}), -it will be treated as an error, since the @sc{posix} standard specifies -that @code{continue} should only be used inside the body of a loop.@refill - -@node Next Statement, Next File Statement, Continue Statement, Statements -@section The @code{next} Statement -@cindex @code{next} statement - -The @code{next} statement forces @code{awk} to immediately stop processing -the current record and go on to the next record. This means that no -further rules are executed for the current record. The rest of the -current rule's action is not executed either. - -Contrast this with the effect of the @code{getline} function -(@pxref{Getline, ,Explicit Input with @code{getline}}). That too causes -@code{awk} to read the next record immediately, but it does not alter the -flow of control in any way. So the rest of the current action executes -with a new input record. - -At the highest level, @code{awk} program execution is a loop that reads -an input record and then tests each rule's pattern against it. If you -think of this loop as a @code{for} statement whose body contains the -rules, then the @code{next} statement is analogous to a @code{continue} -statement: it skips to the end of the body of this implicit loop, and -executes the increment (which reads another record). - -For example, if your @code{awk} program works only on records with four -fields, and you don't want it to fail when given bad input, you might -use this rule near the beginning of the program: - -@smallexample -NF != 4 @{ - printf("line %d skipped: doesn't have 4 fields", FNR) > "/dev/stderr" - next -@} -@end smallexample - -@noindent -so that the following rules will not see the bad record. The error -message is redirected to the standard error output stream, as error -messages should be. @xref{Special Files, ,Standard I/O Streams}. - -According to the @sc{posix} standard, the behavior is undefined if -the @code{next} statement is used in a @code{BEGIN} or @code{END} rule. -@code{gawk} will treat it as a syntax error. - -If the @code{next} statement causes the end of the input to be reached, -then the code in the @code{END} rules, if any, will be executed. -@xref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}. - -@node Next File Statement, Exit Statement, Next Statement, Statements -@section The @code{next file} Statement - -@cindex @code{next file} statement -The @code{next file} statement is similar to the @code{next} statement. -However, instead of abandoning processing of the current record, the -@code{next file} statement instructs @code{awk} to stop processing the -current data file. - -Upon execution of the @code{next file} statement, @code{FILENAME} is -updated to the name of the next data file listed on the command line, -@code{FNR} is reset to 1, and processing starts over with the first -rule in the progam. @xref{Built-in Variables}. - -If the @code{next file} statement causes the end of the input to be reached, -then the code in the @code{END} rules, if any, will be executed. -@xref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}. - -The @code{next file} statement is a @code{gawk} extension; it is not -(currently) available in any other @code{awk} implementation. You can -simulate its behavior by creating a library file named @file{nextfile.awk}, -with the following contents. (This sample program uses user-defined -functions, a feature that has not been presented yet. -@xref{User-defined, ,User-defined Functions}, -for more information.)@refill - -@smallexample -# nextfile --- function to skip remaining records in current file - -# this should be read in before the "main" awk program - -function nextfile() @{ _abandon_ = FILENAME; next @} - -_abandon_ == FILENAME && FNR > 1 @{ next @} -_abandon_ == FILENAME && FNR == 1 @{ _abandon_ = "" @} -@end smallexample - -The @code{nextfile} function simply sets a ``private'' variable@footnote{Since -all variables in @code{awk} are global, this program uses the common -practice of prefixing the variable name with an underscore. In fact, it -also suffixes the variable name with an underscore, as extra insurance -against using a variable name that might be used in some other library -file.} to the name of the current data file, and then retrieves the next -record. Since this file is read before the main @code{awk} program, -the rules that follows the function definition will be executed before the -rules in the main program. The first rule continues to skip records as long as -the name of the input file has not changed, and this is not the first -record in the file. This rule is sufficient most of the time. But what if -the @emph{same} data file is named twice in a row on the command line? -This rule would not process the data file the second time. The second rule -catches this case: If the data file name is what was being skipped, but -@code{FNR} is 1, then this is the second time the file is being processed, -and it should not be skipped. - -The @code{next file} statement would be useful if you have many data -files to process, and due to the nature of the data, you expect that you -would not want to process every record in the file. In order to move on to -the next data file, you would have to continue scanning the unwanted -records (as described above). The @code{next file} statement accomplishes -this much more efficiently. - -@ignore -Would it make sense down the road to nuke `next file' in favor of -semantics that would make this work? - - function nextfile() { ARGIND++ ; next } -@end ignore - -@node Exit Statement, , Next File Statement, Statements -@section The @code{exit} Statement - -@cindex @code{exit} statement -The @code{exit} statement causes @code{awk} to immediately stop -executing the current rule and to stop processing input; any remaining input -is ignored.@refill - -If an @code{exit} statement is executed from a @code{BEGIN} rule the -program stops processing everything immediately. No input records are -read. However, if an @code{END} rule is present, it is executed -(@pxref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}). - -If @code{exit} is used as part of an @code{END} rule, it causes -the program to stop immediately. - -An @code{exit} statement that is part of an ordinary rule (that is, not part -of a @code{BEGIN} or @code{END} rule) stops the execution of any further -automatic rules, but the @code{END} rule is executed if there is one. -If you do not want the @code{END} rule to do its job in this case, you -can set a variable to nonzero before the @code{exit} statement, and check -that variable in the @code{END} rule. - -If an argument is supplied to @code{exit}, its value is used as the exit -status code for the @code{awk} process. If no argument is supplied, -@code{exit} returns status zero (success).@refill - -For example, let's say you've discovered an error condition you really -don't know how to handle. Conventionally, programs report this by -exiting with a nonzero status. Your @code{awk} program can do this -using an @code{exit} statement with a nonzero argument. Here's an -example of this:@refill - -@example -@group -BEGIN @{ - if (("date" | getline date_now) < 0) @{ - print "Can't get system date" > "/dev/stderr" - exit 4 - @} -@} -@end group -@end example - -@node Arrays, Built-in, Statements, Top -@chapter Arrays in @code{awk} - -An @dfn{array} is a table of values, called @dfn{elements}. The -elements of an array are distinguished by their indices. @dfn{Indices} -may be either numbers or strings. Each array has a name, which looks -like a variable name, but must not be in use as a variable name in the -same @code{awk} program. - -@menu -* Array Intro:: Introduction to Arrays -* Reference to Elements:: How to examine one element of an array. -* Assigning Elements:: How to change an element of an array. -* Array Example:: Basic Example of an Array -* Scanning an Array:: A variation of the @code{for} statement. - It loops through the indices of - an array's existing elements. -* Delete:: The @code{delete} statement removes - an element from an array. -* Numeric Array Subscripts:: How to use numbers as subscripts in @code{awk}. -* Multi-dimensional:: Emulating multi-dimensional arrays in @code{awk}. -* Multi-scanning:: Scanning multi-dimensional arrays. -@end menu - -@node Array Intro, Reference to Elements, Arrays, Arrays -@section Introduction to Arrays - -@cindex arrays -The @code{awk} language has one-dimensional @dfn{arrays} for storing groups -of related strings or numbers. - -Every @code{awk} array must have a name. Array names have the same -syntax as variable names; any valid variable name would also be a valid -array name. But you cannot use one name in both ways (as an array and -as a variable) in one @code{awk} program. - -Arrays in @code{awk} superficially resemble arrays in other programming -languages; but there are fundamental differences. In @code{awk}, you -don't need to specify the size of an array before you start to use it. -Additionally, any number or string in @code{awk} may be used as an -array index. - -In most other languages, you have to @dfn{declare} an array and specify -how many elements or components it contains. In such languages, the -declaration causes a contiguous block of memory to be allocated for that -many elements. An index in the array must be a positive integer; for -example, the index 0 specifies the first element in the array, which is -actually stored at the beginning of the block of memory. Index 1 -specifies the second element, which is stored in memory right after the -first element, and so on. It is impossible to add more elements to the -array, because it has room for only as many elements as you declared. - -A contiguous array of four elements might look like this, -conceptually, if the element values are @code{8}, @code{"foo"}, -@code{""} and @code{30}:@refill - -@example -+---------+---------+--------+---------+ -| 8 | "foo" | "" | 30 | @r{value} -+---------+---------+--------+---------+ - 0 1 2 3 @r{index} -@end example - -@noindent -Only the values are stored; the indices are implicit from the order of -the values. @code{8} is the value at index 0, because @code{8} appears in the -position with 0 elements before it. - -@cindex arrays, definition of -@cindex associative arrays -Arrays in @code{awk} are different: they are @dfn{associative}. This means -that each array is a collection of pairs: an index, and its corresponding -array element value: - -@example -@r{Element} 4 @r{Value} 30 -@r{Element} 2 @r{Value} "foo" -@r{Element} 1 @r{Value} 8 -@r{Element} 3 @r{Value} "" -@end example - -@noindent -We have shown the pairs in jumbled order because their order is irrelevant. - -One advantage of an associative array is that new pairs can be added -at any time. For example, suppose we add to the above array a tenth element -whose value is @w{@code{"number ten"}}. The result is this: - -@example -@r{Element} 10 @r{Value} "number ten" -@r{Element} 4 @r{Value} 30 -@r{Element} 2 @r{Value} "foo" -@r{Element} 1 @r{Value} 8 -@r{Element} 3 @r{Value} "" -@end example - -@noindent -Now the array is @dfn{sparse} (i.e., some indices are missing): it has -elements 1--4 and 10, but doesn't have elements 5, 6, 7, 8, or 9.@refill - -Another consequence of associative arrays is that the indices don't -have to be positive integers. Any number, or even a string, can be -an index. For example, here is an array which translates words from -English into French: - -@example -@r{Element} "dog" @r{Value} "chien" -@r{Element} "cat" @r{Value} "chat" -@r{Element} "one" @r{Value} "un" -@r{Element} 1 @r{Value} "un" -@end example - -@noindent -Here we decided to translate the number 1 in both spelled-out and -numeric form---thus illustrating that a single array can have both -numbers and strings as indices. - -When @code{awk} creates an array for you, e.g., with the @code{split} -built-in function, -that array's indices are consecutive integers starting at 1. -(@xref{String Functions, ,Built-in Functions for String Manipulation}.) - -@node Reference to Elements, Assigning Elements, Array Intro, Arrays -@section Referring to an Array Element -@cindex array reference -@cindex element of array -@cindex reference to array - -The principal way of using an array is to refer to one of its elements. -An array reference is an expression which looks like this: - -@example -@var{array}[@var{index}] -@end example - -@noindent -Here, @var{array} is the name of an array. The expression @var{index} is -the index of the element of the array that you want. - -The value of the array reference is the current value of that array -element. For example, @code{foo[4.3]} is an expression for the element -of array @code{foo} at index 4.3. - -If you refer to an array element that has no recorded value, the value -of the reference is @code{""}, the null string. This includes elements -to which you have not assigned any value, and elements that have been -deleted (@pxref{Delete, ,The @code{delete} Statement}). Such a reference -automatically creates that array element, with the null string as its value. -(In some cases, this is unfortunate, because it might waste memory inside -@code{awk}). - -@cindex arrays, presence of elements -You can find out if an element exists in an array at a certain index with -the expression: - -@example -@var{index} in @var{array} -@end example - -@noindent -This expression tests whether or not the particular index exists, -without the side effect of creating that element if it is not present. -The expression has the value 1 (true) if @code{@var{array}[@var{index}]} -exists, and 0 (false) if it does not exist.@refill - -For example, to test whether the array @code{frequencies} contains the -index @code{"2"}, you could write this statement:@refill - -@smallexample -if ("2" in frequencies) print "Subscript \"2\" is present." -@end smallexample - -Note that this is @emph{not} a test of whether or not the array -@code{frequencies} contains an element whose @emph{value} is @code{"2"}. -(There is no way to do that except to scan all the elements.) Also, this -@emph{does not} create @code{frequencies["2"]}, while the following -(incorrect) alternative would do so:@refill - -@smallexample -if (frequencies["2"] != "") print "Subscript \"2\" is present." -@end smallexample - -@node Assigning Elements, Array Example, Reference to Elements, Arrays -@section Assigning Array Elements -@cindex array assignment -@cindex element assignment - -Array elements are lvalues: they can be assigned values just like -@code{awk} variables: - -@example -@var{array}[@var{subscript}] = @var{value} -@end example - -@noindent -Here @var{array} is the name of your array. The expression -@var{subscript} is the index of the element of the array that you want -to assign a value. The expression @var{value} is the value you are -assigning to that element of the array.@refill - -@node Array Example, Scanning an Array, Assigning Elements, Arrays -@section Basic Example of an Array - -The following program takes a list of lines, each beginning with a line -number, and prints them out in order of line number. The line numbers are -not in order, however, when they are first read: they are scrambled. This -program sorts the lines by making an array using the line numbers as -subscripts. It then prints out the lines in sorted order of their numbers. -It is a very simple program, and gets confused if it encounters repeated -numbers, gaps, or lines that don't begin with a number.@refill - -@example -@{ - if ($1 > max) - max = $1 - arr[$1] = $0 -@} - -END @{ - for (x = 1; x <= max; x++) - print arr[x] -@} -@end example - -The first rule keeps track of the largest line number seen so far; -it also stores each line into the array @code{arr}, at an index that -is the line's number. - -The second rule runs after all the input has been read, to print out -all the lines. - -When this program is run with the following input: - -@example -5 I am the Five man -2 Who are you? The new number two! -4 . . . And four on the floor -1 Who is number one? -3 I three you. -@end example - -@noindent -its output is this: - -@example -1 Who is number one? -2 Who are you? The new number two! -3 I three you. -4 . . . And four on the floor -5 I am the Five man -@end example - -If a line number is repeated, the last line with a given number overrides -the others. - -Gaps in the line numbers can be handled with an easy improvement to the -program's @code{END} rule: - -@example -END @{ - for (x = 1; x <= max; x++) - if (x in arr) - print arr[x] -@} -@end example - -@node Scanning an Array, Delete, Array Example, Arrays -@section Scanning all Elements of an Array -@cindex @code{for (x in @dots{})} -@cindex arrays, special @code{for} statement -@cindex scanning an array - -In programs that use arrays, often you need a loop that executes -once for each element of an array. In other languages, where arrays are -contiguous and indices are limited to positive integers, this is -easy: the largest index is one less than the length of the array, and you can -find all the valid indices by counting from zero up to that value. This -technique won't do the job in @code{awk}, since any number or string -may be an array index. So @code{awk} has a special kind of @code{for} -statement for scanning an array: - -@example -for (@var{var} in @var{array}) - @var{body} -@end example - -@noindent -This loop executes @var{body} once for each different value that your -program has previously used as an index in @var{array}, with the -variable @var{var} set to that index.@refill - -Here is a program that uses this form of the @code{for} statement. The -first rule scans the input records and notes which words appear (at -least once) in the input, by storing a 1 into the array @code{used} with -the word as index. The second rule scans the elements of @code{used} to -find all the distinct words that appear in the input. It prints each -word that is more than 10 characters long, and also prints the number of -such words. @xref{Built-in, ,Built-in Functions}, for more information -on the built-in function @code{length}. - -@smallexample -# Record a 1 for each word that is used at least once. -@{ - for (i = 1; i <= NF; i++) - used[$i] = 1 -@} - -# Find number of distinct words more than 10 characters long. -END @{ - for (x in used) - if (length(x) > 10) @{ - ++num_long_words - print x - @} - print num_long_words, "words longer than 10 characters" -@} -@end smallexample - -@noindent -@xref{Sample Program}, for a more detailed example of this type. - -The order in which elements of the array are accessed by this statement -is determined by the internal arrangement of the array elements within -@code{awk} and cannot be controlled or changed. This can lead to -problems if new elements are added to @var{array} by statements in -@var{body}; you cannot predict whether or not the @code{for} loop will -reach them. Similarly, changing @var{var} inside the loop can produce -strange results. It is best to avoid such things.@refill - -@node Delete, Numeric Array Subscripts, Scanning an Array, Arrays -@section The @code{delete} Statement -@cindex @code{delete} statement -@cindex deleting elements of arrays -@cindex removing elements of arrays -@cindex arrays, deleting an element - -You can remove an individual element of an array using the @code{delete} -statement: - -@example -delete @var{array}[@var{index}] -@end example - -You can not refer to an array element after it has been deleted; -it is as if you had never referred -to it and had never given it any value. You can no longer obtain any -value the element once had. - -Here is an example of deleting elements in an array: - -@example -for (i in frequencies) - delete frequencies[i] -@end example - -@noindent -This example removes all the elements from the array @code{frequencies}. - -If you delete an element, a subsequent @code{for} statement to scan the array -will not report that element, and the @code{in} operator to check for -the presence of that element will return 0: - -@example -delete foo[4] -if (4 in foo) - print "This will never be printed" -@end example - -It is not an error to delete an element which does not exist. - -@node Numeric Array Subscripts, Multi-dimensional, Delete, Arrays -@section Using Numbers to Subscript Arrays - -An important aspect of arrays to remember is that array subscripts -are @emph{always} strings. If you use a numeric value as a subscript, -it will be converted to a string value before it is used for subscripting -(@pxref{Conversion, ,Conversion of Strings and Numbers}). - -@cindex conversions, during subscripting -@cindex numbers, used as subscripts -@vindex CONVFMT -This means that the value of the @code{CONVFMT} can potentially -affect how your program accesses elements of an array. For example: - -@example -a = b = 12.153 -data[a] = 1 -CONVFMT = "%2.2f" -if (b in data) - printf "%s is in data", b -else - printf "%s is not in data", b -@end example - -@noindent -should print @samp{12.15 is not in data}. The first statement gives -both @code{a} and @code{b} the same numeric value. Assigning to -@code{data[a]} first gives @code{a} the string value @code{"12.153"} -(using the default conversion value of @code{CONVFMT}, @code{"%.6g"}), -and then assigns 1 to @code{data["12.153"]}. The program then changes -the value of @code{CONVFMT}. The test @samp{(b in data)} forces @code{b} -to be converted to a string, this time @code{"12.15"}, since the value of -@code{CONVFMT} only allows two significant digits. This test fails, -since @code{"12.15"} is a different string from @code{"12.153"}.@refill - -According to the rules for conversions -(@pxref{Conversion, ,Conversion of Strings and Numbers}), integer -values are always converted to strings as integers, no matter what the -value of @code{CONVFMT} may happen to be. So the usual case of@refill - -@example -for (i = 1; i <= maxsub; i++) - @i{do something with} array[i] -@end example - -@noindent -will work, no matter what the value of @code{CONVFMT}. - -Like many things in @code{awk}, the majority of the time things work -as you would expect them to work. But it is useful to have a precise -knowledge of the actual rules, since sometimes they can have a subtle -effect on your programs. - -@node Multi-dimensional, Multi-scanning, Numeric Array Subscripts, Arrays -@section Multi-dimensional Arrays - -@c the following index entry is an overfull hbox. --mew 30jan1992 -@cindex subscripts in arrays -@cindex arrays, multi-dimensional subscripts -@cindex multi-dimensional subscripts -A multi-dimensional array is an array in which an element is identified -by a sequence of indices, not a single index. For example, a -two-dimensional array requires two indices. The usual way (in most -languages, including @code{awk}) to refer to an element of a -two-dimensional array named @code{grid} is with -@code{grid[@var{x},@var{y}]}. - -@vindex SUBSEP -Multi-dimensional arrays are supported in @code{awk} through -concatenation of indices into one string. What happens is that -@code{awk} converts the indices into strings -(@pxref{Conversion, ,Conversion of Strings and Numbers}) and -concatenates them together, with a separator between them. This creates -a single string that describes the values of the separate indices. The -combined string is used as a single index into an ordinary, -one-dimensional array. The separator used is the value of the built-in -variable @code{SUBSEP}.@refill - -For example, suppose we evaluate the expression @code{foo[5,12]="value"} -when the value of @code{SUBSEP} is @code{"@@"}. The numbers 5 and 12 are -converted to strings and -concatenated with an @samp{@@} between them, yielding @code{"5@@12"}; thus, -the array element @code{foo["5@@12"]} is set to @code{"value"}.@refill - -Once the element's value is stored, @code{awk} has no record of whether -it was stored with a single index or a sequence of indices. The two -expressions @code{foo[5,12]} and @w{@code{foo[5 SUBSEP 12]}} always have -the same value. - -The default value of @code{SUBSEP} is the string @code{"\034"}, -which contains a nonprinting character that is unlikely to appear in an -@code{awk} program or in the input data. - -The usefulness of choosing an unlikely character comes from the fact -that index values that contain a string matching @code{SUBSEP} lead to -combined strings that are ambiguous. Suppose that @code{SUBSEP} were -@code{"@@"}; then @w{@code{foo["a@@b", "c"]}} and @w{@code{foo["a", -"b@@c"]}} would be indistinguishable because both would actually be -stored as @code{foo["a@@b@@c"]}. Because @code{SUBSEP} is -@code{"\034"}, such confusion can arise only when an index -contains the character with ASCII code 034, which is a rare -event.@refill - -You can test whether a particular index-sequence exists in a -``multi-dimensional'' array with the same operator @code{in} used for single -dimensional arrays. Instead of a single index as the left-hand operand, -write the whole sequence of indices, separated by commas, in -parentheses:@refill - -@example -(@var{subscript1}, @var{subscript2}, @dots{}) in @var{array} -@end example - -The following example treats its input as a two-dimensional array of -fields; it rotates this array 90 degrees clockwise and prints the -result. It assumes that all lines have the same number of -elements. - -@example -awk '@{ - if (max_nf < NF) - max_nf = NF - max_nr = NR - for (x = 1; x <= NF; x++) - vector[x, NR] = $x -@} - -END @{ - for (x = 1; x <= max_nf; x++) @{ - for (y = max_nr; y >= 1; --y) - printf("%s ", vector[x, y]) - printf("\n") - @} -@}' -@end example - -@noindent -When given the input: - -@example -@group -1 2 3 4 5 6 -2 3 4 5 6 1 -3 4 5 6 1 2 -4 5 6 1 2 3 -@end group -@end example - -@noindent -it produces: - -@example -@group -4 3 2 1 -5 4 3 2 -6 5 4 3 -1 6 5 4 -2 1 6 5 -3 2 1 6 -@end group -@end example - -@node Multi-scanning, , Multi-dimensional, Arrays -@section Scanning Multi-dimensional Arrays - -There is no special @code{for} statement for scanning a -``multi-dimensional'' array; there cannot be one, because in truth there -are no multi-dimensional arrays or elements; there is only a -multi-dimensional @emph{way of accessing} an array. - -However, if your program has an array that is always accessed as -multi-dimensional, you can get the effect of scanning it by combining -the scanning @code{for} statement -(@pxref{Scanning an Array, ,Scanning all Elements of an Array}) with the -@code{split} built-in function -(@pxref{String Functions, ,Built-in Functions for String Manipulation}). -It works like this:@refill - -@example -for (combined in @var{array}) @{ - split(combined, separate, SUBSEP) - @dots{} -@} -@end example - -@noindent -This finds each concatenated, combined index in the array, and splits it -into the individual indices by breaking it apart where the value of -@code{SUBSEP} appears. The split-out indices become the elements of -the array @code{separate}. - -Thus, suppose you have previously stored in @code{@var{array}[1, -"foo"]}; then an element with index @code{"1\034foo"} exists in -@var{array}. (Recall that the default value of @code{SUBSEP} contains -the character with code 034.) Sooner or later the @code{for} statement -will find that index and do an iteration with @code{combined} set to -@code{"1\034foo"}. Then the @code{split} function is called as -follows: - -@example -split("1\034foo", separate, "\034") -@end example - -@noindent -The result of this is to set @code{separate[1]} to 1 and @code{separate[2]} -to @code{"foo"}. Presto, the original sequence of separate indices has -been recovered. - -@node Built-in, User-defined, Arrays, Top -@chapter Built-in Functions - -@cindex built-in functions -@dfn{Built-in} functions are functions that are always available for -your @code{awk} program to call. This chapter defines all the built-in -functions in @code{awk}; some of them are mentioned in other sections, -but they are summarized here for your convenience. (You can also define -new functions yourself. @xref{User-defined, ,User-defined Functions}.) - -@menu -* Calling Built-in:: How to call built-in functions. -* Numeric Functions:: Functions that work with numbers, - including @code{int}, @code{sin} and @code{rand}. -* String Functions:: Functions for string manipulation, - such as @code{split}, @code{match}, and @code{sprintf}. -* I/O Functions:: Functions for files and shell commands. -* Time Functions:: Functions for dealing with time stamps. -@end menu - -@node Calling Built-in, Numeric Functions, Built-in, Built-in -@section Calling Built-in Functions - -To call a built-in function, write the name of the function followed -by arguments in parentheses. For example, @code{atan2(y + z, 1)} -is a call to the function @code{atan2}, with two arguments. - -Whitespace is ignored between the built-in function name and the -open-parenthesis, but we recommend that you avoid using whitespace -there. User-defined functions do not permit whitespace in this way, and -you will find it easier to avoid mistakes by following a simple -convention which always works: no whitespace after a function name. - -Each built-in function accepts a certain number of arguments. In most -cases, any extra arguments given to built-in functions are ignored. The -defaults for omitted arguments vary from function to function and are -described under the individual functions. - -When a function is called, expressions that create the function's actual -parameters are evaluated completely before the function call is performed. -For example, in the code fragment: - -@example -i = 4 -j = sqrt(i++) -@end example - -@noindent -the variable @code{i} is set to 5 before @code{sqrt} is called -with a value of 4 for its actual parameter. - -@node Numeric Functions, String Functions, Calling Built-in, Built-in -@section Numeric Built-in Functions -@c I didn't make all the examples small because a couple of them were -@c short already. --mew 29jan1992 - -Here is a full list of built-in functions that work with numbers: - -@table @code -@item int(@var{x}) -This gives you the integer part of @var{x}, truncated toward 0. This -produces the nearest integer to @var{x}, located between @var{x} and 0. - -For example, @code{int(3)} is 3, @code{int(3.9)} is 3, @code{int(-3.9)} -is @minus{}3, and @code{int(-3)} is @minus{}3 as well.@refill - -@item sqrt(@var{x}) -This gives you the positive square root of @var{x}. It reports an error -if @var{x} is negative. Thus, @code{sqrt(4)} is 2.@refill - -@item exp(@var{x}) -This gives you the exponential of @var{x}, or reports an error if -@var{x} is out of range. The range of values @var{x} can have depends -on your machine's floating point representation.@refill - -@item log(@var{x}) -This gives you the natural logarithm of @var{x}, if @var{x} is positive; -otherwise, it reports an error.@refill - -@item sin(@var{x}) -This gives you the sine of @var{x}, with @var{x} in radians. - -@item cos(@var{x}) -This gives you the cosine of @var{x}, with @var{x} in radians. - -@item atan2(@var{y}, @var{x}) -This gives you the arctangent of @code{@var{y} / @var{x}} in radians. - -@item rand() -This gives you a random number. The values of @code{rand} are -uniformly-distributed between 0 and 1. The value is never 0 and never -1. - -Often you want random integers instead. Here is a user-defined function -you can use to obtain a random nonnegative integer less than @var{n}: - -@example -function randint(n) @{ - return int(n * rand()) -@} -@end example - -@noindent -The multiplication produces a random real number greater than 0 and less -than @var{n}. We then make it an integer (using @code{int}) between 0 -and @code{@var{n} @minus{} 1}. - -Here is an example where a similar function is used to produce -random integers between 1 and @var{n}. Note that this program will -print a new random number for each input record. - -@smallexample -awk ' -# Function to roll a simulated die. -function roll(n) @{ return 1 + int(rand() * n) @} - -# Roll 3 six-sided dice and print total number of points. -@{ - printf("%d points\n", roll(6)+roll(6)+roll(6)) -@}' -@end smallexample - -@strong{Note:} @code{rand} starts generating numbers from the same -point, or @dfn{seed}, each time you run @code{awk}. This means that -a program will produce the same results each time you run it. -The numbers are random within one @code{awk} run, but predictable -from run to run. This is convenient for debugging, but if you want -a program to do different things each time it is used, you must change -the seed to a value that will be different in each run. To do this, -use @code{srand}. - -@item srand(@var{x}) -The function @code{srand} sets the starting point, or @dfn{seed}, -for generating random numbers to the value @var{x}. - -Each seed value leads to a particular sequence of ``random'' numbers. -Thus, if you set the seed to the same value a second time, you will get -the same sequence of ``random'' numbers again. - -If you omit the argument @var{x}, as in @code{srand()}, then the current -date and time of day are used for a seed. This is the way to get random -numbers that are truly unpredictable. - -The return value of @code{srand} is the previous seed. This makes it -easy to keep track of the seeds for use in consistently reproducing -sequences of random numbers. -@end table - -@node String Functions, I/O Functions, Numeric Functions, Built-in -@section Built-in Functions for String Manipulation - -The functions in this section look at or change the text of one or more -strings. - -@table @code -@item index(@var{in}, @var{find}) -@findex match -This searches the string @var{in} for the first occurrence of the string -@var{find}, and returns the position in characters where that occurrence -begins in the string @var{in}. For example:@refill - -@smallexample -awk 'BEGIN @{ print index("peanut", "an") @}' -@end smallexample - -@noindent -prints @samp{3}. If @var{find} is not found, @code{index} returns 0. -(Remember that string indices in @code{awk} start at 1.) - -@item length(@var{string}) -@findex length -This gives you the number of characters in @var{string}. If -@var{string} is a number, the length of the digit string representing -that number is returned. For example, @code{length("abcde")} is 5. By -contrast, @code{length(15 * 35)} works out to 3. How? Well, 15 * 35 = -525, and 525 is then converted to the string @samp{"525"}, which has -three characters. - -If no argument is supplied, @code{length} returns the length of @code{$0}. - -In older versions of @code{awk}, you could call the @code{length} function -without any parentheses. Doing so is marked as ``deprecated'' in the -@sc{posix} standard. This means that while you can do this in your -programs, it is a feature that can eventually be removed from a future -version of the standard. Therefore, for maximal portability of your -@code{awk} programs you should always supply the parentheses. - -@item match(@var{string}, @var{regexp}) -@findex match -The @code{match} function searches the string, @var{string}, for the -longest, leftmost substring matched by the regular expression, -@var{regexp}. It returns the character position, or @dfn{index}, of -where that substring begins (1, if it starts at the beginning of -@var{string}). If no match if found, it returns 0. - -@vindex RSTART -@vindex RLENGTH -The @code{match} function sets the built-in variable @code{RSTART} to -the index. It also sets the built-in variable @code{RLENGTH} to the -length in characters of the matched substring. If no match is found, -@code{RSTART} is set to 0, and @code{RLENGTH} to @minus{}1. - -For example: - -@smallexample -awk '@{ - if ($1 == "FIND") - regex = $2 - else @{ - where = match($0, regex) - if (where) - print "Match of", regex, "found at", where, "in", $0 - @} -@}' -@end smallexample - -@noindent -This program looks for lines that match the regular expression stored in -the variable @code{regex}. This regular expression can be changed. If the -first word on a line is @samp{FIND}, @code{regex} is changed to be the -second word on that line. Therefore, given: - -@smallexample -FIND fo*bar -My program was a foobar -But none of it would doobar -FIND Melvin -JF+KM -This line is property of The Reality Engineering Co. -This file created by Melvin. -@end smallexample - -@noindent -@code{awk} prints: - -@smallexample -Match of fo*bar found at 18 in My program was a foobar -Match of Melvin found at 26 in This file created by Melvin. -@end smallexample - -@item split(@var{string}, @var{array}, @var{fieldsep}) -@findex split -This divides @var{string} into pieces separated by @var{fieldsep}, -and stores the pieces in @var{array}. The first piece is stored in -@code{@var{array}[1]}, the second piece in @code{@var{array}[2]}, and so -forth. The string value of the third argument, @var{fieldsep}, is -a regexp describing where to split @var{string} (much as @code{FS} can -be a regexp describing where to split input records). If -the @var{fieldsep} is omitted, the value of @code{FS} is used. -@code{split} returns the number of elements created.@refill - -The @code{split} function, then, splits strings into pieces in a -manner similar to the way input lines are split into fields. For example: - -@smallexample -split("auto-da-fe", a, "-") -@end smallexample - -@noindent -splits the string @samp{auto-da-fe} into three fields using @samp{-} as the -separator. It sets the contents of the array @code{a} as follows: - -@smallexample -a[1] = "auto" -a[2] = "da" -a[3] = "fe" -@end smallexample - -@noindent -The value returned by this call to @code{split} is 3. - -As with input field-splitting, when the value of @var{fieldsep} is -@code{" "}, leading and trailing whitespace is ignored, and the elements -are separated by runs of whitespace. - -@item sprintf(@var{format}, @var{expression1},@dots{}) -@findex sprintf -This returns (without printing) the string that @code{printf} would -have printed out with the same arguments -(@pxref{Printf, ,Using @code{printf} Statements for Fancier Printing}). -For example:@refill - -@smallexample -sprintf("pi = %.2f (approx.)", 22/7) -@end smallexample - -@noindent -returns the string @w{@code{"pi = 3.14 (approx.)"}}. - -@item sub(@var{regexp}, @var{replacement}, @var{target}) -@findex sub -The @code{sub} function alters the value of @var{target}. -It searches this value, which should be a string, for the -leftmost substring matched by the regular expression, @var{regexp}, -extending this match as far as possible. Then the entire string is -changed by replacing the matched text with @var{replacement}. -The modified string becomes the new value of @var{target}. - -This function is peculiar because @var{target} is not simply -used to compute a value, and not just any expression will do: it -must be a variable, field or array reference, so that @code{sub} can -store a modified value there. If this argument is omitted, then the -default is to use and alter @code{$0}. - -For example:@refill - -@smallexample -str = "water, water, everywhere" -sub(/at/, "ith", str) -@end smallexample - -@noindent -sets @code{str} to @w{@code{"wither, water, everywhere"}}, by replacing the -leftmost, longest occurrence of @samp{at} with @samp{ith}. - -The @code{sub} function returns the number of substitutions made (either -one or zero). - -If the special character @samp{&} appears in @var{replacement}, it -stands for the precise substring that was matched by @var{regexp}. (If -the regexp can match more than one string, then this precise substring -may vary.) For example:@refill - -@smallexample -awk '@{ sub(/candidate/, "& and his wife"); print @}' -@end smallexample - -@noindent -changes the first occurrence of @samp{candidate} to @samp{candidate -and his wife} on each input line. - -Here is another example: - -@smallexample -awk 'BEGIN @{ - str = "daabaaa" - sub(/a*/, "c&c", str) - print str -@}' -@end smallexample - -@noindent -prints @samp{dcaacbaaa}. This show how @samp{&} can represent a non-constant -string, and also illustrates the ``leftmost, longest'' rule. - -The effect of this special character (@samp{&}) can be turned off by putting a -backslash before it in the string. As usual, to insert one backslash in -the string, you must write two backslashes. Therefore, write @samp{\\&} -in a string constant to include a literal @samp{&} in the replacement. -For example, here is how to replace the first @samp{|} on each line with -an @samp{&}:@refill - -@smallexample -awk '@{ sub(/\|/, "\\&"); print @}' -@end smallexample - -@strong{Note:} as mentioned above, the third argument to @code{sub} must -be an lvalue. Some versions of @code{awk} allow the third argument to -be an expression which is not an lvalue. In such a case, @code{sub} -would still search for the pattern and return 0 or 1, but the result of -the substitution (if any) would be thrown away because there is no place -to put it. Such versions of @code{awk} accept expressions like -this:@refill - -@smallexample -sub(/USA/, "United States", "the USA and Canada") -@end smallexample - -@noindent -But that is considered erroneous in @code{gawk}. - -@item gsub(@var{regexp}, @var{replacement}, @var{target}) -@findex gsub -This is similar to the @code{sub} function, except @code{gsub} replaces -@emph{all} of the longest, leftmost, @emph{nonoverlapping} matching -substrings it can find. The @samp{g} in @code{gsub} stands for -``global,'' which means replace everywhere. For example:@refill - -@smallexample -awk '@{ gsub(/Britain/, "United Kingdom"); print @}' -@end smallexample - -@noindent -replaces all occurrences of the string @samp{Britain} with @samp{United -Kingdom} for all input records.@refill - -The @code{gsub} function returns the number of substitutions made. If -the variable to be searched and altered, @var{target}, is -omitted, then the entire input record, @code{$0}, is used.@refill - -As in @code{sub}, the characters @samp{&} and @samp{\} are special, and -the third argument must be an lvalue. - -@item substr(@var{string}, @var{start}, @var{length}) -@findex substr -This returns a @var{length}-character-long substring of @var{string}, -starting at character number @var{start}. The first character of a -string is character number one. For example, -@code{substr("washington", 5, 3)} returns @code{"ing"}.@refill - -If @var{length} is not present, this function returns the whole suffix of -@var{string} that begins at character number @var{start}. For example, -@code{substr("washington", 5)} returns @code{"ington"}. This is also -the case if @var{length} is greater than the number of characters remaining -in the string, counting from character number @var{start}. - -@item tolower(@var{string}) -@findex tolower -This returns a copy of @var{string}, with each upper-case character -in the string replaced with its corresponding lower-case character. -Nonalphabetic characters are left unchanged. For example, -@code{tolower("MiXeD cAsE 123")} returns @code{"mixed case 123"}. - -@item toupper(@var{string}) -@findex toupper -This returns a copy of @var{string}, with each lower-case character -in the string replaced with its corresponding upper-case character. -Nonalphabetic characters are left unchanged. For example, -@code{toupper("MiXeD cAsE 123")} returns @code{"MIXED CASE 123"}. -@end table - -@node I/O Functions, Time Functions, String Functions, Built-in -@section Built-in Functions for Input/Output - -@table @code -@item close(@var{filename}) -Close the file @var{filename}, for input or output. The argument may -alternatively be a shell command that was used for redirecting to or -from a pipe; then the pipe is closed. - -@xref{Close Input, ,Closing Input Files and Pipes}, regarding closing -input files and pipes. @xref{Close Output, ,Closing Output Files and Pipes}, -regarding closing output files and pipes.@refill - -@item system(@var{command}) -@findex system -@c the following index entry is an overfull hbox. --mew 30jan1992 -@cindex interaction, @code{awk} and other programs -The system function allows the user to execute operating system commands -and then return to the @code{awk} program. The @code{system} function -executes the command given by the string @var{command}. It returns, as -its value, the status returned by the command that was executed. - -For example, if the following fragment of code is put in your @code{awk} -program: - -@smallexample -END @{ - system("mail -s 'awk run done' operator < /dev/null") -@} -@end smallexample - -@noindent -the system operator will be sent mail when the @code{awk} program -finishes processing input and begins its end-of-input processing. - -Note that much the same result can be obtained by redirecting -@code{print} or @code{printf} into a pipe. However, if your @code{awk} -program is interactive, @code{system} is useful for cranking up large -self-contained programs, such as a shell or an editor.@refill - -Some operating systems cannot implement the @code{system} function. -@code{system} causes a fatal error if it is not supported. -@end table - -@c fakenode --- for prepinfo -@subheading Controlling Output Buffering with @code{system} -@cindex flushing buffers -@cindex buffers, flushing -@cindex buffering output -@cindex output, buffering - -Many utility programs will @dfn{buffer} their output; they save information -to be written to a disk file or terminal in memory, until there is enough -to be written in one operation. This is often more efficient than writing -every little bit of information as soon as it is ready. However, sometimes -it is necessary to force a program to @dfn{flush} its buffers; that is, -write the information to its destination, even if a buffer is not full. -You can do this from your @code{awk} program by calling @code{system} -with a null string as its argument: - -@example -system("") # flush output -@end example - -@noindent -@code{gawk} treats this use of the @code{system} function as a special -case, and is smart enough not to run a shell (or other command -interpreter) with the empty command. Therefore, with @code{gawk}, this -idiom is not only useful, it is efficient. While this idiom should work -with other @code{awk} implementations, it will not necessarily avoid -starting an unnecessary shell. -@ignore -Need a better explanation, perhaps in a separate paragraph. Explain that -for - -awk 'BEGIN { print "hi" - system("echo hello") - print "howdy" }' - -that the output had better be - - hi - hello - howdy - -and not - - hello - hi - howdy - -which it would be if awk did not flush its buffers before calling system. -@end ignore - -@node Time Functions, , I/O Functions, Built-in -@section Functions for Dealing with Time Stamps - -@cindex time stamps -@cindex time of day -A common use for @code{awk} programs is the processing of log files. -Log files often contain time stamp information, indicating when a -particular log record was written. Many programs log their time stamp -in the form returned by the @code{time} system call, which is the -number of seconds since a particular epoch. On @sc{posix} systems, -it is the number of seconds since Midnight, January 1, 1970, @sc{utc}. - -In order to make it easier to process such log files, and to easily produce -useful reports, @code{gawk} provides two functions for working with time -stamps. Both of these are @code{gawk} extensions; they are not specified -in the @sc{posix} standard, nor are they in any other known version -of @code{awk}. - -@table @code -@item systime() -@findex systime -This function returns the current time as the number of seconds since -the system epoch. On @sc{posix} systems, this is the number of seconds -since Midnight, January 1, 1970, @sc{utc}. It may be a different number on -other systems. - -@item strftime(@var{format}, @var{timestamp}) -@findex strftime -This function returns a string. It is similar to the function of the -same name in the @sc{ansi} C standard library. The time specified by -@var{timestamp} is used to produce a string, based on the contents -of the @var{format} string. -@end table - -The @code{systime} function allows you to compare a time stamp from a -log file with the current time of day. In particular, it is easy to -determine how long ago a particular record was logged. It also allows -you to produce log records using the ``seconds since the epoch'' format. - -The @code{strftime} function allows you to easily turn a time stamp -into human-readable information. It is similar in nature to the @code{sprintf} -function, copying non-format specification characters verbatim to the -returned string, and substituting date and time values for format -specifications in the @var{format} string. If no @var{timestamp} argument -is supplied, @code{gawk} will use the current time of day as the -time stamp.@refill - -@code{strftime} is guaranteed by the @sc{ansi} C standard to support -the following date format specifications: - -@table @code -@item %a -The locale's abbreviated weekday name. - -@item %A -The locale's full weekday name. - -@item %b -The locale's abbreviated month name. - -@item %B -The locale's full month name. - -@item %c -The locale's ``appropriate'' date and time representation. - -@item %d -The day of the month as a decimal number (01--31). - -@item %H -The hour (24-hour clock) as a decimal number (00--23). - -@item %I -The hour (12-hour clock) as a decimal number (01--12). - -@item %j -The day of the year as a decimal number (001--366). - -@item %m -The month as a decimal number (01--12). - -@item %M -The minute as a decimal number (00--59). - -@item %p -The locale's equivalent of the AM/PM designations associated -with a 12-hour clock. - -@item %S -The second as a decimal number (00--61). (Occasionally there are -minutes in a year with one or two leap seconds, which is why the -seconds can go from 0 all the way to 61.) - -@item %U -The week number of the year (the first Sunday as the first day of week 1) -as a decimal number (00--53). - -@item %w -The weekday as a decimal number (0--6). Sunday is day 0. - -@item %W -The week number of the year (the first Monday as the first day of week 1) -as a decimal number (00--53). - -@item %x -The locale's ``appropriate'' date representation. - -@item %X -The locale's ``appropriate'' time representation. - -@item %y -The year without century as a decimal number (00--99). - -@item %Y -The year with century as a decimal number. - -@item %Z -The time zone name or abbreviation, or no characters if -no time zone is determinable. - -@item %% -A literal @samp{%}. -@end table - -@c The parenthetical remark here should really be a footnote, but -@c it gave formatting problems at the FSF. So for now put it in -@c parentheses. -If a conversion specifier is not one of the above, the behavior is -undefined. (This is because the @sc{ansi} standard for C leaves the -behavior of the C version of @code{strftime} undefined, and @code{gawk} -will use the system's version of @code{strftime} if it's there. -Typically, the conversion specifier will either not appear in the -returned string, or it will appear literally.) - -Informally, a @dfn{locale} is the geographic place in which a program -is meant to run. For example, a common way to abbreviate the date -September 4, 1991 in the United States would be ``9/4/91''. -In many countries in Europe, however, it would be abbreviated ``4.9.91''. -Thus, the @samp{%x} specification in a @code{"US"} locale might produce -@samp{9/4/91}, while in a @code{"EUROPE"} locale, it might produce -@samp{4.9.91}. The @sc{ansi} C standard defines a default @code{"C"} -locale, which is an environment that is typical of what most C programmers -are used to. - -A public-domain C version of @code{strftime} is shipped with @code{gawk} -for systems that are not yet fully @sc{ansi}-compliant. If that version is -used to compile @code{gawk} (@pxref{Installation, ,Installing @code{gawk}}), -then the following additional format specifications are available:@refill - -@table @code -@item %D -Equivalent to specifying @samp{%m/%d/%y}. - -@item %e -The day of the month, padded with a blank if it is only one digit. - -@item %h -Equivalent to @samp{%b}, above. - -@item %n -A newline character (ASCII LF). - -@item %r -Equivalent to specifying @samp{%I:%M:%S %p}. - -@item %R -Equivalent to specifying @samp{%H:%M}. - -@item %T -Equivalent to specifying @samp{%H:%M:%S}. - -@item %t -A TAB character. - -@item %k -is replaced by the hour (24-hour clock) as a decimal number (0-23). -Single digit numbers are padded with a blank. - -@item %l -is replaced by the hour (12-hour clock) as a decimal number (1-12). -Single digit numbers are padded with a blank. - -@item %C -The century, as a number between 00 and 99. - -@item %u -is replaced by the weekday as a decimal number -[1 (Monday)--7]. - -@item %V -is replaced by the week number of the year (the first Monday as the first -day of week 1) as a decimal number (01--53). -The method for determining the week number is as specified by ISO 8601 -(to wit: if the week containing January 1 has four or more days in the -new year, then it is week 1, otherwise it is week 53 of the previous year -and the next week is week 1).@refill - -@item %Ec %EC %Ex %Ey %EY %Od %Oe %OH %OI -@itemx %Om %OM %OS %Ou %OU %OV %Ow %OW %Oy -These are ``alternate representations'' for the specifications -that use only the second letter (@samp{%c}, @samp{%C}, and so on). -They are recognized, but their normal representations are used. -(These facilitate compliance with the @sc{posix} @code{date} -utility.)@refill - -@item %v -The date in VMS format (e.g. 20-JUN-1991). -@end table - -Here are two examples that use @code{strftime}. The first is an -@code{awk} version of the C @code{ctime} function. (This is a -user defined function, which we have not discussed yet. -@xref{User-defined, ,User-defined Functions}, for more information.) - -@smallexample -# ctime.awk -# -# awk version of C ctime(3) function - -function ctime(ts, format) -@{ - format = "%a %b %e %H:%M:%S %Z %Y" - if (ts == 0) - ts = systime() # use current time as default - return strftime(format, ts) -@} -@end smallexample - -This next example is an @code{awk} implementation of the @sc{posix} -@code{date} utility. Normally, the @code{date} utility prints the -current date and time of day in a well known format. However, if you -provide an argument to it that begins with a @samp{+}, @code{date} -will copy non-format specifier characters to the standard output, and -will interpret the current time according to the format specifiers in -the string. For example: - -@smallexample -date '+Today is %A, %B %d, %Y.' -@end smallexample - -@noindent -might print - -@smallexample -Today is Thursday, July 11, 1991. -@end smallexample - -Here is the @code{awk} version of the @code{date} utility. - -@smallexample -#! /usr/bin/gawk -f -# -# date --- implement the P1003.2 Draft 11 'date' command -# -# Bug: does not recognize the -u argument. - -BEGIN \ -@{ - format = "%a %b %e %H:%M:%S %Z %Y" - exitval = 0 - - if (ARGC > 2) - exitval = 1 - else if (ARGC == 2) @{ - format = ARGV[1] - if (format ~ /^\+/) - format = substr(format, 2) # remove leading + - @} - print strftime(format) - exit exitval -@} -@end smallexample - -@node User-defined, Built-in Variables, Built-in, Top -@chapter User-defined Functions - -@cindex user-defined functions -@cindex functions, user-defined -Complicated @code{awk} programs can often be simplified by defining -your own functions. User-defined functions can be called just like -built-in ones (@pxref{Function Calls}), but it is up to you to define -them---to tell @code{awk} what they should do. - -@menu -* Definition Syntax:: How to write definitions and what they mean. -* Function Example:: An example function definition and - what it does. -* Function Caveats:: Things to watch out for. -* Return Statement:: Specifying the value a function returns. -@end menu - -@node Definition Syntax, Function Example, User-defined, User-defined -@section Syntax of Function Definitions -@cindex defining functions -@cindex function definition - -Definitions of functions can appear anywhere between the rules of the -@code{awk} program. Thus, the general form of an @code{awk} program is -extended to include sequences of rules @emph{and} user-defined function -definitions. - -The definition of a function named @var{name} looks like this: - -@example -function @var{name} (@var{parameter-list}) @{ - @var{body-of-function} -@} -@end example - -@noindent -@var{name} is the name of the function to be defined. A valid function -name is like a valid variable name: a sequence of letters, digits and -underscores, not starting with a digit. Functions share the same pool -of names as variables and arrays. - -@var{parameter-list} is a list of the function's arguments and local -variable names, separated by commas. When the function is called, -the argument names are used to hold the argument values given in -the call. The local variables are initialized to the null string. - -The @var{body-of-function} consists of @code{awk} statements. It is the -most important part of the definition, because it says what the function -should actually @emph{do}. The argument names exist to give the body a -way to talk about the arguments; local variables, to give the body -places to keep temporary values. - -Argument names are not distinguished syntactically from local variable -names; instead, the number of arguments supplied when the function is -called determines how many argument variables there are. Thus, if three -argument values are given, the first three names in @var{parameter-list} -are arguments, and the rest are local variables. - -It follows that if the number of arguments is not the same in all calls -to the function, some of the names in @var{parameter-list} may be -arguments on some occasions and local variables on others. Another -way to think of this is that omitted arguments default to the -null string. - -Usually when you write a function you know how many names you intend to -use for arguments and how many you intend to use as locals. By -convention, you should write an extra space between the arguments and -the locals, so other people can follow how your function is -supposed to be used. - -During execution of the function body, the arguments and local variable -values hide or @dfn{shadow} any variables of the same names used in the -rest of the program. The shadowed variables are not accessible in the -function definition, because there is no way to name them while their -names have been taken away for the local variables. All other variables -used in the @code{awk} program can be referenced or set normally in the -function definition. - -The arguments and local variables last only as long as the function body -is executing. Once the body finishes, the shadowed variables come back. - -The function body can contain expressions which call functions. They -can even call this function, either directly or by way of another -function. When this happens, we say the function is @dfn{recursive}. - -There is no need in @code{awk} to put the definition of a function -before all uses of the function. This is because @code{awk} reads the -entire program before starting to execute any of it. - -In many @code{awk} implementations, the keyword @code{function} may be -abbreviated @code{func}. However, @sc{posix} only specifies the use of -the keyword @code{function}. This actually has some practical implications. -If @code{gawk} is in @sc{posix}-compatibility mode -(@pxref{Command Line, ,Invoking @code{awk}}), then the following -statement will @emph{not} define a function:@refill - -@example -func foo() @{ a = sqrt($1) ; print a @} -@end example - -@noindent -Instead it defines a rule that, for each record, concatenates the value -of the variable @samp{func} with the return value of the function @samp{foo}, -and based on the truth value of the result, executes the corresponding action. -This is probably not what was desired. (@code{awk} accepts this input as -syntactically valid, since functions may be used before they are defined -in @code{awk} programs.) - -@node Function Example, Function Caveats, Definition Syntax, User-defined -@section Function Definition Example - -Here is an example of a user-defined function, called @code{myprint}, that -takes a number and prints it in a specific format. - -@example -function myprint(num) -@{ - printf "%6.3g\n", num -@} -@end example - -@noindent -To illustrate, here is an @code{awk} rule which uses our @code{myprint} -function: - -@example -$3 > 0 @{ myprint($3) @} -@end example - -@noindent -This program prints, in our special format, all the third fields that -contain a positive number in our input. Therefore, when given: - -@example - 1.2 3.4 5.6 7.8 - 9.10 11.12 -13.14 15.16 -17.18 19.20 21.22 23.24 -@end example - -@noindent -this program, using our function to format the results, prints: - -@example - 5.6 - 21.2 -@end example - -Here is a rather contrived example of a recursive function. It prints a -string backwards: - -@example -function rev (str, len) @{ - if (len == 0) @{ - printf "\n" - return - @} - printf "%c", substr(str, len, 1) - rev(str, len - 1) -@} -@end example - -@node Function Caveats, Return Statement, Function Example, User-defined -@section Calling User-defined Functions - -@dfn{Calling a function} means causing the function to run and do its job. -A function call is an expression, and its value is the value returned by -the function. - -A function call consists of the function name followed by the arguments -in parentheses. What you write in the call for the arguments are -@code{awk} expressions; each time the call is executed, these -expressions are evaluated, and the values are the actual arguments. For -example, here is a call to @code{foo} with three arguments (the first -being a string concatenation): - -@example -foo(x y, "lose", 4 * z) -@end example - -@quotation -@strong{Caution:} whitespace characters (spaces and tabs) are not allowed -between the function name and the open-parenthesis of the argument list. -If you write whitespace by mistake, @code{awk} might think that you mean -to concatenate a variable with an expression in parentheses. However, it -notices that you used a function name and not a variable name, and reports -an error. -@end quotation - -@cindex call by value -When a function is called, it is given a @emph{copy} of the values of -its arguments. This is called @dfn{call by value}. The caller may use -a variable as the expression for the argument, but the called function -does not know this: it only knows what value the argument had. For -example, if you write this code: - -@example -foo = "bar" -z = myfunc(foo) -@end example - -@noindent -then you should not think of the argument to @code{myfunc} as being -``the variable @code{foo}.'' Instead, think of the argument as the -string value, @code{"bar"}. - -If the function @code{myfunc} alters the values of its local variables, -this has no effect on any other variables. In particular, if @code{myfunc} -does this: - -@example -function myfunc (win) @{ - print win - win = "zzz" - print win -@} -@end example - -@noindent -to change its first argument variable @code{win}, this @emph{does not} -change the value of @code{foo} in the caller. The role of @code{foo} in -calling @code{myfunc} ended when its value, @code{"bar"}, was computed. -If @code{win} also exists outside of @code{myfunc}, the function body -cannot alter this outer value, because it is shadowed during the -execution of @code{myfunc} and cannot be seen or changed from there. - -@cindex call by reference -However, when arrays are the parameters to functions, they are @emph{not} -copied. Instead, the array itself is made available for direct manipulation -by the function. This is usually called @dfn{call by reference}. -Changes made to an array parameter inside the body of a function @emph{are} -visible outside that function. -@ifinfo -This can be @strong{very} dangerous if you do not watch what you are -doing. For example:@refill -@end ifinfo -@iftex -@emph{This can be very dangerous if you do not watch what you are -doing.} For example:@refill -@end iftex - -@example -function changeit (array, ind, nvalue) @{ - array[ind] = nvalue -@} - -BEGIN @{ - a[1] = 1 ; a[2] = 2 ; a[3] = 3 - changeit(a, 2, "two") - printf "a[1] = %s, a[2] = %s, a[3] = %s\n", a[1], a[2], a[3] - @} -@end example - -@noindent -prints @samp{a[1] = 1, a[2] = two, a[3] = 3}, because calling -@code{changeit} stores @code{"two"} in the second element of @code{a}. - -@node Return Statement, , Function Caveats, User-defined -@section The @code{return} Statement -@cindex @code{return} statement - -The body of a user-defined function can contain a @code{return} statement. -This statement returns control to the rest of the @code{awk} program. It -can also be used to return a value for use in the rest of the @code{awk} -program. It looks like this:@refill - -@example -return @var{expression} -@end example - -The @var{expression} part is optional. If it is omitted, then the returned -value is undefined and, therefore, unpredictable. - -A @code{return} statement with no value expression is assumed at the end of -every function definition. So if control reaches the end of the function -body, then the function returns an unpredictable value. @code{awk} -will not warn you if you use the return value of such a function; you will -simply get unpredictable or unexpected results. - -Here is an example of a user-defined function that returns a value -for the largest number among the elements of an array:@refill - -@example -@group -function maxelt (vec, i, ret) @{ - for (i in vec) @{ - if (ret == "" || vec[i] > ret) - ret = vec[i] - @} - return ret -@} -@end group -@end example - -@noindent -You call @code{maxelt} with one argument, which is an array name. The local -variables @code{i} and @code{ret} are not intended to be arguments; -while there is nothing to stop you from passing two or three arguments -to @code{maxelt}, the results would be strange. The extra space before -@code{i} in the function parameter list is to indicate that @code{i} and -@code{ret} are not supposed to be arguments. This is a convention which -you should follow when you define functions. - -Here is a program that uses our @code{maxelt} function. It loads an -array, calls @code{maxelt}, and then reports the maximum number in that -array:@refill - -@example -@group -awk ' -function maxelt (vec, i, ret) @{ - for (i in vec) @{ - if (ret == "" || vec[i] > ret) - ret = vec[i] - @} - return ret -@} -@end group - -@group -# Load all fields of each record into nums. -@{ - for(i = 1; i <= NF; i++) - nums[NR, i] = $i -@} - -END @{ - print maxelt(nums) -@}' -@end group -@end example - -Given the following input: - -@example -@group - 1 5 23 8 16 -44 3 5 2 8 26 -256 291 1396 2962 100 --6 467 998 1101 -99385 11 0 225 -@end group -@end example - -@noindent -our program tells us (predictably) that: - -@example -99385 -@end example - -@noindent -is the largest number in our array. - -@node Built-in Variables, Command Line, User-defined, Top -@chapter Built-in Variables -@cindex built-in variables - -Most @code{awk} variables are available for you to use for your own -purposes; they never change except when your program assigns values to -them, and never affect anything except when your program examines them. - -A few variables have special built-in meanings. Some of them @code{awk} -examines automatically, so that they enable you to tell @code{awk} how -to do certain things. Others are set automatically by @code{awk}, so -that they carry information from the internal workings of @code{awk} to -your program. - -This chapter documents all the built-in variables of @code{gawk}. Most -of them are also documented in the chapters where their areas of -activity are described. - -@menu -* User-modified:: Built-in variables that you change - to control @code{awk}. -* Auto-set:: Built-in variables where @code{awk} - gives you information. -@end menu - -@node User-modified, Auto-set, Built-in Variables, Built-in Variables -@section Built-in Variables that Control @code{awk} -@cindex built-in variables, user modifiable - -This is a list of the variables which you can change to control how -@code{awk} does certain things. - -@table @code -@iftex -@vindex CONVFMT -@end iftex -@item CONVFMT -This string is used by @code{awk} to control conversion of numbers to -strings (@pxref{Conversion, ,Conversion of Strings and Numbers}). -It works by being passed, in effect, as the first argument to the -@code{sprintf} function. Its default value is @code{"%.6g"}. -@code{CONVFMT} was introduced by the @sc{posix} standard.@refill - -@iftex -@vindex FIELDWIDTHS -@end iftex -@item FIELDWIDTHS -This is a space separated list of columns that tells @code{gawk} -how to manage input with fixed, columnar boundaries. It is an -experimental feature that is still evolving. Assigning to @code{FIELDWIDTHS} -overrides the use of @code{FS} for field splitting. -@xref{Constant Size, ,Reading Fixed-width Data}, for more information.@refill - -If @code{gawk} is in compatibility mode -(@pxref{Command Line, ,Invoking @code{awk}}), then @code{FIELDWIDTHS} -has no special meaning, and field splitting operations are done based -exclusively on the value of @code{FS}.@refill - -@iftex -@vindex FS -@end iftex -@item FS -@code{FS} is the input field separator -(@pxref{Field Separators, ,Specifying how Fields are Separated}). -The value is a single-character string or a multi-character regular -expression that matches the separations between fields in an input -record.@refill - -The default value is @w{@code{" "}}, a string consisting of a single -space. As a special exception, this value actually means that any -sequence of spaces and tabs is a single separator. It also causes -spaces and tabs at the beginning or end of a line to be ignored. - -You can set the value of @code{FS} on the command line using the -@samp{-F} option: - -@example -awk -F, '@var{program}' @var{input-files} -@end example - -If @code{gawk} is using @code{FIELDWIDTHS} for field-splitting, -assigning a value to @code{FS} will cause @code{gawk} to return to -the normal, regexp-based, field splitting. - -@item IGNORECASE -@iftex -@vindex IGNORECASE -@end iftex -If @code{IGNORECASE} is nonzero, then @emph{all} regular expression -matching is done in a case-independent fashion. In particular, regexp -matching with @samp{~} and @samp{!~}, and the @code{gsub} @code{index}, -@code{match}, @code{split} and @code{sub} functions all ignore case when -doing their particular regexp operations. @strong{Note:} since field -splitting with the value of the @code{FS} variable is also a regular -expression operation, that too is done with case ignored. -@xref{Case-sensitivity, ,Case-sensitivity in Matching}. - -If @code{gawk} is in compatibility mode -(@pxref{Command Line, ,Invoking @code{awk}}), then @code{IGNORECASE} has -no special meaning, and regexp operations are always case-sensitive.@refill - -@item OFMT -@iftex -@vindex OFMT -@end iftex -This string is used by @code{awk} to control conversion of numbers to -strings (@pxref{Conversion, ,Conversion of Strings and Numbers}) for -printing with the @code{print} statement. -It works by being passed, in effect, as the first argument to the -@code{sprintf} function. Its default value is @code{"%.6g"}. -Earlier versions of @code{awk} also used @code{OFMT} to specify the -format for converting numbers to strings in general expressions; this -has been taken over by @code{CONVFMT}.@refill - -@item OFS -@iftex -@vindex OFS -@end iftex -This is the output field separator (@pxref{Output Separators}). It is -output between the fields output by a @code{print} statement. Its -default value is @w{@code{" "}}, a string consisting of a single space. - -@item ORS -@iftex -@vindex ORS -@end iftex -This is the output record separator. It is output at the end of every -@code{print} statement. Its default value is a string containing a -single newline character, which could be written as @code{"\n"}. -(@xref{Output Separators}.)@refill - -@item RS -@iftex -@vindex RS -@end iftex -This is @code{awk}'s input record separator. Its default value is a string -containing a single newline character, which means that an input record -consists of a single line of text. -(@xref{Records, ,How Input is Split into Records}.)@refill - -@item SUBSEP -@iftex -@vindex SUBSEP -@end iftex -@code{SUBSEP} is the subscript separator. It has the default value of -@code{"\034"}, and is used to separate the parts of the name of a -multi-dimensional array. Thus, if you access @code{foo[12,3]}, it -really accesses @code{foo["12\0343"]} -(@pxref{Multi-dimensional, ,Multi-dimensional Arrays}).@refill -@end table - -@node Auto-set, , User-modified, Built-in Variables -@section Built-in Variables that Convey Information - -This is a list of the variables that are set automatically by @code{awk} -on certain occasions so as to provide information to your program. - -@table @code -@item ARGC -@itemx ARGV -@iftex -@vindex ARGC -@vindex ARGV -@end iftex -The command-line arguments available to @code{awk} programs are stored in -an array called @code{ARGV}. @code{ARGC} is the number of command-line -arguments present. @xref{Command Line, ,Invoking @code{awk}}. -@code{ARGV} is indexed from zero to @w{@code{ARGC - 1}}. For example:@refill - -@example -awk 'BEGIN @{ - for (i = 0; i < ARGC; i++) - print ARGV[i] - @}' inventory-shipped BBS-list -@end example - -@noindent -In this example, @code{ARGV[0]} contains @code{"awk"}, @code{ARGV[1]} -contains @code{"inventory-shipped"}, and @code{ARGV[2]} contains -@code{"BBS-list"}. The value of @code{ARGC} is 3, one more than the -index of the last element in @code{ARGV} since the elements are numbered -from zero.@refill - -The names @code{ARGC} and @code{ARGV}, as well the convention of indexing -the array from 0 to @w{@code{ARGC - 1}}, are derived from the C language's -method of accessing command line arguments.@refill - -Notice that the @code{awk} program is not entered in @code{ARGV}. The -other special command line options, with their arguments, are also not -entered. But variable assignments on the command line @emph{are} -treated as arguments, and do show up in the @code{ARGV} array. - -Your program can alter @code{ARGC} and the elements of @code{ARGV}. -Each time @code{awk} reaches the end of an input file, it uses the next -element of @code{ARGV} as the name of the next input file. By storing a -different string there, your program can change which files are read. -You can use @code{"-"} to represent the standard input. By storing -additional elements and incrementing @code{ARGC} you can cause -additional files to be read. - -If you decrease the value of @code{ARGC}, that eliminates input files -from the end of the list. By recording the old value of @code{ARGC} -elsewhere, your program can treat the eliminated arguments as -something other than file names. - -To eliminate a file from the middle of the list, store the null string -(@code{""}) into @code{ARGV} in place of the file's name. As a -special feature, @code{awk} ignores file names that have been -replaced with the null string. - -@ignore -see getopt.awk in the examples... -@end ignore - -@item ARGIND -@vindex ARGIND -The index in @code{ARGV} of the current file being processed. -Every time @code{gawk} opens a new data file for processing, it sets -@code{ARGIND} to the index in @code{ARGV} of the file name. Thus, the -condition @samp{FILENAME == ARGV[ARGIND]} is always true. - -This variable is useful in file processing; it allows you to tell how far -along you are in the list of data files, and to distinguish between -multiple successive instances of the same filename on the command line. - -While you can change the value of @code{ARGIND} within your @code{awk} -program, @code{gawk} will automatically set it to a new value when the -next file is opened. - -This variable is a @code{gawk} extension; in other @code{awk} implementations -it is not special. - -@item ENVIRON -@vindex ENVIRON -This is an array that contains the values of the environment. The array -indices are the environment variable names; the values are the values of -the particular environment variables. For example, -@code{ENVIRON["HOME"]} might be @file{/u/close}. Changing this array -does not affect the environment passed on to any programs that -@code{awk} may spawn via redirection or the @code{system} function. -(In a future version of @code{gawk}, it may do so.) - -Some operating systems may not have environment variables. -On such systems, the array @code{ENVIRON} is empty. - -@item ERRNO -@iftex -@vindex ERRNO -@end iftex -If a system error occurs either doing a redirection for @code{getline}, -during a read for @code{getline}, or during a @code{close} operation, -then @code{ERRNO} will contain a string describing the error. - -This variable is a @code{gawk} extension; in other @code{awk} implementations -it is not special. - -@item FILENAME -@iftex -@vindex FILENAME -@end iftex -This is the name of the file that @code{awk} is currently reading. -If @code{awk} is reading from the standard input (in other words, -there are no files listed on the command line), -@code{FILENAME} is set to @code{"-"}. -@code{FILENAME} is changed each time a new file is read -(@pxref{Reading Files, ,Reading Input Files}).@refill - -@item FNR -@iftex -@vindex FNR -@end iftex -@code{FNR} is the current record number in the current file. @code{FNR} is -incremented each time a new record is read -(@pxref{Getline, ,Explicit Input with @code{getline}}). It is reinitialized -to 0 each time a new input file is started.@refill - -@item NF -@iftex -@vindex NF -@end iftex -@code{NF} is the number of fields in the current input record. -@code{NF} is set each time a new record is read, when a new field is -created, or when @code{$0} changes (@pxref{Fields, ,Examining Fields}).@refill - -@item NR -@iftex -@vindex NR -@end iftex -This is the number of input records @code{awk} has processed since -the beginning of the program's execution. -(@pxref{Records, ,How Input is Split into Records}). -@code{NR} is set each time a new record is read.@refill - -@item RLENGTH -@iftex -@vindex RLENGTH -@end iftex -@code{RLENGTH} is the length of the substring matched by the -@code{match} function -(@pxref{String Functions, ,Built-in Functions for String Manipulation}). -@code{RLENGTH} is set by invoking the @code{match} function. Its value -is the length of the matched string, or @minus{}1 if no match was found.@refill - -@item RSTART -@iftex -@vindex RSTART -@end iftex -@code{RSTART} is the start-index in characters of the substring matched by the -@code{match} function -(@pxref{String Functions, ,Built-in Functions for String Manipulation}). -@code{RSTART} is set by invoking the @code{match} function. Its value -is the position of the string where the matched substring starts, or 0 -if no match was found.@refill -@end table - -@node Command Line, Language History, Built-in Variables, Top -@c node-name, next, previous, up -@chapter Invoking @code{awk} -@cindex command line -@cindex invocation of @code{gawk} -@cindex arguments, command line -@cindex options, command line -@cindex long options -@cindex options, long - -There are two ways to run @code{awk}: with an explicit program, or with -one or more program files. Here are templates for both of them; items -enclosed in @samp{@r{[}@dots{}@r{]}} in these templates are optional. - -Besides traditional one-letter @sc{posix}-style options, @code{gawk} also -supports GNU long named options. - -@example -awk @r{[@var{POSIX or GNU style options}]} -f progfile @r{[@code{--}]} @var{file} @dots{} -awk @r{[@var{POSIX or GNU style options}]} @r{[@code{--}]} '@var{program}' @var{file} @dots{} -@end example - -@menu -* Options:: Command line options and their meanings. -* Other Arguments:: Input file names and variable assignments. -* AWKPATH Variable:: Searching directories for @code{awk} programs. -* Obsolete:: Obsolete Options and/or features. -* Undocumented:: Undocumented Options and Features. -@end menu - -@node Options, Other Arguments, Command Line, Command Line -@section Command Line Options - -Options begin with a minus sign, and consist of a single character. -GNU style long named options consist of two minus signs and -a keyword that can be abbreviated if the abbreviation allows the option -to be uniquely identified. If the option takes an argument, then the -keyword is immediately followed by an equals sign (@samp{=}) and the -argument's value. For brevity, the discussion below only refers to the -traditional short options; however the long and short options are -interchangeable in all contexts. - -Each long named option for @code{gawk} has a corresponding -@sc{posix}-style option. The options and their meanings are as follows: - -@table @code -@item -F @var{fs} -@itemx --field-separator=@var{fs} -@iftex -@cindex @code{-F} option -@end iftex -@cindex @code{--field-separator} option -Sets the @code{FS} variable to @var{fs} -(@pxref{Field Separators, ,Specifying how Fields are Separated}).@refill - -@item -f @var{source-file} -@itemx --file=@var{source-file} -@iftex -@cindex @code{-f} option -@end iftex -@cindex @code{--file} option -Indicates that the @code{awk} program is to be found in @var{source-file} -instead of in the first non-option argument. - -@item -v @var{var}=@var{val} -@itemx --assign=@var{var}=@var{val} -@cindex @samp{-v} option -@cindex @code{--assign} option -Sets the variable @var{var} to the value @var{val} @emph{before} -execution of the program begins. Such variable values are available -inside the @code{BEGIN} rule (see below for a fuller explanation). - -The @samp{-v} option can only set one variable, but you can use -it more than once, setting another variable each time, like this: -@samp{@w{-v foo=1} @w{-v bar=2}}. - -@item -W @var{gawk-opt} -@cindex @samp{-W} option -Following the @sc{posix} standard, options that are implementation -specific are supplied as arguments to the @samp{-W} option. With @code{gawk}, -these arguments may be separated by commas, or quoted and separated by -whitespace. Case is ignored when processing these options. These options -also have corresponding GNU style long named options. The following -@code{gawk}-specific options are available: - -@table @code -@item -W compat -@itemx --compat -@cindex @code{--compat} option -Specifies @dfn{compatibility mode}, in which the GNU extensions in -@code{gawk} are disabled, so that @code{gawk} behaves just like Unix -@code{awk}. -@xref{POSIX/GNU, ,Extensions in @code{gawk} not in POSIX @code{awk}}, -which summarizes the extensions. Also see -@ref{Compatibility Mode, ,Downward Compatibility and Debugging}.@refill - -@item -W copyleft -@itemx -W copyright -@itemx --copyleft -@itemx --copyright -@cindex @code{--copyleft} option -@cindex @code{--copyright} option -Print the short version of the General Public License. -This option may disappear in a future version of @code{gawk}. - -@item -W help -@itemx -W usage -@itemx --help -@itemx --usage -@cindex @code{--help} option -@cindex @code{--usage} option -Print a ``usage'' message summarizing the short and long style options -that @code{gawk} accepts, and then exit. - -@item -W lint -@itemx --lint -@cindex @code{--lint} option -Provide warnings about constructs that are dubious or non-portable to -other @code{awk} implementations. -Some warnings are issued when @code{gawk} first reads your program. Others -are issued at run-time, as your program executes. - -@item -W posix -@itemx --posix -@cindex @code{--posix} option -Operate in strict @sc{posix} mode. This disables all @code{gawk} -extensions (just like @code{-W compat}), and adds the following additional -restrictions: - -@itemize @bullet{} -@item -@code{\x} escape sequences are not recognized -(@pxref{Constants, ,Constant Expressions}).@refill - -@item -The synonym @code{func} for the keyword @code{function} is not -recognized (@pxref{Definition Syntax, ,Syntax of Function Definitions}). - -@item -The operators @samp{**} and @samp{**=} cannot be used in -place of @samp{^} and @samp{^=} (@pxref{Arithmetic Ops, ,Arithmetic Operators}, -and also @pxref{Assignment Ops, ,Assignment Expressions}).@refill - -@item -Specifying @samp{-Ft} on the command line does not set the value -of @code{FS} to be a single tab character -(@pxref{Field Separators, ,Specifying how Fields are Separated}).@refill -@end itemize - -Although you can supply both @samp{-W compat} and @samp{-W posix} on the -command line, @samp{-W posix} will take precedence. - -@item -W source=@var{program-text} -@itemx --source=@var{program-text} -@cindex @code{--source} option -Program source code is taken from the @var{program-text}. This option -allows you to mix @code{awk} source code in files with program source -code that you would enter on the command line. This is particularly useful -when you have library functions that you wish to use from your command line -programs (@pxref{AWKPATH Variable, ,The @code{AWKPATH} Environment Variable}). - -@item -W version -@itemx --version -@cindex @code{--version} option -Prints version information for this particular copy of @code{gawk}. -This is so you can determine if your copy of @code{gawk} is up to date -with respect to whatever the Free Software Foundation is currently -distributing. This option may disappear in a future version of @code{gawk}. -@end table - -@item -- -Signals the end of the command line options. The following arguments -are not treated as options even if they begin with @samp{-}. This -interpretation of @samp{--} follows the @sc{posix} argument parsing -conventions. - -This is useful if you have file names that start with @samp{-}, -or in shell scripts, if you have file names that will be specified -by the user which could start with @samp{-}. -@end table - -Any other options are flagged as invalid with a warning message, but -are otherwise ignored. - -In compatibility mode, as a special case, if the value of @var{fs} supplied -to the @samp{-F} option is @samp{t}, then @code{FS} is set to the tab -character (@code{"\t"}). This is only true for @samp{-W compat}, and not -for @samp{-W posix} -(@pxref{Field Separators, ,Specifying how Fields are Separated}).@refill - -If the @samp{-f} option is @emph{not} used, then the first non-option -command line argument is expected to be the program text. - -The @samp{-f} option may be used more than once on the command line. -If it is, @code{awk} reads its program source from all of the named files, as -if they had been concatenated together into one big file. This is -useful for creating libraries of @code{awk} functions. Useful functions -can be written once, and then retrieved from a standard place, instead -of having to be included into each individual program. You can still -type in a program at the terminal and use library functions, by specifying -@samp{-f /dev/tty}. @code{awk} will read a file from the terminal -to use as part of the @code{awk} program. After typing your program, -type @kbd{Control-d} (the end-of-file character) to terminate it. -(You may also use @samp{-f -} to read program source from the standard -input, but then you will not be able to also use the standard input as a -source of data.) - -Because it is clumsy using the standard @code{awk} mechanisms to mix source -file and command line @code{awk} programs, @code{gawk} provides the -@samp{--source} option. This does not require you to pre-empt the standard -input for your source code, and allows you to easily mix command line -and library source code -(@pxref{AWKPATH Variable, ,The @code{AWKPATH} Environment Variable}). - -If no @samp{-f} or @samp{--source} option is specified, then @code{gawk} -will use the first non-option command line argument as the text of the -program source code. - -@node Other Arguments, AWKPATH Variable, Options, Command Line -@section Other Command Line Arguments - -Any additional arguments on the command line are normally treated as -input files to be processed in the order specified. However, an -argument that has the form @code{@var{var}=@var{value}}, means to assign -the value @var{value} to the variable @var{var}---it does not specify a -file at all. - -@vindex ARGV -All these arguments are made available to your @code{awk} program in the -@code{ARGV} array (@pxref{Built-in Variables}). Command line options -and the program text (if present) are omitted from the @code{ARGV} -array. All other arguments, including variable assignments, are -included. - -The distinction between file name arguments and variable-assignment -arguments is made when @code{awk} is about to open the next input file. -At that point in execution, it checks the ``file name'' to see whether -it is really a variable assignment; if so, @code{awk} sets the variable -instead of reading a file. - -Therefore, the variables actually receive the specified values after all -previously specified files have been read. In particular, the values of -variables assigned in this fashion are @emph{not} available inside a -@code{BEGIN} rule -(@pxref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}), -since such rules are run before @code{awk} begins scanning the argument list. -The values given on the command line are processed for escape sequences -(@pxref{Constants, ,Constant Expressions}).@refill - -In some earlier implementations of @code{awk}, when a variable assignment -occurred before any file names, the assignment would happen @emph{before} -the @code{BEGIN} rule was executed. Some applications came to depend -upon this ``feature.'' When @code{awk} was changed to be more consistent, -the @samp{-v} option was added to accommodate applications that depended -upon this old behavior. - -The variable assignment feature is most useful for assigning to variables -such as @code{RS}, @code{OFS}, and @code{ORS}, which control input and -output formats, before scanning the data files. It is also useful for -controlling state if multiple passes are needed over a data file. For -example:@refill - -@cindex multiple passes over data -@cindex passes, multiple -@smallexample -awk 'pass == 1 @{ @var{pass 1 stuff} @} - pass == 2 @{ @var{pass 2 stuff} @}' pass=1 datafile pass=2 datafile -@end smallexample - -Given the variable assignment feature, the @samp{-F} option is not -strictly necessary. It remains for historical compatibility. - -@node AWKPATH Variable, Obsolete, Other Arguments, Command Line -@section The @code{AWKPATH} Environment Variable -@cindex @code{AWKPATH} environment variable -@cindex search path -@cindex directory search -@cindex path, search -@iftex -@cindex differences between @code{gawk} and @code{awk} -@end iftex - -The previous section described how @code{awk} program files can be named -on the command line with the @samp{-f} option. In some @code{awk} -implementations, you must supply a precise path name for each program -file, unless the file is in the current directory. - -But in @code{gawk}, if the file name supplied in the @samp{-f} option -does not contain a @samp{/}, then @code{gawk} searches a list of -directories (called the @dfn{search path}), one by one, looking for a -file with the specified name. - -The search path is actually a string consisting of directory names -separated by colons. @code{gawk} gets its search path from the -@code{AWKPATH} environment variable. If that variable does not exist, -@code{gawk} uses the default path, which is -@samp{.:/usr/lib/awk:/usr/local/lib/awk}. (Programs written by -system administrators should use an @code{AWKPATH} variable that -does not include the current directory, @samp{.}.)@refill - -The search path feature is particularly useful for building up libraries -of useful @code{awk} functions. The library files can be placed in a -standard directory that is in the default path, and then specified on -the command line with a short file name. Otherwise, the full file name -would have to be typed for each file. - -By combining the @samp{--source} and @samp{-f} options, your command line -@code{awk} programs can use facilities in @code{awk} library files. - -Path searching is not done if @code{gawk} is in compatibility mode. -This is true for both @samp{-W compat} and @samp{-W posix}. -@xref{Options, ,Command Line Options}. - -@strong{Note:} if you want files in the current directory to be found, -you must include the current directory in the path, either by writing -@file{.} as an entry in the path, or by writing a null entry in the -path. (A null entry is indicated by starting or ending the path with a -colon, or by placing two colons next to each other (@samp{::}).) If the -current directory is not included in the path, then files cannot be -found in the current directory. This path search mechanism is identical -to the shell's. -@c someday, @cite{The Bourne Again Shell}.... - -@node Obsolete, Undocumented, AWKPATH Variable, Command Line -@section Obsolete Options and/or Features - -@cindex deprecated options -@cindex obsolete options -@cindex deprecated features -@cindex obsolete features -This section describes features and/or command line options from the -previous release of @code{gawk} that are either not available in the -current version, or that are still supported but deprecated (meaning that -they will @emph{not} be in the next release). - -@c update this section for each release! - -For version 2.15 of @code{gawk}, the following command line options -from version 2.11.1 are no longer recognized. - -@table @samp -@ignore -@item -nostalgia -Use @samp{-W nostalgia} instead. -@end ignore - -@item -c -Use @samp{-W compat} instead. - -@item -V -Use @samp{-W version} instead. - -@item -C -Use @samp{-W copyright} instead. - -@item -a -@itemx -e -These options produce an ``unrecognized option'' error message but have -no effect on the execution of @code{gawk}. The @sc{posix} standard now -specifies traditional @code{awk} regular expressions for the @code{awk} utility. -@end table - -The public-domain version of @code{strftime} that is distributed with -@code{gawk} changed for the 2.14 release. The @samp{%V} conversion specifier -that used to generate the date in VMS format was changed to @samp{%v}. -This is because the @sc{posix} standard for the @code{date} utility now -specifies a @samp{%V} conversion specifier. -@xref{Time Functions, ,Functions for Dealing with Time Stamps}, for details. - -@node Undocumented, , Obsolete, Command Line -@section Undocumented Options and Features - -This section intentionally left blank. - -@c Read The Source, Luke! - -@ignore -@c If these came out in the Info file or TeX manual, then they wouldn't -@c be undocumented, would they? - -@code{gawk} has one undocumented option: - -@table @samp -@item -W nostalgia -Print the message @code{"awk: bailing out near line 1"} and dump core. -This option was inspired by the common behavior of very early versions of -Unix @code{awk}, and by a t--shirt. -@end table - -Early versions of @code{awk} used to not require any separator (either -a newline or @samp{;}) between the rules in @code{awk} programs. Thus, -it was common to see one-line programs like: - -@example -awk '@{ sum += $1 @} END @{ print sum @}' -@end example - -@code{gawk} actually supports this, but it is purposely undocumented -since it is considered bad style. The correct way to write such a program -is either - -@example -awk '@{ sum += $1 @} ; END @{ print sum @}' -@end example - -@noindent -or - -@example -awk '@{ sum += $1 @} - END @{ print sum @}' data -@end example - -@noindent -@xref{Statements/Lines, ,@code{awk} Statements versus Lines}, for a fuller -explanation.@refill - -As an accident of the implementation of the original Unix @code{awk}, if -a built-in function used @code{$0} as its default argument, it was possible -to call that function without the parentheses. In particular, it was -common practice to use the @code{length} function in this fashion. -For example, the pipeline: - -@example -echo abcdef | awk '@{ print length @}' -@end example - -@noindent -would print @samp{6}. - -For backwards compatibility with old programs, @code{gawk} supports -this usage, but only for the @code{length} function. New programs should -@emph{not} call the @code{length} function this way. In particular, -this usage will not be portable to other @sc{posix} compliant versions -of @code{awk}. It is also poor style. - -@end ignore - -@node Language History, Installation, Command Line, Top -@chapter The Evolution of the @code{awk} Language - -This manual describes the GNU implementation of @code{awk}, which is patterned -after the @sc{posix} specification. Many @code{awk} users are only familiar -with the original @code{awk} implementation in Version 7 Unix, which is also -the basis for the version in Berkeley Unix (through 4.3--Reno). This chapter -briefly describes the evolution of the @code{awk} language. - -@menu -* V7/S5R3.1:: The major changes between V7 and - System V Release 3.1. -* S5R4:: Minor changes between System V - Releases 3.1 and 4. -* POSIX:: New features from the @sc{posix} standard. -* POSIX/GNU:: The extensions in @code{gawk} - not in @sc{posix} @code{awk}. -@end menu - -@node V7/S5R3.1, S5R4, Language History, Language History -@section Major Changes between V7 and S5R3.1 - -The @code{awk} language evolved considerably between the release of -Version 7 Unix (1978) and the new version first made widely available in -System V Release 3.1 (1987). This section summarizes the changes, with -cross-references to further details. - -@itemize @bullet -@item -The requirement for @samp{;} to separate rules on a line -(@pxref{Statements/Lines, ,@code{awk} Statements versus Lines}). - -@item -User-defined functions, and the @code{return} statement -(@pxref{User-defined, ,User-defined Functions}). - -@item -The @code{delete} statement (@pxref{Delete, ,The @code{delete} Statement}). - -@item -The @code{do}-@code{while} statement -(@pxref{Do Statement, ,The @code{do}-@code{while} Statement}).@refill - -@item -The built-in functions @code{atan2}, @code{cos}, @code{sin}, @code{rand} and -@code{srand} (@pxref{Numeric Functions, ,Numeric Built-in Functions}). - -@item -The built-in functions @code{gsub}, @code{sub}, and @code{match} -(@pxref{String Functions, ,Built-in Functions for String Manipulation}). - -@item -The built-in functions @code{close}, which closes an open file, and -@code{system}, which allows the user to execute operating system -commands (@pxref{I/O Functions, ,Built-in Functions for Input/Output}).@refill -@c Does the above verbiage prevents an overfull hbox? --mew, rjc 24jan1992 - -@item -The @code{ARGC}, @code{ARGV}, @code{FNR}, @code{RLENGTH}, @code{RSTART}, -and @code{SUBSEP} built-in variables (@pxref{Built-in Variables}). - -@item -The conditional expression using the operators @samp{?} and @samp{:} -(@pxref{Conditional Exp, ,Conditional Expressions}).@refill - -@item -The exponentiation operator @samp{^} -(@pxref{Arithmetic Ops, ,Arithmetic Operators}) and its assignment operator -form @samp{^=} (@pxref{Assignment Ops, ,Assignment Expressions}).@refill - -@item -C-compatible operator precedence, which breaks some old @code{awk} -programs (@pxref{Precedence, ,Operator Precedence (How Operators Nest)}). - -@item -Regexps as the value of @code{FS} -(@pxref{Field Separators, ,Specifying how Fields are Separated}), and as the -third argument to the @code{split} function -(@pxref{String Functions, ,Built-in Functions for String Manipulation}).@refill - -@item -Dynamic regexps as operands of the @samp{~} and @samp{!~} operators -(@pxref{Regexp Usage, ,How to Use Regular Expressions}). - -@item -Escape sequences (@pxref{Constants, ,Constant Expressions}) in regexps.@refill - -@item -The escape sequences @samp{\b}, @samp{\f}, and @samp{\r} -(@pxref{Constants, ,Constant Expressions}). - -@item -Redirection of input for the @code{getline} function -(@pxref{Getline, ,Explicit Input with @code{getline}}).@refill - -@item -Multiple @code{BEGIN} and @code{END} rules -(@pxref{BEGIN/END, ,@code{BEGIN} and @code{END} Special Patterns}).@refill - -@item -Simulated multi-dimensional arrays -(@pxref{Multi-dimensional, ,Multi-dimensional Arrays}).@refill -@end itemize - -@node S5R4, POSIX, V7/S5R3.1, Language History -@section Changes between S5R3.1 and S5R4 - -The System V Release 4 version of Unix @code{awk} added these features -(some of which originated in @code{gawk}): - -@itemize @bullet -@item -The @code{ENVIRON} variable (@pxref{Built-in Variables}). - -@item -Multiple @samp{-f} options on the command line -(@pxref{Command Line, ,Invoking @code{awk}}).@refill - -@item -The @samp{-v} option for assigning variables before program execution begins -(@pxref{Command Line, ,Invoking @code{awk}}).@refill - -@item -The @samp{--} option for terminating command line options. - -@item -The @samp{\a}, @samp{\v}, and @samp{\x} escape sequences -(@pxref{Constants, ,Constant Expressions}).@refill - -@item -A defined return value for the @code{srand} built-in function -(@pxref{Numeric Functions, ,Numeric Built-in Functions}). - -@item -The @code{toupper} and @code{tolower} built-in string functions -for case translation -(@pxref{String Functions, ,Built-in Functions for String Manipulation}).@refill - -@item -A cleaner specification for the @samp{%c} format-control letter in the -@code{printf} function -(@pxref{Printf, ,Using @code{printf} Statements for Fancier Printing}).@refill - -@item -The ability to dynamically pass the field width and precision (@code{"%*.*d"}) -in the argument list of the @code{printf} function -(@pxref{Printf, ,Using @code{printf} Statements for Fancier Printing}).@refill - -@item -The use of constant regexps such as @code{/foo/} as expressions, where -they are equivalent to use of the matching operator, as in @code{$0 ~ -/foo/} (@pxref{Constants, ,Constant Expressions}). -@end itemize - -@node POSIX, POSIX/GNU, S5R4, Language History -@section Changes between S5R4 and POSIX @code{awk} - -The @sc{posix} Command Language and Utilities standard for @code{awk} -introduced the following changes into the language: - -@itemize @bullet{} -@item -The use of @samp{-W} for implementation-specific options. - -@item -The use of @code{CONVFMT} for controlling the conversion of numbers -to strings (@pxref{Conversion, ,Conversion of Strings and Numbers}). - -@item -The concept of a numeric string, and tighter comparison rules to go -with it (@pxref{Comparison Ops, ,Comparison Expressions}). - -@item -More complete documentation of many of the previously undocumented -features of the language. -@end itemize - -@node POSIX/GNU, , POSIX, Language History -@section Extensions in @code{gawk} not in POSIX @code{awk} - -The GNU implementation, @code{gawk}, adds these features: - -@itemize @bullet -@item -The @code{AWKPATH} environment variable for specifying a path search for -the @samp{-f} command line option -(@pxref{Command Line, ,Invoking @code{awk}}).@refill - -@item -The various @code{gawk} specific features available via the @samp{-W} -command line option (@pxref{Command Line, ,Invoking @code{awk}}). - -@item -The @code{ARGIND} variable, that tracks the movement of @code{FILENAME} -through @code{ARGV}. (@pxref{Built-in Variables}). - -@item -The @code{ERRNO} variable, that contains the system error message when -@code{getline} returns @minus{}1, or when @code{close} fails. -(@pxref{Built-in Variables}). - -@item -The @code{IGNORECASE} variable and its effects -(@pxref{Case-sensitivity, ,Case-sensitivity in Matching}).@refill - -@item -The @code{FIELDWIDTHS} variable and its effects -(@pxref{Constant Size, ,Reading Fixed-width Data}).@refill - -@item -The @code{next file} statement for skipping to the next data file -(@pxref{Next File Statement, ,The @code{next file} Statement}).@refill - -@item -The @code{systime} and @code{strftime} built-in functions for obtaining -and printing time stamps -(@pxref{Time Functions, ,Functions for Dealing with Time Stamps}).@refill - -@item -The @file{/dev/stdin}, @file{/dev/stdout}, @file{/dev/stderr}, and -@file{/dev/fd/@var{n}} file name interpretation -(@pxref{Special Files, ,Standard I/O Streams}).@refill - -@item -The @samp{-W compat} option to turn off these extensions -(@pxref{Command Line, ,Invoking @code{awk}}).@refill - -@item -The @samp{-W posix} option for full @sc{posix} compliance -(@pxref{Command Line, ,Invoking @code{awk}}).@refill - -@end itemize - -@node Installation, Gawk Summary, Language History, Top -@chapter Installing @code{gawk} - -This chapter provides instructions for installing @code{gawk} on the -various platforms that are supported by the developers. The primary -developers support Unix (and one day, GNU), while the other ports were -contributed. The file @file{ACKNOWLEDGMENT} in the @code{gawk} -distribution lists the electronic mail addresses of the people who did -the respective ports.@refill - -@menu -* Gawk Distribution:: What is in the @code{gawk} distribution. -* Unix Installation:: Installing @code{gawk} under various versions - of Unix. -* VMS Installation:: Installing @code{gawk} on VMS. -* MS-DOS Installation:: Installing @code{gawk} on MS-DOS. -* Atari Installation:: Installing @code{gawk} on the Atari ST. -@end menu - -@node Gawk Distribution, Unix Installation, Installation, Installation -@section The @code{gawk} Distribution - -This section first describes how to get and extract the @code{gawk} -distribution, and then discusses what is in the various files and -subdirectories. - -@menu -* Extracting:: How to get and extract the distribution. -* Distribution contents:: What is in the distribution. -@end menu - -@node Extracting, Distribution contents, Gawk Distribution, Gawk Distribution -@subsection Getting the @code{gawk} Distribution - -@cindex getting gawk -@cindex anonymous ftp -@cindex anonymous uucp -@cindex ftp, anonymous -@cindex uucp, anonymous -@code{gawk} is distributed as a @code{tar} file compressed with the -GNU Zip program, @code{gzip}. You can -get it via anonymous @code{ftp} to the Internet host @code{prep.ai.mit.edu}. -Like all GNU software, it will be archived at other well known systems, -from which it will be possible to use some sort of anonymous @code{uucp} to -obtain the distribution as well. -You can also order @code{gawk} on tape or CD-ROM directly from the -Free Software Foundation. (The address is on the copyright page.) -Doing so directly contributes to the support of the foundation and to -the production of more free software. - -Once you have the distribution (for example, -@file{gawk-2.15.0.tar.z}), first use @code{gzip} to expand the -file, and then use @code{tar} to extract it. You can use the following -pipeline to produce the @code{gawk} distribution: - -@example -# Under System V, add 'o' to the tar flags -gzip -d -c gawk-2.15.0.tar.z | tar -xvpf - -@end example - -@noindent -This will create a directory named @file{gawk-2.15} in the current -directory. - -The distribution file name is of the form @file{gawk-2.15.@var{n}.tar.Z}. -The @var{n} represents a @dfn{patchlevel}, meaning that minor bugs have -been fixed in the major release. The current patchlevel is 0, but when -retrieving distributions, you should get the version with the highest -patchlevel.@refill - -If you are not on a Unix system, you will need to make other arrangements -for getting and extracting the @code{gawk} distribution. You should consult -a local expert. - -@node Distribution contents, , Extracting, Gawk Distribution -@subsection Contents of the @code{gawk} Distribution - -@code{gawk} has a number of C source files, documentation files, -subdirectories and files related to the configuration process -(@pxref{Unix Installation, ,Compiling and Installing @code{gawk} on Unix}), -and several subdirectories related to different, non-Unix, -operating systems.@refill - -@table @asis -@item various @samp{.c}, @samp{.y}, and @samp{.h} files - -The C and YACC source files are the actual @code{gawk} source code. -@end table - -@table @file -@item README -@itemx README.VMS -@itemx README.dos -@itemx README.rs6000 -@itemx README.ultrix -Descriptive files: @file{README} for @code{gawk} under Unix, and the -rest for the various hardware and software combinations. - -@item PORTS -A list of systems to which @code{gawk} has been ported, and which -have successfully run the test suite. - -@item ACKNOWLEDGMENT -A list of the people who contributed major parts of the code or documentation. - -@item NEWS -A list of changes to @code{gawk} since the last release or patch. - -@item COPYING -The GNU General Public License. - -@item FUTURES -A brief list of features and/or changes being contemplated for future -releases, with some indication of the time frame for the feature, based -on its difficulty. - -@item LIMITATIONS -A list of those factors that limit @code{gawk}'s performance. -Most of these depend on the hardware or operating system software, and -are not limits in @code{gawk} itself.@refill - -@item PROBLEMS -A file describing known problems with the current release. - -@item gawk.1 -The @code{troff} source for a manual page describing @code{gawk}. - -@item gawk.texinfo -@ifinfo -The @code{texinfo} source file for this Info file. -It should be processed with @TeX{} to produce a printed manual, and -with @code{makeinfo} to produce the Info file.@refill -@end ifinfo -@iftex -The @code{texinfo} source file for this manual. -It should be processed with @TeX{} to produce a printed manual, and -with @code{makeinfo} to produce the Info file.@refill -@end iftex - -@item Makefile.in -@itemx config -@itemx config.in -@itemx configure -@itemx missing -@itemx mungeconf -These files and subdirectories are used when configuring @code{gawk} -for various Unix systems. They are explained in detail in -@ref{Unix Installation, ,Compiling and Installing @code{gawk} on Unix}.@refill - -@item atari -Files needed for building @code{gawk} on an Atari ST. -@xref{Atari Installation, ,Installing @code{gawk} on the Atari ST}, for details. - -@item pc -Files needed for building @code{gawk} under MS-DOS. -@xref{MS-DOS Installation, ,Installing @code{gawk} on MS-DOS}, for details. - -@item vms -Files needed for building @code{gawk} under VMS. -@xref{VMS Installation, ,Compiling Installing and Running @code{gawk} on VMS}, for details. - -@item test -Many interesting @code{awk} programs, provided as a test suite for -@code{gawk}. You can use @samp{make test} from the top level @code{gawk} -directory to run your version of @code{gawk} against the test suite. -@c There are many programs here that are useful in their own right. -If @code{gawk} successfully passes @samp{make test} then you can -be confident of a successful port.@refill -@end table - -@node Unix Installation, VMS Installation, Gawk Distribution, Installation -@section Compiling and Installing @code{gawk} on Unix - -Often, you can compile and install @code{gawk} by typing only two -commands. However, if you do not use a supported system, you may need -to configure @code{gawk} for your system yourself. - -@menu -* Quick Installation:: Compiling @code{gawk} on a - supported Unix version. -* Configuration Philosophy:: How it's all supposed to work. -* New Configurations:: What to do if there is no supplied - configuration for your system. -@end menu - -@node Quick Installation, Configuration Philosophy, Unix Installation, Unix Installation -@subsection Compiling @code{gawk} for a Supported Unix Version - -@cindex installation, unix -After you have extracted the @code{gawk} distribution, @code{cd} -to @file{gawk-2.15}. Look in the @file{config} subdirectory for a -file that matches your hardware/software combination. In general, -only the software is relevant; for example @code{sunos41} is used -for SunOS 4.1, on both Sun 3 and Sun 4 hardware.@refill - -If you find such a file, run the command: - -@example -# assume you have SunOS 4.1 -./configure sunos41 -@end example - -This produces a @file{Makefile} and @file{config.h} tailored to your -system. You may wish to edit the @file{Makefile} to use a different -C compiler, such as @code{gcc}, the GNU C compiler, if you have it. -You may also wish to change the @code{CFLAGS} variable, which controls -the command line options that are passed to the C compiler (such as -optimization levels, or compiling for debugging).@refill - -After you have configured @file{Makefile} and @file{config.h}, type: - -@example -make -@end example - -@noindent -and shortly thereafter, you should have an executable version of @code{gawk}. -That's all there is to it! - -@node Configuration Philosophy, New Configurations, Quick Installation, Unix Installation -@subsection The Configuration Process - -(This section is of interest only if you know something about using the -C language and the Unix operating system.) - -The source code for @code{gawk} generally attempts to adhere to industry -standards wherever possible. This means that @code{gawk} uses library -routines that are specified by the @sc{ansi} C standard and by the @sc{posix} -operating system interface standard. When using an @sc{ansi} C compiler, -function prototypes are provided to help improve the compile-time checking. - -Many older Unix systems do not support all of either the @sc{ansi} or the -@sc{posix} standards. The @file{missing} subdirectory in the @code{gawk} -distribution contains replacement versions of those subroutines that are -most likely to be missing. - -The @file{config.h} file that is created by the @code{configure} program -contains definitions that describe features of the particular operating -system where you are attempting to compile @code{gawk}. For the most -part, it lists which standard subroutines are @emph{not} available. -For example, if your system lacks the @samp{getopt} routine, then -@samp{GETOPT_MISSING} would be defined. - -@file{config.h} also defines constants that describe facts about your -variant of Unix. For example, there may not be an @samp{st_blksize} -element in the @code{stat} structure. In this case @samp{BLKSIZE_MISSING} -would be defined. - -Based on the list in @file{config.h} of standard subroutines that are -missing, @file{missing.c} will do a @samp{#include} of the appropriate -file(s) from the @file{missing} subdirectory.@refill - -Conditionally compiled code in the other source files relies on the -other definitions in the @file{config.h} file. - -Besides creating @file{config.h}, @code{configure} produces a @file{Makefile} -from @file{Makefile.in}. There are a number of lines in @file{Makefile.in} -that are system or feature specific. For example, there is line that begins -with @samp{##MAKE_ALLOCA_C##}. This is normally a comment line, since -it starts with @samp{#}. If a configuration file has @samp{MAKE_ALLOCA_C} -in it, then @code{configure} will delete the @samp{##MAKE_ALLOCA_C##} -from the beginning of the line. This will enable the rules in the -@file{Makefile} that use a C version of @samp{alloca}. There are several -similar features that work in this fashion.@refill - -@node New Configurations, , Configuration Philosophy, Unix Installation -@subsection Configuring @code{gawk} for a New System - -(This section is of interest only if you know something about using the -C language and the Unix operating system, and if you have to install -@code{gawk} on a system that is not supported by the @code{gawk} distribution. -If you are a C or Unix novice, get help from a local expert.) - -If you need to configure @code{gawk} for a Unix system that is not -supported in the distribution, first see -@ref{Configuration Philosophy, ,The Configuration Process}. -Then, copy @file{config.in} to @file{config.h}, and copy -@file{Makefile.in} to @file{Makefile}.@refill - -Next, edit both files. Both files are liberally commented, and the -necessary changes should be straightforward. - -While editing @file{config.h}, you need to determine what library -routines you do or do not have by consulting your system documentation, or -by perusing your actual libraries using the @code{ar} or @code{nm} utilities. -In the worst case, simply do not define @emph{any} of the macros for missing -subroutines. When you compile @code{gawk}, the final link-editing step -will fail. The link editor will provide you with a list of unresolved external -references---these are the missing subroutines. Edit @file{config.h} again -and recompile, and you should be set.@refill - -Editing the @file{Makefile} should also be straightforward. Enable or -disable the lines that begin with @samp{##MAKE_@var{whatever}##}, as -appropriate. Select the correct C compiler and @code{CFLAGS} for it. -Then run @code{make}. - -Getting a correct configuration is likely to be an iterative process. -Do not be discouraged if it takes you several tries. If you have no -luck whatsoever, please report your system type, and the steps you took. -Once you do have a working configuration, please send it to the maintainers -so that support for your system can be added to the official release. - -@xref{Bugs, ,Reporting Problems and Bugs}, for information on how to report -problems in configuring @code{gawk}. You may also use the same mechanisms -for sending in new configurations.@refill - -@node VMS Installation, MS-DOS Installation, Unix Installation, Installation -@section Compiling, Installing, and Running @code{gawk} on VMS - -@c based on material from -@c Pat Rankin <rankin@eql.caltech.edu> - -@cindex installation, vms -This section describes how to compile and install @code{gawk} under VMS. - -@menu -* VMS Compilation:: How to compile @code{gawk} under VMS. -* VMS Installation Details:: How to install @code{gawk} under VMS. -* VMS Running:: How to run @code{gawk} under VMS. -* VMS POSIX:: Alternate instructions for VMS POSIX. -@end menu - -@node VMS Compilation, VMS Installation Details, VMS Installation, VMS Installation -@subsection Compiling @code{gawk} under VMS - -To compile @code{gawk} under VMS, there is a @code{DCL} command procedure that -will issue all the necessary @code{CC} and @code{LINK} commands, and there is -also a @file{Makefile} for use with the @code{MMS} utility. From the source -directory, use either - -@smallexample -$ @@[.VMS]VMSBUILD.COM -@end smallexample - -@noindent -or - -@smallexample -$ MMS/DESCRIPTION=[.VMS]DECSRIP.MMS GAWK -@end smallexample - -Depending upon which C compiler you are using, follow one of the sets -of instructions in this table: - -@table @asis -@item VAX C V3.x -Use either @file{vmsbuild.com} or @file{descrip.mms} as is. These use -@code{CC/OPTIMIZE=NOLINE}, which is essential for Version 3.0. - -@item VAX C V2.x -You must have Version 2.3 or 2.4; older ones won't work. Edit either -@file{vmsbuild.com} or @file{descrip.mms} according to the comments in them. -For @file{vmsbuild.com}, this just entails removing two @samp{!} delimiters. -Also edit @file{config.h} (which is a copy of file @file{[.config]vms-conf.h}) -and comment out or delete the two lines @samp{#define __STDC__ 0} and -@samp{#define VAXC_BUILTINS} near the end.@refill - -@item GNU C -Edit @file{vmsbuild.com} or @file{descrip.mms}; the changes are different -from those for VAX C V2.x, but equally straightforward. No changes to -@file{config.h} should be needed. - -@item DEC C -Edit @file{vmsbuild.com} or @file{descrip.mms} according to their comments. -No changes to @file{config.h} should be needed. -@end table - -@code{gawk} 2.15 has been tested under VAX/VMS 5.5-1 using VAX C V3.2, -GNU C 1.40 and 2.3. It should work without modifications for VMS V4.6 and up. - -@node VMS Installation Details, VMS Running, VMS Compilation, VMS Installation -@subsection Installing @code{gawk} on VMS - -To install @code{gawk}, all you need is a ``foreign'' command, which is -a @code{DCL} symbol whose value begins with a dollar sign. - -@smallexample -$ GAWK :== $device:[directory]GAWK -@end smallexample - -@noindent -(Substitute the actual location of @code{gawk.exe} for -@samp{device:[directory]}.) The symbol should be placed in the -@file{login.com} of any user who wishes to run @code{gawk}, -so that it will be defined every time the user logs on. -Alternatively, the symbol may be placed in the system-wide -@file{sylogin.com} procedure, which will allow all users -to run @code{gawk}.@refill - -Optionally, the help entry can be loaded into a VMS help library: - -@smallexample -$ LIBRARY/HELP SYS$HELP:HELPLIB [.VMS]GAWK.HLP -@end smallexample - -@noindent -(You may want to substitute a site-specific help library rather than -the standard VMS library @samp{HELPLIB}.) After loading the help text, - -@c this is so tiny, but `should' be smallexample for consistency sake... -@c I didn't because it was so short. --mew 29jan1992 -@example -$ HELP GAWK -@end example - -@noindent -will provide information about both the @code{gawk} implementation and the -@code{awk} programming language. - -The logical name @samp{AWK_LIBRARY} can designate a default location -for @code{awk} program files. For the @samp{-f} option, if the specified -filename has no device or directory path information in it, @code{gawk} -will look in the current directory first, then in the directory specified -by the translation of @samp{AWK_LIBRARY} if the file was not found. -If after searching in both directories, the file still is not found, -then @code{gawk} appends the suffix @samp{.awk} to the filename and the -file search will be re-tried. If @samp{AWK_LIBRARY} is not defined, that -portion of the file search will fail benignly.@refill - -@node VMS Running, VMS POSIX, VMS Installation Details, VMS Installation -@subsection Running @code{gawk} on VMS - -Command line parsing and quoting conventions are significantly different -on VMS, so examples in this manual or from other sources often need minor -changes. They @emph{are} minor though, and all @code{awk} programs -should run correctly. - -Here are a couple of trivial tests: - -@smallexample -$ gawk -- "BEGIN @{print ""Hello, World!""@}" -$ gawk -"W" version ! could also be -"W version" or "-W version" -@end smallexample - -@noindent -Note that upper-case and mixed-case text must be quoted. - -The VMS port of @code{gawk} includes a @code{DCL}-style interface in addition -to the original shell-style interface (see the help entry for details). -One side-effect of dual command line parsing is that if there is only a -single parameter (as in the quoted string program above), the command -becomes ambiguous. To work around this, the normally optional @samp{--} -flag is required to force Unix style rather than @code{DCL} parsing. If any -other dash-type options (or multiple parameters such as data files to be -processed) are present, there is no ambiguity and @samp{--} can be omitted. - -The default search path when looking for @code{awk} program files specified -by the @samp{-f} option is @code{"SYS$DISK:[],AWK_LIBRARY:"}. The logical -name @samp{AWKPATH} can be used to override this default. The format -of @samp{AWKPATH} is a comma-separated list of directory specifications. -When defining it, the value should be quoted so that it retains a single -translation, and not a multi-translation @code{RMS} searchlist. - -@node VMS POSIX, , VMS Running, VMS Installation -@subsection Building and using @code{gawk} under VMS POSIX - -Ignore the instructions above, although @file{vms/gawk.hlp} should still -be made available in a help library. Make sure that the two scripts, -@file{configure} and @file{mungeconf}, are executable; use @samp{chmod +x} -on them if necessary. Then execute the following commands: - -@smallexample -$ POSIX -psx> configure vms-posix -psx> make awktab.c gawk -@end smallexample - -@noindent -The first command will construct files @file{config.h} and @file{Makefile} -out of templates. The second command will compile and link @code{gawk}. -Due to a @code{make} bug in VMS POSIX V1.0 and V1.1, -the file @file{awktab.c} must be given as an explicit target or it will -not be built and the final link step will fail. Ignore the warning -@samp{"Could not find lib m in lib list"}; it is harmless, caused by the -explicit use of @samp{-lm} as a linker option which is not needed -under VMS POSIX. Under V1.1 (but not V1.0) a problem with the @code{yacc} -skeleton @file{/etc/yyparse.c} will cause a compiler warning for -@file{awktab.c}, followed by a linker warning about compilation warnings -in the resulting object module. These warnings can be ignored.@refill - -Once built, @code{gawk} will work like any other shell utility. Unlike -the normal VMS port of @code{gawk}, no special command line manipulation is -needed in the VMS POSIX environment. - -@node MS-DOS Installation, Atari Installation, VMS Installation, Installation -@section Installing @code{gawk} on MS-DOS - -@cindex installation, ms-dos -The first step is to get all the files in the @code{gawk} distribution -onto your PC. Move all the files from the @file{pc} directory into -the main directory where the other files are. Edit the file -@file{make.bat} so that it will be an acceptable MS-DOS batch file. -This means making sure that all lines are terminated with the ASCII -carriage return and line feed characters. -restrictions. - -@code{gawk} has only been compiled with version 5.1 of the Microsoft -C compiler. The file @file{make.bat} from the @file{pc} directory -assumes that you have this compiler. - -Copy the file @file{setargv.obj} from the library directory where it -resides to the @code{gawk} source code directory. - -Run @file{make.bat}. This will compile @code{gawk} for you, and link it. -That's all there is to it! - -@node Atari Installation, , MS-DOS Installation, Installation -@section Installing @code{gawk} on the Atari ST - -@c based on material from -@c Michal Jaegermann <ntomczak@vm.ucs.ualberta.ca> - -@cindex installation, atari -This section assumes that you are running TOS. It applies to other Atari -models (STe, TT) as well. - -In order to use @code{gawk}, you need to have a shell, either text or -graphics, that does not map all the characters of a command line to -upper case. Maintaining case distinction in option flags is very -important (@pxref{Command Line, ,Invoking @code{awk}}). Popular shells -like @code{gulam} or @code{gemini} will work, as will newer versions of -@code{desktop}. Support for I/O redirection is necessary to make it easy -to import @code{awk} programs from other environments. Pipes are nice to have, -but not vital. - -If you have received an executable version of @code{gawk}, place it, -as usual, anywhere in your @code{PATH} where your shell will find it. - -While executing, @code{gawk} creates a number of temporary files. -@code{gawk} looks for either of the environment variables @code{TEMP} -or @code{TMPDIR}, in that order. If either one is found, its value -is assumed to be a directory for temporary files. This directory -must exist, and if you can spare the memory, it is a good idea to -put it on a @sc{ram} drive. If neither @code{TEMP} nor @code{TMPDIR} -are found, then @code{gawk} uses the current directory for its -temporary files. - -The ST version of @code{gawk} searches for its program files as -described in @ref{AWKPATH Variable, ,The @code{AWKPATH} Environment Variable}. -On the ST, the default value for the @code{AWKPATH} variable is -@code{@w{".,c:\lib\awk,c:\gnu\lib\awk"}}. -The search path can be modified by explicitly setting @code{AWKPATH} to -whatever you wish. Note that colons cannot be used on the ST to separate -elements in the @code{AWKPATH} variable, since they have another, reserved, -meaning. Instead, you must use a comma to separate elements in the path. -If you are recompiling @code{gawk} on the ST, then you can choose a new -default search path, by setting the value of @samp{DEFPATH} in the file -@file{...\config\atari}. You may choose a different separator character -by setting the value of @samp{ENVSEP} in the same file. The new values will -be used when creating the header file @file{config.h}.@refill - -@ignore -As a last resort, small -adjustments can be made directly on the executable version of @code{gawk} -using a binary editor.@refill -@end ignore - -Although @code{awk} allows great flexibility in doing I/O redirections -from within a program, this facility should be used with care on the ST. -In some circumstances the OS routines for file handle pool processing -lose track of certain events, causing the computer to crash, and requiring -a reboot. Often a warm reboot is sufficient. Fortunately, this happens -infrequently, and in rather esoteric situations. In particular, avoid -having one part of an @code{awk} program using @code{print} -statements explicitly redirected to @code{"/dev/stdout"}, while other -@code{print} statements use the default standard output, and a -calling shell has redirected standard output to a file.@refill -@c whew! - -When @code{gawk} is compiled with the ST version of @code{gcc} and its -usual libraries, it will accept both @samp{/} and @samp{\} as path separators. -While this is convenient, it should be remembered that this removes one, -technically legal, character (@samp{/}) from your file names, and that -it may create problems for external programs, called via the @code{system()} -function, which may not support this convention. Whenever it is possible -that a file created by @code{gawk} will be used by some other program, -use only backslashes. Also remember that in @code{awk}, backslashes in -strings have to be doubled in order to get literal backslashes. - -The initial port of @code{gawk} to the ST was done with @code{gcc}. -If you wish to recompile @code{gawk} from scratch, you will need to use -a compiler that accepts @sc{ansi} standard C (such as @code{gcc}, Turbo C, -or Prospero C). If @code{sizeof(int) != @w{sizeof(int *)}}, the correctness -of the generated code depends heavily on the fact that all function calls -have function prototypes in the current scope. If your compiler does -not accept function prototypes, you will probably have to add a -number of casts to the code.@refill - -If you are using @code{gcc}, make sure that you have up-to-date libraries. -Older versions have problems with some library functions (@code{atan2()}, -@code{strftime()}, the @samp{%g} conversion in @code{sprintf()}) which -may affect the operation of @code{gawk}. - -In the @file{atari} subdirectory of the @code{gawk} distribution is -a version of the @code{system()} function that has been tested with -@code{gulam} and @code{msh}; it should work with other shells as well. -With @code{gulam}, it passes the string to be executed without spawning -an extra copy of a shell. It is possible to replace this version of -@code{system()} with a similar function from a library or from some other -source if that version would be a better choice for the shell you prefer. - -The files needed to recompile @code{gawk} on the ST can be found in -the @file{atari} directory. The provided files and instructions below -assume that you have the GNU C compiler (@code{gcc}), the @code{gulam} shell, -and an ST version of @code{sed}. The @file{Makefile} is set up to use -@file{byacc} as a @file{yacc} replacement. With a different set of tools some -adjustments and/or editing will be needed.@refill - -@code{cd} to the @file{atari} directory. Copy @file{Makefile.st} to -@file{makefile} in the source (parent) directory. Possibly adjust -@file{../config/atari} to suit your system. Execute the script @file{mkconf.g} -which will create the header file @file{../config.h}. Go back to the source -directory. If you are not using @code{gcc}, check the file @file{missing.c}. -It may be necessary to change forward slashes in the references to files -from the @file{atari} subdirectory into backslashes. Type @code{make} and -enjoy.@refill - -Compilation with @code{gcc} of some of the bigger modules, like -@file{awk_tab.c}, may require a full four megabytes of memory. On smaller -machines you would need to cut down on optimizations, or you would have to -switch to another, less memory hungry, compiler.@refill - -@node Gawk Summary, Sample Program, Installation, Top -@appendix @code{gawk} Summary - -This appendix provides a brief summary of the @code{gawk} command line and the -@code{awk} language. It is designed to serve as ``quick reference.'' It is -therefore terse, but complete. - -@menu -* Command Line Summary:: Recapitulation of the command line. -* Language Summary:: A terse review of the language. -* Variables/Fields:: Variables, fields, and arrays. -* Rules Summary:: Patterns and Actions, and their - component parts. -* Functions Summary:: Defining and calling functions. -* Historical Features:: Some undocumented but supported ``features''. -@end menu - -@node Command Line Summary, Language Summary, Gawk Summary, Gawk Summary -@appendixsec Command Line Options Summary - -The command line consists of options to @code{gawk} itself, the -@code{awk} program text (if not supplied via the @samp{-f} option), and -values to be made available in the @code{ARGC} and @code{ARGV} -predefined @code{awk} variables: - -@example -awk @r{[@var{POSIX or GNU style options}]} -f source-file @r{[@code{--}]} @var{file} @dots{} -awk @r{[@var{POSIX or GNU style options}]} @r{[@code{--}]} '@var{program}' @var{file} @dots{} -@end example - -The options that @code{gawk} accepts are: - -@table @code -@item -F @var{fs} -@itemx --field-separator=@var{fs} -Use @var{fs} for the input field separator (the value of the @code{FS} -predefined variable). - -@item -f @var{program-file} -@itemx --file=@var{program-file} -Read the @code{awk} program source from the file @var{program-file}, instead -of from the first command line argument. - -@item -v @var{var}=@var{val} -@itemx --assign=@var{var}=@var{val} -Assign the variable @var{var} the value @var{val} before program execution -begins. - -@item -W compat -@itemx --compat -Specifies compatibility mode, in which @code{gawk} extensions are turned -off. - -@item -W copyleft -@itemx -W copyright -@itemx --copyleft -@itemx --copyright -Print the short version of the General Public License on the error -output. This option may disappear in a future version of @code{gawk}. - -@item -W help -@itemx -W usage -@itemx --help -@itemx --usage -Print a relatively short summary of the available options on the error output. - -@item -W lint -@itemx --lint -Give warnings about dubious or non-portable @code{awk} constructs. - -@item -W posix -@itemx --posix -Specifies @sc{posix} compatibility mode, in which @code{gawk} extensions -are turned off and additional restrictions apply. - -@item -W source=@var{program-text} -@itemx --source=@var{program-text} -Use @var{program-text} as @code{awk} program source code. This option allows -mixing command line source code with source code from files, and is -particularly useful for mixing command line programs with library functions. - -@item -W version -@itemx --version -Print version information for this particular copy of @code{gawk} on the error -output. This option may disappear in a future version of @code{gawk}. - -@item -- -Signal the end of options. This is useful to allow further arguments to the -@code{awk} program itself to start with a @samp{-}. This is mainly for -consistency with the argument parsing conventions of @sc{posix}. -@end table - -Any other options are flagged as invalid, but are otherwise ignored. -@xref{Command Line, ,Invoking @code{awk}}, for more details. - -@node Language Summary, Variables/Fields, Command Line Summary, Gawk Summary -@appendixsec Language Summary - -An @code{awk} program consists of a sequence of pattern-action statements -and optional function definitions. - -@example -@var{pattern} @{ @var{action statements} @} - -function @var{name}(@var{parameter list}) @{ @var{action statements} @} -@end example - -@code{gawk} first reads the program source from the -@var{program-file}(s) if specified, or from the first non-option -argument on the command line. The @samp{-f} option may be used multiple -times on the command line. @code{gawk} reads the program text from all -the @var{program-file} files, effectively concatenating them in the -order they are specified. This is useful for building libraries of -@code{awk} functions, without having to include them in each new -@code{awk} program that uses them. To use a library function in a file -from a program typed in on the command line, specify @samp{-f /dev/tty}; -then type your program, and end it with a @kbd{Control-d}. -@xref{Command Line, ,Invoking @code{awk}}.@refill - -The environment variable @code{AWKPATH} specifies a search path to use -when finding source files named with the @samp{-f} option. The default -path, which is -@samp{.:/usr/lib/awk:/usr/local/lib/awk} is used if @code{AWKPATH} is not set. -If a file name given to the @samp{-f} option contains a @samp{/} character, -no path search is performed. -@xref{AWKPATH Variable, ,The @code{AWKPATH} Environment Variable}, -for a full description of the @code{AWKPATH} environment variable.@refill - -@code{gawk} compiles the program into an internal form, and then proceeds to -read each file named in the @code{ARGV} array. If there are no files named -on the command line, @code{gawk} reads the standard input. - -If a ``file'' named on the command line has the form -@samp{@var{var}=@var{val}}, it is treated as a variable assignment: the -variable @var{var} is assigned the value @var{val}. -If any of the files have a value that is the null string, that -element in the list is skipped.@refill - -For each line in the input, @code{gawk} tests to see if it matches any -@var{pattern} in the @code{awk} program. For each pattern that the line -matches, the associated @var{action} is executed. - -@node Variables/Fields, Rules Summary, Language Summary, Gawk Summary -@appendixsec Variables and Fields - -@code{awk} variables are dynamic; they come into existence when they are -first used. Their values are either floating-point numbers or strings. -@code{awk} also has one-dimension arrays; multiple-dimensional arrays -may be simulated. There are several predefined variables that -@code{awk} sets as a program runs; these are summarized below. - -@menu -* Fields Summary:: Input field splitting. -* Built-in Summary:: @code{awk}'s built-in variables. -* Arrays Summary:: Using arrays. -* Data Type Summary:: Values in @code{awk} are numbers or strings. -@end menu - -@node Fields Summary, Built-in Summary, Variables/Fields, Variables/Fields -@appendixsubsec Fields - -As each input line is read, @code{gawk} splits the line into -@var{fields}, using the value of the @code{FS} variable as the field -separator. If @code{FS} is a single character, fields are separated by -that character. Otherwise, @code{FS} is expected to be a full regular -expression. In the special case that @code{FS} is a single blank, -fields are separated by runs of blanks and/or tabs. Note that the value -of @code{IGNORECASE} (@pxref{Case-sensitivity, ,Case-sensitivity in Matching}) -also affects how fields are split when @code{FS} is a regular expression.@refill - -Each field in the input line may be referenced by its position, @code{$1}, -@code{$2}, and so on. @code{$0} is the whole line. The value of a field may -be assigned to as well. Field numbers need not be constants: - -@example -n = 5 -print $n -@end example - -@noindent -prints the fifth field in the input line. The variable @code{NF} is set to -the total number of fields in the input line. - -References to nonexistent fields (i.e., fields after @code{$NF}) return -the null-string. However, assigning to a nonexistent field (e.g., -@code{$(NF+2) = 5}) increases the value of @code{NF}, creates any -intervening fields with the null string as their value, and causes the -value of @code{$0} to be recomputed, with the fields being separated by -the value of @code{OFS}.@refill - -@xref{Reading Files, ,Reading Input Files}, for a full description of the -way @code{awk} defines and uses fields. - -@node Built-in Summary, Arrays Summary, Fields Summary, Variables/Fields -@appendixsubsec Built-in Variables - -@code{awk}'s built-in variables are: - -@table @code -@item ARGC -The number of command line arguments (not including options or the -@code{awk} program itself). - -@item ARGIND -The index in @code{ARGV} of the current file being processed. -It is always true that @samp{FILENAME == ARGV[ARGIND]}. - -@item ARGV -The array of command line arguments. The array is indexed from 0 to -@code{ARGC} @minus{} 1. Dynamically changing the contents of @code{ARGV} -can control the files used for data.@refill - -@item CONVFMT -The conversion format to use when converting numbers to strings. - -@item FIELDWIDTHS -A space separated list of numbers describing the fixed-width input data. - -@item ENVIRON -An array containing the values of the environment variables. The array -is indexed by variable name, each element being the value of that -variable. Thus, the environment variable @code{HOME} would be in -@code{ENVIRON["HOME"]}. Its value might be @file{/u/close}. - -Changing this array does not affect the environment seen by programs -which @code{gawk} spawns via redirection or the @code{system} function. -(This may change in a future version of @code{gawk}.) - -Some operating systems do not have environment variables. -The array @code{ENVIRON} is empty when running on these systems. - -@item ERRNO -The system error message when an error occurs using @code{getline} -or @code{close}. - -@item FILENAME -The name of the current input file. If no files are specified on the command -line, the value of @code{FILENAME} is @samp{-}. - -@item FNR -The input record number in the current input file. - -@item FS -The input field separator, a blank by default. - -@item IGNORECASE -The case-sensitivity flag for regular expression operations. If -@code{IGNORECASE} has a nonzero value, then pattern matching in rules, -field splitting with @code{FS}, regular expression matching with -@samp{~} and @samp{!~}, and the @code{gsub}, @code{index}, @code{match}, -@code{split} and @code{sub} predefined functions all ignore case -when doing regular expression operations.@refill - -@item NF -The number of fields in the current input record. - -@item NR -The total number of input records seen so far. - -@item OFMT -The output format for numbers for the @code{print} statement, -@code{"%.6g"} by default. - -@item OFS -The output field separator, a blank by default. - -@item ORS -The output record separator, by default a newline. - -@item RS -The input record separator, by default a newline. @code{RS} is exceptional -in that only the first character of its string value is used for separating -records. If @code{RS} is set to the null string, then records are separated by -blank lines. When @code{RS} is set to the null string, then the newline -character always acts as a field separator, in addition to whatever value -@code{FS} may have.@refill - -@item RSTART -The index of the first character matched by @code{match}; 0 if no match. - -@item RLENGTH -The length of the string matched by @code{match}; @minus{}1 if no match. - -@item SUBSEP -The string used to separate multiple subscripts in array elements, by -default @code{"\034"}. -@end table - -@xref{Built-in Variables}, for more information. - -@node Arrays Summary, Data Type Summary, Built-in Summary, Variables/Fields -@appendixsubsec Arrays - -Arrays are subscripted with an expression between square brackets -(@samp{[} and @samp{]}). Array subscripts are @emph{always} strings; -numbers are converted to strings as necessary, following the standard -conversion rules -(@pxref{Conversion, ,Conversion of Strings and Numbers}).@refill - -If you use multiple expressions separated by commas inside the square -brackets, then the array subscript is a string consisting of the -concatenation of the individual subscript values, converted to strings, -separated by the subscript separator (the value of @code{SUBSEP}). - -The special operator @code{in} may be used in an @code{if} or -@code{while} statement to see if an array has an index consisting of a -particular value. - -@example -if (val in array) - print array[val] -@end example - -If the array has multiple subscripts, use @code{(i, j, @dots{}) in array} -to test for existence of an element. - -The @code{in} construct may also be used in a @code{for} loop to iterate -over all the elements of an array. -@xref{Scanning an Array, ,Scanning all Elements of an Array}.@refill - -An element may be deleted from an array using the @code{delete} statement. - -@xref{Arrays, ,Arrays in @code{awk}}, for more detailed information. - -@node Data Type Summary, , Arrays Summary, Variables/Fields -@appendixsubsec Data Types - -The value of an @code{awk} expression is always either a number -or a string. - -Certain contexts (such as arithmetic operators) require numeric -values. They convert strings to numbers by interpreting the text -of the string as a numeral. If the string does not look like a -numeral, it converts to 0. - -Certain contexts (such as concatenation) require string values. -They convert numbers to strings by effectively printing them -with @code{sprintf}. -@xref{Conversion, ,Conversion of Strings and Numbers}, for the details.@refill - -To force conversion of a string value to a number, simply add 0 -to it. If the value you start with is already a number, this -does not change it. - -To force conversion of a numeric value to a string, concatenate it with -the null string. - -The @code{awk} language defines comparisons as being done numerically if -both operands are numeric, or if one is numeric and the other is a numeric -string. Otherwise one or both operands are converted to strings and a -string comparison is performed. - -Uninitialized variables have the string value @code{""} (the null, or -empty, string). In contexts where a number is required, this is -equivalent to 0. - -@xref{Variables}, for more information on variable naming and initialization; -@pxref{Conversion, ,Conversion of Strings and Numbers}, for more information -on how variable values are interpreted.@refill - -@node Rules Summary, Functions Summary, Variables/Fields, Gawk Summary -@appendixsec Patterns and Actions - -@menu -* Pattern Summary:: Quick overview of patterns. -* Regexp Summary:: Quick overview of regular expressions. -* Actions Summary:: Quick overview of actions. -@end menu - -An @code{awk} program is mostly composed of rules, each consisting of a -pattern followed by an action. The action is enclosed in @samp{@{} and -@samp{@}}. Either the pattern may be missing, or the action may be -missing, but, of course, not both. If the pattern is missing, the -action is executed for every single line of input. A missing action is -equivalent to this action, - -@example -@{ print @} -@end example - -@noindent -which prints the entire line. - -Comments begin with the @samp{#} character, and continue until the end of the -line. Blank lines may be used to separate statements. Normally, a statement -ends with a newline, however, this is not the case for lines ending in a -@samp{,}, @samp{@{}, @samp{?}, @samp{:}, @samp{&&}, or @samp{||}. Lines -ending in @code{do} or @code{else} also have their statements automatically -continued on the following line. In other cases, a line can be continued by -ending it with a @samp{\}, in which case the newline is ignored.@refill - -Multiple statements may be put on one line by separating them with a @samp{;}. -This applies to both the statements within the action part of a rule (the -usual case), and to the rule statements. - -@xref{Comments, ,Comments in @code{awk} Programs}, for information on -@code{awk}'s commenting convention; -@pxref{Statements/Lines, ,@code{awk} Statements versus Lines}, for a -description of the line continuation mechanism in @code{awk}.@refill - -@node Pattern Summary, Regexp Summary, Rules Summary, Rules Summary -@appendixsubsec Patterns - -@code{awk} patterns may be one of the following: - -@example -/@var{regular expression}/ -@var{relational expression} -@var{pattern} && @var{pattern} -@var{pattern} || @var{pattern} -@var{pattern} ? @var{pattern} : @var{pattern} -(@var{pattern}) -! @var{pattern} -@var{pattern1}, @var{pattern2} -BEGIN -END -@end example - -@code{BEGIN} and @code{END} are two special kinds of patterns that are not -tested against the input. The action parts of all @code{BEGIN} rules are -merged as if all the statements had been written in a single @code{BEGIN} -rule. They are executed before any of the input is read. Similarly, all the -@code{END} rules are merged, and executed when all the input is exhausted (or -when an @code{exit} statement is executed). @code{BEGIN} and @code{END} -patterns cannot be combined with other patterns in pattern expressions. -@code{BEGIN} and @code{END} rules cannot have missing action parts.@refill - -For @samp{/@var{regular-expression}/} patterns, the associated statement is -executed for each input line that matches the regular expression. Regular -expressions are extensions of those in @code{egrep}, and are summarized below. - -A @var{relational expression} may use any of the operators defined below in -the section on actions. These generally test whether certain fields match -certain regular expressions. - -The @samp{&&}, @samp{||}, and @samp{!} operators are logical ``and,'' -logical ``or,'' and logical ``not,'' respectively, as in C. They do -short-circuit evaluation, also as in C, and are used for combining more -primitive pattern expressions. As in most languages, parentheses may be -used to change the order of evaluation. - -The @samp{?:} operator is like the same operator in C. If the first -pattern matches, then the second pattern is matched against the input -record; otherwise, the third is matched. Only one of the second and -third patterns is matched. - -The @samp{@var{pattern1}, @var{pattern2}} form of a pattern is called a -range pattern. It matches all input lines starting with a line that -matches @var{pattern1}, and continuing until a line that matches -@var{pattern2}, inclusive. A range pattern cannot be used as an operand -to any of the pattern operators. - -@xref{Patterns}, for a full description of the pattern part of @code{awk} -rules. - -@node Regexp Summary, Actions Summary, Pattern Summary, Rules Summary -@appendixsubsec Regular Expressions - -Regular expressions are the extended kind found in @code{egrep}. -They are composed of characters as follows: - -@table @code -@item @var{c} -matches the character @var{c} (assuming @var{c} is a character with no -special meaning in regexps). - -@item \@var{c} -matches the literal character @var{c}. - -@item . -matches any character except newline. - -@item ^ -matches the beginning of a line or a string. - -@item $ -matches the end of a line or a string. - -@item [@var{abc}@dots{}] -matches any of the characters @var{abc}@dots{} (character class). - -@item [^@var{abc}@dots{}] -matches any character except @var{abc}@dots{} and newline (negated -character class). - -@item @var{r1}|@var{r2} -matches either @var{r1} or @var{r2} (alternation). - -@item @var{r1r2} -matches @var{r1}, and then @var{r2} (concatenation). - -@item @var{r}+ -matches one or more @var{r}'s. - -@item @var{r}* -matches zero or more @var{r}'s. - -@item @var{r}? -matches zero or one @var{r}'s. - -@item (@var{r}) -matches @var{r} (grouping). -@end table - -@xref{Regexp, ,Regular Expressions as Patterns}, for a more detailed -explanation of regular expressions. - -The escape sequences allowed in string constants are also valid in -regular expressions (@pxref{Constants, ,Constant Expressions}). - -@node Actions Summary, , Regexp Summary, Rules Summary -@appendixsubsec Actions - -Action statements are enclosed in braces, @samp{@{} and @samp{@}}. -Action statements consist of the usual assignment, conditional, and looping -statements found in most languages. The operators, control statements, -and input/output statements available are patterned after those in C. - -@menu -* Operator Summary:: @code{awk} operators. -* Control Flow Summary:: The control statements. -* I/O Summary:: The I/O statements. -* Printf Summary:: A summary of @code{printf}. -* Special File Summary:: Special file names interpreted internally. -* Numeric Functions Summary:: Built-in numeric functions. -* String Functions Summary:: Built-in string functions. -* Time Functions Summary:: Built-in time functions. -* String Constants Summary:: Escape sequences in strings. -@end menu - -@node Operator Summary, Control Flow Summary, Actions Summary, Actions Summary -@appendixsubsubsec Operators - -The operators in @code{awk}, in order of increasing precedence, are: - -@table @code -@item = += -= *= /= %= ^= -Assignment. Both absolute assignment (@code{@var{var}=@var{value}}) -and operator assignment (the other forms) are supported. - -@item ?: -A conditional expression, as in C. This has the form @code{@var{expr1} ? -@var{expr2} : @var{expr3}}. If @var{expr1} is true, the value of the -expression is @var{expr2}; otherwise it is @var{expr3}. Only one of -@var{expr2} and @var{expr3} is evaluated.@refill - -@item || -Logical ``or''. - -@item && -Logical ``and''. - -@item ~ !~ -Regular expression match, negated match. - -@item < <= > >= != == -The usual relational operators. - -@item @var{blank} -String concatenation. - -@item + - -Addition and subtraction. - -@item * / % -Multiplication, division, and modulus. - -@item + - ! -Unary plus, unary minus, and logical negation. - -@item ^ -Exponentiation (@samp{**} may also be used, and @samp{**=} for the assignment -operator, but they are not specified in the @sc{posix} standard). - -@item ++ -- -Increment and decrement, both prefix and postfix. - -@item $ -Field reference. -@end table - -@xref{Expressions, ,Expressions as Action Statements}, for a full -description of all the operators listed above. -@xref{Fields, ,Examining Fields}, for a description of the field -reference operator.@refill - -@node Control Flow Summary, I/O Summary, Operator Summary, Actions Summary -@appendixsubsubsec Control Statements - -The control statements are as follows: - -@example -if (@var{condition}) @var{statement} @r{[} else @var{statement} @r{]} -while (@var{condition}) @var{statement} -do @var{statement} while (@var{condition}) -for (@var{expr1}; @var{expr2}; @var{expr3}) @var{statement} -for (@var{var} in @var{array}) @var{statement} -break -continue -delete @var{array}[@var{index}] -exit @r{[} @var{expression} @r{]} -@{ @var{statements} @} -@end example - -@xref{Statements, ,Control Statements in Actions}, for a full description -of all the control statements listed above. - -@node I/O Summary, Printf Summary, Control Flow Summary, Actions Summary -@appendixsubsubsec I/O Statements - -The input/output statements are as follows: - -@table @code -@item getline -Set @code{$0} from next input record; set @code{NF}, @code{NR}, @code{FNR}. - -@item getline <@var{file} -Set @code{$0} from next record of @var{file}; set @code{NF}. - -@item getline @var{var} -Set @var{var} from next input record; set @code{NF}, @code{FNR}. - -@item getline @var{var} <@var{file} -Set @var{var} from next record of @var{file}. - -@item next -Stop processing the current input record. The next input record is read and -processing starts over with the first pattern in the @code{awk} program. -If the end of the input data is reached, the @code{END} rule(s), if any, -are executed. - -@item next file -Stop processing the current input file. The next input record read comes -from the next input file. @code{FILENAME} is updated, @code{FNR} is set to 1, -and processing starts over with the first pattern in the @code{awk} program. -If the end of the input data is reached, the @code{END} rule(s), if any, -are executed. - -@item print -Prints the current record. - -@item print @var{expr-list} -Prints expressions. - -@item print @var{expr-list} > @var{file} -Prints expressions on @var{file}. - -@item printf @var{fmt, expr-list} -Format and print. - -@item printf @var{fmt, expr-list} > file -Format and print on @var{file}. -@end table - -Other input/output redirections are also allowed. For @code{print} and -@code{printf}, @samp{>> @var{file}} appends output to the @var{file}, -and @samp{| @var{command}} writes on a pipe. In a similar fashion, -@samp{@var{command} | getline} pipes input into @code{getline}. -@code{getline} returns 0 on end of file, and @minus{}1 on an error.@refill - -@xref{Getline, ,Explicit Input with @code{getline}}, for a full description -of the @code{getline} statement. -@xref{Printing, ,Printing Output}, for a full description of @code{print} and -@code{printf}. Finally, @pxref{Next Statement, ,The @code{next} Statement}, -for a description of how the @code{next} statement works.@refill - -@node Printf Summary, Special File Summary, I/O Summary, Actions Summary -@appendixsubsubsec @code{printf} Summary - -The @code{awk} @code{printf} statement and @code{sprintf} function -accept the following conversion specification formats: - -@table @code -@item %c -An ASCII character. If the argument used for @samp{%c} is numeric, it is -treated as a character and printed. Otherwise, the argument is assumed to -be a string, and the only first character of that string is printed. - -@item %d -@itemx %i -A decimal number (the integer part). - -@item %e -A floating point number of the form -@samp{@r{[}-@r{]}d.ddddddE@r{[}+-@r{]}dd}.@refill - -@item %f -A floating point number of the form -@r{[}@code{-}@r{]}@code{ddd.dddddd}. - -@item %g -Use @samp{%e} or @samp{%f} conversion, whichever produces a shorter string, -with nonsignificant zeros suppressed. - -@item %o -An unsigned octal number (again, an integer). - -@item %s -A character string. - -@item %x -An unsigned hexadecimal number (an integer). - -@item %X -Like @samp{%x}, except use @samp{A} through @samp{F} instead of @samp{a} -through @samp{f} for decimal 10 through 15.@refill - -@item %% -A single @samp{%} character; no argument is converted. -@end table - -There are optional, additional parameters that may lie between the @samp{%} -and the control letter: - -@table @code -@item - -The expression should be left-justified within its field. - -@item @var{width} -The field should be padded to this width. If @var{width} has a leading zero, -then the field is padded with zeros. Otherwise it is padded with blanks. - -@item .@var{prec} -A number indicating the maximum width of strings or digits to the right -of the decimal point. -@end table - -Either or both of the @var{width} and @var{prec} values may be specified -as @samp{*}. In that case, the particular value is taken from the argument -list. - -@xref{Printf, ,Using @code{printf} Statements for Fancier Printing}, for -examples and for a more detailed description. - -@node Special File Summary, Numeric Functions Summary, Printf Summary, Actions Summary -@appendixsubsubsec Special File Names - -When doing I/O redirection from either @code{print} or @code{printf} into a -file, or via @code{getline} from a file, @code{gawk} recognizes certain special -file names internally. These file names allow access to open file descriptors -inherited from @code{gawk}'s parent process (usually the shell). The -file names are: - -@table @file -@item /dev/stdin -The standard input. - -@item /dev/stdout -The standard output. - -@item /dev/stderr -The standard error output. - -@item /dev/fd/@var{n} -The file denoted by the open file descriptor @var{n}. -@end table - -In addition the following files provide process related information -about the running @code{gawk} program. - -@table @file -@item /dev/pid -Reading this file returns the process ID of the current process, -in decimal, terminated with a newline. - -@item /dev/ppid -Reading this file returns the parent process ID of the current process, -in decimal, terminated with a newline. - -@item /dev/pgrpid -Reading this file returns the process group ID of the current process, -in decimal, terminated with a newline. - -@item /dev/user -Reading this file returns a single record terminated with a newline. -The fields are separated with blanks. The fields represent the -following information: - -@table @code -@item $1 -The value of the @code{getuid} system call. - -@item $2 -The value of the @code{geteuid} system call. - -@item $3 -The value of the @code{getgid} system call. - -@item $4 -The value of the @code{getegid} system call. -@end table - -If there are any additional fields, they are the group IDs returned by -@code{getgroups} system call. -(Multiple groups may not be supported on all systems.)@refill -@end table - -@noindent -These file names may also be used on the command line to name data files. -These file names are only recognized internally if you do not -actually have files by these names on your system. - -@xref{Special Files, ,Standard I/O Streams}, for a longer description that -provides the motivation for this feature. - -@node Numeric Functions Summary, String Functions Summary, Special File Summary, Actions Summary -@appendixsubsubsec Numeric Functions - -@code{awk} has the following predefined arithmetic functions: - -@table @code -@item atan2(@var{y}, @var{x}) -returns the arctangent of @var{y/x} in radians. - -@item cos(@var{expr}) -returns the cosine in radians. - -@item exp(@var{expr}) -the exponential function. - -@item int(@var{expr}) -truncates to integer. - -@item log(@var{expr}) -the natural logarithm function. - -@item rand() -returns a random number between 0 and 1. - -@item sin(@var{expr}) -returns the sine in radians. - -@item sqrt(@var{expr}) -the square root function. - -@item srand(@var{expr}) -use @var{expr} as a new seed for the random number generator. If no @var{expr} -is provided, the time of day is used. The return value is the previous -seed for the random number generator. -@end table - -@node String Functions Summary, Time Functions Summary, Numeric Functions Summary, Actions Summary -@appendixsubsubsec String Functions - -@code{awk} has the following predefined string functions: - -@table @code -@item gsub(@var{r}, @var{s}, @var{t}) -for each substring matching the regular expression @var{r} in the string -@var{t}, substitute the string @var{s}, and return the number of substitutions. -If @var{t} is not supplied, use @code{$0}. - -@item index(@var{s}, @var{t}) -returns the index of the string @var{t} in the string @var{s}, or 0 if -@var{t} is not present. - -@item length(@var{s}) -returns the length of the string @var{s}. The length of @code{$0} -is returned if no argument is supplied. - -@item match(@var{s}, @var{r}) -returns the position in @var{s} where the regular expression @var{r} -occurs, or 0 if @var{r} is not present, and sets the values of @code{RSTART} -and @code{RLENGTH}. - -@item split(@var{s}, @var{a}, @var{r}) -splits the string @var{s} into the array @var{a} on the regular expression -@var{r}, and returns the number of fields. If @var{r} is omitted, @code{FS} -is used instead. - -@item sprintf(@var{fmt}, @var{expr-list}) -prints @var{expr-list} according to @var{fmt}, and returns the resulting string. - -@item sub(@var{r}, @var{s}, @var{t}) -this is just like @code{gsub}, but only the first matching substring is -replaced. - -@item substr(@var{s}, @var{i}, @var{n}) -returns the @var{n}-character substring of @var{s} starting at @var{i}. -If @var{n} is omitted, the rest of @var{s} is used. - -@item tolower(@var{str}) -returns a copy of the string @var{str}, with all the upper-case characters in -@var{str} translated to their corresponding lower-case counterparts. -Nonalphabetic characters are left unchanged. - -@item toupper(@var{str}) -returns a copy of the string @var{str}, with all the lower-case characters in -@var{str} translated to their corresponding upper-case counterparts. -Nonalphabetic characters are left unchanged. - -@item system(@var{cmd-line}) -Execute the command @var{cmd-line}, and return the exit status. -@end table - -@node Time Functions Summary, String Constants Summary, String Functions Summary, Actions Summary -@appendixsubsubsec Built-in time functions - -The following two functions are available for getting the current -time of day, and for formatting time stamps. - -@table @code -@item systime() -returns the current time of day as the number of seconds since a particular -epoch (Midnight, January 1, 1970 @sc{utc}, on @sc{posix} systems). - -@item strftime(@var{format}, @var{timestamp}) -formats @var{timestamp} according to the specification in @var{format}. -The current time of day is used if no @var{timestamp} is supplied. -@xref{Time Functions, ,Functions for Dealing with Time Stamps}, for the -details on the conversion specifiers that @code{strftime} accepts.@refill -@end table - -@iftex -@xref{Built-in, ,Built-in Functions}, for a description of all of -@code{awk}'s built-in functions. -@end iftex - -@node String Constants Summary, , Time Functions Summary, Actions Summary -@appendixsubsubsec String Constants - -String constants in @code{awk} are sequences of characters enclosed -between double quotes (@code{"}). Within strings, certain @dfn{escape sequences} -are recognized, as in C. These are: - -@table @code -@item \\ -A literal backslash. - -@item \a -The ``alert'' character; usually the ASCII BEL character. - -@item \b -Backspace. - -@item \f -Formfeed. - -@item \n -Newline. - -@item \r -Carriage return. - -@item \t -Horizontal tab. - -@item \v -Vertical tab. - -@item \x@var{hex digits} -The character represented by the string of hexadecimal digits following -the @samp{\x}. As in @sc{ansi} C, all following hexadecimal digits are -considered part of the escape sequence. (This feature should tell us -something about language design by committee.) E.g., @code{"\x1B"} is a -string containing the ASCII ESC (escape) character. (The @samp{\x} -escape sequence is not in @sc{posix} @code{awk}.) - -@item \@var{ddd} -The character represented by the 1-, 2-, or 3-digit sequence of octal -digits. Thus, @code{"\033"} is also a string containing the ASCII ESC -(escape) character. - -@item \@var{c} -The literal character @var{c}. -@end table - -The escape sequences may also be used inside constant regular expressions -(e.g., the regexp @code{@w{/[@ \t\f\n\r\v]/}} matches whitespace -characters).@refill - -@xref{Constants, ,Constant Expressions}. - -@node Functions Summary, Historical Features, Rules Summary, Gawk Summary -@appendixsec Functions - -Functions in @code{awk} are defined as follows: - -@example -function @var{name}(@var{parameter list}) @{ @var{statements} @} -@end example - -Actual parameters supplied in the function call are used to instantiate -the formal parameters declared in the function. Arrays are passed by -reference, other variables are passed by value. - -If there are fewer arguments passed than there are names in @var{parameter-list}, -the extra names are given the null string as value. Extra names have the -effect of local variables. - -The open-parenthesis in a function call of a user-defined function must -immediately follow the function name, without any intervening white space. -This is to avoid a syntactic ambiguity with the concatenation operator. - -The word @code{func} may be used in place of @code{function} (but not in -@sc{posix} @code{awk}). - -Use the @code{return} statement to return a value from a function. - -@xref{User-defined, ,User-defined Functions}, for a more complete description. - -@node Historical Features, , Functions Summary, Gawk Summary -@appendixsec Historical Features - -There are two features of historical @code{awk} implementations that -@code{gawk} supports. First, it is possible to call the @code{length} -built-in function not only with no arguments, but even without parentheses! - -@example -a = length -@end example - -@noindent -is the same as either of - -@example -a = length() -a = length($0) -@end example - -@noindent -This feature is marked as ``deprecated'' in the @sc{posix} standard, and -@code{gawk} will issue a warning about its use if @samp{-W lint} is -specified on the command line. - -The other feature is the use of the @code{continue} statement outside the -body of a @code{while}, @code{for}, or @code{do} loop. Traditional -@code{awk} implementations have treated such usage as equivalent to the -@code{next} statement. @code{gawk} will support this usage if @samp{-W posix} -has not been specified. - -@node Sample Program, Bugs, Gawk Summary, Top -@appendix Sample Program - -The following example is a complete @code{awk} program, which prints -the number of occurrences of each word in its input. It illustrates the -associative nature of @code{awk} arrays by using strings as subscripts. It -also demonstrates the @samp{for @var{x} in @var{array}} construction. -Finally, it shows how @code{awk} can be used in conjunction with other -utility programs to do a useful task of some complexity with a minimum of -effort. Some explanations follow the program listing.@refill - -@example -awk ' -# Print list of word frequencies -@{ - for (i = 1; i <= NF; i++) - freq[$i]++ -@} - -END @{ - for (word in freq) - printf "%s\t%d\n", word, freq[word] -@}' -@end example - -The first thing to notice about this program is that it has two rules. The -first rule, because it has an empty pattern, is executed on every line of -the input. It uses @code{awk}'s field-accessing mechanism -(@pxref{Fields, ,Examining Fields}) to pick out the individual words from -the line, and the built-in variable @code{NF} (@pxref{Built-in Variables}) -to know how many fields are available.@refill - -For each input word, an element of the array @code{freq} is incremented to -reflect that the word has been seen an additional time.@refill - -The second rule, because it has the pattern @code{END}, is not executed -until the input has been exhausted. It prints out the contents of the -@code{freq} table that has been built up inside the first action.@refill - -Note that this program has several problems that would prevent it from being -useful by itself on real text files:@refill - -@itemize @bullet -@item -Words are detected using the @code{awk} convention that fields are -separated by whitespace and that other characters in the input (except -newlines) don't have any special meaning to @code{awk}. This means that -punctuation characters count as part of words.@refill - -@item -The @code{awk} language considers upper and lower case characters to be -distinct. Therefore, @samp{foo} and @samp{Foo} are not treated by this -program as the same word. This is undesirable since in normal text, words -are capitalized if they begin sentences, and a frequency analyzer should not -be sensitive to that.@refill - -@item -The output does not come out in any useful order. You're more likely to be -interested in which words occur most frequently, or having an alphabetized -table of how frequently each word occurs.@refill -@end itemize - -The way to solve these problems is to use some of the more advanced -features of the @code{awk} language. First, we use @code{tolower} to remove -case distinctions. Next, we use @code{gsub} to remove punctuation -characters. Finally, we use the system @code{sort} utility to process the -output of the @code{awk} script. First, here is the new version of -the program:@refill - -@example -awk ' -# Print list of word frequencies -@{ - $0 = tolower($0) # remove case distinctions - gsub(/[^a-z0-9_ \t]/, "", $0) # remove punctuation - for (i = 1; i <= NF; i++) - freq[$i]++ -@} - -END @{ - for (word in freq) - printf "%s\t%d\n", word, freq[word] -@}' -@end example - -Assuming we have saved this program in a file named @file{frequency.awk}, -and that the data is in @file{file1}, the following pipeline - -@example -awk -f frequency.awk file1 | sort +1 -nr -@end example - -@noindent -produces a table of the words appearing in @file{file1} in order of -decreasing frequency. - -The @code{awk} program suitably massages the data and produces a word -frequency table, which is not ordered. - -The @code{awk} script's output is then sorted by the @code{sort} command and -printed on the terminal. The options given to @code{sort} in this example -specify to sort using the second field of each input line (skipping one field), -that the sort keys should be treated as numeric quantities (otherwise -@samp{15} would come before @samp{5}), and that the sorting should be done -in descending (reverse) order.@refill - -We could have even done the @code{sort} from within the program, by -changing the @code{END} action to: - -@example -END @{ - sort = "sort +1 -nr" - for (word in freq) - printf "%s\t%d\n", word, freq[word] | sort - close(sort) -@}' -@end example - -See the general operating system documentation for more information on how -to use the @code{sort} command.@refill - -@ignore -@strong{ADR: I have some more substantial programs courtesy of Rick Adams -at UUNET. I am planning on incorporating those either in addition to or -instead of this program.} - -@strong{I would also like to incorporate the general @code{translate} -function that I have written.} - -@strong{I have a ton of other sample programs to include too.} -@end ignore - -@node Bugs, Notes, Sample Program, Top -@appendix Reporting Problems and Bugs - -@c This chapter stolen shamelessly from the GNU m4 manual. -@c This chapter has been unshamelessly altered to emulate changes made to -@c make.texi from whence it was originally shamelessly stolen! :-} --mew - -If you have problems with @code{gawk} or think that you have found a bug, -please report it to the developers; we cannot promise to do anything -but we might well want to fix it. - -Before reporting a bug, make sure you have actually found a real bug. -Carefully reread the documentation and see if it really says you can do -what you're trying to do. If it's not clear whether you should be able -to do something or not, report that too; it's a bug in the documentation! - -Before reporting a bug or trying to fix it yourself, try to isolate it -to the smallest possible @code{awk} program and input data file that -reproduces the problem. Then send us the program and data file, -some idea of what kind of Unix system you're using, and the exact results -@code{gawk} gave you. Also say what you expected to occur; this will help -us decide whether the problem was really in the documentation. - -Once you have a precise problem, send e-mail to (Internet) -@samp{bug-gnu-utils@@prep.ai.mit.edu} or (UUCP) -@samp{mit-eddie!prep.ai.mit.edu!bug-gnu-utils}. Please include the -version number of @code{gawk} you are using. You can get this information -with the command @samp{gawk -W version '@{@}' /dev/null}. -You should send carbon copies of your mail to David Trueman at -@samp{david@@cs.dal.ca}, and to Arnold Robbins, who can be reached at -@samp{arnold@@skeeve.atl.ga.us}. David is most likely to fix code -problems, while Arnold is most likely to fix documentation problems.@refill - -Non-bug suggestions are always welcome as well. If you have questions -about things that are unclear in the documentation or are just obscure -features, ask Arnold Robbins; he will try to help you out, although he -may not have the time to fix the problem. You can send him electronic mail at the Internet address -above. - -If you find bugs in one of the non-Unix ports of @code{gawk}, please send -an electronic mail message to the person who maintains that port. They -are listed below, and also in the @file{README} file in the @code{gawk} -distribution. Information in the @code{README} file should be considered -authoritative if it conflicts with this manual. - -The people maintaining the non-Unix ports of @code{gawk} are: - -@table @asis -@item MS-DOS -The port to MS-DOS is maintained by Scott Deifik. -His electronic mail address is @samp{scottd@@amgen.com}. - -@item VMS -The port to VAX VMS is maintained by Pat Rankin. -His electronic mail address is @samp{rankin@@eql.caltech.edu}. - -@item Atari ST -The port to the Atari ST is maintained by Michal Jaegermann. -His electronic mail address is @samp{ntomczak@@vm.ucs.ualberta.ca}. - -@end table - -If your bug is also reproducible under Unix, please send copies of your -report to the general GNU bug list, as well as to Arnold Robbins and David -Trueman, at the addresses listed above. - -@node Notes, Glossary, Bugs, Top -@appendix Implementation Notes - -This appendix contains information mainly of interest to implementors and -maintainers of @code{gawk}. Everything in it applies specifically to -@code{gawk}, and not to other implementations. - -@menu -* Compatibility Mode:: How to disable certain @code{gawk} extensions. -* Future Extensions:: New features we may implement soon. -* Improvements:: Suggestions for improvements by volunteers. -@end menu - -@node Compatibility Mode, Future Extensions, Notes, Notes -@appendixsec Downward Compatibility and Debugging - -@xref{POSIX/GNU, ,Extensions in @code{gawk} not in POSIX @code{awk}}, -for a summary of the GNU extensions to the @code{awk} language and program. -All of these features can be turned off by invoking @code{gawk} with the -@samp{-W compat} option, or with the @samp{-W posix} option.@refill - -If @code{gawk} is compiled for debugging with @samp{-DDEBUG}, then there -is one more option available on the command line: - -@table @samp -@item -W parsedebug -Print out the parse stack information as the program is being parsed. -@end table - -This option is intended only for serious @code{gawk} developers, -and not for the casual user. It probably has not even been compiled into -your version of @code{gawk}, since it slows down execution. - -@node Future Extensions, Improvements, Compatibility Mode, Notes -@appendixsec Probable Future Extensions - -This section briefly lists extensions that indicate the directions we are -currently considering for @code{gawk}. The file @file{FUTURES} in the -@code{gawk} distributions lists these extensions, as well as several others. - -@table @asis -@item @code{RS} as a regexp -The meaning of @code{RS} may be generalized along the lines of @code{FS}. - -@item Control of subprocess environment -Changes made in @code{gawk} to the array @code{ENVIRON} may be -propagated to subprocesses run by @code{gawk}. - -@item Databases -It may be possible to map a GDBM/NDBM/SDBM file into an @code{awk} array. - -@item Single-character fields -The null string, @code{""}, as a field separator, will cause field -splitting and the @code{split} function to separate individual characters. -Thus, @code{split(a, "abcd", "")} would yield @code{a[1] == "a"}, -@code{a[2] == "b"}, and so on. - -@item More @code{lint} warnings -There are more things that could be checked for portability. - -@item @code{RECLEN} variable for fixed length records -Along with @code{FIELDWIDTHS}, this would speed up the processing of -fixed-length records. - -@item @code{RT} variable to hold the record terminator -It is occasionally useful to have access to the actual string of -characters that matched the @code{RS} variable. The @code{RT} -variable would hold these characters. - -@item A @code{restart} keyword -After modifying @code{$0}, @code{restart} would restart the pattern -matching loop, without reading a new record from the input. - -@item A @samp{|&} redirection -The @samp{|&} redirection, in place of @samp{|}, would open a two-way -pipeline for communication with a sub-process (via @code{getline} and -@code{print} and @code{printf}). - -@item @code{IGNORECASE} affecting all comparisons -The effects of the @code{IGNORECASE} variable may be generalized to -all string comparisons, and not just regular expression operations. - -@item A way to mix command line source code and library files -There may be a new option that would make it possible to easily use library -functions from a program entered on the command line. -@c probably a @samp{-s} option... - -@item GNU-style long options -We will add GNU-style long options -to @code{gawk} for compatibility with other GNU programs. -(For example, @samp{--field-separator=:} would be equivalent to -@samp{-F:}.)@refill - -@c this is @emph{very} long term --- not worth including right now. -@ignore -@item The C Comma Operator -We may add the C comma operator, which takes the form -@code{@var{expr1},@var{expr2}}. The first expression is evaluated, and the -result is thrown away. The value of the full expression is the value of -@var{expr2}.@refill -@end ignore -@end table - -@node Improvements, , Future Extensions, Notes -@appendixsec Suggestions for Improvements - -Here are some projects that would-be @code{gawk} hackers might like to take -on. They vary in size from a few days to a few weeks of programming, -depending on which one you choose and how fast a programmer you are. Please -send any improvements you write to the maintainers at the GNU -project.@refill - -@enumerate -@item -Compilation of @code{awk} programs: @code{gawk} uses a Bison (YACC-like) -parser to convert the script given it into a syntax tree; the syntax -tree is then executed by a simple recursive evaluator. This method incurs -a lot of overhead, since the recursive evaluator performs many procedure -calls to do even the simplest things.@refill - -It should be possible for @code{gawk} to convert the script's parse tree -into a C program which the user would then compile, using the normal -C compiler and a special @code{gawk} library to provide all the needed -functions (regexps, fields, associative arrays, type coercion, and so -on).@refill - -An easier possibility might be for an intermediate phase of @code{awk} to -convert the parse tree into a linear byte code form like the one used -in GNU Emacs Lisp. The recursive evaluator would then be replaced by -a straight line byte code interpreter that would be intermediate in speed -between running a compiled program and doing what @code{gawk} does -now.@refill - -This may actually happen for the 3.0 version of @code{gawk}. - -@item -An error message section has not been included in this version of the -manual. Perhaps some nice beta testers will document some of the messages -for the future. - -@item -The programs in the test suite could use documenting in this manual. - -@item -The programs and data files in the manual should be available in -separate files to facilitate experimentation. - -@item -See the @file{FUTURES} file for more ideas. Contact us if you would -seriously like to tackle any of the items listed there. -@end enumerate - -@node Glossary, Index, Notes, Top -@appendix Glossary - -@table @asis -@item Action -A series of @code{awk} statements attached to a rule. If the rule's -pattern matches an input record, the @code{awk} language executes the -rule's action. Actions are always enclosed in curly braces. -@xref{Actions, ,Overview of Actions}.@refill - -@item Amazing @code{awk} Assembler -Henry Spencer at the University of Toronto wrote a retargetable assembler -completely as @code{awk} scripts. It is thousands of lines long, including -machine descriptions for several 8-bit microcomputers. -@c It is distributed with @code{gawk} (as part of the test suite) and -It is a good example of a -program that would have been better written in another language.@refill - -@item @sc{ansi} -The American National Standards Institute. This organization produces -many standards, among them the standard for the C programming language. - -@item Assignment -An @code{awk} expression that changes the value of some @code{awk} -variable or data object. An object that you can assign to is called an -@dfn{lvalue}. @xref{Assignment Ops, ,Assignment Expressions}.@refill - -@item @code{awk} Language -The language in which @code{awk} programs are written. - -@item @code{awk} Program -An @code{awk} program consists of a series of @dfn{patterns} and -@dfn{actions}, collectively known as @dfn{rules}. For each input record -given to the program, the program's rules are all processed in turn. -@code{awk} programs may also contain function definitions.@refill - -@item @code{awk} Script -Another name for an @code{awk} program. - -@item Built-in Function -The @code{awk} language provides built-in functions that perform various -numerical, time stamp related, and string computations. Examples are -@code{sqrt} (for the square root of a number) and @code{substr} (for a -substring of a string). @xref{Built-in, ,Built-in Functions}.@refill - -@item Built-in Variable -@code{ARGC}, @code{ARGIND}, @code{ARGV}, @code{CONVFMT}, @code{ENVIRON}, -@code{ERRNO}, @code{FIELDWIDTHS}, @code{FILENAME}, @code{FNR}, @code{FS}, -@code{IGNORECASE}, @code{NF}, @code{NR}, @code{OFMT}, @code{OFS}, @code{ORS}, -@code{RLENGTH}, @code{RSTART}, @code{RS}, and @code{SUBSEP}, -are the variables that have special -meaning to @code{awk}. Changing some of them affects @code{awk}'s running -environment. @xref{Built-in Variables}.@refill - -@item Braces -See ``Curly Braces.'' - -@item C -The system programming language that most GNU software is written in. The -@code{awk} programming language has C-like syntax, and this manual -points out similarities between @code{awk} and C when appropriate.@refill - -@item CHEM -A preprocessor for @code{pic} that reads descriptions of molecules -and produces @code{pic} input for drawing them. It was written by -Brian Kernighan, and is available from @code{netlib@@research.att.com}.@refill - -@item Compound Statement -A series of @code{awk} statements, enclosed in curly braces. Compound -statements may be nested. -@xref{Statements, ,Control Statements in Actions}.@refill - -@item Concatenation -Concatenating two strings means sticking them together, one after another, -giving a new string. For example, the string @samp{foo} concatenated with -the string @samp{bar} gives the string @samp{foobar}. -@xref{Concatenation, ,String Concatenation}.@refill - -@item Conditional Expression -An expression using the @samp{?:} ternary operator, such as -@code{@var{expr1} ? @var{expr2} : @var{expr3}}. The expression -@var{expr1} is evaluated; if the result is true, the value of the whole -expression is the value of @var{expr2} otherwise the value is -@var{expr3}. In either case, only one of @var{expr2} and @var{expr3} -is evaluated. @xref{Conditional Exp, ,Conditional Expressions}.@refill - -@item Constant Regular Expression -A constant regular expression is a regular expression written within -slashes, such as @samp{/foo/}. This regular expression is chosen -when you write the @code{awk} program, and cannot be changed doing -its execution. @xref{Regexp Usage, ,How to Use Regular Expressions}. - -@item Comparison Expression -A relation that is either true or false, such as @code{(a < b)}. -Comparison expressions are used in @code{if}, @code{while}, and @code{for} -statements, and in patterns to select which input records to process. -@xref{Comparison Ops, ,Comparison Expressions}.@refill - -@item Curly Braces -The characters @samp{@{} and @samp{@}}. Curly braces are used in -@code{awk} for delimiting actions, compound statements, and function -bodies.@refill - -@item Data Objects -These are numbers and strings of characters. Numbers are converted into -strings and vice versa, as needed. -@xref{Conversion, ,Conversion of Strings and Numbers}.@refill - -@item Dynamic Regular Expression -A dynamic regular expression is a regular expression written as an -ordinary expression. It could be a string constant, such as -@code{"foo"}, but it may also be an expression whose value may vary. -@xref{Regexp Usage, ,How to Use Regular Expressions}. - -@item Escape Sequences -A special sequence of characters used for describing nonprinting -characters, such as @samp{\n} for newline, or @samp{\033} for the ASCII -ESC (escape) character. @xref{Constants, ,Constant Expressions}. - -@item Field -When @code{awk} reads an input record, it splits the record into pieces -separated by whitespace (or by a separator regexp which you can -change by setting the built-in variable @code{FS}). Such pieces are -called fields. If the pieces are of fixed length, you can use the built-in -variable @code{FIELDWIDTHS} to describe their lengths. -@xref{Records, ,How Input is Split into Records}.@refill - -@item Format -Format strings are used to control the appearance of output in the -@code{printf} statement. Also, data conversions from numbers to strings -are controlled by the format string contained in the built-in variable -@code{CONVFMT}. @xref{Control Letters, ,Format-Control Letters}.@refill - -@item Function -A specialized group of statements often used to encapsulate general -or program-specific tasks. @code{awk} has a number of built-in -functions, and also allows you to define your own. -@xref{Built-in, ,Built-in Functions}. -Also, see @ref{User-defined, ,User-defined Functions}.@refill - -@item @code{gawk} -The GNU implementation of @code{awk}. - -@item GNU -``GNU's not Unix''. An on-going project of the Free Software Foundation -to create a complete, freely distributable, @sc{posix}-compliant computing -environment. - -@item Input Record -A single chunk of data read in by @code{awk}. Usually, an @code{awk} input -record consists of one line of text. -@xref{Records, ,How Input is Split into Records}.@refill - -@item Keyword -In the @code{awk} language, a keyword is a word that has special -meaning. Keywords are reserved and may not be used as variable names. - -@code{awk}'s keywords are: -@code{if}, -@code{else}, -@code{while}, -@code{do@dots{}while}, -@code{for}, -@code{for@dots{}in}, -@code{break}, -@code{continue}, -@code{delete}, -@code{next}, -@code{function}, -@code{func}, -and @code{exit}.@refill - -@item Lvalue -An expression that can appear on the left side of an assignment -operator. In most languages, lvalues can be variables or array -elements. In @code{awk}, a field designator can also be used as an -lvalue.@refill - -@item Number -A numeric valued data object. The @code{gawk} implementation uses double -precision floating point to represent numbers.@refill - -@item Pattern -Patterns tell @code{awk} which input records are interesting to which -rules. - -A pattern is an arbitrary conditional expression against which input is -tested. If the condition is satisfied, the pattern is said to @dfn{match} -the input record. A typical pattern might compare the input record against -a regular expression. @xref{Patterns}.@refill - -@item @sc{posix} -The name for a series of standards being developed by the @sc{ieee} -that specify a Portable Operating System interface. The ``IX'' denotes -the Unix heritage of these standards. The main standard of interest for -@code{awk} users is P1003.2, the Command Language and Utilities standard. - -@item Range (of input lines) -A sequence of consecutive lines from the input file. A pattern -can specify ranges of input lines for @code{awk} to process, or it can -specify single lines. @xref{Patterns}.@refill - -@item Recursion -When a function calls itself, either directly or indirectly. -If this isn't clear, refer to the entry for ``recursion.'' - -@item Redirection -Redirection means performing input from other than the standard input -stream, or output to other than the standard output stream. - -You can redirect the output of the @code{print} and @code{printf} statements -to a file or a system command, using the @samp{>}, @samp{>>}, and @samp{|} -operators. You can redirect input to the @code{getline} statement using -the @samp{<} and @samp{|} operators. -@xref{Redirection, ,Redirecting Output of @code{print} and @code{printf}}.@refill - -@item Regular Expression -See ``regexp.'' - -@item Regexp -Short for @dfn{regular expression}. A regexp is a pattern that denotes a -set of strings, possibly an infinite set. For example, the regexp -@samp{R.*xp} matches any string starting with the letter @samp{R} -and ending with the letters @samp{xp}. In @code{awk}, regexps are -used in patterns and in conditional expressions. Regexps may contain -escape sequences. @xref{Regexp, ,Regular Expressions as Patterns}.@refill - -@item Rule -A segment of an @code{awk} program, that specifies how to process single -input records. A rule consists of a @dfn{pattern} and an @dfn{action}. -@code{awk} reads an input record; then, for each rule, if the input record -satisfies the rule's pattern, @code{awk} executes the rule's action. -Otherwise, the rule does nothing for that input record.@refill - -@item Side Effect -A side effect occurs when an expression has an effect aside from merely -producing a value. Assignment expressions, increment expressions and -function calls have side effects. @xref{Assignment Ops, ,Assignment Expressions}. - -@item Special File -A file name interpreted internally by @code{gawk}, instead of being handed -directly to the underlying operating system. For example, @file{/dev/stdin}. -@xref{Special Files, ,Standard I/O Streams}. - -@item Stream Editor -A program that reads records from an input stream and processes them one -or more at a time. This is in contrast with batch programs, which may -expect to read their input files in entirety before starting to do -anything, and with interactive programs, which require input from the -user.@refill - -@item String -A datum consisting of a sequence of characters, such as @samp{I am a -string}. Constant strings are written with double-quotes in the -@code{awk} language, and may contain escape sequences. -@xref{Constants, ,Constant Expressions}. - -@item Whitespace -A sequence of blank or tab characters occurring inside an input record or a -string.@refill -@end table - -@node Index, , Glossary, Top -@unnumbered Index -@printindex cp - -@summarycontents -@contents -@bye - -Unresolved Issues: ------------------- -1. From: ntomczak@vm.ucs.ualberta.ca (Michal Jaegermann) - Examples of usage tend to suggest that /../ and ".." delimiters - can be used for regular expressions, even if definition is consistently - using /../. I am not sure what the real rules are and in particular - what of the following is a bug and what is a feature: - # This program matches everything - '"\(" { print }' - # This one complains about mismatched parenthesis - '$0 ~ "\(" { print }' - # This one behaves in an expected manner - '/\(/ { print }' - You may also try to use "\(" as an argument to match() to see what - will happen. - -2. From ADR. - - The posix (and original Unix!) notion of awk values as both number - and string values needs to be put into the manual. This involves - major and minor rewrites of most of the manual, but should help in - clarifying many of the weirder points of the language. - -3. From ADR. - - The manual should be reorganized. Expressions should be introduced - early, building up to regexps as expressions, and from there to their - use as patterns and then in actions. Built-in vars should come earlier - in the manual too. The 'expert info' sections marked with comments - should get their own sections or subsections with nodes and titles. - The manual should be gone over thoroughly for indexing. - -4. From ADR. - - Robert J. Chassell points out that awk programs should have some indication - of how to use them. It would be useful to perhaps have a "programming - style" section of the manual that would include this and other tips. - -5. From ADR in response to moraes@uunet.ca - (This would make the beginnings of a good "puzzles" section...) - - Date: Mon, 2 Dec 91 10:08:05 EST - From: gatech!cc!arnold (Arnold Robbins) - To: cs.dal.ca!david, uunet.ca!moraes - Subject: redirecting to /dev/stderr - Cc: skeeve!arnold, boeing.com!brennan, research.att.com!bwk - - In 2.13.3 the following program no longer dumps core: - - BEGIN { print "hello" > /dev/stderr ; exit(1) } - - Instead, it creates a file named `0' with the word `hello' in it. AWK - semantics strikes again. The meaning of the statement is - - print "hello" > (($0 ~ /dev/) stderr) - - /dev/ tests $0 for the pattern `dev'. This yields a 0. The variable stderr, - having never been used, has a null string in it. The concatenation yields - a string value of "0" which is used as the file name. Sigh. - - I think with some more time I can come up with a decent fix, but it will - probably only print a diagnostic with -Wlint. - - Arnold - diff --git a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info b/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info deleted file mode 100644 index 060d9325e33a..000000000000 --- a/gnu/usr.bin/cvs/contrib/pcl-cvs/pcl-cvs.info +++ /dev/null @@ -1,1659 +0,0 @@ -This is Info file pcl-cvs, produced by Makeinfo-1.49 from the input -file pcl-cvs.texinfo. - - Copyright (C) 1992 Per Cederqvist - - Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided also -that the section entitled "GNU General Public License" is included -exactly as in the original, and provided that the entire resulting -derived work is distributed under the terms of a permission notice -identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that the section entitled "GNU General Public -License" and this permission notice may be included in translations -approved by the Free Software Foundation instead of in the original -English. - - -File: pcl-cvs, Node: Top, Next: Copying, Prev: (dir), Up: (dir) - - This info manual describes pcl-cvs which is a GNU Emacs front-end -to CVS. It works with CVS version 1.3. This manual is updated to -release 1.05 of pcl-cvs. - -* Menu: - -* Copying:: GNU General Public License -* Installation:: How to install pcl-cvs on your system. -* About pcl-cvs:: Authors and ftp sites. - -* Getting started:: An introduction with a walk-through example. -* Buffer contents:: An explanation of the buffer contents. -* Commands:: All commands, grouped by type. - -* Customization:: How you can tailor pcl-cvs to suit your needs. -* Future enhancements:: Future enhancements of pcl-cvs. -* Bugs:: Bugs (known and unknown). -* Function and Variable Index:: List of functions and variables. -* Concept Index:: List of concepts. -* Key Index:: List of keystrokes. - - -- The Detailed Node Listing -- - -Installation - -* Pcl-cvs installation:: How to install pcl-cvs on your system. -* On-line manual installation:: How to install the on-line manual. -* Typeset manual installation:: How to create typeset documentation - about pcl-cvs. - -About pcl-cvs - -* Contributors:: Contributors to pcl-cvs. -* Archives:: Where can I get a copy of Pcl-Cvs? - -Buffer contents - -* File status:: The meaning of the second field. -* Selected files:: How selection works. - -Commands - -* Updating the directory:: Commands to update the local directory -* Movement commands:: How to move up and down in the buffer -* Marking files:: How to mark files that other commands - will later operate on. -* Committing changes:: Checking in your modifications to the - CVS repository. -* Editing files:: Loading files into Emacs. -* Getting info about files:: Display the log and status of files. -* Adding and removing files:: Adding and removing files -* Undoing changes:: Undoing changes -* Removing handled entries:: Uninteresting lines can easily be removed. -* Ignoring files:: Telling CVS to ignore generated files. -* Viewing differences:: Commands to `diff' different versions. -* Emerge:: -* Reverting your buffers:: Reverting your buffers -* Miscellaneous commands:: Miscellaneous commands - - -File: pcl-cvs, Node: Copying, Next: Installation, Prev: Top, Up: Top - -GNU GENERAL PUBLIC LICENSE -************************** - - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -Preamble -======== - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if -you distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, -and (2) offer you this license which gives you legal permission to -copy, distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make -certain that everyone understands that there is no warranty for this -free software. If the software is modified by someone else and -passed on, we want its recipients to know that what they have is not -the original, so that any problems introduced by others will not -reflect on the original authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at -all. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 1. This License applies to any program or other work which contains - a notice placed by the copyright holder saying it may be - distributed under the terms of this General Public License. The - "Program", below, refers to any such program or work, and a - "work based on the Program" means either the Program or any - derivative work under copyright law: that is to say, a work - containing the Program or a portion of it, either verbatim or - with modifications and/or translated into another language. - (Hereinafter, translation is included without limitation in the - term "modification".) Each licensee is addressed as "you". - - Activities other than copying, distribution and modification are - not covered by this License; they are outside its scope. The - act of running the Program is not restricted, and the output - from the Program is covered only if its contents constitute a - work based on the Program (independent of having been made by - running the Program). Whether that is true depends on what the - Program does. - - 2. You may copy and distribute verbatim copies of the Program's - source code as you receive it, in any medium, provided that you - conspicuously and appropriately publish on each copy an - appropriate copyright notice and disclaimer of warranty; keep - intact all the notices that refer to this License and to the - absence of any warranty; and give any other recipients of the - Program a copy of this License along with the Program. - - You may charge a fee for the physical act of transferring a - copy, and you may at your option offer warranty protection in - exchange for a fee. - - 3. You may modify your copy or copies of the Program or any portion - of it, thus forming a work based on the Program, and copy and - distribute such modifications or work under the terms of Section - 1 above, provided that you also meet all of these conditions: - - a. You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any - change. - - b. You must cause any work that you distribute or publish, - that in whole or in part contains or is derived from the - Program or any part thereof, to be licensed as a whole at - no charge to all third parties under the terms of this - License. - - c. If the modified program normally reads commands - interactively when run, you must cause it, when started - running for such interactive use in the most ordinary way, - to print or display an announcement including an - appropriate copyright notice and a notice that there is no - warranty (or else, saying that you provide a warranty) and - that users may redistribute the program under these - conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive - but does not normally print such an announcement, your work - based on the Program is not required to print an - announcement.) - - These requirements apply to the modified work as a whole. If - identifiable sections of that work are not derived from the - Program, and can be reasonably considered independent and - separate works in themselves, then this License, and its terms, - do not apply to those sections when you distribute them as - separate works. But when you distribute the same sections as - part of a whole which is a work based on the Program, the - distribution of the whole must be on the terms of this License, - whose permissions for other licensees extend to the entire - whole, and thus to each and every part regardless of who wrote - it. - - Thus, it is not the intent of this section to claim rights or - contest your rights to work written entirely by you; rather, the - intent is to exercise the right to control the distribution of - derivative or collective works based on the Program. - - In addition, mere aggregation of another work not based on the - Program with the Program (or with a work based on the Program) - on a volume of a storage or distribution medium does not bring - the other work under the scope of this License. - - 4. You may copy and distribute the Program (or a work based on it, - under Section 2) in object code or executable form under the - terms of Sections 1 and 2 above provided that you also do one of - the following: - - a. Accompany it with the complete corresponding - machine-readable source code, which must be distributed - under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - b. Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than - your cost of physically performing source distribution, a - complete machine-readable copy of the corresponding source - code, to be distributed under the terms of Sections 1 and 2 - above on a medium customarily used for software - interchange; or, - - c. Accompany it with the information you received as to the - offer to distribute corresponding source code. (This - alternative is allowed only for noncommercial distribution - and only if you received the program in object code or - executable form with such an offer, in accord with - Subsection b above.) - - The source code for a work means the preferred form of the work - for making modifications to it. For an executable work, - complete source code means all the source code for all modules - it contains, plus any associated interface definition files, - plus the scripts used to control compilation and installation of - the executable. However, as a special exception, the source - code distributed need not include anything that is normally - distributed (in either source or binary form) with the major - components (compiler, kernel, and so on) of the operating system - on which the executable runs, unless that component itself - accompanies the executable. - - If distribution of executable or object code is made by offering - access to copy from a designated place, then offering equivalent - access to copy the source code from the same place counts as - distribution of the source code, even though third parties are - not compelled to copy the source along with the object code. - - 5. You may not copy, modify, sublicense, or distribute the Program - except as expressly provided under this License. Any attempt - otherwise to copy, modify, sublicense or distribute the Program - is void, and will automatically terminate your rights under this - License. However, parties who have received copies, or rights, - from you under this License will not have their licenses - terminated so long as such parties remain in full compliance. - - 6. You are not required to accept this License, since you have not - signed it. However, nothing else grants you permission to - modify or distribute the Program or its derivative works. These - actions are prohibited by law if you do not accept this License. - Therefore, by modifying or distributing the Program (or any - work based on the Program), you indicate your acceptance of this - License to do so, and all its terms and conditions for copying, - distributing or modifying the Program or works based on it. - - 7. Each time you redistribute the Program (or any work based on the - Program), the recipient automatically receives a license from the - original licensor to copy, distribute or modify the Program - subject to these terms and conditions. You may not impose any - further restrictions on the recipients' exercise of the rights - granted herein. You are not responsible for enforcing compliance - by third parties to this License. - - 8. If, as a consequence of a court judgment or allegation of patent - infringement or for any other reason (not limited to patent - issues), conditions are imposed on you (whether by court order, - agreement or otherwise) that contradict the conditions of this - License, they do not excuse you from the conditions of this - License. If you cannot distribute so as to satisfy - simultaneously your obligations under this License and any other - pertinent obligations, then as a consequence you may not - distribute the Program at all. For example, if a patent license - would not permit royalty-free redistribution of the Program by - all those who receive copies directly or indirectly through you, - then the only way you could satisfy both it and this License - would be to refrain entirely from distribution of the Program. - - If any portion of this section is held invalid or unenforceable - under any particular circumstance, the balance of the section is - intended to apply and the section as a whole is intended to - apply in other circumstances. - - It is not the purpose of this section to induce you to infringe - any patents or other property right claims or to contest - validity of any such claims; this section has the sole purpose - of protecting the integrity of the free software distribution - system, which is implemented by public license practices. Many - people have made generous contributions to the wide range of - software distributed through that system in reliance on - consistent application of that system; it is up to the - author/donor to decide if he or she is willing to distribute - software through any other system and a licensee cannot impose - that choice. - - This section is intended to make thoroughly clear what is - believed to be a consequence of the rest of this License. - - 9. If the distribution and/or use of the Program is restricted in - certain countries either by patents or by copyrighted - interfaces, the original copyright holder who places the Program - under this License may add an explicit geographical distribution - limitation excluding those countries, so that distribution is - permitted only in or among countries not thus excluded. In such - case, this License incorporates the limitation as if written in - the body of this License. - - 10. The Free Software Foundation may publish revised and/or new - versions of the General Public License from time to time. Such - new versions will be similar in spirit to the present version, - but may differ in detail to address new problems or concerns. - - Each version is given a distinguishing version number. If the - Program specifies a version number of this License which applies - to it and "any later version", you have the option of following - the terms and conditions either of that version or of any later - version published by the Free Software Foundation. If the - Program does not specify a version number of this License, you - may choose any version ever published by the Free Software - Foundation. - - 11. If you wish to incorporate parts of the Program into other free - programs whose distribution conditions are different, write to - the author to ask for permission. For software which is - copyrighted by the Free Software Foundation, write to the Free - Software Foundation; we sometimes make exceptions for this. Our - decision will be guided by the two goals of preserving the free - status of all derivatives of our free software and of promoting - the sharing and reuse of software generally. - - NO WARRANTY - - 12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO - WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE - LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT - HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT - WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, - BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE - QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE - PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY - SERVICING, REPAIR OR CORRECTION. - - 13. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN - WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY - MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE - LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, - INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR - INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS - OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY - YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH - ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - -Appendix: How to Apply These Terms to Your New Programs -======================================================= - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is -safest to attach them to the start of each source file to most -effectively convey the exclusion of warranty; and each file should -have at least the "copyright" line and a pointer to where the full -notice is found. - - ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. - Copyright (C) 19YY NAME OF AUTHOR - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - Also add information on how to contact you by electronic and paper -mail. - - If the program is interactive, make it output a short notice like -this when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - - The hypothetical commands `show w' and `show c' should show the -appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w' and -`show c'; they could even be mouse-clicks or menu items--whatever -suits your program. - - You should also get your employer (if you work as a programmer) or -your school, if any, to sign a "copyright disclaimer" for the -program, if necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - SIGNATURE OF TY COON, 1 April 1989 - Ty Coon, President of Vice - - This General Public License does not permit incorporating your -program into proprietary programs. If your program is a subroutine -library, you may consider it more useful to permit linking -proprietary applications with the library. If this is what you want -to do, use the GNU Library General Public License instead of this -License. - - -File: pcl-cvs, Node: Installation, Next: About pcl-cvs, Prev: Copying, Up: Top - -Installation -************ - - This section describes the installation of pcl-cvs, the GNU Emacs -CVS front-end. You should install not only the elisp files -themselves, but also the on-line documentation so that your users -will know how to use it. You can create typeset documentation from -the file `pcl-cvs.texinfo' as well as an on-line info file. The -following steps are also described in the file `INSTALL' in the source -directory. - -* Menu: - -* Pcl-cvs installation:: How to install pcl-cvs on your system. -* On-line manual installation:: How to install the on-line manual. -* Typeset manual installation:: How to create typeset documentation - about pcl-cvs. - - -File: pcl-cvs, Node: Pcl-cvs installation, Next: On-line manual installation, Prev: Installation, Up: Installation - -Installation of the pcl-cvs program -=================================== - - 1. Edit the file `Makefile' to reflect the situation at your site. - The only things you have to change is the definition of `lispdir' - and `infodir'. The elisp files will be copied to `lispdir', and - the info file to `infodir'. - - 2. Configure pcl-cvs.el - - There are a couple of paths that you have to check to make sure - that they match you system. They appear early in the file - pcl-cvs.el. - - *NOTE:* If your system is running emacs 18.57 or earlier you - MUST uncomment the line that says: - - (setq delete-exited-processes nil) - - Setting `delete-exited-processes' to `nil' works around a bug in - emacs that causes it to dump core. The bug was fixed in emacs - 18.58. - - 3. Release 1.05 and later of pcl-cvs requires parts of the Elib - library, version 0.07 or later. Elib is available via anonymous - ftp from prep.ai.mit.edu in `pub/gnu/elib-0.07.tar.z', and from - a lot of other sites that mirrors prep. Get Elib, and install - it, before proceeding. - - 4. Type `make install' in the source directory. This will - byte-compile all `.el' files and copy both the `.el' and the - `.elc' into the directory you specified in step 1. - - If you don't want to install the `.el' files but only the `.elc' - files (the byte-compiled files), you can type ``make - install_elc'' instead of ``make install''. - - If you only want to create the compiled elisp files, but don't - want to install them, you can type `make elcfiles' instead. - This is what happens if you only type `make' without parameters. - - 5. Edit the file `default.el' in your emacs lisp directory (usually - `/usr/gnu/emacs/lisp' or something similar) and enter the - contents of the file `pcl-cvs-startup.el' into it. It contains - a couple of `auto-load's that facilitates the use of pcl-cvs. - - - -File: pcl-cvs, Node: On-line manual installation, Next: Typeset manual installation, Prev: Pcl-cvs installation, Up: Installation - -Installation of the on-line manual. -=================================== - - 1. Create the info file `pcl-cvs' from `pcl-cvs.texinfo' by typing - `make info'. If you don't have the program `makeinfo' you can - get it by anonymous ftp from e.g. `ftp.gnu.ai.mit.edu' as - `pub/gnu/texinfo-2.14.tar.Z' (there might be a newer version - there when you read this), or you could use the preformatted - info file `pcl-cvs.info' that is included in the distribution - (type `cp pcl-cvs.info pcl-cvs'). - - 2. Move the info file `pcl-cvs' to your standard info directory. - This might be called something like `/usr/gnu/emacs/info'. - - 3. Edit the file `dir' in the info directory and enter one line to - contain a pointer to the info file `pcl-cvs'. The line can, for - instance, look like this: - - * Pcl-cvs: (pcl-cvs). An Emacs front-end to CVS. - - -File: pcl-cvs, Node: Typeset manual installation, Prev: On-line manual installation, Up: Installation - -How to make typeset documentation from pcl-cvs.texinfo -====================================================== - - If you have TeX installed at your site, you can make a typeset -manual from `pcl-cvs.texinfo'. - - 1. Run TeX by typing ``make pcl-cvs.dvi''. You will not get the - indices unless you have the `texindex' program. - - 2. Convert the resulting device independent file `pcl-cvs.dvi' to a - form which your printer can output and print it. If you have a - postscript printer there is a program, `dvi2ps', which does. - There is also a program which comes together with TeX, `dvips', - which you can use. - - - -File: pcl-cvs, Node: About pcl-cvs, Next: Getting started, Prev: Installation, Up: Top - -About pcl-cvs -************* - - Pcl-cvs is a front-end to CVS version 1.3. It integrates the most -frequently used CVS commands into emacs. - -* Menu: - -* Contributors:: Contributors to pcl-cvs. -* Archives:: Where can I get a copy of Pcl-Cvs? - - -File: pcl-cvs, Node: Contributors, Next: Archives, Prev: About pcl-cvs, Up: About pcl-cvs - -Contributors to pcl-cvs -======================= - - Contributions to the package are welcome. I have limited time to -work on this project, but I will gladly add any code that you -contribute to me to this package (*note Bugs::.). - - The following persons have made contributions to pcl-cvs. - - * Brian Berliner wrote CVS, together with some other contributors. - Without his work on CVS this package would be useless... - - * Per Cederqvist wrote most of the otherwise unattributed - functions in pcl-cvs as well as all documentation. - - * Inge Wallin (`inge@lysator.liu.se') wrote the skeleton to - `pcl-cvs.texinfo', and gave useful comments on it. He also wrote - the files `elib-node.el' and `compile-all.el'. The file - `cookie.el' was inspired by Inge. - - * Linus Tolke (`linus@lysator.liu.se') contributed useful comments - on both the functionality and the documentation. - - * Jamie Zawinski (`jwz@lucid.com') contributed `pcl-cvs-lucid.el'. - - * Leif Lonnblad contributed RCVS support. - - Apart from these, a lot of people have send me suggestions, ideas, -requests, bug reports and encouragement. Thanks a lot! Without your -there would be no new releases of pcl-cvs. - - -File: pcl-cvs, Node: Archives, Prev: Contributors, Up: About pcl-cvs - -Where can I get pcl-cvs? -======================== - - The latest release of pcl-cvs can be fetched via anonymous ftp from -`ftp.lysator.liu.se', (IP no. 130.236.254.1) in the directory -`pub/emacs'. If you don't live in Scandinavia you should probably -check with archie to see if there is a site closer to you that -archives pcl-cvs. - - New releases will be announced to appropriate newsgroups. If you -send your email address to me I will add you to my list of people to -mail when I make a new release. - - -File: pcl-cvs, Node: Getting started, Next: Buffer contents, Prev: About pcl-cvs, Up: Top - -Getting started -*************** - - This document assumes that you know what CVS is, and that you at -least knows the fundamental concepts of CVS. If that is not the case -you should read the man page for CVS. - - Pcl-cvs is only useful once you have checked out a module. So -before you invoke it you must have a copy of a module somewhere in -the file system. - - You invoke pcl-cvs by typing `M-x cvs-update RET'. If your emacs -responds with `[No match]' your system administrator has not -installed pcl-cvs properly. Try `M-x load-library RET pcl-cvs RET'. -If that also fails - talk to your root. If it succeeds you might put -this line in your `.emacs' file so that you don't have to type the -`load-library' command every time you wish to use pcl-cvs: - - (autoload 'cvs-update "pcl-cvs" nil t) - - The function `cvs-update' will ask for a directory. The command -`cvs update' will be run in that directory. (It should contain files -that have been checked out from a CVS archive.) The output from -`cvs' will be parsed and presented in a table in a buffer called -`*cvs*'. It might look something like this: - - PCL-CVS release 1.05. - - In directory /users/ceder/FOO/test: - Updated bar - Updated file.txt - Modified ci namechange - Updated newer - - In directory /users/ceder/FOO/test/sub: - Modified ci ChangeLog - ---------- End ----- - - In this example the three files (`bar', `file.txt' and `newer') -that are marked with `Updated' have been copied from the CVS -repository to `/users/ceder/FOO/test/' since someone else have -checked in newer versions of them. Two files (`namechange' and -`sub/ChangeLog') have been modified locally, and needs to be checked -in. - - You can move the cursor up and down in the buffer with `C-n' and -`C-p' or `n' and `p'. If you press `c' on one of the `Modified' -files that file will be checked in to the CVS repository. *Note -Committing changes::. You can press `x' to get rid of the -"uninteresting" files that have only been `Updated' (and don't -require any further action from you). - - You can also easily get a `diff' between your modified file and the -base version that you started from, and you can get the output from -`cvs log' and `cvs status' on the listed files simply by pressing a -key (*note Getting info about files::.). - - -File: pcl-cvs, Node: Buffer contents, Next: Commands, Prev: Getting started, Up: Top - -Buffer contents -*************** - - The display contains four columns. They contain, from left to -right: - - * An asterisk when the file is "marked" (*note Selected files::.). - - * The status of the file. See *Note File status::, for more - information. - - * A "need to be checked in"-marker (`ci'). - - * The file name. - -* Menu: - -* File status:: The meaning of the second field. -* Selected files:: How selection works. - - -File: pcl-cvs, Node: File status, Next: Selected files, Prev: Buffer contents, Up: Buffer contents - -File status -=========== - - The `file status' field can have the following values: - -`Updated' - The file was brought up to date with respect to the repository. - This is done for any file that exists in the repository but not - in your source, and for files that you haven't changed but are - not the most recent versions available in the repository. - -`Modified' - The file is modified in your working directory, and there was - no modification to the same file in the repository. - -`Merged' - The file is modified in your working directory, and there were - modifications in the repository as well as in your copy, but - they were merged successfully, without conflict, in your working - directory. - -`Conflict' - A conflict was detected while trying to merge your changes to - FILE with changes from the source repository. FILE (the copy in - your working directory) is now the output of the `rcsmerge' - command on the two versions; an unmodified copy of your file is - also in your working directory, with the name `.#FILE.VERSION', - where VERSION is the RCS revision that your modified file started - from. *Note Viewing differences::, for more details. - -`Added' - The file has been added by you, but it still needs to be checked - in to the repository. - -`Removed' - The file has been removed by you, but it needs to be checked in - to the repository. You can resurrect it by typing `a' (*note - Adding and removing files::.). - -`Unknown' - A file that was detected in your directory, but that neither - appears in the repository, nor is present on the list of files - that CVS should ignore. - - There are also a few special cases, that rarely occur, which have -longer strings in the fields: - -`Removed from repository' - The file has been removed from your directory since someone has - removed it from the repository. (It is still present in the - Attic directory, so no permanent loss has occurred). This, - unlike the other entries in this table, is not an error - condition. - -`Removed from repository, changed by you' - You have modified a file that someone have removed from the - repository. You can correct this situation by removing the file - manually (see *note Adding and removing files::.). - -`Removed by you, changed in repository' - You have removed a file, and before you committed the removal - someone committed a change to that file. You could use `a' to - resurrect the file (see *note Adding and removing files::.). - -`Move away FILE - it is in the way' - For some reason CVS does not like the file FILE. Rename or - remove it. - -`This repository is missing! Remove this dir manually.' - It is impossible to remove a directory in the CVS repository in - a clean way. Someone have tried to remove one, and CVS gets - confused. Remove your copy of the directory. - - -File: pcl-cvs, Node: Selected files, Prev: File status, Up: Buffer contents - -Selected files -============== - - Many of the commands works on the current set of "selected" files. - - * If there are any files that are marked they constitute the set of - selected files. - - * Otherwise, if the cursor points to a file, that file is the - selected file. - - * Otherwise, if the cursor points to a directory, all the files in - that directory that appears in the buffer are the selected files. - - This scheme might seem a little complicated, but once one get used -to it, it is quite powerful. - - *Note Marking files:: tells how you mark and unmark files. - - -File: pcl-cvs, Node: Commands, Next: Customization, Prev: Buffer contents, Up: Top - -Commands -******** - - The nodes in this menu contains explanations about all the -commands that you can use in pcl-cvs. They are grouped together by -type. - -* Menu: - -* Updating the directory:: Commands to update the local directory -* Movement commands:: How to move up and down in the buffer -* Marking files:: How to mark files that other commands - will later operate on. -* Committing changes:: Checking in your modifications to the - CVS repository. -* Editing files:: Loading files into Emacs. -* Getting info about files:: Display the log and status of files. -* Adding and removing files:: Adding and removing files -* Undoing changes:: Undoing changes -* Removing handled entries:: Uninteresting lines can easily be removed. -* Ignoring files:: Telling CVS to ignore generated files. -* Viewing differences:: Commands to `diff' different versions. -* Emerge:: -* Reverting your buffers:: Reverting your buffers -* Miscellaneous commands:: Miscellaneous commands - - -File: pcl-cvs, Node: Updating the directory, Next: Movement commands, Prev: Commands, Up: Commands - -Updating the directory -====================== - -`M-x cvs-update' - Run a `cvs update' command. You will be asked for the directory - in which the `cvs update' will be run. The output will be - parsed by pcl-cvs, and the result printed in the `*cvs*' buffer - (see *note Buffer contents::. for a description of the contents). - - By default, `cvs-update' will descend recursively into - subdirectories. You can avoid that behavior by giving a prefix - argument to it (e.g., by typing `C-u M-x cvs-update RET'). - - All other commands in pcl-cvs requires that you have a `*cvs*' - buffer. This is the command that you use to get one. - - CVS uses lock files in the repository to ensure the integrity of - the data files in the repository. They might be left behind - i.e. if a workstation crashes in the middle of a CVS operation. - CVS outputs a message when it is waiting for a lock file to go - away. Pcl-cvs will show the same message in the *cvs* buffer, - together with instructions for deleting the lock files. You - should normally not have to delete them manually -- just wait a - little while and the problem should fix itself. But if the lock - files doesn't disappear you can delete them with `M-x - cvs-delete-lock RET'. - -`g' - This will run `cvs update' again. It will always use the same - buffer that was used with the previous `cvs update'. Give a - prefix argument to avoid descending into subdirectories. This - runs the command `cvs-mode-update-no-prompt'. - - -File: pcl-cvs, Node: Movement commands, Next: Marking files, Prev: Updating the directory, Up: Commands - -Movement Commands -================= - - You can use most normal Emacs commands to move forward and -backward in the buffer. Some keys are rebound to functions that take -advantage of the fact that the buffer is a pcl-cvs buffer: - -`SPC' -`C-n' -`n' - These keys move the cursor one file forward, towards the end of - the buffer (`cookie-next-cookie'). - -`C-p' -`p' - These keys move one file backward, towards the beginning of the - buffer (`cookie-previous-cookie'). - - -File: pcl-cvs, Node: Marking files, Next: Committing changes, Prev: Movement commands, Up: Commands - -Marking files -============= - - Pcl-cvs works on a set of "selected files" (*note Selected -files::.). You can mark and unmark files with these commands: - -`m' - This marks the file that the cursor is positioned on. If the - cursor is positioned on a directory all files in that directory - will be marked. (`cvs-mode-mark'). - -`u' - Unmark the file that the cursor is positioned on. If the cursor - is on a directory, all files in that directory will be unmarked. - (`cvs-mode-unmark'). - -`M' - Mark *all* files in the buffer (`cvs-mode-mark-all-files'). - -`ESC DEL' - Unmark *all* files (`cvs-mode-unmark-all-files'). - -`DEL' - Unmark the file on the previous line, and move point to that line - (`cvs-mode-unmark-up'). - - -File: pcl-cvs, Node: Committing changes, Next: Editing files, Prev: Marking files, Up: Commands - -Committing changes -================== - -`c' - All files that have a "need to be checked in"-marker (*note - Buffer contents::.) can be checked in with the `c' command. It - checks in all selected files (*note Selected files::.) (except - those who lack the "ci"-marker - they are ignored). Pressing - `c' causes `cvs-mode-commit' to be run. - - When you press `c' you will get a buffer called - `*cvs-commit-message*'. Enter the log message for the file(s) in - it. When you are ready you should press `C-c C-c' to actually - commit the files (using `cvs-edit-done'). - - Normally the `*cvs-commit-message*' buffer will retain the log - message from the previous commit, but if the variable - `cvs-erase-input-buffer' is set to a non-`nil' value the buffer - will be erased. Point and mark will always be located around the - entire buffer so that you can easily erase it with `C-w' - (`kill-region'). - - If you are editing the files in your emacs an automatic - `revert-buffer' will be performed. (If the file contains `$Id$' - keywords `cvs commit' will write a new file with the new values - substituted. The auto-revert makes sure that you get them into - your buffer). The revert will not occur if you have modified - your buffer, or if `cvs-auto-revert-after-commit' is set to - `nil'. - - -File: pcl-cvs, Node: Editing files, Next: Getting info about files, Prev: Committing changes, Up: Commands - -Editing files -============= - - There are currently three commands that can be used to find a file -(that is, load it into a buffer and start editing it there). These -commands work on the line that the cursor is situated at. They -ignore any marked files. - -`f' - Find the file that the cursor points to. Run `dired' (*note - Dired: (Emacs)Dired.) if the cursor points to a directory - (`cvs-mode-find-file'). - -`o' - Like `f', but use another window - (`cvs-mode-find-file-other-window'). - -`A' - Invoke `add-change-log-entry-other-window' to edit a `ChangeLog' - file. The `ChangeLog' will be found in the directory of the - file the cursor points to. - (`cvs-mode-add-change-log-entry-other-window'). - - -File: pcl-cvs, Node: Getting info about files, Next: Adding and removing files, Prev: Editing files, Up: Commands - -Getting info about files -======================== - - Both of the following commands can be customized. *Note -Customization::. - -`l' - Run `cvs log' on all selected files, and show the result in a - temporary buffer (`cvs-mode-log'). - -`s' - Run `cvs status' on all selected files, and show the result in a - temporary buffer (`cvs-mode-status'). - - -File: pcl-cvs, Node: Adding and removing files, Next: Undoing changes, Prev: Getting info about files, Up: Commands - -Adding and removing files -========================= - - The following commands are available to make it easy to add and -remove files from the CVS repository. - -`a' - Add all selected files. This command can be used on `Unknown' - files (see *note File status::.). The status of the file will - change to `Added', and you will have to use `c' - (`cvs-mode-commit', see *note Committing changes::.) to really - add the file to the repository. - - This command can also be used on `Removed' files (before you - commit them) to resurrect them. - - Selected files that are neither `Unknown' nor `Removed' will be - ignored by this command. - - The command that is run is `cvs-mode-add'. - -`r' - This command removes the selected files (after prompting for - confirmation). The files are `rm'ed from your directory and - (unless the status was `Unknown'; *note File status::.) they will - also be `cvs remove'd. If the files were `Unknown' they will - disappear from the buffer. Otherwise their status will change to - `Removed', and you must use `c' (`cvs-mode-commit', *note - Committing changes::.) to commit the removal. - - The command that is run is `cvs-mode-remove-file'. - - -File: pcl-cvs, Node: Undoing changes, Next: Removing handled entries, Prev: Adding and removing files, Up: Commands - -Undoing changes -=============== - -`U' - If you have modified a file, and for some reason decide that you - don't want to keep the changes, you can undo them with this - command. It works by removing your working copy of the file and - then getting the latest version from the repository - (`cvs-mode-undo-local-changes'. - - -File: pcl-cvs, Node: Removing handled entries, Next: Ignoring files, Prev: Undoing changes, Up: Commands - -Removing handled entries -======================== - -`x' - This command allows you to remove all entries that you have - processed. More specifically, the lines for `Updated' files - (*note File status::. and files that have been checked in (*note - Committing changes::.) are removed from the buffer. If a - directory becomes empty the heading for that directory is also - removed. This makes it easier to get an overview of what needs - to be done. - - The command is called `cvs-mode-remove-handled'. If - `cvs-auto-remove-handled' is set to non-`nil' this will - automatically be performed after every commit. - -`C-k' - This command can be used for lines that - `cvs-mode-remove-handled' would not delete, but that you want to - delete (`cvs-mode-acknowledge'). - - -File: pcl-cvs, Node: Ignoring files, Next: Viewing differences, Prev: Removing handled entries, Up: Commands - -Ignoring files -============== - -`i' - Arrange so that CVS will ignore the selected files. The file - names are added to the `.cvsignore' file in the corresponding - directory. If the `.cvsignore' doesn't exist it will be created. - - The `.cvsignore' file should normally be added to the repository, - but you could ignore it also if you like it better that way. - - This runs `cvs-mode-ignore'. - - -File: pcl-cvs, Node: Viewing differences, Next: Emerge, Prev: Ignoring files, Up: Commands - -Viewing differences -=================== - -`d' - Display a `cvs diff' between the selected files and the RCS - version that they are based on. *Note Customization:: describes - how you can send flags to `cvs diff'. If CVS-DIFF-IGNORE-MARKS - is set to a non-`nil' value or if a prefix argument is given - (but not both) any marked files will not be considered to be - selected. (`cvs-mode-diff-cvs'). - -`b' - If CVS finds a conflict while merging two versions of a file - (during a `cvs update', *note Updating the directory::.) it will - save the original file in a file called `.#FILE.VERSION' where - FILE is the name of the file, and VERSION is the RCS version - number that your file was based on. - - With the `b' command you can run a `diff' on the files - `.#FILE.VERSION' and `FILE'. You can get a context- or Unidiff - by setting `cvs-diff-flags' - *note Customization::.. This - command only works on files that have status `Conflict' or - `Merged'. - - If CVS-DIFF-IGNORE-MARKS is set to a non-`nil' value or if a - prefix argument is given (but not both) any marked files will - not be considered to be selected. (`cvs-mode-diff-backup'). - - -File: pcl-cvs, Node: Emerge, Next: Reverting your buffers, Prev: Viewing differences, Up: Commands - -Running emerge -============== - -`e' - Invoke `emerge' on one file. This command works slightly - different depending on the file status. - - `Modified' - Run `emerge-files' with your working file as file A, and - the latest revision in the repository as file B. - - `Merged' - `Conflict' - Run `emerge-files-with-ancestor' with your working file (as - it was prior to your invocation of `cvs-update') as file A, - the latest revision in the repository as file B, and the - revision that you based your local modifications on as - ancestor. - - *Note:* CVS has already performed a merge. The resulting file is - not used in any way if you use this command. If you use the `q' - command inside `emerge' (to successfully terminate the merge) the - file that CVS created will be overwritten. - - -File: pcl-cvs, Node: Reverting your buffers, Next: Miscellaneous commands, Prev: Emerge, Up: Commands - -Reverting your buffers -====================== - -`R' - If you are editing (or just viewing) a file in a buffer, and - that file is changed by CVS during a `cvs-update', all you have - to do is type `R' in the *cvs* buffer to read in the new - versions of the files. - - All files that are `Updated', `Merged' or in `Conflict' are - reverted from the disk. Any other files are ignored. Only files - that you were already editing are read. - - An error is signalled if you have modified the buffer since it - was last changed. (`cvs-mode-revert-updated-buffers'). - - -File: pcl-cvs, Node: Miscellaneous commands, Prev: Reverting your buffers, Up: Commands - -Miscellaneous commands -====================== - -`M-x cvs-byte-compile-files' - Byte compile all selected files that end in .el. - -`M-x cvs-delete-lock' - This command can be used in any buffer, and deletes the lock - files that the *cvs* buffer informs you about. You should - normally never have to use this command since CVS tries very - carefully to always remove the lock files itself. - - You can only use this command when a message in the *cvs* buffer - tells you so. You should wait a while before using this command - in case someone else is running a cvs command. - -`q' - Bury the *cvs* buffer. (`bury-buffer'). - - -File: pcl-cvs, Node: Customization, Next: Future enhancements, Prev: Commands, Up: Top - -Customization -************* - - If you have an idea about any customization that would be handy but -isn't present in this list, please tell me! *Note Bugs:: for info on -how to reach me. - -`cvs-erase-input-buffer' - If set to anything else than `nil' the edit buffer will be erased - before you write the log message (*note Committing changes::.). - -`cvs-inhibit-copyright-message' - The copyright message that is displayed on startup can be - annoying after a while. Set this variable to `t' if you want to - get rid of it. (But don't set this to `t' in the system defaults - file - new users should see this message at least once). - -`cvs-diff-flags' - A list of strings to pass as arguments to the `cvs diff' and - `diff' programs. This is used by `cvs-mode-diff-cvs' and - `cvs-mode-diff-backup' (key `b', *note Viewing differences::.). - If you prefer the Unidiff format you could add this line to your - `.emacs' file: - - (setq cvs-diff-flags '("-u")) - -`cvs-diff-ignore-marks' - If this variable is non-`nil' or if a prefix argument is given - (but not both) to `cvs-mode-diff-cvs' or `cvs-mode-diff-backup' - marked files are not considered selected. - -`cvs-log-flags' - List of strings to send to `cvs log'. Used by `cvs-mode-log' - (key `l', *note Getting info about files::.). - -`cvs-status-flags' - List of strings to send to `cvs status'. Used by - `cvs-mode-status' (key `s', *note Getting info about files::.). - -`cvs-auto-remove-handled' - If this variable is set to any non-`nil' value - `cvs-mode-remove-handled' will be called every time you check in - files, after the check-in is ready. *Note Removing handled - entries::. - -`cvs-auto-revert-after-commit' - If this variable is set to any non-`nil' value any buffers you - have that visit a file that is committed will be automatically - reverted. This variable is default `t'. *Note Committing - changes::. - -`cvs-update-prog-output-skip-regexp' - The `-u' flag in the `modules' file can be used to run a command - whenever a `cvs update' is performed (see cvs(5)). This regexp - is used to search for the last line in that output. It is - normally set to `"$"'. That setting is only correct if the - command outputs nothing. Note that pcl-cvs will get very - confused if the command outputs *anything* to `stderr'. - -`cvs-cvsroot' - This variable can be set to override `CVSROOT'. It should be a - string. If it is set then everytime a cvs command is run it will - be called as `cvs -d CVS-CVSROOT...' This can be useful if your - site has several repositories. - -`TMPDIR' - Pcl-cvs uses this *environment variable* to decide where to put - the temporary files it needs. It defaults to `/tmp' if it is - not set. - -`cvs-commit-buffer-require-final-newline' - When you enter a log message in the `*cvs-commit-message*' buffer - pcl-cvs will normally automatically insert a trailing newline, - unless there already is one. This behavior can be controlled via - `cvs-commit-buffer-require-final-newline'. If it is `t' (the - default behavior), a newline will always be appended. If it is - `nil', newlines will never be appended. Any other value causes - pcl-cvs to ask the user whenever there is no trailing newline in - the commit message buffer. - -`cvs-sort-ignore-file' - If this variable is set to any non-`nil' value the `.cvsignore' - will always be sorted whenever you use `cvs-mode-ignore' to add - a file to it. This option is on by default. - - -File: pcl-cvs, Node: Future enhancements, Next: Bugs, Prev: Customization, Up: Top - -Future enhancements -******************* - - Pcl-cvs is still under development and needs a number of -enhancements to be called complete. Below is my current wish-list -for future releases of pcl-cvs. Please, let me know which of these -features you want most. They are listed below in approximately the -order that I currently think I will implement them in. - - * Rewritten parser code. There are many situations where pcl-cvs - will fail to recognize the output from CVS. The situation could - be greatly increased. - - * `cvs-status'. This will run `cvs status' in a directory and - produce a buffer that looks pretty much like the current *cvs* - buffer. That buffer will include information for all - version-controlled files. (There will be a simple keystroke to - remove all "uninteresting" files, that is, files that are - "Up-to-date"). In this new buffer you will be able to update a - file, commit a file, et c. The big win with this is that you - will be able to watch the differences between your current - working file and the head revision in the repository before you - update the file, and you can then choose to update it or let it - wait for a while longer. - - * Log mode. When this mode is finished you will be able to move - around (using `n' and `p') between the revisions of a file, mark - two of them, and run a diff between them. You will be able to - hide branches (similar to the way you can hide sub-paragraphs in - outline-mode) and do merges between revisions. Other ideas - about this are welcome. - - * The current model for marks in the *cvs* buffer seems to be - confusing. I am considering to use the VM model instead, where - marks are normally inactive. To activate the mark, you issue a - command like `cvs-mode-next-command-uses-marks'. I might - implement a flag so that you can use either version. Feedback - on this before I start coding it is very welcome. - - * It should be possible to run commands such as `cvs log', `cvs - status' and `cvs commit' directly from a buffer containing a - file, instead of having to `cvs-update'. If the directory - contains many files the `cvs-update' can take quite some time, - especially on a slow machine. I planed to put these kind of - commands on the prefix `C-c C-v', but that turned out to be used - by for instance c++-mode. If you have any suggestions for a - better prefix key, please let me know. - - * Increased robustness. For instance, you can not currently press - `C-g' when you are entering the description of a file that you - are adding without confusing pcl-cvs. - - * Support for multiple active *cvs* buffers. - - * Dired support. I have an experimental `dired-cvs.el' that works - together with CVS 1.2. Unfortunately I wrote it on top of a - non-standard `dired.el', so it must be rewritten. - - * An ability to send user-supplied options to all the cvs commands. - - * Pcl-cvs is not at all clever about what it should do when `cvs - update' runs a program (due to the `-u' option in the `modules' - file -- see `cvs(5)'). The current release uses a regexp to - search for the end. At the very least that regexp should be - configured for different modules. Tell me if you have any idea - about what is the right thing to do. In a perfect world the - program should also be allowed to print to `stderr' without - causing pcl-cvs to crash. - - If you miss something in this wish-list, let me know! I don't -promise that I will write it, but I will at least try to coordinate -the efforts of making a good Emacs front end to CVS. See *Note -Bugs:: for information about how to reach me. - - So far, I have written most of pcl-cvs in my all-to-rare spare -time. If you want pcl-cvs to be developed faster you can write a -contract with Signum Support to do the extension. You can reach -Signum Support by email to `info@signum.se' or via mail to Signum -Support AB, Box 2044, S-580 02 Linkoping, Sweden. Phone: +46 (0) 13 - -21 46 00. Fax: +46 (0) 13 - 21 47 00. - - -File: pcl-cvs, Node: Bugs, Next: Function and Variable Index, Prev: Future enhancements, Up: Top - -Bugs (known and unknown) -************************ - - If you find a bug or misfeature, don't hesitate to tell me! Send -email to `ceder@lysator.liu.se'. - - If you have ideas for improvements, or if you have written some -extensions to this package, I would like to hear from you. I hope -that you find this package useful! - - Below is a partial list of currently known problems with pcl-cvs -version 1.05. - -Commit causes Emacs to hang - Emacs waits for the `cvs commit' command to finish before you can - do anything. If you start a background job from the loginfo - file you must take care that it closes `stdout' and `stderr' if - you do not want to wait for it. (You do that with - `background-command &>- 2&>- &' if you are starting - `background-command' from a `/bin/sh' shell script). - - Your emacs will also hang if there was a lock file in the - repository. In this case you can type `C-g' to get control over - your emacs again. - -Name clash in Emacs 19 - This is really a bug in Elib or the Emacs 19 distribution. Both - Elib and Emacs 19.6 through at least 19.10 contains a file named - `cookie.el'. One of the files will have to be renamed, and we - are currently negotiating about which of the files to rename. - -Commands while cvs-update is running - It is possible to type commands in the *cvs* buffer while the - update is running, but error messages is all that you will get. - The error messages should be better. - -Unexpected output from CVS - Unexpected output from CVS confuses pcl-cvs. It will currently - create a bug report that you can mail to me. It should do - something more civilized. - - -File: pcl-cvs, Node: Function and Variable Index, Next: Concept Index, Prev: Bugs, Up: Top - -Function and Variable Index -*************************** - -* Menu: - -* bury-buffer: Miscellaneous commands. -* cookie-next-cookie: Movement commands. -* cookie-previous-cookie: Movement commands. -* cvs-auto-remove-handled (variable): Customization. -* cvs-auto-revert-after-commit (variable): Customization. -* cvs-auto-revert-after-commit (variable): Committing changes. -* cvs-byte-compile-files: Miscellaneous commands. -* cvs-commit-buffer-require-final-newline (variable): Customization. -* cvs-cvsroot (variable): Customization. -* cvs-delete-lock: Updating the directory. -* cvs-diff-flags (variable): Customization. -* cvs-diff-ignore-marks (variable): Customization. -* cvs-diff-ignore-marks (variable): Viewing differences. -* cvs-erase-input-buffer (variable): Customization. -* cvs-erase-input-buffer (variable): Committing changes. -* cvs-inhibit-copyright-message (variable): Customization. -* cvs-log-flags (variable): Customization. -* cvs-mode-acknowledge: Removing handled entries. -* cvs-mode-add: Adding and removing files. -* cvs-mode-add-change-log-entry-other-window: Editing files. -* cvs-mode-commit: Committing changes. -* cvs-mode-diff-backup: Viewing differences. -* cvs-mode-diff-cvs: Viewing differences. -* cvs-mode-emerge: Emerge. -* cvs-mode-find-file: Editing files. -* cvs-mode-find-file-other-window: Editing files. -* cvs-mode-ignore: Removing handled entries. -* cvs-mode-log: Getting info about files. -* cvs-mode-mark: Marking files. -* cvs-mode-mark-all-files: Marking files. -* cvs-mode-remove-file: Adding and removing files. -* cvs-mode-remove-handled: Removing handled entries. -* cvs-mode-revert-updated-buffers: Reverting your buffers. -* cvs-mode-status: Getting info about files. -* cvs-mode-undo-local-changes: Undoing changes. -* cvs-mode-unmark: Marking files. -* cvs-mode-unmark-all-files: Marking files. -* cvs-mode-unmark-up: Marking files. -* cvs-mode-update-no-prompt: Updating the directory. -* cvs-sort-ignore-file (variable): Customization. -* cvs-status-flags (variable): Customization. -* cvs-update: Updating the directory. -* cvs-update-prog-output-skip-regexp (variable): Customization. -* TMPDIR (environment variable): Customization. - - -File: pcl-cvs, Node: Concept Index, Next: Key Index, Prev: Function and Variable Index, Up: Top - -Concept Index -************* - -* Menu: - -* -u option in modules file: Customization. -* .cvsignore file, sorting: Customization. -* About pcl-cvs: About pcl-cvs. -* Active files: Selected files. -* Added (file status): File status. -* Adding files: Adding and removing files. -* Archives: Archives. -* Author, how to reach: Bugs. -* Authors: Contributors. -* Automatically inserting newline: Customization. -* Automatically remove handled files: Customization. -* Automatically sorting .cvsignore: Customization. -* Buffer contents: Buffer contents. -* Bugs, how to report them: Bugs. -* Bugs, known: Bugs. -* Byte compilation: Miscellaneous commands. -* Ci: Committing changes. -* Commit buffer: Committing changes. -* Commit message, inserting newline: Customization. -* Committing changes: Committing changes. -* Conflict (file status): File status. -* Conflicts, how to resolve them: Viewing differences. -* Conflicts, resolving: Emerge. -* Context diff, how to get: Customization. -* Contributors: Contributors. -* Copyright message, getting rid of it: Customization. -* Customization: Customization. -* Deleting files: Adding and removing files. -* Diff: Viewing differences. -* Dired: Editing files. -* Edit buffer: Committing changes. -* Editing files: Editing files. -* Email archives: Archives. -* Email to the author: Bugs. -* Emerge: Emerge. -* Enhancements: Future enhancements. -* Erasing commit message: Committing changes. -* Erasing the input buffer: Customization. -* Example run: Getting started. -* Expunging uninteresting entries: Removing handled entries. -* FAQ: Bugs. -* File selection: Selected files. -* File status: File status. -* Finding files: Editing files. -* Flush changes: Undoing changes. -* Ftp-sites: Archives. -* Generating a typeset manual: Typeset manual installation. -* Generating the on-line manual: On-line manual installation. -* Getting pcl-cvs: Archives. -* Getting rid of lock files: Miscellaneous commands. -* Getting rid of the Copyright message.: Customization. -* Getting rid of uninteresting lines: Removing handled entries. -* Getting status: Getting info about files. -* Getting the *cvs* buffer: Updating the directory. -* Handled lines, removing them: Removing handled entries. -* Info-file (how to generate): On-line manual installation. -* Inhibiting the Copyright message.: Customization. -* Installation: Installation. -* Installation of elisp files: Pcl-cvs installation. -* Installation of on-line manual: On-line manual installation. -* Installation of typeset manual: Typeset manual installation. -* Introduction: Getting started. -* Invoking dired: Editing files. -* Invoking emerge: Emerge. -* Known bugs: Bugs. -* Loading files: Editing files. -* Lock files: Miscellaneous commands. -* Log (RCS/cvs command): Getting info about files. -* Manual installation (on-line): On-line manual installation. -* Manual installation (typeset): Typeset manual installation. -* Marked files: Selected files. -* Marking files: Marking files. -* Merged (file status): File status. -* Modified (file status): File status. -* Modules file (-u option): Customization. -* Move away FILE - it is in the way (file status): File status. -* Movement Commands: Movement commands. -* On-line manual (how to generate): On-line manual installation. -* Printing a manual: Typeset manual installation. -* Problems, list of common: Bugs. -* Putting files under CVS control: Adding and removing files. -* Recompiling elisp files: Miscellaneous commands. -* Removed (file status): File status. -* Removed by you, changed in repository (file status): File status. -* Removed from repository (file status): File status. -* Removed from repository, changed by you (file status): File status. -* Removing files: Adding and removing files. -* Removing uninteresting (processed) lines: Removing handled entries. -* Reporting bugs and ideas: Bugs. -* Require final newline: Customization. -* Resolving conflicts: Emerge. -* Resurrecting files: Adding and removing files. -* Reverting buffers: Reverting your buffers. -* Reverting buffers after commit: Committing changes. -* Reverting buffers after commit: Customization. -* Selected files: Selected files. -* Selecting files (commands to mark files): Marking files. -* Sites: Archives. -* Sorting the .cvsignore file: Customization. -* Status (cvs command): Getting info about files. -* Syncing buffers: Reverting your buffers. -* TeX - generating a typeset manual: Typeset manual installation. -* This repository is missing!... (file status): File status. -* Undo changes: Undoing changes. -* Unidiff, how to get: Customization. -* Uninteresting entries, getting rid of them: Removing handled entries. -* Unknown (file status): File status. -* Update program (-u option in modules file): Customization. -* Updated (file status): File status. -* Variables, list of all: Customization. -* Viewing differences: Viewing differences. - - -File: pcl-cvs, Node: Key Index, Prev: Concept Index, Up: Top - -Key Index -********* - -* Menu: - -* a - add a file: Adding and removing files. -* A - add ChangeLog entry: Editing files. -* b - diff backup file: Viewing differences. -* c - commit files: Committing changes. -* C-k - remove selected entries: Removing handled entries. -* C-n - Move down one file: Movement commands. -* C-p - Move up one file: Movement commands. -* d - run cvs diff: Viewing differences. -* DEL - unmark previous file: Marking files. -* e - invoke emerge: Emerge. -* ESC DEL - unmark all files: Marking files. -* f - find file or directory: Editing files. -* g - Rerun cvs update: Updating the directory. -* l - run cvs log: Getting info about files. -* m - marking a file: Marking files. -* M - marking all files: Marking files. -* n - Move down one file: Movement commands. -* o - find file in other window: Editing files. -* p - Move up on file: Movement commands. -* q - bury the *cvs* buffer: Miscellaneous commands. -* r - remove a file: Adding and removing files. -* R - revert buffers: Reverting your buffers. -* s - run cvs status: Getting info about files. -* SPC - Move down one file: Movement commands. -* U - undo changes: Undoing changes. -* u - unmark a file: Marking files. -* x - remove processed entries: Removing handled entries. - - - -Tag Table: -Node: Top1007 -Node: Copying3571 -Node: Installation22803 -Node: Pcl-cvs installation23593 -Node: On-line manual installation25654 -Node: Typeset manual installation26672 -Node: About pcl-cvs27411 -Node: Contributors27780 -Node: Archives29083 -Node: Getting started29662 -Node: Buffer contents32105 -Node: File status32654 -Node: Selected files35679 -Node: Commands36347 -Node: Updating the directory37558 -Node: Movement commands39217 -Node: Marking files39803 -Node: Committing changes40658 -Node: Editing files42124 -Node: Getting info about files42969 -Node: Adding and removing files43448 -Node: Undoing changes44799 -Node: Removing handled entries45259 -Node: Ignoring files46176 -Node: Viewing differences46706 -Node: Emerge48014 -Node: Reverting your buffers48988 -Node: Miscellaneous commands49685 -Node: Customization50427 -Node: Future enhancements54107 -Node: Bugs58298 -Node: Function and Variable Index60079 -Node: Concept Index62872 -Node: Key Index69468 - -End Tag Table diff --git a/gnu/usr.bin/cvs/cvs/config.h b/gnu/usr.bin/cvs/cvs/config.h deleted file mode 100644 index b3bee5f97b09..000000000000 --- a/gnu/usr.bin/cvs/cvs/config.h +++ /dev/null @@ -1,217 +0,0 @@ -/* @(#)config.h 1.19 92/03/31 */ - -/* - * Copyright (c) 1992, Brian Berliner and Jeff Polk - * Copyright (c) 1989-1992, Brian Berliner - * - * You may distribute under the terms of the GNU General Public License as - * specified in the README file that comes with the CVS 1.3 kit. - * - * This file holds (most of) the configuration tweaks that can be made to - * customize CVS for your site. CVS comes configured for a typical SunOS 4.x - * environment. The comments for each configurable item are intended to be - * self-explanatory. All #defines are tested first to see if an over-riding - * option was specified on the "make" command line. - * - * If special libraries are needed, you will have to edit the Makefile.in file - * or the configure script directly. Sorry. - */ - -/* - * CVS provides the most features when used in conjunction with the Version-5 - * release of RCS. Thus, it is the default. This also assumes that GNU diff - * Version-1.15 is being used as well -- you will have to configure your RCS - * V5 release separately to make this the case. If you do not have RCS V5 and - * GNU diff V1.15, comment out this define. You should not try mixing and - * matching other combinations of these tools. - */ -#ifndef HAVE_RCS5 -#define HAVE_RCS5 -#endif - -/* - * If, before installing this version of CVS, you were running RCS V4 AND you - * are installing this CVS and RCS V5 and GNU diff 1.15 all at the same time, - * you should turn on the following define. It only exists to try to do - * reasonable things with your existing checked out files when you upgrade to - * RCS V5, since the keyword expansion formats have changed with RCS V5. - * - * If you already have been running with RCS5, or haven't been running with CVS - * yet at all, or are sticking with RCS V4 for now, leave the commented out. - */ -#ifndef HAD_RCS4 -/* #define HAD_RCS4 */ -#endif - -/* - * For portability and heterogeneity reasons, CVS is shipped by default using - * my own text-file version of the ndbm database library in the src/myndbm.c - * file. If you want better performance and are not concerned about - * heterogeneous hosts accessing your modules file, turn this option off. - */ -#ifndef MY_NDBM -#define MY_NDBM -#endif - -/* - * The "diff" program to execute when creating patch output. This "diff" - * must support the "-c" option for context diffing. Specify a full pathname - * if your site wants to use a particular diff. If you are using the GNU - * version of diff (version 1.15 or later), this should be "diff -a". - * - * NOTE: this program is only used for the ``patch'' sub-command. The other - * commands use rcsdiff which will use whatever version of diff was specified - * when rcsdiff was built on your system. - */ -#ifndef DIFF -#define DIFF "diff" -#endif - -/* - * The "grep" program to execute when checking to see if a merged file had - * any conflicts. This "grep" must support the "-s" option and a standard - * regular expression as an argument. Specify a full pathname if your site - * wants to use a particular grep. - */ -#ifndef GREP -#define GREP "grep" -#endif - -/* - * The "rm" program to execute when pruning directories that are not part of - * a release. This "rm" must support the "-fr" options. Specify a full - * pathname if your site wants to use a particular rm. - */ -#ifndef RM -#define RM "rm" -#endif - -/* - * The "sort" program to execute when displaying the module database. Specify - * a full pathname if your site wants to use a particular sort. - */ -#ifndef SORT -#define SORT "sort" -#endif - -/* - * By default, RCS programs are executed with the shell or through execlp(), - * so the user's PATH environment variable is searched. If you'd like to - * bind all RCS programs to a certain directory (perhaps one not in most - * people's PATH) then set the default in RCSBIN_DFLT. Note that setting - * this here will cause all RCS programs to be executed from this directory, - * unless the user overrides the default with the RCSBIN environment variable - * or the "-b" option to CVS. - * - * This define should be either the empty string ("") or a full pathname to the - * directory containing all the installed programs from the RCS distribution. - */ -#ifndef RCSBIN_DFLT -#define RCSBIN_DFLT "" -#endif - -/* - * The default editor to use, if one does not specify the "-e" option to cvs, - * or does not have an EDITOR environment variable. I set this to just "vi", - * and use the shell to find where "vi" actually is. This allows sites with - * /usr/bin/vi or /usr/ucb/vi to work equally well (assuming that your PATH - * is reasonable). - */ -#ifndef EDITOR_DFLT -#define EDITOR_DFLT "vi" -#endif - -/* - * The Repository file holds the path to the directory within the source - * repository that contains the RCS ,v files for each CVS working directory. - * This path is either a full-path or a path relative to CVSROOT. - * - * The only advantage that I can see to having a relative path is that One can - * change the physical location of the master source repository, change one's - * CVSROOT environment variable, and CVS will work without problems. I - * recommend using full-paths. - */ -#ifndef RELATIVE_REPOS -/* #define RELATIVE_REPOS */ -#endif - -/* - * When committing or importing files, you must enter a log message. - * Normally, you can do this either via the -m flag on the command line or an - * editor will be started for you. If you like to use logging templates (the - * rcsinfo file within the $CVSROOT/CVSROOT directory), you might want to - * force people to use the editor even if they specify a message with -m. - * Enabling FORCE_USE_EDITOR will cause the -m message to be appended to the - * temp file when the editor is started. - */ -#ifndef FORCE_USE_EDITOR -/* #define FORCE_USE_EDITOR */ -#endif - -/* - * When locking the repository, some sites like to remove locks and assume - * the program that created them went away if the lock has existed for a long - * time. This used to be the default for previous versions of CVS. CVS now - * attempts to be much more robust, so lock files should not be left around - * by mistake. The new behaviour will never remove old locks (they must now - * be removed by hand). Enabling CVS_FUDGELOCKS will cause CVS to remove - * locks that are older than CVSLCKAGE seconds. - * Use of this option is NOT recommended. - */ -#ifndef CVS_FUDGELOCKS -/* #define CVS_FUDGELOCKS */ -#endif - -/* - * When committing a permanent change, CVS and RCS make a log entry of - * who committed the change. If you are committing the change logged in - * as "root" (not under "su" or other root-priv giving program), CVS/RCS - * cannot determine who is actually making the change. - * - * As such, by default, CVS disallows changes to be committed by users - * logged in as "root". You can disable this option by commenting - * out the lines below. - */ -#ifndef CVS_BADROOT -#define CVS_BADROOT -#endif - -/* - * The "cvs diff" command accepts all the single-character options that GNU - * diff (1.15) accepts. Except -D. GNU diff uses -D as a way to put - * cpp-style #define's around the output differences. CVS, by default, uses - * -D to specify a free-form date (like "cvs diff -D '1 week ago'"). If - * you would prefer that the -D option of "cvs diff" work like the GNU diff - * option, then comment out this define. - */ -#ifndef CVS_DIFFDATE -#define CVS_DIFFDATE -#endif - -/* End of CVS configuration section */ - -/* - * Externs that are included in libc, but are used frequently enough to - * warrant defining here. - */ -#ifndef STDC_HEADERS -extern void exit (); -#endif - -#ifndef getwd -extern char *getwd (); -#endif - -/* - * Some UNIX distributions don't include these in their stat.h Defined here - * because "config.h" is always included last. - */ -#ifndef S_IWRITE -#define S_IWRITE 0000200 /* write permission, owner */ -#endif -#ifndef S_IWGRP -#define S_IWGRP 0000020 /* write permission, grougroup */ -#endif -#ifndef S_IWOTH -#define S_IWOTH 0000002 /* write permission, other */ -#endif diff --git a/gnu/usr.bin/cvs/cvs/version.c b/gnu/usr.bin/cvs/cvs/version.c deleted file mode 100644 index 18a9d14f2b3d..000000000000 --- a/gnu/usr.bin/cvs/cvs/version.c +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright (c) 1992, Brian Berliner and Jeff Polk - * Copyright (c) 1989-1992, Brian Berliner - * - * You may distribute under the terms of the GNU General Public License as - * specified in the README file that comes with the CVS 1.3 kit. - * - * version.c - the CVS version number - */ - -char *version_string = "\nConcurrent Versions System (CVS) 1.3\n"; diff --git a/gnu/usr.bin/cvs/doc/cvs.ms b/gnu/usr.bin/cvs/doc/cvs.ms deleted file mode 100644 index 567179b393f8..000000000000 --- a/gnu/usr.bin/cvs/doc/cvs.ms +++ /dev/null @@ -1,1073 +0,0 @@ -.\" soelim cvs.ms | pic | tbl | troff -ms -.\" @(#)cvs.ms 1.2 92/01/30 -.\" -.\" troff source to the cvs USENIX article, Winter 1990, Washington, D.C. -.\" Copyright (c) 1989, Brian Berliner -.\" -.\" This program is free software; you can redistribute it and/or modify -.\" it under the terms of the GNU General Public License as published by -.\" the Free Software Foundation; either version 1, or (at your option) -.\" any later version. -.\" -.\" This program is distributed in the hope that it will be useful, -.\" but WITHOUT ANY WARRANTY; without even the implied warranty of -.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -.\" GNU General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program; if not, write to the Free Software -.\" Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -.\" -.\" The author can be reached at: berliner@prisma.com -.\" -.de SP -.if n .sp -.if t .sp .5 -.. -.de hl -.br -.in +0.5i -\l'\\n(LLu-1i' -.in -0.5i -.sp -.. -.OH "" -.nr PS 11 -.nr PO 1.25i -.pl -0.2i -.TL -.ps 14 -.ft B -.nf -CVS II: -Parallelizing Software Development -.fi -.ft -.ps -.AU -.ps 12 -.ft I -Brian Berliner -.ft -.ps -.AI -.ps 12 -.ft I -Prisma, Inc. -5465 Mark Dabling Blvd. -Colorado Springs, CO 80918 -berliner@prisma.com -.ft -.ps -.AB -The program described in this paper fills a need in the UNIX -community for a freely available tool to manage software revision and -release control in a multi-developer, multi-directory, multi-group -environment. -This tool also addresses the increasing need for tracking third-party vendor -source distributions while trying to maintain local modifications to -earlier releases. -.AE -.NH -Background -.PP -In large software development projects, it is usually necessary for more -than one software developer to be modifying (usually different) modules of the -code at the same time. -Some of these code modifications are done in an -experimental sense, at least until the code functions correctly, and some -testing of the entire program is usually necessary. -Then, the modifications are returned to a master source repository -so that others in the project can -enjoy the new bug-fix or functionality. -In order to manage such a project, some sort of revision control system is -necessary. -.PP -Specifically, UNIX\** -.FS -UNIX is a registered trademark of AT&T. -.FE -kernel development is an excellent example of the -problems that an adequate revision control system must address. -The SunOS\** -.FS -SunOS is a trademark of Sun Microsystems, Inc. -.FE -kernel is composed of over a thousand files spread across a -hierarchy of dozens of directories.\** -.FS -Yes, the SunOS 4.0 kernel is composed of over a \fIthousand\fP files! -.FE -Pieces of the kernel must be edited -by many software developers within an organization. -While undesirable in -theory, it is not uncommon to have two or more people making -modifications to the same file within the kernel sources in -order to facilitate a desired change. -Existing revision control systems like -.SM -RCS -.LG -[Tichy] or -.SM -SCCS -.LG -[Bell] serialize file modifications by -allowing only one developer to have a writable copy of a particular file at -any one point in time. -That developer is said to -have \*Qlocked\*U the file for his exclusive use, and no other developer is -allowed to check out a writable copy of the file until the locking -developer has finished impeding others' productivity. -Development pressures of productivity and deadlines -often force organizations to require that multiple developers be able to -simultaneously edit -copies of the same revision controlled file. -.PP -The necessity for multiple developers to modify the same file concurrently -questions the value of serialization-based policies in traditional revision -control. -This paper discusses the approach that -Prisma took in adapting a standard revision control system, -.SM -RCS\c -.LG -, along with an existing public-domain collection of shell scripts that sits -atop -.SM -RCS -.LG -and provides the basic conflict-resolution algorithms. -The resulting -program, \fBcvs\fP, addresses not only the issue of conflict-resolution in -a multi-developer open-editing environment, but also the issues of -software release control and vendor source support and integration. -.NH -The CVS Program -.PP -\fBcvs\fP -(Concurrent Versions System) -is a front end to the -.SM -RCS -.LG -revision control system which extends -the notion of revision control from a collection of files in a single -directory to a hierarchical collection of directories each containing -revision controlled files. -Directories and files in the \fBcvs\fP system can be combined together in -many ways to form a software release. -\fBcvs\fP -provides the functions necessary to manage these software releases and to -control the concurrent editing of source files among multiple software -developers. -.PP -The six major features of \fBcvs\fP are listed below, and will be -described in more detail in the following sections: -.RS -.IP 1. -Concurrent access and conflict-resolution algorithms to guarantee that -source changes are not \*Qlost.\*U -.IP 2. -Support for tracking third-party vendor source distributions while -maintaining the local modifications made to those sources. -.IP 3. -A flexible module database that provides a symbolic mapping of names to -components of a larger software distribution. -This symbolic mapping provides for location independence within the software -release and, for example, allows one to check out a copy of the \*Qdiff\*U -program without ever knowing that the sources to \*Qdiff\*U actually reside -in the \*Qbin/diff\*U directory. -.IP 4. -Configurable logging support allows all \*Qcommitted\*U source file changes -to be logged using an arbitrary program to save the log messages in a file, -notesfile, or news database. -.IP 5. -A software release can be symbolically tagged and checked out at any time -based on that tag. -An exact copy of a previous software release can be checked out at -any time, \fIregardless\fP of whether files or directories have been -added/removed from the \*Qcurrent\*U software release. -As well, -a \*Qdate\*U can be used to check out the \fIexact\fP version of the software -release as of the specified date. -.IP 6. -A \*Qpatch\*U format file [Wall] can be produced between two software -releases, even if the releases span multiple directories. -.RE -.PP -The sources maintained by \fBcvs\fP are kept within a single directory -hierarchy known as the \*Qsource repository.\*U -This \*Qsource repository\*U holds the actual -.SM -RCS -.LG -\*Q,v\*U files directly, as well as a special per-repository directory -(\c -.SM -CVSROOT.adm\c -.LG -) which contains a small number of administrative files that describe the -repository and how it can be accessed. -See Figure 1 for a picture of the \fBcvs\fP tree. -.KF -.hl -.DS B -.PS -line from 4.112,9.200 to 5.550,8.887 -line from 5.447,8.884 to 5.550,8.887 to 5.458,8.933 -line from 4.112,9.200 to 4.550,8.950 -line from 4.451,8.978 to 4.550,8.950 to 4.476,9.021 -line from 4.112,9.200 to 3.737,8.887 -line from 3.798,8.971 to 3.737,8.887 to 3.830,8.932 -line from 3.612,8.762 to 4.737,8.137 -line from 4.638,8.164 to 4.737,8.137 to 4.662,8.208 -line from 3.612,8.762 to 3.737,8.137 -line from 3.693,8.231 to 3.737,8.137 to 3.742,8.240 -line from 3.612,8.762 to 2.612,8.200 -line from 2.687,8.271 to 2.612,8.200 to 2.712,8.227 -line from 2.362,9.262 to 2.737,8.950 -line from 2.645,8.995 to 2.737,8.950 to 2.677,9.033 -line from 2.362,9.262 to 1.925,8.950 -line from 1.992,9.028 to 1.925,8.950 to 2.021,8.988 -line from 3.362,9.762 to 4.050,9.387 -line from 3.950,9.413 to 4.050,9.387 to 3.974,9.457 -line from 3.362,9.762 to 2.487,9.387 -line from 2.570,9.450 to 2.487,9.387 to 2.589,9.404 -.ps 11 -"newfs.c,v" at 4.487,8.043 ljust -.ps 11 -"mkfs.c,v" at 3.487,8.043 ljust -.ps 11 -"Makefile,v" at 2.237,8.043 ljust -.ps 11 -"newfs" at 3.487,8.793 ljust -.ps 11 -"halt.c,v" at 5.487,8.793 ljust -.ps 11 -"Makefile,v" at 4.237,8.793 ljust -.ps 11 -"modules,v" at 2.487,8.793 ljust -.ps 11 -"loginfo,v" at 1.488,8.793 ljust -.ps 11 -"etc" at 3.987,9.293 ljust -.ps 11 -"CVSROOT.adm" at 1.988,9.293 ljust -.ps 11 -"/src/master" at 2.987,9.793 ljust -.PE -.DE -.hl -.ce 100 -.LG -\fBFigure 1.\fP -.SM -\fBcvs\fP Source Repository -.ce 0 -.sp -.KE -.NH 2 -Software Conflict Resolution\** -.FS -The basic conflict-resolution algorithms -used in the \fBcvs\fP program find their roots -in the original work done by Dick Grune at Vrije Universiteit in Amsterdam -and posted to \fBcomp.sources.unix\fP in the volume 6 release sometime in 1986. -This original version of \fBcvs\fP was a collection of shell scripts that -combined to form a front end to the -.SM -RCS -.LG -programs. -.FE -.PP -\fBcvs\fP allows several software developers to edit personal copies of a -revision controlled file concurrently. -The revision number of each checked out file is maintained independently -for each user, and \fBcvs\fP forces the checked out file to be current with -the \*Qhead\*U revision before it can be \*Qcommitted\*U as a permanent change. -A checked out file is brought up-to-date with the \*Qhead\*U revision using -the \*Qupdate\*U command of \fBcvs\fP. -This command compares the \*Qhead\*U revision number with that of the user's -file and performs an -.SM -RCS -.LG -merge operation if they are not the same. -The result of the merge is a file that contains the user's modifications -and those modifications that were \*Qcommitted\*U after the user -checked out his version of the file (as well as a backup copy of the -user's original file). -\fBcvs\fP points out any conflicts during the merge. -It is the user's responsibility to resolve these conflicts -and to \*Qcommit\*U his/her changes when ready. -.PP -Although the \fBcvs\fP conflict-resolution algorithm was defined in 1986, -it is remarkably similar to the \*QCopy-Modify-Merge\*U scenario included -with NSE\** -.FS -NSE is the Network Software Environment, a product of Sun Microsystems, Inc. -.FE -and described in [Honda] and [Courington]. -The following explanation from [Honda] also applies to \fBcvs\fP: -.QP -Simply stated, a developer copies an object without locking it, modifies -the copy, and then merges the modified copy with the original. -This paradigm allows developers to work in isolation from one another since -changes are made to copies of objects. -Because locks are not used, development is not serialized and can proceed -in parallel. -Developers, however, must merge objects after the changes have been made. -In particular, a developer must resolve conflicts when the same object has -been modified by someone else. -.PP -In practice, Prisma has found that conflicts that occur when the same -object has been modified by someone else are quite rare. -When they do happen, the changes made by the other developer are usually -easily resolved. -This practical use has shown that the \*QCopy-Modify-Merge\*U paradigm is a -correct and useful one. -.NH 2 -Tracking Third-Party Source Distributions -.PP -Currently, a large amount of software is based on source -distributions from a third-party distributor. -It is often the case that local modifications are to be made to this -distribution, \fIand\fP that the vendor's future releases should be -tracked. -Rolling your local modifications forward into the new vendor release is a -time-consuming task, but \fBcvs\fP can ease this burden somewhat. -The \fBcheckin\fP program of \fBcvs\fP initially sets up a source -repository by integrating the source modules directly from the vendor's -release, preserving the directory hierarchy of the vendor's distribution. -The branch support of -.SM -RCS -.LG -is used to build this vendor release as a branch of the main -.SM -RCS -.LG -trunk. -Figure 2 shows how the \*Qhead\*U tracks a sample vendor -branch when no local modifications have been made to the file. -.KF -.hl -.DS B -.PS -ellipse at 3.237,6.763 wid 1.000 ht 0.500 -dashwid = 0.050i -line dashed from 3.237,7.513 to 3.737,7.513 to 3.737,9.762 to 4.237,9.762 -line from 4.138,9.737 to 4.237,9.762 to 4.138,9.787 -line dashed from 2.237,8.262 to 3.237,8.262 to 3.237,7.013 -line from 3.212,7.112 to 3.237,7.013 to 3.262,7.112 -line from 3.737,6.763 to 4.237,6.763 -line from 4.138,6.737 to 4.237,6.763 to 4.138,6.788 -line from 2.237,6.763 to 2.737,6.763 -line from 2.637,6.737 to 2.737,6.763 to 2.637,6.788 -line from 1.738,6.013 to 1.738,6.513 -line from 1.762,6.413 to 1.738,6.513 to 1.713,6.413 -line from 1.238,7.013 to 2.237,7.013 to 2.237,6.513 to 1.238,6.513 to 1.238,7.013 -line from 4.237,9.012 to 5.237,9.012 to 5.237,8.512 to 4.237,8.512 to 4.237,9.012 -line from 4.237,8.012 to 5.237,8.012 to 5.237,7.513 to 4.237,7.513 to 4.237,8.012 -line from 4.237,7.013 to 5.237,7.013 to 5.237,6.513 to 4.237,6.513 to 4.237,7.013 -line from 4.737,7.013 to 4.737,7.513 -line from 4.763,7.413 to 4.737,7.513 to 4.712,7.413 -line from 4.737,8.012 to 4.737,8.512 -line from 4.763,8.412 to 4.737,8.512 to 4.712,8.412 -line from 4.237,10.012 to 5.237,10.012 to 5.237,9.512 to 4.237,9.512 to 4.237,10.012 -line from 4.737,9.012 to 4.737,9.512 -line from 4.763,9.412 to 4.737,9.512 to 4.712,9.412 -line from 5.987,5.013 to 5.987,6.013 to 0.988,6.013 to 0.988,5.013 to 5.987,5.013 -.ps 11 -"\"HEAD\"" at 1.550,8.231 ljust -.ps 11 -"'SunOS'" at 2.987,6.293 ljust -.ps 11 -"1.1.1" at 3.050,6.793 ljust -.ps 11 -"1.1" at 1.613,6.793 ljust -.ps 11 -"1.1.1.1" at 4.487,6.793 ljust -.ps 11 -"1.1.1.2" at 4.487,7.793 ljust -.ps 11 -"1.1.1.3" at 4.487,8.793 ljust -.ps 11 -"1.1.1.4" at 4.487,9.793 ljust -.ps 11 -"'SunOS_4_0'" at 5.487,6.793 ljust -.ps 11 -"'SunOS_4_0_1'" at 5.487,7.793 ljust -.ps 11 -"'YAPT_5_5C'" at 5.487,8.793 ljust -.ps 11 -"'SunOS_4_0_3'" at 5.487,9.793 ljust -.ps 11 -"rcsfile.c,v" at 2.987,5.543 ljust -.PE -.DE -.hl -.ce 100 -.LG -\fBFigure 2.\fP -.SM -\fBcvs\fP Vendor Branch Example -.ce 0 -.sp .3 -.KE -Once this is done, developers can check out files and make local changes to -the vendor's source distribution. -These local changes form a new branch to the tree which is then used as the -source for future check outs. -Figure 3 shows how the \*Qhead\*U moves to the main -.SM -RCS -.LG -trunk when a local modification is made. -.KF -.hl -.DS B -.PS -ellipse at 3.237,6.763 wid 1.000 ht 0.500 -dashwid = 0.050i -line dashed from 2.800,9.075 to 1.738,9.075 to 1.738,8.012 -line from 1.713,8.112 to 1.738,8.012 to 1.762,8.112 -line from 1.738,7.013 to 1.738,7.513 -line from 1.762,7.413 to 1.738,7.513 to 1.713,7.413 -line from 1.238,8.012 to 2.237,8.012 to 2.237,7.513 to 1.238,7.513 to 1.238,8.012 -line from 3.737,6.763 to 4.237,6.763 -line from 4.138,6.737 to 4.237,6.763 to 4.138,6.788 -line from 2.237,6.763 to 2.737,6.763 -line from 2.637,6.737 to 2.737,6.763 to 2.637,6.788 -line from 1.738,6.013 to 1.738,6.513 -line from 1.762,6.413 to 1.738,6.513 to 1.713,6.413 -line from 1.238,7.013 to 2.237,7.013 to 2.237,6.513 to 1.238,6.513 to 1.238,7.013 -line from 4.237,9.012 to 5.237,9.012 to 5.237,8.512 to 4.237,8.512 to 4.237,9.012 -line from 4.237,8.012 to 5.237,8.012 to 5.237,7.513 to 4.237,7.513 to 4.237,8.012 -line from 4.237,7.013 to 5.237,7.013 to 5.237,6.513 to 4.237,6.513 to 4.237,7.013 -line from 4.737,7.013 to 4.737,7.513 -line from 4.763,7.413 to 4.737,7.513 to 4.712,7.413 -line from 4.737,8.012 to 4.737,8.512 -line from 4.763,8.412 to 4.737,8.512 to 4.712,8.412 -line from 4.237,10.012 to 5.237,10.012 to 5.237,9.512 to 4.237,9.512 to 4.237,10.012 -line from 4.737,9.012 to 4.737,9.512 -line from 4.763,9.412 to 4.737,9.512 to 4.712,9.412 -line from 5.987,5.013 to 5.987,6.013 to 0.988,6.013 to 0.988,5.013 to 5.987,5.013 -.ps 11 -"1.2" at 1.613,7.793 ljust -.ps 11 -"\"HEAD\"" at 2.862,9.043 ljust -.ps 11 -"'SunOS'" at 2.987,6.293 ljust -.ps 11 -"1.1.1" at 3.050,6.793 ljust -.ps 11 -"1.1" at 1.613,6.793 ljust -.ps 11 -"1.1.1.1" at 4.487,6.793 ljust -.ps 11 -"1.1.1.2" at 4.487,7.793 ljust -.ps 11 -"1.1.1.3" at 4.487,8.793 ljust -.ps 11 -"1.1.1.4" at 4.487,9.793 ljust -.ps 11 -"'SunOS_4_0'" at 5.487,6.793 ljust -.ps 11 -"'SunOS_4_0_1'" at 5.487,7.793 ljust -.ps 11 -"'YAPT_5_5C'" at 5.487,8.793 ljust -.ps 11 -"'SunOS_4_0_3'" at 5.487,9.793 ljust -.ps 11 -"rcsfile.c,v" at 2.987,5.543 ljust -.PE -.DE -.hl -.ce 100 -.LG -\fBFigure 3.\fP -.SM -\fBcvs\fP Local Modification to Vendor Branch -.ce 0 -.sp -.KE -.PP -When a new version of the vendor's source distribution arrives, the -\fBcheckin\fP program adds the new and changed vendor's files to the -already existing source repository. -For files that have not been changed locally, the new file from the -vendor becomes the current \*Qhead\*U revision. -For files that have been modified locally, \fBcheckin\fP warns that the -file must be merged with the new vendor release. -The \fBcvs\fP \*Qjoin\*U command is a useful tool that aids this process by -performing the necessary -.SM -RCS -.LG -merge, as is done above when performing an \*Qupdate.\*U -.PP -There is also limited support for \*Qdual\*U derivations for source files. -See Figure 4 for a sample dual-derived file. -.KF -.hl -.DS B -.PS -ellipse at 2.337,8.575 wid 0.700 ht 0.375 -ellipse at 2.312,9.137 wid 0.700 ht 0.375 -line from 1.225,9.012 to 1.225,9.363 -line from 1.250,9.263 to 1.225,9.363 to 1.200,9.263 -line from 0.875,9.725 to 1.600,9.725 to 1.600,9.363 to 0.875,9.363 to 0.875,9.725 -line from 0.875,9.012 to 1.600,9.012 to 1.600,8.650 to 0.875,8.650 to 0.875,9.012 -line from 4.050,10.200 to 4.775,10.200 to 4.775,9.850 to 4.050,9.850 to 4.050,10.200 -line from 4.050,9.475 to 4.775,9.475 to 4.775,9.113 to 4.050,9.113 to 4.050,9.475 -line from 4.050,8.762 to 4.775,8.762 to 4.775,8.400 to 4.050,8.400 to 4.050,8.762 -line from 4.425,8.762 to 4.425,9.113 -line from 4.450,9.013 to 4.425,9.113 to 4.400,9.013 -line from 4.425,9.475 to 4.425,9.850 -line from 4.450,9.750 to 4.425,9.850 to 4.400,9.750 -line from 3.050,10.000 to 3.775,10.000 to 3.775,9.637 to 3.050,9.637 to 3.050,10.000 -line from 3.050,9.312 to 3.775,9.312 to 3.775,8.950 to 3.050,8.950 to 3.050,9.312 -line from 0.713,7.325 to 0.713,8.075 to 4.925,8.075 to 4.925,7.325 to 0.713,7.325 -line from 1.238,8.075 to 1.238,8.637 -line from 1.262,8.537 to 1.238,8.637 to 1.213,8.537 -line from 1.613,8.825 to 1.975,8.575 -line from 1.878,8.611 to 1.975,8.575 to 1.907,8.652 -line from 2.675,8.575 to 4.050,8.575 -line from 3.950,8.550 to 4.050,8.575 to 3.950,8.600 -line from 2.675,9.137 to 3.050,9.137 -line from 2.950,9.112 to 3.050,9.137 to 2.950,9.162 -line from 3.425,9.325 to 3.425,9.637 -line from 3.450,9.537 to 3.425,9.637 to 3.400,9.537 -line from 1.613,8.825 to 1.925,9.137 -line from 1.872,9.049 to 1.925,9.137 to 1.837,9.084 -.ps 11 -"'BSD'" at 2.138,9.481 ljust -.ps 11 -"1.2" at 1.113,9.543 ljust -.ps 11 -"1.1" at 1.125,8.831 ljust -.ps 11 -"1.1.1.1" at 4.175,8.543 ljust -.ps 11 -"1.1.1.2" at 4.175,9.281 ljust -.ps 11 -"1.1.1.3" at 4.175,9.993 ljust -.ps 11 -"1.1.2.2" at 3.175,9.793 ljust -.ps 11 -"1.1.2.1" at 3.175,9.106 ljust -.ps 11 -"rcsfile.c,v" at 2.425,7.706 ljust -.ps 11 -"1.1.1" at 2.175,8.568 ljust -.ps 11 -"'SunOS'" at 2.125,8.243 ljust -.ps 11 -"1.1.2" at 2.163,9.131 ljust -.PE -.DE -.hl -.ce 100 -.LG -\fBFigure 4.\fP -.SM -\fBcvs\fP Support For \*QDual\*U Derivations -.ce 0 -.sp -.KE -This example tracks the SunOS distribution but includes major changes from -Berkeley. -These BSD files are saved directly in the -.SM -RCS -.LG -file off a new branch. -.NH 2 -Location Independent Module Database -.PP -\fBcvs\fP contains support for a simple, yet powerful, \*Qmodule\*U database. -For reasons of efficiency, this database is stored in \fBndbm\fP\|(3) format. -The module database is used to apply names to collections of directories -and files as a matter of convenience for checking out pieces of a large -software distribution. -The database records the physical location of the sources as a form of -information hiding, allowing one to check out whole directory hierarchies -or individual files without regard for their actual location within the -global source distribution. -.PP -Consider the following small sample of a module database, which must be -tailored manually to each specific source repository environment: -.DS -\f(CW #key [-option argument] directory [files...] - diff bin/diff - libc lib/libc - sys -o sys/tools/make_links sys - modules -i mkmodules CVSROOT.adm modules - kernel -a sys lang/adb - ps bin Makefile ps.c\fP -.DE -.PP -The \*Qdiff\*U and \*Qlibc\*U modules refer to whole directory hierarchies that -are extracted on check out. -The \*Qsys\*U module extracts the \*Qsys\*U hierarchy, and runs the -\*Qmake_links\*U program at the end of the check out process (the \fI-o\fP -option specifies a program to run on check\fIo\fPut). -The \*Qmodules\*U module allows one to edit the module database file and -runs the \*Qmkmodules\*U program on check\fIi\fPn to regenerate the -\fBndbm\fP database that \fBcvs\fP uses. -The \*Qkernel\*U module is an alias (as the \fI-a\fP option specifies) -which causes the remaining arguments after the \fI-a\fP to be interpreted -exactly as if they had been specified on the command line. -This is useful for objects that require shared pieces of code from far away -places to be compiled (as is the case with the kernel debugger, \fBkadb\fP, -which shares code with the standard \fBadb\fP debugger). -The \*Qps\*U module shows that the source for \*Qps\*U lives in the \*Qbin\*U -directory, but only \fIMakefile\fP and \fIps.c\fP are required to build the -object. -.PP -The module database at Prisma is now populated for the entire UNIX -distribution and thereby allows us to issue the -following convenient commands to check out components of the UNIX -distribution without regard for their actual location within the master source -repository: -.DS -\f(CW example% cvs checkout diff - example% cvs checkout libc ps - example% cd diff; make\fP -.DE -.PP -In building the module database file, it is quite possible to have name -conflicts within a global software distribution. -For example, SunOS provides two \fBcat\fP programs: -one for the standard environment, \fI/bin/cat\fP, and one for the System V -environment, \fI/usr/5bin/cat\fP. -We resolved this conflict by naming the standard \fBcat\fP module -\*Qcat\*U, and the System V \fBcat\fP module \*Q5cat\*U. -Similar name modifications must be applied to other conflicting names, as -might be found between a utility program and a library function, though -Prisma chose not to include individual library functions within the module -database at this time. -.NH 2 -Configurable Logging Support -.PP -The \fBcvs\fP \*Qcommit\*U command is used to make a permanent change to the -master source repository (where the -.SM -RCS -.LG -\*Q,v\*U files live). -Whenever a \*Qcommit\*U is done, the log message for the change is carefully -logged by an arbitrary program (in a file, notesfile, news database, or -mail). -For example, a collection of these updates can be used to produce release -notices. -\fBcvs\fP can be configured to send log updates through one or more filter -programs, based on a regular expression match on the directory that is -being changed. -This allows multiple related or unrelated projects to exist within a single -\fBcvs\fP source repository tree, with each different project sending its -\*Qcommit\*U reports to a unique log device. -.PP -A sample logging configuration file might look as follows: -.DS -\f(CW #regex filter-program - DEFAULT /usr/local/bin/nfpipe -t %s utils.updates - ^diag /usr/local/bin/nfpipe -t %s diag.updates - ^local /usr/local/bin/nfpipe -t %s local.updates - ^perf /usr/local/bin/nfpipe -t %s perf.updates - ^sys /usr/local/bin/nfpipe -t %s kernel.updates\fP -.DE -.PP -This sample allows the diagnostics and performance groups to -share the same source repository with the kernel and utilities groups. -Changes that they make are sent directly to their own notesfile [Essick] -through the \*Qnfpipe\*U program. -A sufficiently simple title is substituted for the \*Q%s\*U argument before -the filter program is executed. -This logging configuration file is tailored manually to each specific -source repository environment. -.NH 2 -Tagged Releases and Dates -.PP -Any release can be given a symbolic tag name that is stored directly in the -.SM -RCS -.LG -files. -This tag can be used at any time to get an exact copy of any previous -release. -With equal ease, one can also extract an exact copy of the source files as -of any arbitrary date in the past as well. -Thus, all that's required to tag the current kernel, and to tag the kernel -as of the Fourth of July is: -.DS -\f(CW example% cvs tag TEST_KERNEL kernel - example% cvs tag -D 'July 4' PATRIOTIC_KERNEL kernel\fP -.DE -The following command would retrieve an exact copy of the test kernel at -some later date: -.DS -\f(CW example% cvs checkout -fp -rTEST_KERNEL kernel\fP -.DE -The \fI-f\fP option causes only files that match the specified tag to be -extracted, while the \fI-p\fP option automatically prunes empty directories. -Consequently, directories added to the kernel after the test kernel was -tagged are not included in the newly extracted copy of the test kernel. -.PP -The \fBcvs\fP date support has exactly the same interface as that provided -with -.SM -RCS\c -.LG -, however \fBcvs\fP must process the \*Q,v\*U files directly due to the -special handling required by the vendor branch support. -The standard -.SM -RCS -.LG -date handling only processes one branch (or the main trunk) when checking -out based on a date specification. -\fBcvs\fP must instead process the current \*Qhead\*U branch and, if a -match is not found, proceed to look for a match on the vendor branch. -This, combined with reasons of performance, is why \fBcvs\fP processes -revision (symbolic and numeric) and date specifications directly from the -\*Q,v\*U files. -.NH 2 -Building \*Qpatch\*U Source Distributions -.PP -\fBcvs\fP can produce a \*Qpatch\*U format [Wall] output file which can be -used to bring a previously released software distribution current with the -newest release. -This patch file supports an entire directory hierarchy within a single -patch, as well as being able to add whole new files to the previous -release. -One can combine symbolic revisions and dates together to display changes in -a very generic way: -.DS -\f(CW example% cvs patch -D 'December 1, 1988' \e - -D 'January 1, 1989' sys\fP -.DE -This example displays the kernel changes made in the month of December, -1988. -To release a patch file, for example, to take the \fBcvs\fP distribution -from version 1.0 to version 1.4 might be done as follows: -.DS -\f(CW example% cvs patch -rCVS_1_0 -rCVS_1_4 cvs\fP -.DE -.NH -CVS Experience -.NH 2 -Statistics -.PP -A quick summary of the scale that \fBcvs\fP is addressing today -can be found in Table 1. -.KF -.TS -box center tab(:); -c s -c s -c | c -l | n . -\fB\s+2Revision Control Statistics at Prisma -as of 11/11/89\fP\s-2 -_ -How Many...:Total -= -Files:17243 -Directories:1005 -Lines of code:3927255 -Removed files:131 -Software developers:14 -Software groups:6 -Megabytes of source:128 -.TE -.ce 100 -.LG -\fBTable 1.\fP -.SM -\fBcvs\fP Statistics -.ce 0 -.sp .3 -.KE -Table 2 shows the history of files changed or added and the number -of source lines affected by the change at Prisma. -Only changes made to the kernel sources are included. -.KF -.TS -box center tab(:); -c s s s s -c s s s s -c || c | c || c | c -c || c | c || c | c -l || n | n || n | n. -\fB\s+2Prisma Kernel Source File Changes -By Month, 1988-1989\fP\s-2 -_ -Month:# Changed:# Lines:# Added:# Lines -\^:Files:Changed:Files:Added -= -Dec:87:3619:68:9266 -Jan:39:4324:0:0 -Feb:73:1578:5:3550 -Mar:99:5301:18:11461 -Apr:112:7333:11:5759 -May:138:5371:17:13986 -Jun:65:2261:27:12875 -Jul:34:2000:1:58 -Aug:65:6378:8:4724 -Sep:266:23410:113:39965 -Oct:22:621:1:155 -Total:1000:62196:269:101799 -.TE -.ce 100 -.LG -\fBTable 2.\fP -.SM -\fBcvs\fP Usage History for the Kernel -.ce 0 -.sp -.KE -The large number of source file changes made in September are the result of -merging the SunOS 4.0.3 sources into the kernel. -This merge process is described in section 3.3. -.NH 2 -Performance -.PP -The performance of \fBcvs\fP is currently quite reasonable. -Little effort has been expended on tuning \fBcvs\fP, although performance -related decisions were made during the \fBcvs\fP design. -For example, \fBcvs\fP parses the -.SM -RCS -.LG -\*Q,v\*U files directly instead of running an -.SM -RCS -.LG -process. -This includes following branches as well as integrating with the vendor -source branches and the main trunk when checking out files based on a date. -.PP -Checking out the entire kernel source tree (1223 files/59 directories) -currently takes 16 wall clock minutes on a Sun-4/280. -However, bringing the tree up-to-date with the current kernel sources, once -it has been checked out, takes only 1.5 wall clock minutes. -Updating the \fIcomplete\fP 128 MByte source tree under \fBcvs\fP control -(17243 files/1005 directories) takes roughly 28 wall clock minutes and -utilizes one-third of the machine. -For now this is entirely acceptable; improvements on these numbers will -possibly be made in the future. -.NH 2 -The SunOS 4.0.3 Merge -.PP -The true test of the \fBcvs\fP vendor branch support came with the arrival -of the SunOS 4.0.3 source upgrade tape. -As described above, the \fBcheckin\fP program was used to install the new -sources and the resulting output file listed the files that had been -locally modified, needing to be merged manually. -For the kernel, there were 94 files in conflict. -The \fBcvs\fP \*Qjoin\*U command was used on each of the 94 conflicting -files, and the remaining conflicts were resolved. -.PP -The \*Qjoin\*U command performs an \fBrcsmerge\fP operation. -This in turn uses \fI/usr/lib/diff3\fP to produce a three-way diff file. -As it happens, the \fBdiff3\fP program has a hard-coded limit of 200 -source-file changes maximum. -This proved to be too small for a few of the kernel files that needed -merging by hand, due to the large number of local changes that Prisma had -made. -The \fBdiff3\fP problem was solved by increasing the hard-coded limit by an -order of magnitude. -.PP -The SunOS 4.0.3 kernel source upgrade distribution contained -346 files, 233 of which were modifications to previously released files, -and 113 of which were newly added files. -\fBcheckin\fP added the 113 new files to the source repository -without intervention. -Of the 233 modified files, 139 dropped in cleanly by \fBcheckin\fP, since -Prisma had not made any local changes to them, and 94 required manual -merging due to local modifications. -The 233 modified files consisted of 20,766 lines of differences. -It took one developer two days to manually merge the 94 files using the -\*Qjoin\*U command and resolving conflicts manually. -An additional day was required for kernel debugging. -The entire process of merging over 20,000 lines of differences was -completed in less than a week. -This one time-savings alone was justification enough for the \fBcvs\fP -development effort; we expect to gain even more when tracking future SunOS -releases. -.NH -Future Enhancements and Current Bugs -.PP -Since \fBcvs\fP was designed to be incomplete, for reasons of design -simplicity, there are naturally a good -number of enhancements that can be made to make it more useful. -As well, some nuisances exist in the current implementation. -.RS -.IP \(bu 3 -\fBcvs\fP does not currently \*Qremember\*U who has a checked out a copy of a -module. -As a result, it is impossible to know who might be working on the same -module that you are. -A simple-minded database that is updated nightly would likely suffice. -.IP \(bu 3 -Signal processing, keyboard interrupt handling in particular, is currently -somewhat weak. -This is due to the heavy use of the \fBsystem\fP\|(3) library -function to execute -.SM -RCS -.LG -programs like \fBco\fP and \fBci\fP. -It sometimes takes multiple interrupts to make \fBcvs\fP quit. -This can be fixed by using a home-grown \fBsystem\fP\|() replacement. -.IP \(bu 3 -Security of the source repository is currently not dealt with directly. -The usual UNIX approach of user-group-other security permissions through -the file system is utilized, but nothing else. -\fBcvs\fP could likely be a set-group-id executable that checks a -protected database to verify user access permissions for particular objects -before allowing any operations to affect those objects. -.IP \(bu 3 -With every checked-out directory, \fBcvs\fP maintains some administrative -files that record the current revision numbers of the checked-out files as -well as the location of the respective source repository. -\fBcvs\fP does not recover nicely at all if these administrative files are -removed. -.IP \(bu 3 -The source code for \fBcvs\fP has been tested extensively on Sun-3 and -Sun-4 systems, all running SunOS 4.0 or later versions of the operating -system. -Since the code has not yet been compiled under other platforms, the overall -portability of the code is still questionable. -.IP \(bu 3 -As witnessed in the previous section, the \fBcvs\fP method for tracking -third party vendor source distributions can work quite nicely. -However, if the vendor changes the directory structure or the file names -within the source distribution, \fBcvs\fP has no way of matching the old -release with the new one. -It is currently unclear as to how to solve this, though it is certain to -happen in practice. -.RE -.NH -Availability -.PP -The \fBcvs\fP program sources can be found in a recent posting to the -\fBcomp.sources.unix\fP newsgroup. -It is also currently available via anonymous ftp from \*Qprisma.com\*U. -Copying rights for \fBcvs\fP will be covered by the GNU General Public -License. -.NH -Summary -.PP -Prisma has used \fBcvs\fP since December, 1988. -It has evolved to meet our specific needs of revision and release control. -We will make our code freely available so that others can -benefit from our work, and can enhance \fBcvs\fP to meet broader needs yet. -.PP -Many of the other software release and revision control systems, like the -one described in [Glew], appear to use a collection of tools that are -geared toward specific environments \(em one set of tools for the kernel, -one set for \*Qgeneric\*U software, one set for utilities, and one set for -kernel and utilities. -Each of these tool sets apparently handle some specific aspect of the -problem uniquely. -\fBcvs\fP took a somewhat different approach. -File sharing through symbolic or hard links is not addressed; instead, the -disk space is simply burned since it is \*Qcheap.\*U -Support for producing objects for multiple architectures is not addressed; -instead, a parallel checked-out source tree must be used for each -architecture, again wasting disk space to simplify complexity and ease of -use \(em punting on this issue allowed \fIMakefile\fPs to remain -unchanged, unlike the approach taken in [Mahler], thereby maintaining closer -compatibility with the third-party vendor sources. -\fBcvs\fP is essentially a source-file server, making no assumptions or -special handling of the sources that it controls. -To \fBcvs\fP: -.QP -A source is a source, of course, of course, unless of course the source is -Mr. Ed.\** -.FS -\fBcvs\fP, of course, does not really discriminate against Mr. Ed.\** -.FE -.FS -Yet. -.FE -.LP -Sources are maintained, saved, and retrievable at any time based on -symbolic or numeric revision or date in the past. -It is entirely up to \fBcvs\fP wrapper programs to provide for release -environments and such. -.PP -The major advantage of \fBcvs\fP over the -many other similar systems that have already been designed is the -simplicity of \fBcvs\fP. -\fBcvs\fP contains only three programs that do all the work of release -and revision control, and two manually-maintained administrative -files for each source repository. -Of course, the deciding factor of any tool is whether people use it, and if -they even \fIlike\fP to use it. -At Prisma, \fBcvs\fP prevented members of the kernel -group from killing each other. -.NH -Acknowledgements -.PP -Many thanks to Dick Grune at Vrije Universiteit in Amsterdam for his work -on the original version of \fBcvs\fP and for making it available to the -world. -Thanks to Jeff Polk of Prisma for helping with the design of the module -database, vendor branch support, and for writing the \fBcheckin\fP shell -script. -Thanks also to the entire software group at Prisma for taking the -time to review the paper and correct my grammar. -.NH -References -.IP [Bell] 12 -Bell Telephone Laboratories. -\*QSource Code Control System User's Guide.\*U -\fIUNIX System III Programmer's Manual\fP, October 1981. -.IP [Courington] 12 -Courington, W. -\fIThe Network Software Environment\fP, -Sun Technical Report FE197-0, Sun Microsystems Inc, February 1989. -.IP [Essick] 12 -Essick, Raymond B. and Robert Bruce Kolstad. -\fINotesfile Reference Manual\fP, -Department of Computer Science Technical Report #1081, -University of Illinois at Urbana-Champaign, Urbana, Illinois, -1982, p. 26. -.IP [Glew] 12 -Glew, Andy. -\*QBoxes, Links, and Parallel Trees: -Elements of a Configuration Management System.\*U -\fIWorkshop Proceedings of the Software Management Conference\fP, USENIX, -New Orleans, April 1989. -.IP [Grune] 12 -Grune, Dick. -Distributed the original shell script version of \fBcvs\fP in the -\fBcomp.sources.unix\fP volume 6 release in 1986. -.IP [Honda] 12 -Honda, Masahiro and Terrence Miller. -\*QSoftware Management Using a CASE Environment.\*U -\fIWorkshop Proceedings of the Software Management Conference\fP, USENIX, -New Orleans, April 1989. -.IP [Mahler] 12 -Mahler, Alex and Andreas Lampen. -\*QAn Integrated Toolset for Engineering Software Configurations.\*U -\fIProceedings of the ACM SIGSOFT/SIGPLAN Software Engineering Symposium on -Practical Software Development Environments\fP, ACM, Boston, November 1988. -Described is the \fBshape\fP toolkit posted to the -\fBcomp.sources.unix\fP newsgroup in the volume 19 release. -.IP [Tichy] 12 -Tichy, Walter F. -\*QDesign, Implementation, and Evaluation of a Revision Control System.\*U -\fIProceedings of the 6th International Conference on Software -Engineering\fP, IEEE, Tokyo, September 1982. -.IP [Wall] 12 -Wall, Larry. -The \fBpatch\fP program is an indispensable tool for applying a diff file -to an original. -Can be found on uunet.uu.net in ~ftp/pub/patch.tar. diff --git a/gnu/usr.bin/cvs/lib/Makefile.in b/gnu/usr.bin/cvs/lib/Makefile.in deleted file mode 100644 index a8309f2fc00d..000000000000 --- a/gnu/usr.bin/cvs/lib/Makefile.in +++ /dev/null @@ -1,91 +0,0 @@ -# Makefile for library files used by GNU CVS. -# Do not use this makefile directly, but only from `../Makefile'. -# Copyright (C) 1986, 1988-1992 Free Software Foundation, Inc. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -# @(#)Makefile.in 1.12 92/03/31 - -SHELL = /bin/sh - -srcdir = @srcdir@ -@VPATH@ - -SOURCES = argmatch.c \ -error.c getopt.c getopt1.c \ -sighandle.c \ -strippath.c stripslash.c yesno.c \ -getdate.y \ -hostname.c fnmatch.c ftruncate.c mkdir.c rename.c regex.c \ -strdup.c getwd.c alloca.c - -OBJECTS = argmatch.o \ -error.o getopt.o getopt1.o \ -sighandle.o \ -strippath.o stripslash.o yesno.o \ -getdate.o \ -@LIBOBJS@ - -DISTFILES = Makefile.in getopt.h \ -fnmatch.h regex.h system.h wait.h $(SOURCES) - -xxx: - @cd ..; $(MAKE) all SUBDIRS=lib - -all: libcvs.a -.PHONY: all - -install: all -.PHONY: install - -tags: $(DISTFILES) - ctags $(DISTFILES) - -TAGS: $(DISTFILES) - etags $(DISTFILES) - -ls: - @echo $(DISTFILES) -.PHONY: ls - -clean: - rm -f *.a *.o *.tab.c getdate.c -.PHONY: clean - -distclean: clean - rm -f tags TAGS Makefile -.PHONY: distclean - -realclean: distclean -.PHONY: realclean - -dist: - ln $(DISTFILES) ../`cat ../.fname`/lib -.PHONY: dist - -libcvs.a: $(OBJECTS) - $(AR) cr $@ $(OBJECTS) - -$(RANLIB) $@ - -getdate.c: getdate.y - @echo expect 8 shift/reduce conflicts - $(YACC) $(srcdir)/getdate.y - -if test -f y.tab.c ; then mv y.tab.c getdate.c ; fi - -if test -f getdate.tab.c ; then mv getdate.tab.c getdate.c ; fi - -fnmatch.o: fnmatch.h -getopt1.o: getopt.h -regex.o: regex.h -getwd.o: system.h diff --git a/gnu/usr.bin/cvs/lib/regex.c b/gnu/usr.bin/cvs/lib/regex.c deleted file mode 100644 index 8169880d7e4f..000000000000 --- a/gnu/usr.bin/cvs/lib/regex.c +++ /dev/null @@ -1,4948 +0,0 @@ -/* Extended regular expression matching and search library, - version 0.12. - (Implements POSIX draft P10003.2/D11.2, except for - internationalization features.) - - Copyright (C) 1993 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* AIX requires this to be the first thing in the file. */ -#if defined (_AIX) && !defined (REGEX_MALLOC) - #pragma alloca -#endif - -#define _GNU_SOURCE - -/* We need this for `regex.h', and perhaps for the Emacs include files. */ -#include <sys/types.h> - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -/* The `emacs' switch turns on certain matching commands - that make sense only in Emacs. */ -#ifdef emacs - -#include "lisp.h" -#include "buffer.h" -#include "syntax.h" - -/* Emacs uses `NULL' as a predicate. */ -#undef NULL - -#else /* not emacs */ - -/* We used to test for `BSTRING' here, but only GCC and Emacs define - `BSTRING', as far as I know, and neither of them use this code. */ -#if HAVE_STRING_H || STDC_HEADERS -#include <string.h> -#ifndef bcmp -#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) -#endif -#ifndef bcopy -#define bcopy(s, d, n) memcpy ((d), (s), (n)) -#endif -#ifndef bzero -#define bzero(s, n) memset ((s), 0, (n)) -#endif -#else -#include <strings.h> -#endif - -#ifdef STDC_HEADERS -#include <stdlib.h> -#else -char *malloc (); -char *realloc (); -#endif - - -/* Define the syntax stuff for \<, \>, etc. */ - -/* This must be nonzero for the wordchar and notwordchar pattern - commands in re_match_2. */ -#ifndef Sword -#define Sword 1 -#endif - -#ifdef SYNTAX_TABLE - -extern char *re_syntax_table; - -#else /* not SYNTAX_TABLE */ - -/* How many characters in the character set. */ -#define CHAR_SET_SIZE 256 - -static char re_syntax_table[CHAR_SET_SIZE]; - -static void -init_syntax_once () -{ - register int c; - static int done = 0; - - if (done) - return; - - bzero (re_syntax_table, sizeof re_syntax_table); - - for (c = 'a'; c <= 'z'; c++) - re_syntax_table[c] = Sword; - - for (c = 'A'; c <= 'Z'; c++) - re_syntax_table[c] = Sword; - - for (c = '0'; c <= '9'; c++) - re_syntax_table[c] = Sword; - - re_syntax_table['_'] = Sword; - - done = 1; -} - -#endif /* not SYNTAX_TABLE */ - -#define SYNTAX(c) re_syntax_table[c] - -#endif /* not emacs */ - -/* Get the interface, including the syntax bits. */ -#include "regex.h" - -/* isalpha etc. are used for the character classes. */ -#include <ctype.h> - -#ifndef isascii -#define isascii(c) 1 -#endif - -#ifdef isblank -#define ISBLANK(c) (isascii (c) && isblank (c)) -#else -#define ISBLANK(c) ((c) == ' ' || (c) == '\t') -#endif -#ifdef isgraph -#define ISGRAPH(c) (isascii (c) && isgraph (c)) -#else -#define ISGRAPH(c) (isascii (c) && isprint (c) && !isspace (c)) -#endif - -#define ISPRINT(c) (isascii (c) && isprint (c)) -#define ISDIGIT(c) (isascii (c) && isdigit (c)) -#define ISALNUM(c) (isascii (c) && isalnum (c)) -#define ISALPHA(c) (isascii (c) && isalpha (c)) -#define ISCNTRL(c) (isascii (c) && iscntrl (c)) -#define ISLOWER(c) (isascii (c) && islower (c)) -#define ISPUNCT(c) (isascii (c) && ispunct (c)) -#define ISSPACE(c) (isascii (c) && isspace (c)) -#define ISUPPER(c) (isascii (c) && isupper (c)) -#define ISXDIGIT(c) (isascii (c) && isxdigit (c)) - -#ifndef NULL -#define NULL 0 -#endif - -/* We remove any previous definition of `SIGN_EXTEND_CHAR', - since ours (we hope) works properly with all combinations of - machines, compilers, `char' and `unsigned char' argument types. - (Per Bothner suggested the basic approach.) */ -#undef SIGN_EXTEND_CHAR -#if __STDC__ -#define SIGN_EXTEND_CHAR(c) ((signed char) (c)) -#else /* not __STDC__ */ -/* As in Harbison and Steele. */ -#define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128) -#endif - -/* Should we use malloc or alloca? If REGEX_MALLOC is not defined, we - use `alloca' instead of `malloc'. This is because using malloc in - re_search* or re_match* could cause memory leaks when C-g is used in - Emacs; also, malloc is slower and causes storage fragmentation. On - the other hand, malloc is more portable, and easier to debug. - - Because we sometimes use alloca, some routines have to be macros, - not functions -- `alloca'-allocated space disappears at the end of the - function it is called in. */ - -#ifdef REGEX_MALLOC - -#define REGEX_ALLOCATE malloc -#define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize) - -#else /* not REGEX_MALLOC */ - -/* Emacs already defines alloca, sometimes. */ -#ifndef alloca - -/* Make alloca work the best possible way. */ -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not __GNUC__ */ -#if HAVE_ALLOCA_H -#include <alloca.h> -#else /* not __GNUC__ or HAVE_ALLOCA_H */ -#ifndef _AIX /* Already did AIX, up at the top. */ -char *alloca (); -#endif /* not _AIX */ -#endif /* not HAVE_ALLOCA_H */ -#endif /* not __GNUC__ */ - -#endif /* not alloca */ - -#define REGEX_ALLOCATE alloca - -/* Assumes a `char *destination' variable. */ -#define REGEX_REALLOCATE(source, osize, nsize) \ - (destination = (char *) alloca (nsize), \ - bcopy (source, destination, osize), \ - destination) - -#endif /* not REGEX_MALLOC */ - - -/* True if `size1' is non-NULL and PTR is pointing anywhere inside - `string1' or just past its end. This works if PTR is NULL, which is - a good thing. */ -#define FIRST_STRING_P(ptr) \ - (size1 && string1 <= (ptr) && (ptr) <= string1 + size1) - -/* (Re)Allocate N items of type T using malloc, or fail. */ -#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t))) -#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t))) -#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t))) - -#define BYTEWIDTH 8 /* In bits. */ - -#define STREQ(s1, s2) ((strcmp (s1, s2) == 0)) - -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#define MIN(a, b) ((a) < (b) ? (a) : (b)) - -typedef char boolean; -#define false 0 -#define true 1 - -/* These are the command codes that appear in compiled regular - expressions. Some opcodes are followed by argument bytes. A - command code can specify any interpretation whatsoever for its - arguments. Zero bytes may appear in the compiled regular expression. - - The value of `exactn' is needed in search.c (search_buffer) in Emacs. - So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of - `exactn' we use here must also be 1. */ - -typedef enum -{ - no_op = 0, - - /* Followed by one byte giving n, then by n literal bytes. */ - exactn = 1, - - /* Matches any (more or less) character. */ - anychar, - - /* Matches any one char belonging to specified set. First - following byte is number of bitmap bytes. Then come bytes - for a bitmap saying which chars are in. Bits in each byte - are ordered low-bit-first. A character is in the set if its - bit is 1. A character too large to have a bit in the map is - automatically not in the set. */ - charset, - - /* Same parameters as charset, but match any character that is - not one of those specified. */ - charset_not, - - /* Start remembering the text that is matched, for storing in a - register. Followed by one byte with the register number, in - the range 0 to one less than the pattern buffer's re_nsub - field. Then followed by one byte with the number of groups - inner to this one. (This last has to be part of the - start_memory only because we need it in the on_failure_jump - of re_match_2.) */ - start_memory, - - /* Stop remembering the text that is matched and store it in a - memory register. Followed by one byte with the register - number, in the range 0 to one less than `re_nsub' in the - pattern buffer, and one byte with the number of inner groups, - just like `start_memory'. (We need the number of inner - groups here because we don't have any easy way of finding the - corresponding start_memory when we're at a stop_memory.) */ - stop_memory, - - /* Match a duplicate of something remembered. Followed by one - byte containing the register number. */ - duplicate, - - /* Fail unless at beginning of line. */ - begline, - - /* Fail unless at end of line. */ - endline, - - /* Succeeds if at beginning of buffer (if emacs) or at beginning - of string to be matched (if not). */ - begbuf, - - /* Analogously, for end of buffer/string. */ - endbuf, - - /* Followed by two byte relative address to which to jump. */ - jump, - - /* Same as jump, but marks the end of an alternative. */ - jump_past_alt, - - /* Followed by two-byte relative address of place to resume at - in case of failure. */ - on_failure_jump, - - /* Like on_failure_jump, but pushes a placeholder instead of the - current string position when executed. */ - on_failure_keep_string_jump, - - /* Throw away latest failure point and then jump to following - two-byte relative address. */ - pop_failure_jump, - - /* Change to pop_failure_jump if know won't have to backtrack to - match; otherwise change to jump. This is used to jump - back to the beginning of a repeat. If what follows this jump - clearly won't match what the repeat does, such that we can be - sure that there is no use backtracking out of repetitions - already matched, then we change it to a pop_failure_jump. - Followed by two-byte address. */ - maybe_pop_jump, - - /* Jump to following two-byte address, and push a dummy failure - point. This failure point will be thrown away if an attempt - is made to use it for a failure. A `+' construct makes this - before the first repeat. Also used as an intermediary kind - of jump when compiling an alternative. */ - dummy_failure_jump, - - /* Push a dummy failure point and continue. Used at the end of - alternatives. */ - push_dummy_failure, - - /* Followed by two-byte relative address and two-byte number n. - After matching N times, jump to the address upon failure. */ - succeed_n, - - /* Followed by two-byte relative address, and two-byte number n. - Jump to the address N times, then fail. */ - jump_n, - - /* Set the following two-byte relative address to the - subsequent two-byte number. The address *includes* the two - bytes of number. */ - set_number_at, - - wordchar, /* Matches any word-constituent character. */ - notwordchar, /* Matches any char that is not a word-constituent. */ - - wordbeg, /* Succeeds if at word beginning. */ - wordend, /* Succeeds if at word end. */ - - wordbound, /* Succeeds if at a word boundary. */ - notwordbound /* Succeeds if not at a word boundary. */ - -#ifdef emacs - ,before_dot, /* Succeeds if before point. */ - at_dot, /* Succeeds if at point. */ - after_dot, /* Succeeds if after point. */ - - /* Matches any character whose syntax is specified. Followed by - a byte which contains a syntax code, e.g., Sword. */ - syntaxspec, - - /* Matches any character whose syntax is not that specified. */ - notsyntaxspec -#endif /* emacs */ -} re_opcode_t; - -/* Common operations on the compiled pattern. */ - -/* Store NUMBER in two contiguous bytes starting at DESTINATION. */ - -#define STORE_NUMBER(destination, number) \ - do { \ - (destination)[0] = (number) & 0377; \ - (destination)[1] = (number) >> 8; \ - } while (0) - -/* Same as STORE_NUMBER, except increment DESTINATION to - the byte after where the number is stored. Therefore, DESTINATION - must be an lvalue. */ - -#define STORE_NUMBER_AND_INCR(destination, number) \ - do { \ - STORE_NUMBER (destination, number); \ - (destination) += 2; \ - } while (0) - -/* Put into DESTINATION a number stored in two contiguous bytes starting - at SOURCE. */ - -#define EXTRACT_NUMBER(destination, source) \ - do { \ - (destination) = *(source) & 0377; \ - (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8; \ - } while (0) - -#ifdef DEBUG -static void -extract_number (dest, source) - int *dest; - unsigned char *source; -{ - int temp = SIGN_EXTEND_CHAR (*(source + 1)); - *dest = *source & 0377; - *dest += temp << 8; -} - -#ifndef EXTRACT_MACROS /* To debug the macros. */ -#undef EXTRACT_NUMBER -#define EXTRACT_NUMBER(dest, src) extract_number (&dest, src) -#endif /* not EXTRACT_MACROS */ - -#endif /* DEBUG */ - -/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number. - SOURCE must be an lvalue. */ - -#define EXTRACT_NUMBER_AND_INCR(destination, source) \ - do { \ - EXTRACT_NUMBER (destination, source); \ - (source) += 2; \ - } while (0) - -#ifdef DEBUG -static void -extract_number_and_incr (destination, source) - int *destination; - unsigned char **source; -{ - extract_number (destination, *source); - *source += 2; -} - -#ifndef EXTRACT_MACROS -#undef EXTRACT_NUMBER_AND_INCR -#define EXTRACT_NUMBER_AND_INCR(dest, src) \ - extract_number_and_incr (&dest, &src) -#endif /* not EXTRACT_MACROS */ - -#endif /* DEBUG */ - -/* If DEBUG is defined, Regex prints many voluminous messages about what - it is doing (if the variable `debug' is nonzero). If linked with the - main program in `iregex.c', you can enter patterns and strings - interactively. And if linked with the main program in `main.c' and - the other test files, you can run the already-written tests. */ - -#ifdef DEBUG - -/* We use standard I/O for debugging. */ -#include <stdio.h> - -/* It is useful to test things that ``must'' be true when debugging. */ -#include <assert.h> - -static int debug = 0; - -#define DEBUG_STATEMENT(e) e -#define DEBUG_PRINT1(x) if (debug) printf (x) -#define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2) -#define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3) -#define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4) -#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) \ - if (debug) print_partial_compiled_pattern (s, e) -#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) \ - if (debug) print_double_string (w, s1, sz1, s2, sz2) - - -extern void printchar (); - -/* Print the fastmap in human-readable form. */ - -void -print_fastmap (fastmap) - char *fastmap; -{ - unsigned was_a_range = 0; - unsigned i = 0; - - while (i < (1 << BYTEWIDTH)) - { - if (fastmap[i++]) - { - was_a_range = 0; - printchar (i - 1); - while (i < (1 << BYTEWIDTH) && fastmap[i]) - { - was_a_range = 1; - i++; - } - if (was_a_range) - { - printf ("-"); - printchar (i - 1); - } - } - } - putchar ('\n'); -} - - -/* Print a compiled pattern string in human-readable form, starting at - the START pointer into it and ending just before the pointer END. */ - -void -print_partial_compiled_pattern (start, end) - unsigned char *start; - unsigned char *end; -{ - int mcnt, mcnt2; - unsigned char *p = start; - unsigned char *pend = end; - - if (start == NULL) - { - printf ("(null)\n"); - return; - } - - /* Loop over pattern commands. */ - while (p < pend) - { - switch ((re_opcode_t) *p++) - { - case no_op: - printf ("/no_op"); - break; - - case exactn: - mcnt = *p++; - printf ("/exactn/%d", mcnt); - do - { - putchar ('/'); - printchar (*p++); - } - while (--mcnt); - break; - - case start_memory: - mcnt = *p++; - printf ("/start_memory/%d/%d", mcnt, *p++); - break; - - case stop_memory: - mcnt = *p++; - printf ("/stop_memory/%d/%d", mcnt, *p++); - break; - - case duplicate: - printf ("/duplicate/%d", *p++); - break; - - case anychar: - printf ("/anychar"); - break; - - case charset: - case charset_not: - { - register int c; - - printf ("/charset%s", - (re_opcode_t) *(p - 1) == charset_not ? "_not" : ""); - - assert (p + *p < pend); - - for (c = 0; c < *p; c++) - { - unsigned bit; - unsigned char map_byte = p[1 + c]; - - putchar ('/'); - - for (bit = 0; bit < BYTEWIDTH; bit++) - if (map_byte & (1 << bit)) - printchar (c * BYTEWIDTH + bit); - } - p += 1 + *p; - break; - } - - case begline: - printf ("/begline"); - break; - - case endline: - printf ("/endline"); - break; - - case on_failure_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/on_failure_jump/0/%d", mcnt); - break; - - case on_failure_keep_string_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/on_failure_keep_string_jump/0/%d", mcnt); - break; - - case dummy_failure_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/dummy_failure_jump/0/%d", mcnt); - break; - - case push_dummy_failure: - printf ("/push_dummy_failure"); - break; - - case maybe_pop_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/maybe_pop_jump/0/%d", mcnt); - break; - - case pop_failure_jump: - extract_number_and_incr (&mcnt, &p); - printf ("/pop_failure_jump/0/%d", mcnt); - break; - - case jump_past_alt: - extract_number_and_incr (&mcnt, &p); - printf ("/jump_past_alt/0/%d", mcnt); - break; - - case jump: - extract_number_and_incr (&mcnt, &p); - printf ("/jump/0/%d", mcnt); - break; - - case succeed_n: - extract_number_and_incr (&mcnt, &p); - extract_number_and_incr (&mcnt2, &p); - printf ("/succeed_n/0/%d/0/%d", mcnt, mcnt2); - break; - - case jump_n: - extract_number_and_incr (&mcnt, &p); - extract_number_and_incr (&mcnt2, &p); - printf ("/jump_n/0/%d/0/%d", mcnt, mcnt2); - break; - - case set_number_at: - extract_number_and_incr (&mcnt, &p); - extract_number_and_incr (&mcnt2, &p); - printf ("/set_number_at/0/%d/0/%d", mcnt, mcnt2); - break; - - case wordbound: - printf ("/wordbound"); - break; - - case notwordbound: - printf ("/notwordbound"); - break; - - case wordbeg: - printf ("/wordbeg"); - break; - - case wordend: - printf ("/wordend"); - -#ifdef emacs - case before_dot: - printf ("/before_dot"); - break; - - case at_dot: - printf ("/at_dot"); - break; - - case after_dot: - printf ("/after_dot"); - break; - - case syntaxspec: - printf ("/syntaxspec"); - mcnt = *p++; - printf ("/%d", mcnt); - break; - - case notsyntaxspec: - printf ("/notsyntaxspec"); - mcnt = *p++; - printf ("/%d", mcnt); - break; -#endif /* emacs */ - - case wordchar: - printf ("/wordchar"); - break; - - case notwordchar: - printf ("/notwordchar"); - break; - - case begbuf: - printf ("/begbuf"); - break; - - case endbuf: - printf ("/endbuf"); - break; - - default: - printf ("?%d", *(p-1)); - } - } - printf ("/\n"); -} - - -void -print_compiled_pattern (bufp) - struct re_pattern_buffer *bufp; -{ - unsigned char *buffer = bufp->buffer; - - print_partial_compiled_pattern (buffer, buffer + bufp->used); - printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated); - - if (bufp->fastmap_accurate && bufp->fastmap) - { - printf ("fastmap: "); - print_fastmap (bufp->fastmap); - } - - printf ("re_nsub: %d\t", bufp->re_nsub); - printf ("regs_alloc: %d\t", bufp->regs_allocated); - printf ("can_be_null: %d\t", bufp->can_be_null); - printf ("newline_anchor: %d\n", bufp->newline_anchor); - printf ("no_sub: %d\t", bufp->no_sub); - printf ("not_bol: %d\t", bufp->not_bol); - printf ("not_eol: %d\t", bufp->not_eol); - printf ("syntax: %d\n", bufp->syntax); - /* Perhaps we should print the translate table? */ -} - - -void -print_double_string (where, string1, size1, string2, size2) - const char *where; - const char *string1; - const char *string2; - int size1; - int size2; -{ - unsigned this_char; - - if (where == NULL) - printf ("(null)"); - else - { - if (FIRST_STRING_P (where)) - { - for (this_char = where - string1; this_char < size1; this_char++) - printchar (string1[this_char]); - - where = string2; - } - - for (this_char = where - string2; this_char < size2; this_char++) - printchar (string2[this_char]); - } -} - -#else /* not DEBUG */ - -#undef assert -#define assert(e) - -#define DEBUG_STATEMENT(e) -#define DEBUG_PRINT1(x) -#define DEBUG_PRINT2(x1, x2) -#define DEBUG_PRINT3(x1, x2, x3) -#define DEBUG_PRINT4(x1, x2, x3, x4) -#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) -#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2) - -#endif /* not DEBUG */ - -/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can - also be assigned to arbitrarily: each pattern buffer stores its own - syntax, so it can be changed between regex compilations. */ -reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS; - - -/* Specify the precise syntax of regexps for compilation. This provides - for compatibility for various utilities which historically have - different, incompatible syntaxes. - - The argument SYNTAX is a bit mask comprised of the various bits - defined in regex.h. We return the old syntax. */ - -reg_syntax_t -re_set_syntax (syntax) - reg_syntax_t syntax; -{ - reg_syntax_t ret = re_syntax_options; - - re_syntax_options = syntax; - return ret; -} - -/* This table gives an error message for each of the error codes listed - in regex.h. Obviously the order here has to be same as there. */ - -static const char *re_error_msg[] = - { NULL, /* REG_NOERROR */ - "No match", /* REG_NOMATCH */ - "Invalid regular expression", /* REG_BADPAT */ - "Invalid collation character", /* REG_ECOLLATE */ - "Invalid character class name", /* REG_ECTYPE */ - "Trailing backslash", /* REG_EESCAPE */ - "Invalid back reference", /* REG_ESUBREG */ - "Unmatched [ or [^", /* REG_EBRACK */ - "Unmatched ( or \\(", /* REG_EPAREN */ - "Unmatched \\{", /* REG_EBRACE */ - "Invalid content of \\{\\}", /* REG_BADBR */ - "Invalid range end", /* REG_ERANGE */ - "Memory exhausted", /* REG_ESPACE */ - "Invalid preceding regular expression", /* REG_BADRPT */ - "Premature end of regular expression", /* REG_EEND */ - "Regular expression too big", /* REG_ESIZE */ - "Unmatched ) or \\)", /* REG_ERPAREN */ - }; - -/* Subroutine declarations and macros for regex_compile. */ - -static void store_op1 (), store_op2 (); -static void insert_op1 (), insert_op2 (); -static boolean at_begline_loc_p (), at_endline_loc_p (); -static boolean group_in_compile_stack (); -static reg_errcode_t compile_range (); - -/* Fetch the next character in the uncompiled pattern---translating it - if necessary. Also cast from a signed character in the constant - string passed to us by the user to an unsigned char that we can use - as an array index (in, e.g., `translate'). */ -#define PATFETCH(c) \ - do {if (p == pend) return REG_EEND; \ - c = (unsigned char) *p++; \ - if (translate) c = translate[c]; \ - } while (0) - -/* Fetch the next character in the uncompiled pattern, with no - translation. */ -#define PATFETCH_RAW(c) \ - do {if (p == pend) return REG_EEND; \ - c = (unsigned char) *p++; \ - } while (0) - -/* Go backwards one character in the pattern. */ -#define PATUNFETCH p-- - - -/* If `translate' is non-null, return translate[D], else just D. We - cast the subscript to translate because some data is declared as - `char *', to avoid warnings when a string constant is passed. But - when we use a character as a subscript we must make it unsigned. */ -#define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d)) - - -/* Macros for outputting the compiled pattern into `buffer'. */ - -/* If the buffer isn't allocated when it comes in, use this. */ -#define INIT_BUF_SIZE 32 - -/* Make sure we have at least N more bytes of space in buffer. */ -#define GET_BUFFER_SPACE(n) \ - while (b - bufp->buffer + (n) > bufp->allocated) \ - EXTEND_BUFFER () - -/* Make sure we have one more byte of buffer space and then add C to it. */ -#define BUF_PUSH(c) \ - do { \ - GET_BUFFER_SPACE (1); \ - *b++ = (unsigned char) (c); \ - } while (0) - - -/* Ensure we have two more bytes of buffer space and then append C1 and C2. */ -#define BUF_PUSH_2(c1, c2) \ - do { \ - GET_BUFFER_SPACE (2); \ - *b++ = (unsigned char) (c1); \ - *b++ = (unsigned char) (c2); \ - } while (0) - - -/* As with BUF_PUSH_2, except for three bytes. */ -#define BUF_PUSH_3(c1, c2, c3) \ - do { \ - GET_BUFFER_SPACE (3); \ - *b++ = (unsigned char) (c1); \ - *b++ = (unsigned char) (c2); \ - *b++ = (unsigned char) (c3); \ - } while (0) - - -/* Store a jump with opcode OP at LOC to location TO. We store a - relative address offset by the three bytes the jump itself occupies. */ -#define STORE_JUMP(op, loc, to) \ - store_op1 (op, loc, (to) - (loc) - 3) - -/* Likewise, for a two-argument jump. */ -#define STORE_JUMP2(op, loc, to, arg) \ - store_op2 (op, loc, (to) - (loc) - 3, arg) - -/* Like `STORE_JUMP', but for inserting. Assume `b' is the buffer end. */ -#define INSERT_JUMP(op, loc, to) \ - insert_op1 (op, loc, (to) - (loc) - 3, b) - -/* Like `STORE_JUMP2', but for inserting. Assume `b' is the buffer end. */ -#define INSERT_JUMP2(op, loc, to, arg) \ - insert_op2 (op, loc, (to) - (loc) - 3, arg, b) - - -/* This is not an arbitrary limit: the arguments which represent offsets - into the pattern are two bytes long. So if 2^16 bytes turns out to - be too small, many things would have to change. */ -#define MAX_BUF_SIZE (1L << 16) - - -/* Extend the buffer by twice its current size via realloc and - reset the pointers that pointed into the old block to point to the - correct places in the new one. If extending the buffer results in it - being larger than MAX_BUF_SIZE, then flag memory exhausted. */ -#define EXTEND_BUFFER() \ - do { \ - unsigned char *old_buffer = bufp->buffer; \ - if (bufp->allocated == MAX_BUF_SIZE) \ - return REG_ESIZE; \ - bufp->allocated <<= 1; \ - if (bufp->allocated > MAX_BUF_SIZE) \ - bufp->allocated = MAX_BUF_SIZE; \ - bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\ - if (bufp->buffer == NULL) \ - return REG_ESPACE; \ - /* If the buffer moved, move all the pointers into it. */ \ - if (old_buffer != bufp->buffer) \ - { \ - b = (b - old_buffer) + bufp->buffer; \ - begalt = (begalt - old_buffer) + bufp->buffer; \ - if (fixup_alt_jump) \ - fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\ - if (laststart) \ - laststart = (laststart - old_buffer) + bufp->buffer; \ - if (pending_exact) \ - pending_exact = (pending_exact - old_buffer) + bufp->buffer; \ - } \ - } while (0) - - -/* Since we have one byte reserved for the register number argument to - {start,stop}_memory, the maximum number of groups we can report - things about is what fits in that byte. */ -#define MAX_REGNUM 255 - -/* But patterns can have more than `MAX_REGNUM' registers. We just - ignore the excess. */ -typedef unsigned regnum_t; - - -/* Macros for the compile stack. */ - -/* Since offsets can go either forwards or backwards, this type needs to - be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1. */ -typedef int pattern_offset_t; - -typedef struct -{ - pattern_offset_t begalt_offset; - pattern_offset_t fixup_alt_jump; - pattern_offset_t inner_group_offset; - pattern_offset_t laststart_offset; - regnum_t regnum; -} compile_stack_elt_t; - - -typedef struct -{ - compile_stack_elt_t *stack; - unsigned size; - unsigned avail; /* Offset of next open position. */ -} compile_stack_type; - - -#define INIT_COMPILE_STACK_SIZE 32 - -#define COMPILE_STACK_EMPTY (compile_stack.avail == 0) -#define COMPILE_STACK_FULL (compile_stack.avail == compile_stack.size) - -/* The next available element. */ -#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail]) - - -/* Set the bit for character C in a list. */ -#define SET_LIST_BIT(c) \ - (b[((unsigned char) (c)) / BYTEWIDTH] \ - |= 1 << (((unsigned char) c) % BYTEWIDTH)) - - -/* Get the next unsigned number in the uncompiled pattern. */ -#define GET_UNSIGNED_NUMBER(num) \ - { if (p != pend) \ - { \ - PATFETCH (c); \ - while (ISDIGIT (c)) \ - { \ - if (num < 0) \ - num = 0; \ - num = num * 10 + c - '0'; \ - if (p == pend) \ - break; \ - PATFETCH (c); \ - } \ - } \ - } - -#define CHAR_CLASS_MAX_LENGTH 6 /* Namely, `xdigit'. */ - -#define IS_CHAR_CLASS(string) \ - (STREQ (string, "alpha") || STREQ (string, "upper") \ - || STREQ (string, "lower") || STREQ (string, "digit") \ - || STREQ (string, "alnum") || STREQ (string, "xdigit") \ - || STREQ (string, "space") || STREQ (string, "print") \ - || STREQ (string, "punct") || STREQ (string, "graph") \ - || STREQ (string, "cntrl") || STREQ (string, "blank")) - -/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX. - Returns one of error codes defined in `regex.h', or zero for success. - - Assumes the `allocated' (and perhaps `buffer') and `translate' - fields are set in BUFP on entry. - - If it succeeds, results are put in BUFP (if it returns an error, the - contents of BUFP are undefined): - `buffer' is the compiled pattern; - `syntax' is set to SYNTAX; - `used' is set to the length of the compiled pattern; - `fastmap_accurate' is zero; - `re_nsub' is the number of subexpressions in PATTERN; - `not_bol' and `not_eol' are zero; - - The `fastmap' and `newline_anchor' fields are neither - examined nor set. */ - -static reg_errcode_t -regex_compile (pattern, size, syntax, bufp) - const char *pattern; - int size; - reg_syntax_t syntax; - struct re_pattern_buffer *bufp; -{ - /* We fetch characters from PATTERN here. Even though PATTERN is - `char *' (i.e., signed), we declare these variables as unsigned, so - they can be reliably used as array indices. */ - register unsigned char c, c1; - - /* A random tempory spot in PATTERN. */ - const char *p1; - - /* Points to the end of the buffer, where we should append. */ - register unsigned char *b; - - /* Keeps track of unclosed groups. */ - compile_stack_type compile_stack; - - /* Points to the current (ending) position in the pattern. */ - const char *p = pattern; - const char *pend = pattern + size; - - /* How to translate the characters in the pattern. */ - char *translate = bufp->translate; - - /* Address of the count-byte of the most recently inserted `exactn' - command. This makes it possible to tell if a new exact-match - character can be added to that command or if the character requires - a new `exactn' command. */ - unsigned char *pending_exact = 0; - - /* Address of start of the most recently finished expression. - This tells, e.g., postfix * where to find the start of its - operand. Reset at the beginning of groups and alternatives. */ - unsigned char *laststart = 0; - - /* Address of beginning of regexp, or inside of last group. */ - unsigned char *begalt; - - /* Place in the uncompiled pattern (i.e., the {) to - which to go back if the interval is invalid. */ - const char *beg_interval; - - /* Address of the place where a forward jump should go to the end of - the containing expression. Each alternative of an `or' -- except the - last -- ends with a forward jump of this sort. */ - unsigned char *fixup_alt_jump = 0; - - /* Counts open-groups as they are encountered. Remembered for the - matching close-group on the compile stack, so the same register - number is put in the stop_memory as the start_memory. */ - regnum_t regnum = 0; - -#ifdef DEBUG - DEBUG_PRINT1 ("\nCompiling pattern: "); - if (debug) - { - unsigned debug_count; - - for (debug_count = 0; debug_count < size; debug_count++) - printchar (pattern[debug_count]); - putchar ('\n'); - } -#endif /* DEBUG */ - - /* Initialize the compile stack. */ - compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t); - if (compile_stack.stack == NULL) - return REG_ESPACE; - - compile_stack.size = INIT_COMPILE_STACK_SIZE; - compile_stack.avail = 0; - - /* Initialize the pattern buffer. */ - bufp->syntax = syntax; - bufp->fastmap_accurate = 0; - bufp->not_bol = bufp->not_eol = 0; - - /* Set `used' to zero, so that if we return an error, the pattern - printer (for debugging) will think there's no pattern. We reset it - at the end. */ - bufp->used = 0; - - /* Always count groups, whether or not bufp->no_sub is set. */ - bufp->re_nsub = 0; - -#if !defined (emacs) && !defined (SYNTAX_TABLE) - /* Initialize the syntax table. */ - init_syntax_once (); -#endif - - if (bufp->allocated == 0) - { - if (bufp->buffer) - { /* If zero allocated, but buffer is non-null, try to realloc - enough space. This loses if buffer's address is bogus, but - that is the user's responsibility. */ - RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char); - } - else - { /* Caller did not allocate a buffer. Do it for them. */ - bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char); - } - if (!bufp->buffer) return REG_ESPACE; - - bufp->allocated = INIT_BUF_SIZE; - } - - begalt = b = bufp->buffer; - - /* Loop through the uncompiled pattern until we're at the end. */ - while (p != pend) - { - PATFETCH (c); - - switch (c) - { - case '^': - { - if ( /* If at start of pattern, it's an operator. */ - p == pattern + 1 - /* If context independent, it's an operator. */ - || syntax & RE_CONTEXT_INDEP_ANCHORS - /* Otherwise, depends on what's come before. */ - || at_begline_loc_p (pattern, p, syntax)) - BUF_PUSH (begline); - else - goto normal_char; - } - break; - - - case '$': - { - if ( /* If at end of pattern, it's an operator. */ - p == pend - /* If context independent, it's an operator. */ - || syntax & RE_CONTEXT_INDEP_ANCHORS - /* Otherwise, depends on what's next. */ - || at_endline_loc_p (p, pend, syntax)) - BUF_PUSH (endline); - else - goto normal_char; - } - break; - - - case '+': - case '?': - if ((syntax & RE_BK_PLUS_QM) - || (syntax & RE_LIMITED_OPS)) - goto normal_char; - handle_plus: - case '*': - /* If there is no previous pattern... */ - if (!laststart) - { - if (syntax & RE_CONTEXT_INVALID_OPS) - return REG_BADRPT; - else if (!(syntax & RE_CONTEXT_INDEP_OPS)) - goto normal_char; - } - - { - /* Are we optimizing this jump? */ - boolean keep_string_p = false; - - /* 1 means zero (many) matches is allowed. */ - char zero_times_ok = 0, many_times_ok = 0; - - /* If there is a sequence of repetition chars, collapse it - down to just one (the right one). We can't combine - interval operators with these because of, e.g., `a{2}*', - which should only match an even number of `a's. */ - - for (;;) - { - zero_times_ok |= c != '+'; - many_times_ok |= c != '?'; - - if (p == pend) - break; - - PATFETCH (c); - - if (c == '*' - || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?'))) - ; - - else if (syntax & RE_BK_PLUS_QM && c == '\\') - { - if (p == pend) return REG_EESCAPE; - - PATFETCH (c1); - if (!(c1 == '+' || c1 == '?')) - { - PATUNFETCH; - PATUNFETCH; - break; - } - - c = c1; - } - else - { - PATUNFETCH; - break; - } - - /* If we get here, we found another repeat character. */ - } - - /* Star, etc. applied to an empty pattern is equivalent - to an empty pattern. */ - if (!laststart) - break; - - /* Now we know whether or not zero matches is allowed - and also whether or not two or more matches is allowed. */ - if (many_times_ok) - { /* More than one repetition is allowed, so put in at the - end a backward relative jump from `b' to before the next - jump we're going to put in below (which jumps from - laststart to after this jump). - - But if we are at the `*' in the exact sequence `.*\n', - insert an unconditional jump backwards to the ., - instead of the beginning of the loop. This way we only - push a failure point once, instead of every time - through the loop. */ - assert (p - 1 > pattern); - - /* Allocate the space for the jump. */ - GET_BUFFER_SPACE (3); - - /* We know we are not at the first character of the pattern, - because laststart was nonzero. And we've already - incremented `p', by the way, to be the character after - the `*'. Do we have to do something analogous here - for null bytes, because of RE_DOT_NOT_NULL? */ - if (TRANSLATE (*(p - 2)) == TRANSLATE ('.') - && zero_times_ok - && p < pend && TRANSLATE (*p) == TRANSLATE ('\n') - && !(syntax & RE_DOT_NEWLINE)) - { /* We have .*\n. */ - STORE_JUMP (jump, b, laststart); - keep_string_p = true; - } - else - /* Anything else. */ - STORE_JUMP (maybe_pop_jump, b, laststart - 3); - - /* We've added more stuff to the buffer. */ - b += 3; - } - - /* On failure, jump from laststart to b + 3, which will be the - end of the buffer after this jump is inserted. */ - GET_BUFFER_SPACE (3); - INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump - : on_failure_jump, - laststart, b + 3); - pending_exact = 0; - b += 3; - - if (!zero_times_ok) - { - /* At least one repetition is required, so insert a - `dummy_failure_jump' before the initial - `on_failure_jump' instruction of the loop. This - effects a skip over that instruction the first time - we hit that loop. */ - GET_BUFFER_SPACE (3); - INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6); - b += 3; - } - } - break; - - - case '.': - laststart = b; - BUF_PUSH (anychar); - break; - - - case '[': - { - boolean had_char_class = false; - - if (p == pend) return REG_EBRACK; - - /* Ensure that we have enough space to push a charset: the - opcode, the length count, and the bitset; 34 bytes in all. */ - GET_BUFFER_SPACE (34); - - laststart = b; - - /* We test `*p == '^' twice, instead of using an if - statement, so we only need one BUF_PUSH. */ - BUF_PUSH (*p == '^' ? charset_not : charset); - if (*p == '^') - p++; - - /* Remember the first position in the bracket expression. */ - p1 = p; - - /* Push the number of bytes in the bitmap. */ - BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH); - - /* Clear the whole map. */ - bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH); - - /* charset_not matches newline according to a syntax bit. */ - if ((re_opcode_t) b[-2] == charset_not - && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) - SET_LIST_BIT ('\n'); - - /* Read in characters and ranges, setting map bits. */ - for (;;) - { - if (p == pend) return REG_EBRACK; - - PATFETCH (c); - - /* \ might escape characters inside [...] and [^...]. */ - if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') - { - if (p == pend) return REG_EESCAPE; - - PATFETCH (c1); - SET_LIST_BIT (c1); - continue; - } - - /* Could be the end of the bracket expression. If it's - not (i.e., when the bracket expression is `[]' so - far), the ']' character bit gets set way below. */ - if (c == ']' && p != p1 + 1) - break; - - /* Look ahead to see if it's a range when the last thing - was a character class. */ - if (had_char_class && c == '-' && *p != ']') - return REG_ERANGE; - - /* Look ahead to see if it's a range when the last thing - was a character: if this is a hyphen not at the - beginning or the end of a list, then it's the range - operator. */ - if (c == '-' - && !(p - 2 >= pattern && p[-2] == '[') - && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^') - && *p != ']') - { - reg_errcode_t ret - = compile_range (&p, pend, translate, syntax, b); - if (ret != REG_NOERROR) return ret; - } - - else if (p[0] == '-' && p[1] != ']') - { /* This handles ranges made up of characters only. */ - reg_errcode_t ret; - - /* Move past the `-'. */ - PATFETCH (c1); - - ret = compile_range (&p, pend, translate, syntax, b); - if (ret != REG_NOERROR) return ret; - } - - /* See if we're at the beginning of a possible character - class. */ - - else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') - { /* Leave room for the null. */ - char str[CHAR_CLASS_MAX_LENGTH + 1]; - - PATFETCH (c); - c1 = 0; - - /* If pattern is `[[:'. */ - if (p == pend) return REG_EBRACK; - - for (;;) - { - PATFETCH (c); - if (c == ':' || c == ']' || p == pend - || c1 == CHAR_CLASS_MAX_LENGTH) - break; - str[c1++] = c; - } - str[c1] = '\0'; - - /* If isn't a word bracketed by `[:' and:`]': - undo the ending character, the letters, and leave - the leading `:' and `[' (but set bits for them). */ - if (c == ':' && *p == ']') - { - int ch; - boolean is_alnum = STREQ (str, "alnum"); - boolean is_alpha = STREQ (str, "alpha"); - boolean is_blank = STREQ (str, "blank"); - boolean is_cntrl = STREQ (str, "cntrl"); - boolean is_digit = STREQ (str, "digit"); - boolean is_graph = STREQ (str, "graph"); - boolean is_lower = STREQ (str, "lower"); - boolean is_print = STREQ (str, "print"); - boolean is_punct = STREQ (str, "punct"); - boolean is_space = STREQ (str, "space"); - boolean is_upper = STREQ (str, "upper"); - boolean is_xdigit = STREQ (str, "xdigit"); - - if (!IS_CHAR_CLASS (str)) return REG_ECTYPE; - - /* Throw away the ] at the end of the character - class. */ - PATFETCH (c); - - if (p == pend) return REG_EBRACK; - - for (ch = 0; ch < 1 << BYTEWIDTH; ch++) - { - if ( (is_alnum && ISALNUM (ch)) - || (is_alpha && ISALPHA (ch)) - || (is_blank && ISBLANK (ch)) - || (is_cntrl && ISCNTRL (ch)) - || (is_digit && ISDIGIT (ch)) - || (is_graph && ISGRAPH (ch)) - || (is_lower && ISLOWER (ch)) - || (is_print && ISPRINT (ch)) - || (is_punct && ISPUNCT (ch)) - || (is_space && ISSPACE (ch)) - || (is_upper && ISUPPER (ch)) - || (is_xdigit && ISXDIGIT (ch))) - SET_LIST_BIT (ch); - } - had_char_class = true; - } - else - { - c1++; - while (c1--) - PATUNFETCH; - SET_LIST_BIT ('['); - SET_LIST_BIT (':'); - had_char_class = false; - } - } - else - { - had_char_class = false; - SET_LIST_BIT (c); - } - } - - /* Discard any (non)matching list bytes that are all 0 at the - end of the map. Decrease the map-length byte too. */ - while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) - b[-1]--; - b += b[-1]; - } - break; - - - case '(': - if (syntax & RE_NO_BK_PARENS) - goto handle_open; - else - goto normal_char; - - - case ')': - if (syntax & RE_NO_BK_PARENS) - goto handle_close; - else - goto normal_char; - - - case '\n': - if (syntax & RE_NEWLINE_ALT) - goto handle_alt; - else - goto normal_char; - - - case '|': - if (syntax & RE_NO_BK_VBAR) - goto handle_alt; - else - goto normal_char; - - - case '{': - if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) - goto handle_interval; - else - goto normal_char; - - - case '\\': - if (p == pend) return REG_EESCAPE; - - /* Do not translate the character after the \, so that we can - distinguish, e.g., \B from \b, even if we normally would - translate, e.g., B to b. */ - PATFETCH_RAW (c); - - switch (c) - { - case '(': - if (syntax & RE_NO_BK_PARENS) - goto normal_backslash; - - handle_open: - bufp->re_nsub++; - regnum++; - - if (COMPILE_STACK_FULL) - { - RETALLOC (compile_stack.stack, compile_stack.size << 1, - compile_stack_elt_t); - if (compile_stack.stack == NULL) return REG_ESPACE; - - compile_stack.size <<= 1; - } - - /* These are the values to restore when we hit end of this - group. They are all relative offsets, so that if the - whole pattern moves because of realloc, they will still - be valid. */ - COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer; - COMPILE_STACK_TOP.fixup_alt_jump - = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0; - COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer; - COMPILE_STACK_TOP.regnum = regnum; - - /* We will eventually replace the 0 with the number of - groups inner to this one. But do not push a - start_memory for groups beyond the last one we can - represent in the compiled pattern. */ - if (regnum <= MAX_REGNUM) - { - COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2; - BUF_PUSH_3 (start_memory, regnum, 0); - } - - compile_stack.avail++; - - fixup_alt_jump = 0; - laststart = 0; - begalt = b; - /* If we've reached MAX_REGNUM groups, then this open - won't actually generate any code, so we'll have to - clear pending_exact explicitly. */ - pending_exact = 0; - break; - - - case ')': - if (syntax & RE_NO_BK_PARENS) goto normal_backslash; - - if (COMPILE_STACK_EMPTY) - if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) - goto normal_backslash; - else - return REG_ERPAREN; - - handle_close: - if (fixup_alt_jump) - { /* Push a dummy failure point at the end of the - alternative for a possible future - `pop_failure_jump' to pop. See comments at - `push_dummy_failure' in `re_match_2'. */ - BUF_PUSH (push_dummy_failure); - - /* We allocated space for this jump when we assigned - to `fixup_alt_jump', in the `handle_alt' case below. */ - STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1); - } - - /* See similar code for backslashed left paren above. */ - if (COMPILE_STACK_EMPTY) - if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) - goto normal_char; - else - return REG_ERPAREN; - - /* Since we just checked for an empty stack above, this - ``can't happen''. */ - assert (compile_stack.avail != 0); - { - /* We don't just want to restore into `regnum', because - later groups should continue to be numbered higher, - as in `(ab)c(de)' -- the second group is #2. */ - regnum_t this_group_regnum; - - compile_stack.avail--; - begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset; - fixup_alt_jump - = COMPILE_STACK_TOP.fixup_alt_jump - ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 - : 0; - laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset; - this_group_regnum = COMPILE_STACK_TOP.regnum; - /* If we've reached MAX_REGNUM groups, then this open - won't actually generate any code, so we'll have to - clear pending_exact explicitly. */ - pending_exact = 0; - - /* We're at the end of the group, so now we know how many - groups were inside this one. */ - if (this_group_regnum <= MAX_REGNUM) - { - unsigned char *inner_group_loc - = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset; - - *inner_group_loc = regnum - this_group_regnum; - BUF_PUSH_3 (stop_memory, this_group_regnum, - regnum - this_group_regnum); - } - } - break; - - - case '|': /* `\|'. */ - if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) - goto normal_backslash; - handle_alt: - if (syntax & RE_LIMITED_OPS) - goto normal_char; - - /* Insert before the previous alternative a jump which - jumps to this alternative if the former fails. */ - GET_BUFFER_SPACE (3); - INSERT_JUMP (on_failure_jump, begalt, b + 6); - pending_exact = 0; - b += 3; - - /* The alternative before this one has a jump after it - which gets executed if it gets matched. Adjust that - jump so it will jump to this alternative's analogous - jump (put in below, which in turn will jump to the next - (if any) alternative's such jump, etc.). The last such - jump jumps to the correct final destination. A picture: - _____ _____ - | | | | - | v | v - a | b | c - - If we are at `b', then fixup_alt_jump right now points to a - three-byte space after `a'. We'll put in the jump, set - fixup_alt_jump to right after `b', and leave behind three - bytes which we'll fill in when we get to after `c'. */ - - if (fixup_alt_jump) - STORE_JUMP (jump_past_alt, fixup_alt_jump, b); - - /* Mark and leave space for a jump after this alternative, - to be filled in later either by next alternative or - when know we're at the end of a series of alternatives. */ - fixup_alt_jump = b; - GET_BUFFER_SPACE (3); - b += 3; - - laststart = 0; - begalt = b; - break; - - - case '{': - /* If \{ is a literal. */ - if (!(syntax & RE_INTERVALS) - /* If we're at `\{' and it's not the open-interval - operator. */ - || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES)) - || (p - 2 == pattern && p == pend)) - goto normal_backslash; - - handle_interval: - { - /* If got here, then the syntax allows intervals. */ - - /* At least (most) this many matches must be made. */ - int lower_bound = -1, upper_bound = -1; - - beg_interval = p - 1; - - if (p == pend) - { - if (syntax & RE_NO_BK_BRACES) - goto unfetch_interval; - else - return REG_EBRACE; - } - - GET_UNSIGNED_NUMBER (lower_bound); - - if (c == ',') - { - GET_UNSIGNED_NUMBER (upper_bound); - if (upper_bound < 0) upper_bound = RE_DUP_MAX; - } - else - /* Interval such as `{1}' => match exactly once. */ - upper_bound = lower_bound; - - if (lower_bound < 0 || upper_bound > RE_DUP_MAX - || lower_bound > upper_bound) - { - if (syntax & RE_NO_BK_BRACES) - goto unfetch_interval; - else - return REG_BADBR; - } - - if (!(syntax & RE_NO_BK_BRACES)) - { - if (c != '\\') return REG_EBRACE; - - PATFETCH (c); - } - - if (c != '}') - { - if (syntax & RE_NO_BK_BRACES) - goto unfetch_interval; - else - return REG_BADBR; - } - - /* We just parsed a valid interval. */ - - /* If it's invalid to have no preceding re. */ - if (!laststart) - { - if (syntax & RE_CONTEXT_INVALID_OPS) - return REG_BADRPT; - else if (syntax & RE_CONTEXT_INDEP_OPS) - laststart = b; - else - goto unfetch_interval; - } - - /* If the upper bound is zero, don't want to succeed at - all; jump from `laststart' to `b + 3', which will be - the end of the buffer after we insert the jump. */ - if (upper_bound == 0) - { - GET_BUFFER_SPACE (3); - INSERT_JUMP (jump, laststart, b + 3); - b += 3; - } - - /* Otherwise, we have a nontrivial interval. When - we're all done, the pattern will look like: - set_number_at <jump count> <upper bound> - set_number_at <succeed_n count> <lower bound> - succeed_n <after jump addr> <succed_n count> - <body of loop> - jump_n <succeed_n addr> <jump count> - (The upper bound and `jump_n' are omitted if - `upper_bound' is 1, though.) */ - else - { /* If the upper bound is > 1, we need to insert - more at the end of the loop. */ - unsigned nbytes = 10 + (upper_bound > 1) * 10; - - GET_BUFFER_SPACE (nbytes); - - /* Initialize lower bound of the `succeed_n', even - though it will be set during matching by its - attendant `set_number_at' (inserted next), - because `re_compile_fastmap' needs to know. - Jump to the `jump_n' we might insert below. */ - INSERT_JUMP2 (succeed_n, laststart, - b + 5 + (upper_bound > 1) * 5, - lower_bound); - b += 5; - - /* Code to initialize the lower bound. Insert - before the `succeed_n'. The `5' is the last two - bytes of this `set_number_at', plus 3 bytes of - the following `succeed_n'. */ - insert_op2 (set_number_at, laststart, 5, lower_bound, b); - b += 5; - - if (upper_bound > 1) - { /* More than one repetition is allowed, so - append a backward jump to the `succeed_n' - that starts this interval. - - When we've reached this during matching, - we'll have matched the interval once, so - jump back only `upper_bound - 1' times. */ - STORE_JUMP2 (jump_n, b, laststart + 5, - upper_bound - 1); - b += 5; - - /* The location we want to set is the second - parameter of the `jump_n'; that is `b-2' as - an absolute address. `laststart' will be - the `set_number_at' we're about to insert; - `laststart+3' the number to set, the source - for the relative address. But we are - inserting into the middle of the pattern -- - so everything is getting moved up by 5. - Conclusion: (b - 2) - (laststart + 3) + 5, - i.e., b - laststart. - - We insert this at the beginning of the loop - so that if we fail during matching, we'll - reinitialize the bounds. */ - insert_op2 (set_number_at, laststart, b - laststart, - upper_bound - 1, b); - b += 5; - } - } - pending_exact = 0; - beg_interval = NULL; - } - break; - - unfetch_interval: - /* If an invalid interval, match the characters as literals. */ - assert (beg_interval); - p = beg_interval; - beg_interval = NULL; - - /* normal_char and normal_backslash need `c'. */ - PATFETCH (c); - - if (!(syntax & RE_NO_BK_BRACES)) - { - if (p > pattern && p[-1] == '\\') - goto normal_backslash; - } - goto normal_char; - -#ifdef emacs - /* There is no way to specify the before_dot and after_dot - operators. rms says this is ok. --karl */ - case '=': - BUF_PUSH (at_dot); - break; - - case 's': - laststart = b; - PATFETCH (c); - BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]); - break; - - case 'S': - laststart = b; - PATFETCH (c); - BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]); - break; -#endif /* emacs */ - - - case 'w': - laststart = b; - BUF_PUSH (wordchar); - break; - - - case 'W': - laststart = b; - BUF_PUSH (notwordchar); - break; - - - case '<': - BUF_PUSH (wordbeg); - break; - - case '>': - BUF_PUSH (wordend); - break; - - case 'b': - BUF_PUSH (wordbound); - break; - - case 'B': - BUF_PUSH (notwordbound); - break; - - case '`': - BUF_PUSH (begbuf); - break; - - case '\'': - BUF_PUSH (endbuf); - break; - - case '1': case '2': case '3': case '4': case '5': - case '6': case '7': case '8': case '9': - if (syntax & RE_NO_BK_REFS) - goto normal_char; - - c1 = c - '0'; - - if (c1 > regnum) - return REG_ESUBREG; - - /* Can't back reference to a subexpression if inside of it. */ - if (group_in_compile_stack (compile_stack, c1)) - goto normal_char; - - laststart = b; - BUF_PUSH_2 (duplicate, c1); - break; - - - case '+': - case '?': - if (syntax & RE_BK_PLUS_QM) - goto handle_plus; - else - goto normal_backslash; - - default: - normal_backslash: - /* You might think it would be useful for \ to mean - not to translate; but if we don't translate it - it will never match anything. */ - c = TRANSLATE (c); - goto normal_char; - } - break; - - - default: - /* Expects the character in `c'. */ - normal_char: - /* If no exactn currently being built. */ - if (!pending_exact - - /* If last exactn not at current position. */ - || pending_exact + *pending_exact + 1 != b - - /* We have only one byte following the exactn for the count. */ - || *pending_exact == (1 << BYTEWIDTH) - 1 - - /* If followed by a repetition operator. */ - || *p == '*' || *p == '^' - || ((syntax & RE_BK_PLUS_QM) - ? *p == '\\' && (p[1] == '+' || p[1] == '?') - : (*p == '+' || *p == '?')) - || ((syntax & RE_INTERVALS) - && ((syntax & RE_NO_BK_BRACES) - ? *p == '{' - : (p[0] == '\\' && p[1] == '{')))) - { - /* Start building a new exactn. */ - - laststart = b; - - BUF_PUSH_2 (exactn, 0); - pending_exact = b - 1; - } - - BUF_PUSH (c); - (*pending_exact)++; - break; - } /* switch (c) */ - } /* while p != pend */ - - - /* Through the pattern now. */ - - if (fixup_alt_jump) - STORE_JUMP (jump_past_alt, fixup_alt_jump, b); - - if (!COMPILE_STACK_EMPTY) - return REG_EPAREN; - - free (compile_stack.stack); - - /* We have succeeded; set the length of the buffer. */ - bufp->used = b - bufp->buffer; - -#ifdef DEBUG - if (debug) - { - DEBUG_PRINT1 ("\nCompiled pattern: "); - print_compiled_pattern (bufp); - } -#endif /* DEBUG */ - - return REG_NOERROR; -} /* regex_compile */ - -/* Subroutines for `regex_compile'. */ - -/* Store OP at LOC followed by two-byte integer parameter ARG. */ - -static void -store_op1 (op, loc, arg) - re_opcode_t op; - unsigned char *loc; - int arg; -{ - *loc = (unsigned char) op; - STORE_NUMBER (loc + 1, arg); -} - - -/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2. */ - -static void -store_op2 (op, loc, arg1, arg2) - re_opcode_t op; - unsigned char *loc; - int arg1, arg2; -{ - *loc = (unsigned char) op; - STORE_NUMBER (loc + 1, arg1); - STORE_NUMBER (loc + 3, arg2); -} - - -/* Copy the bytes from LOC to END to open up three bytes of space at LOC - for OP followed by two-byte integer parameter ARG. */ - -static void -insert_op1 (op, loc, arg, end) - re_opcode_t op; - unsigned char *loc; - int arg; - unsigned char *end; -{ - register unsigned char *pfrom = end; - register unsigned char *pto = end + 3; - - while (pfrom != loc) - *--pto = *--pfrom; - - store_op1 (op, loc, arg); -} - - -/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2. */ - -static void -insert_op2 (op, loc, arg1, arg2, end) - re_opcode_t op; - unsigned char *loc; - int arg1, arg2; - unsigned char *end; -{ - register unsigned char *pfrom = end; - register unsigned char *pto = end + 5; - - while (pfrom != loc) - *--pto = *--pfrom; - - store_op2 (op, loc, arg1, arg2); -} - - -/* P points to just after a ^ in PATTERN. Return true if that ^ comes - after an alternative or a begin-subexpression. We assume there is at - least one character before the ^. */ - -static boolean -at_begline_loc_p (pattern, p, syntax) - const char *pattern, *p; - reg_syntax_t syntax; -{ - const char *prev = p - 2; - boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\'; - - return - /* After a subexpression? */ - (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash)) - /* After an alternative? */ - || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash)); -} - - -/* The dual of at_begline_loc_p. This one is for $. We assume there is - at least one character after the $, i.e., `P < PEND'. */ - -static boolean -at_endline_loc_p (p, pend, syntax) - const char *p, *pend; - int syntax; -{ - const char *next = p; - boolean next_backslash = *next == '\\'; - const char *next_next = p + 1 < pend ? p + 1 : NULL; - - return - /* Before a subexpression? */ - (syntax & RE_NO_BK_PARENS ? *next == ')' - : next_backslash && next_next && *next_next == ')') - /* Before an alternative? */ - || (syntax & RE_NO_BK_VBAR ? *next == '|' - : next_backslash && next_next && *next_next == '|'); -} - - -/* Returns true if REGNUM is in one of COMPILE_STACK's elements and - false if it's not. */ - -static boolean -group_in_compile_stack (compile_stack, regnum) - compile_stack_type compile_stack; - regnum_t regnum; -{ - int this_element; - - for (this_element = compile_stack.avail - 1; - this_element >= 0; - this_element--) - if (compile_stack.stack[this_element].regnum == regnum) - return true; - - return false; -} - - -/* Read the ending character of a range (in a bracket expression) from the - uncompiled pattern *P_PTR (which ends at PEND). We assume the - starting character is in `P[-2]'. (`P[-1]' is the character `-'.) - Then we set the translation of all bits between the starting and - ending characters (inclusive) in the compiled pattern B. - - Return an error code. - - We use these short variable names so we can use the same macros as - `regex_compile' itself. */ - -static reg_errcode_t -compile_range (p_ptr, pend, translate, syntax, b) - const char **p_ptr, *pend; - char *translate; - reg_syntax_t syntax; - unsigned char *b; -{ - unsigned this_char; - - const char *p = *p_ptr; - int range_start, range_end; - - if (p == pend) - return REG_ERANGE; - - /* Even though the pattern is a signed `char *', we need to fetch - with unsigned char *'s; if the high bit of the pattern character - is set, the range endpoints will be negative if we fetch using a - signed char *. - - We also want to fetch the endpoints without translating them; the - appropriate translation is done in the bit-setting loop below. */ - range_start = ((unsigned char *) p)[-2]; - range_end = ((unsigned char *) p)[0]; - - /* Have to increment the pointer into the pattern string, so the - caller isn't still at the ending character. */ - (*p_ptr)++; - - /* If the start is after the end, the range is empty. */ - if (range_start > range_end) - return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR; - - /* Here we see why `this_char' has to be larger than an `unsigned - char' -- the range is inclusive, so if `range_end' == 0xff - (assuming 8-bit characters), we would otherwise go into an infinite - loop, since all characters <= 0xff. */ - for (this_char = range_start; this_char <= range_end; this_char++) - { - SET_LIST_BIT (TRANSLATE (this_char)); - } - - return REG_NOERROR; -} - -/* Failure stack declarations and macros; both re_compile_fastmap and - re_match_2 use a failure stack. These have to be macros because of - REGEX_ALLOCATE. */ - - -/* Number of failure points for which to initially allocate space - when matching. If this number is exceeded, we allocate more - space, so it is not a hard limit. */ -#ifndef INIT_FAILURE_ALLOC -#define INIT_FAILURE_ALLOC 5 -#endif - -/* Roughly the maximum number of failure points on the stack. Would be - exactly that if always used MAX_FAILURE_SPACE each time we failed. - This is a variable only so users of regex can assign to it; we never - change it ourselves. */ -int re_max_failures = 2000; - -typedef const unsigned char *fail_stack_elt_t; - -typedef struct -{ - fail_stack_elt_t *stack; - unsigned size; - unsigned avail; /* Offset of next open position. */ -} fail_stack_type; - -#define FAIL_STACK_EMPTY() (fail_stack.avail == 0) -#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0) -#define FAIL_STACK_FULL() (fail_stack.avail == fail_stack.size) -#define FAIL_STACK_TOP() (fail_stack.stack[fail_stack.avail]) - - -/* Initialize `fail_stack'. Do `return -2' if the alloc fails. */ - -#define INIT_FAIL_STACK() \ - do { \ - fail_stack.stack = (fail_stack_elt_t *) \ - REGEX_ALLOCATE (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \ - \ - if (fail_stack.stack == NULL) \ - return -2; \ - \ - fail_stack.size = INIT_FAILURE_ALLOC; \ - fail_stack.avail = 0; \ - } while (0) - - -/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items. - - Return 1 if succeeds, and 0 if either ran out of memory - allocating space for it or it was already too large. - - REGEX_REALLOCATE requires `destination' be declared. */ - -#define DOUBLE_FAIL_STACK(fail_stack) \ - ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS \ - ? 0 \ - : ((fail_stack).stack = (fail_stack_elt_t *) \ - REGEX_REALLOCATE ((fail_stack).stack, \ - (fail_stack).size * sizeof (fail_stack_elt_t), \ - ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)), \ - \ - (fail_stack).stack == NULL \ - ? 0 \ - : ((fail_stack).size <<= 1, \ - 1))) - - -/* Push PATTERN_OP on FAIL_STACK. - - Return 1 if was able to do so and 0 if ran out of memory allocating - space to do so. */ -#define PUSH_PATTERN_OP(pattern_op, fail_stack) \ - ((FAIL_STACK_FULL () \ - && !DOUBLE_FAIL_STACK (fail_stack)) \ - ? 0 \ - : ((fail_stack).stack[(fail_stack).avail++] = pattern_op, \ - 1)) - -/* This pushes an item onto the failure stack. Must be a four-byte - value. Assumes the variable `fail_stack'. Probably should only - be called from within `PUSH_FAILURE_POINT'. */ -#define PUSH_FAILURE_ITEM(item) \ - fail_stack.stack[fail_stack.avail++] = (fail_stack_elt_t) item - -/* The complement operation. Assumes `fail_stack' is nonempty. */ -#define POP_FAILURE_ITEM() fail_stack.stack[--fail_stack.avail] - -/* Used to omit pushing failure point id's when we're not debugging. */ -#ifdef DEBUG -#define DEBUG_PUSH PUSH_FAILURE_ITEM -#define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_ITEM () -#else -#define DEBUG_PUSH(item) -#define DEBUG_POP(item_addr) -#endif - - -/* Push the information about the state we will need - if we ever fail back to it. - - Requires variables fail_stack, regstart, regend, reg_info, and - num_regs be declared. DOUBLE_FAIL_STACK requires `destination' be - declared. - - Does `return FAILURE_CODE' if runs out of memory. */ - -#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code) \ - do { \ - char *destination; \ - /* Must be int, so when we don't save any registers, the arithmetic \ - of 0 + -1 isn't done as unsigned. */ \ - int this_reg; \ - \ - DEBUG_STATEMENT (failure_id++); \ - DEBUG_STATEMENT (nfailure_points_pushed++); \ - DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id); \ - DEBUG_PRINT2 (" Before push, next avail: %d\n", (fail_stack).avail);\ - DEBUG_PRINT2 (" size: %d\n", (fail_stack).size);\ - \ - DEBUG_PRINT2 (" slots needed: %d\n", NUM_FAILURE_ITEMS); \ - DEBUG_PRINT2 (" available: %d\n", REMAINING_AVAIL_SLOTS); \ - \ - /* Ensure we have enough space allocated for what we will push. */ \ - while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS) \ - { \ - if (!DOUBLE_FAIL_STACK (fail_stack)) \ - return failure_code; \ - \ - DEBUG_PRINT2 ("\n Doubled stack; size now: %d\n", \ - (fail_stack).size); \ - DEBUG_PRINT2 (" slots available: %d\n", REMAINING_AVAIL_SLOTS);\ - } \ - \ - /* Push the info, starting with the registers. */ \ - DEBUG_PRINT1 ("\n"); \ - \ - for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \ - this_reg++) \ - { \ - DEBUG_PRINT2 (" Pushing reg: %d\n", this_reg); \ - DEBUG_STATEMENT (num_regs_pushed++); \ - \ - DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \ - PUSH_FAILURE_ITEM (regstart[this_reg]); \ - \ - DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \ - PUSH_FAILURE_ITEM (regend[this_reg]); \ - \ - DEBUG_PRINT2 (" info: 0x%x\n ", reg_info[this_reg]); \ - DEBUG_PRINT2 (" match_null=%d", \ - REG_MATCH_NULL_STRING_P (reg_info[this_reg])); \ - DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg])); \ - DEBUG_PRINT2 (" matched_something=%d", \ - MATCHED_SOMETHING (reg_info[this_reg])); \ - DEBUG_PRINT2 (" ever_matched=%d", \ - EVER_MATCHED_SOMETHING (reg_info[this_reg])); \ - DEBUG_PRINT1 ("\n"); \ - PUSH_FAILURE_ITEM (reg_info[this_reg].word); \ - } \ - \ - DEBUG_PRINT2 (" Pushing low active reg: %d\n", lowest_active_reg);\ - PUSH_FAILURE_ITEM (lowest_active_reg); \ - \ - DEBUG_PRINT2 (" Pushing high active reg: %d\n", highest_active_reg);\ - PUSH_FAILURE_ITEM (highest_active_reg); \ - \ - DEBUG_PRINT2 (" Pushing pattern 0x%x: ", pattern_place); \ - DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend); \ - PUSH_FAILURE_ITEM (pattern_place); \ - \ - DEBUG_PRINT2 (" Pushing string 0x%x: `", string_place); \ - DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2, \ - size2); \ - DEBUG_PRINT1 ("'\n"); \ - PUSH_FAILURE_ITEM (string_place); \ - \ - DEBUG_PRINT2 (" Pushing failure id: %u\n", failure_id); \ - DEBUG_PUSH (failure_id); \ - } while (0) - -/* This is the number of items that are pushed and popped on the stack - for each register. */ -#define NUM_REG_ITEMS 3 - -/* Individual items aside from the registers. */ -#ifdef DEBUG -#define NUM_NONREG_ITEMS 5 /* Includes failure point id. */ -#else -#define NUM_NONREG_ITEMS 4 -#endif - -/* We push at most this many items on the stack. */ -#define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS) - -/* We actually push this many items. */ -#define NUM_FAILURE_ITEMS \ - ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS \ - + NUM_NONREG_ITEMS) - -/* How many items can still be added to the stack without overflowing it. */ -#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail) - - -/* Pops what PUSH_FAIL_STACK pushes. - - We restore into the parameters, all of which should be lvalues: - STR -- the saved data position. - PAT -- the saved pattern position. - LOW_REG, HIGH_REG -- the highest and lowest active registers. - REGSTART, REGEND -- arrays of string positions. - REG_INFO -- array of information about each subexpression. - - Also assumes the variables `fail_stack' and (if debugging), `bufp', - `pend', `string1', `size1', `string2', and `size2'. */ - -#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\ -{ \ - DEBUG_STATEMENT (fail_stack_elt_t failure_id;) \ - int this_reg; \ - const unsigned char *string_temp; \ - \ - assert (!FAIL_STACK_EMPTY ()); \ - \ - /* Remove failure points and point to how many regs pushed. */ \ - DEBUG_PRINT1 ("POP_FAILURE_POINT:\n"); \ - DEBUG_PRINT2 (" Before pop, next avail: %d\n", fail_stack.avail); \ - DEBUG_PRINT2 (" size: %d\n", fail_stack.size); \ - \ - assert (fail_stack.avail >= NUM_NONREG_ITEMS); \ - \ - DEBUG_POP (&failure_id); \ - DEBUG_PRINT2 (" Popping failure id: %u\n", failure_id); \ - \ - /* If the saved string location is NULL, it came from an \ - on_failure_keep_string_jump opcode, and we want to throw away the \ - saved NULL, thus retaining our current position in the string. */ \ - string_temp = POP_FAILURE_ITEM (); \ - if (string_temp != NULL) \ - str = (const char *) string_temp; \ - \ - DEBUG_PRINT2 (" Popping string 0x%x: `", str); \ - DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2); \ - DEBUG_PRINT1 ("'\n"); \ - \ - pat = (unsigned char *) POP_FAILURE_ITEM (); \ - DEBUG_PRINT2 (" Popping pattern 0x%x: ", pat); \ - DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend); \ - \ - /* Restore register info. */ \ - high_reg = (unsigned) POP_FAILURE_ITEM (); \ - DEBUG_PRINT2 (" Popping high active reg: %d\n", high_reg); \ - \ - low_reg = (unsigned) POP_FAILURE_ITEM (); \ - DEBUG_PRINT2 (" Popping low active reg: %d\n", low_reg); \ - \ - for (this_reg = high_reg; this_reg >= low_reg; this_reg--) \ - { \ - DEBUG_PRINT2 (" Popping reg: %d\n", this_reg); \ - \ - reg_info[this_reg].word = POP_FAILURE_ITEM (); \ - DEBUG_PRINT2 (" info: 0x%x\n", reg_info[this_reg]); \ - \ - regend[this_reg] = (const char *) POP_FAILURE_ITEM (); \ - DEBUG_PRINT2 (" end: 0x%x\n", regend[this_reg]); \ - \ - regstart[this_reg] = (const char *) POP_FAILURE_ITEM (); \ - DEBUG_PRINT2 (" start: 0x%x\n", regstart[this_reg]); \ - } \ - \ - DEBUG_STATEMENT (nfailure_points_popped++); \ -} /* POP_FAILURE_POINT */ - -/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in - BUFP. A fastmap records which of the (1 << BYTEWIDTH) possible - characters can start a string that matches the pattern. This fastmap - is used by re_search to skip quickly over impossible starting points. - - The caller must supply the address of a (1 << BYTEWIDTH)-byte data - area as BUFP->fastmap. - - We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in - the pattern buffer. - - Returns 0 if we succeed, -2 if an internal error. */ - -int -re_compile_fastmap (bufp) - struct re_pattern_buffer *bufp; -{ - int j, k; - fail_stack_type fail_stack; -#ifndef REGEX_MALLOC - char *destination; -#endif - /* We don't push any register information onto the failure stack. */ - unsigned num_regs = 0; - - register char *fastmap = bufp->fastmap; - unsigned char *pattern = bufp->buffer; - unsigned long size = bufp->used; - const unsigned char *p = pattern; - register unsigned char *pend = pattern + size; - - /* Assume that each path through the pattern can be null until - proven otherwise. We set this false at the bottom of switch - statement, to which we get only if a particular path doesn't - match the empty string. */ - boolean path_can_be_null = true; - - /* We aren't doing a `succeed_n' to begin with. */ - boolean succeed_n_p = false; - - assert (fastmap != NULL && p != NULL); - - INIT_FAIL_STACK (); - bzero (fastmap, 1 << BYTEWIDTH); /* Assume nothing's valid. */ - bufp->fastmap_accurate = 1; /* It will be when we're done. */ - bufp->can_be_null = 0; - - while (p != pend || !FAIL_STACK_EMPTY ()) - { - if (p == pend) - { - bufp->can_be_null |= path_can_be_null; - - /* Reset for next path. */ - path_can_be_null = true; - - p = fail_stack.stack[--fail_stack.avail]; - } - - /* We should never be about to go beyond the end of the pattern. */ - assert (p < pend); - -#ifdef SWITCH_ENUM_BUG - switch ((int) ((re_opcode_t) *p++)) -#else - switch ((re_opcode_t) *p++) -#endif - { - - /* I guess the idea here is to simply not bother with a fastmap - if a backreference is used, since it's too hard to figure out - the fastmap for the corresponding group. Setting - `can_be_null' stops `re_search_2' from using the fastmap, so - that is all we do. */ - case duplicate: - bufp->can_be_null = 1; - return 0; - - - /* Following are the cases which match a character. These end - with `break'. */ - - case exactn: - fastmap[p[1]] = 1; - break; - - - case charset: - for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) - if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) - fastmap[j] = 1; - break; - - - case charset_not: - /* Chars beyond end of map must be allowed. */ - for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) - fastmap[j] = 1; - - for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--) - if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) - fastmap[j] = 1; - break; - - - case wordchar: - for (j = 0; j < (1 << BYTEWIDTH); j++) - if (SYNTAX (j) == Sword) - fastmap[j] = 1; - break; - - - case notwordchar: - for (j = 0; j < (1 << BYTEWIDTH); j++) - if (SYNTAX (j) != Sword) - fastmap[j] = 1; - break; - - - case anychar: - /* `.' matches anything ... */ - for (j = 0; j < (1 << BYTEWIDTH); j++) - fastmap[j] = 1; - - /* ... except perhaps newline. */ - if (!(bufp->syntax & RE_DOT_NEWLINE)) - fastmap['\n'] = 0; - - /* Return if we have already set `can_be_null'; if we have, - then the fastmap is irrelevant. Something's wrong here. */ - else if (bufp->can_be_null) - return 0; - - /* Otherwise, have to check alternative paths. */ - break; - - -#ifdef emacs - case syntaxspec: - k = *p++; - for (j = 0; j < (1 << BYTEWIDTH); j++) - if (SYNTAX (j) == (enum syntaxcode) k) - fastmap[j] = 1; - break; - - - case notsyntaxspec: - k = *p++; - for (j = 0; j < (1 << BYTEWIDTH); j++) - if (SYNTAX (j) != (enum syntaxcode) k) - fastmap[j] = 1; - break; - - - /* All cases after this match the empty string. These end with - `continue'. */ - - - case before_dot: - case at_dot: - case after_dot: - continue; -#endif /* not emacs */ - - - case no_op: - case begline: - case endline: - case begbuf: - case endbuf: - case wordbound: - case notwordbound: - case wordbeg: - case wordend: - case push_dummy_failure: - continue; - - - case jump_n: - case pop_failure_jump: - case maybe_pop_jump: - case jump: - case jump_past_alt: - case dummy_failure_jump: - EXTRACT_NUMBER_AND_INCR (j, p); - p += j; - if (j > 0) - continue; - - /* Jump backward implies we just went through the body of a - loop and matched nothing. Opcode jumped to should be - `on_failure_jump' or `succeed_n'. Just treat it like an - ordinary jump. For a * loop, it has pushed its failure - point already; if so, discard that as redundant. */ - if ((re_opcode_t) *p != on_failure_jump - && (re_opcode_t) *p != succeed_n) - continue; - - p++; - EXTRACT_NUMBER_AND_INCR (j, p); - p += j; - - /* If what's on the stack is where we are now, pop it. */ - if (!FAIL_STACK_EMPTY () - && fail_stack.stack[fail_stack.avail - 1] == p) - fail_stack.avail--; - - continue; - - - case on_failure_jump: - case on_failure_keep_string_jump: - handle_on_failure_jump: - EXTRACT_NUMBER_AND_INCR (j, p); - - /* For some patterns, e.g., `(a?)?', `p+j' here points to the - end of the pattern. We don't want to push such a point, - since when we restore it above, entering the switch will - increment `p' past the end of the pattern. We don't need - to push such a point since we obviously won't find any more - fastmap entries beyond `pend'. Such a pattern can match - the null string, though. */ - if (p + j < pend) - { - if (!PUSH_PATTERN_OP (p + j, fail_stack)) - return -2; - } - else - bufp->can_be_null = 1; - - if (succeed_n_p) - { - EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n. */ - succeed_n_p = false; - } - - continue; - - - case succeed_n: - /* Get to the number of times to succeed. */ - p += 2; - - /* Increment p past the n for when k != 0. */ - EXTRACT_NUMBER_AND_INCR (k, p); - if (k == 0) - { - p -= 4; - succeed_n_p = true; /* Spaghetti code alert. */ - goto handle_on_failure_jump; - } - continue; - - - case set_number_at: - p += 4; - continue; - - - case start_memory: - case stop_memory: - p += 2; - continue; - - - default: - abort (); /* We have listed all the cases. */ - } /* switch *p++ */ - - /* Getting here means we have found the possible starting - characters for one path of the pattern -- and that the empty - string does not match. We need not follow this path further. - Instead, look at the next alternative (remembered on the - stack), or quit if no more. The test at the top of the loop - does these things. */ - path_can_be_null = false; - p = pend; - } /* while p */ - - /* Set `can_be_null' for the last path (also the first path, if the - pattern is empty). */ - bufp->can_be_null |= path_can_be_null; - return 0; -} /* re_compile_fastmap */ - -/* Set REGS to hold NUM_REGS registers, storing them in STARTS and - ENDS. Subsequent matches using PATTERN_BUFFER and REGS will use - this memory for recording register information. STARTS and ENDS - must be allocated using the malloc library routine, and must each - be at least NUM_REGS * sizeof (regoff_t) bytes long. - - If NUM_REGS == 0, then subsequent matches should allocate their own - register data. - - Unless this function is called, the first search or match using - PATTERN_BUFFER will allocate its own register data, without - freeing the old data. */ - -void -re_set_registers (bufp, regs, num_regs, starts, ends) - struct re_pattern_buffer *bufp; - struct re_registers *regs; - unsigned num_regs; - regoff_t *starts, *ends; -{ - if (num_regs) - { - bufp->regs_allocated = REGS_REALLOCATE; - regs->num_regs = num_regs; - regs->start = starts; - regs->end = ends; - } - else - { - bufp->regs_allocated = REGS_UNALLOCATED; - regs->num_regs = 0; - regs->start = regs->end = (regoff_t) 0; - } -} - -/* Searching routines. */ - -/* Like re_search_2, below, but only one string is specified, and - doesn't let you say where to stop matching. */ - -int -re_search (bufp, string, size, startpos, range, regs) - struct re_pattern_buffer *bufp; - const char *string; - int size, startpos, range; - struct re_registers *regs; -{ - return re_search_2 (bufp, NULL, 0, string, size, startpos, range, - regs, size); -} - - -/* Using the compiled pattern in BUFP->buffer, first tries to match the - virtual concatenation of STRING1 and STRING2, starting first at index - STARTPOS, then at STARTPOS + 1, and so on. - - STRING1 and STRING2 have length SIZE1 and SIZE2, respectively. - - RANGE is how far to scan while trying to match. RANGE = 0 means try - only at STARTPOS; in general, the last start tried is STARTPOS + - RANGE. - - In REGS, return the indices of the virtual concatenation of STRING1 - and STRING2 that matched the entire BUFP->buffer and its contained - subexpressions. - - Do not consider matching one past the index STOP in the virtual - concatenation of STRING1 and STRING2. - - We return either the position in the strings at which the match was - found, -1 if no match, or -2 if error (such as failure - stack overflow). */ - -int -re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop) - struct re_pattern_buffer *bufp; - const char *string1, *string2; - int size1, size2; - int startpos; - int range; - struct re_registers *regs; - int stop; -{ - int val; - register char *fastmap = bufp->fastmap; - register char *translate = bufp->translate; - int total_size = size1 + size2; - int endpos = startpos + range; - - /* Check for out-of-range STARTPOS. */ - if (startpos < 0 || startpos > total_size) - return -1; - - /* Fix up RANGE if it might eventually take us outside - the virtual concatenation of STRING1 and STRING2. */ - if (endpos < -1) - range = -1 - startpos; - else if (endpos > total_size) - range = total_size - startpos; - - /* If the search isn't to be a backwards one, don't waste time in a - search for a pattern that must be anchored. */ - if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0) - { - if (startpos > 0) - return -1; - else - range = 1; - } - - /* Update the fastmap now if not correct already. */ - if (fastmap && !bufp->fastmap_accurate) - if (re_compile_fastmap (bufp) == -2) - return -2; - - /* Loop through the string, looking for a place to start matching. */ - for (;;) - { - /* If a fastmap is supplied, skip quickly over characters that - cannot be the start of a match. If the pattern can match the - null string, however, we don't need to skip characters; we want - the first null string. */ - if (fastmap && startpos < total_size && !bufp->can_be_null) - { - if (range > 0) /* Searching forwards. */ - { - register const char *d; - register int lim = 0; - int irange = range; - - if (startpos < size1 && startpos + range >= size1) - lim = range - (size1 - startpos); - - d = (startpos >= size1 ? string2 - size1 : string1) + startpos; - - /* Written out as an if-else to avoid testing `translate' - inside the loop. */ - if (translate) - while (range > lim - && !fastmap[(unsigned char) - translate[(unsigned char) *d++]]) - range--; - else - while (range > lim && !fastmap[(unsigned char) *d++]) - range--; - - startpos += irange - range; - } - else /* Searching backwards. */ - { - register char c = (size1 == 0 || startpos >= size1 - ? string2[startpos - size1] - : string1[startpos]); - - if (!fastmap[(unsigned char) TRANSLATE (c)]) - goto advance; - } - } - - /* If can't match the null string, and that's all we have left, fail. */ - if (range >= 0 && startpos == total_size && fastmap - && !bufp->can_be_null) - return -1; - - val = re_match_2 (bufp, string1, size1, string2, size2, - startpos, regs, stop); - if (val >= 0) - return startpos; - - if (val == -2) - return -2; - - advance: - if (!range) - break; - else if (range > 0) - { - range--; - startpos++; - } - else - { - range++; - startpos--; - } - } - return -1; -} /* re_search_2 */ - -/* Declarations and macros for re_match_2. */ - -static int bcmp_translate (); -static boolean alt_match_null_string_p (), - common_op_match_null_string_p (), - group_match_null_string_p (); - -/* Structure for per-register (a.k.a. per-group) information. - This must not be longer than one word, because we push this value - onto the failure stack. Other register information, such as the - starting and ending positions (which are addresses), and the list of - inner groups (which is a bits list) are maintained in separate - variables. - - We are making a (strictly speaking) nonportable assumption here: that - the compiler will pack our bit fields into something that fits into - the type of `word', i.e., is something that fits into one item on the - failure stack. */ -typedef union -{ - fail_stack_elt_t word; - struct - { - /* This field is one if this group can match the empty string, - zero if not. If not yet determined, `MATCH_NULL_UNSET_VALUE'. */ -#define MATCH_NULL_UNSET_VALUE 3 - unsigned match_null_string_p : 2; - unsigned is_active : 1; - unsigned matched_something : 1; - unsigned ever_matched_something : 1; - } bits; -} register_info_type; - -#define REG_MATCH_NULL_STRING_P(R) ((R).bits.match_null_string_p) -#define IS_ACTIVE(R) ((R).bits.is_active) -#define MATCHED_SOMETHING(R) ((R).bits.matched_something) -#define EVER_MATCHED_SOMETHING(R) ((R).bits.ever_matched_something) - - -/* Call this when have matched a real character; it sets `matched' flags - for the subexpressions which we are currently inside. Also records - that those subexprs have matched. */ -#define SET_REGS_MATCHED() \ - do \ - { \ - unsigned r; \ - for (r = lowest_active_reg; r <= highest_active_reg; r++) \ - { \ - MATCHED_SOMETHING (reg_info[r]) \ - = EVER_MATCHED_SOMETHING (reg_info[r]) \ - = 1; \ - } \ - } \ - while (0) - - -/* This converts PTR, a pointer into one of the search strings `string1' - and `string2' into an offset from the beginning of that string. */ -#define POINTER_TO_OFFSET(ptr) \ - (FIRST_STRING_P (ptr) ? (ptr) - string1 : (ptr) - string2 + size1) - -/* Registers are set to a sentinel when they haven't yet matched. */ -#define REG_UNSET_VALUE ((char *) -1) -#define REG_UNSET(e) ((e) == REG_UNSET_VALUE) - - -/* Macros for dealing with the split strings in re_match_2. */ - -#define MATCHING_IN_FIRST_STRING (dend == end_match_1) - -/* Call before fetching a character with *d. This switches over to - string2 if necessary. */ -#define PREFETCH() \ - while (d == dend) \ - { \ - /* End of string2 => fail. */ \ - if (dend == end_match_2) \ - goto fail; \ - /* End of string1 => advance to string2. */ \ - d = string2; \ - dend = end_match_2; \ - } - - -/* Test if at very beginning or at very end of the virtual concatenation - of `string1' and `string2'. If only one string, it's `string2'. */ -#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2) -#define AT_STRINGS_END(d) ((d) == end2) - - -/* Test if D points to a character which is word-constituent. We have - two special cases to check for: if past the end of string1, look at - the first character in string2; and if before the beginning of - string2, look at the last character in string1. */ -#define WORDCHAR_P(d) \ - (SYNTAX ((d) == end1 ? *string2 \ - : (d) == string2 - 1 ? *(end1 - 1) : *(d)) \ - == Sword) - -/* Test if the character before D and the one at D differ with respect - to being word-constituent. */ -#define AT_WORD_BOUNDARY(d) \ - (AT_STRINGS_BEG (d) || AT_STRINGS_END (d) \ - || WORDCHAR_P (d - 1) != WORDCHAR_P (d)) - - -/* Free everything we malloc. */ -#ifdef REGEX_MALLOC -#define FREE_VAR(var) if (var) free (var); var = NULL -#define FREE_VARIABLES() \ - do { \ - FREE_VAR (fail_stack.stack); \ - FREE_VAR (regstart); \ - FREE_VAR (regend); \ - FREE_VAR (old_regstart); \ - FREE_VAR (old_regend); \ - FREE_VAR (best_regstart); \ - FREE_VAR (best_regend); \ - FREE_VAR (reg_info); \ - FREE_VAR (reg_dummy); \ - FREE_VAR (reg_info_dummy); \ - } while (0) -#else /* not REGEX_MALLOC */ -/* Some MIPS systems (at least) want this to free alloca'd storage. */ -#define FREE_VARIABLES() alloca (0) -#endif /* not REGEX_MALLOC */ - - -/* These values must meet several constraints. They must not be valid - register values; since we have a limit of 255 registers (because - we use only one byte in the pattern for the register number), we can - use numbers larger than 255. They must differ by 1, because of - NUM_FAILURE_ITEMS above. And the value for the lowest register must - be larger than the value for the highest register, so we do not try - to actually save any registers when none are active. */ -#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH) -#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1) - -/* Matching routines. */ - -#ifndef emacs /* Emacs never uses this. */ -/* re_match is like re_match_2 except it takes only a single string. */ - -int -re_match (bufp, string, size, pos, regs) - struct re_pattern_buffer *bufp; - const char *string; - int size, pos; - struct re_registers *regs; - { - return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size); -} -#endif /* not emacs */ - - -/* re_match_2 matches the compiled pattern in BUFP against the - the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1 - and SIZE2, respectively). We start matching at POS, and stop - matching at STOP. - - If REGS is non-null and the `no_sub' field of BUFP is nonzero, we - store offsets for the substring each group matched in REGS. See the - documentation for exactly how many groups we fill. - - We return -1 if no match, -2 if an internal error (such as the - failure stack overflowing). Otherwise, we return the length of the - matched substring. */ - -int -re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop) - struct re_pattern_buffer *bufp; - const char *string1, *string2; - int size1, size2; - int pos; - struct re_registers *regs; - int stop; -{ - /* General temporaries. */ - int mcnt; - unsigned char *p1; - - /* Just past the end of the corresponding string. */ - const char *end1, *end2; - - /* Pointers into string1 and string2, just past the last characters in - each to consider matching. */ - const char *end_match_1, *end_match_2; - - /* Where we are in the data, and the end of the current string. */ - const char *d, *dend; - - /* Where we are in the pattern, and the end of the pattern. */ - unsigned char *p = bufp->buffer; - register unsigned char *pend = p + bufp->used; - - /* We use this to map every character in the string. */ - char *translate = bufp->translate; - - /* Failure point stack. Each place that can handle a failure further - down the line pushes a failure point on this stack. It consists of - restart, regend, and reg_info for all registers corresponding to - the subexpressions we're currently inside, plus the number of such - registers, and, finally, two char *'s. The first char * is where - to resume scanning the pattern; the second one is where to resume - scanning the strings. If the latter is zero, the failure point is - a ``dummy''; if a failure happens and the failure point is a dummy, - it gets discarded and the next next one is tried. */ - fail_stack_type fail_stack; -#ifdef DEBUG - static unsigned failure_id = 0; - unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0; -#endif - - /* We fill all the registers internally, independent of what we - return, for use in backreferences. The number here includes - an element for register zero. */ - unsigned num_regs = bufp->re_nsub + 1; - - /* The currently active registers. */ - unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG; - unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG; - - /* Information on the contents of registers. These are pointers into - the input strings; they record just what was matched (on this - attempt) by a subexpression part of the pattern, that is, the - regnum-th regstart pointer points to where in the pattern we began - matching and the regnum-th regend points to right after where we - stopped matching the regnum-th subexpression. (The zeroth register - keeps track of what the whole pattern matches.) */ - const char **regstart, **regend; - - /* If a group that's operated upon by a repetition operator fails to - match anything, then the register for its start will need to be - restored because it will have been set to wherever in the string we - are when we last see its open-group operator. Similarly for a - register's end. */ - const char **old_regstart, **old_regend; - - /* The is_active field of reg_info helps us keep track of which (possibly - nested) subexpressions we are currently in. The matched_something - field of reg_info[reg_num] helps us tell whether or not we have - matched any of the pattern so far this time through the reg_num-th - subexpression. These two fields get reset each time through any - loop their register is in. */ - register_info_type *reg_info; - - /* The following record the register info as found in the above - variables when we find a match better than any we've seen before. - This happens as we backtrack through the failure points, which in - turn happens only if we have not yet matched the entire string. */ - unsigned best_regs_set = false; - const char **best_regstart, **best_regend; - - /* Logically, this is `best_regend[0]'. But we don't want to have to - allocate space for that if we're not allocating space for anything - else (see below). Also, we never need info about register 0 for - any of the other register vectors, and it seems rather a kludge to - treat `best_regend' differently than the rest. So we keep track of - the end of the best match so far in a separate variable. We - initialize this to NULL so that when we backtrack the first time - and need to test it, it's not garbage. */ - const char *match_end = NULL; - - /* Used when we pop values we don't care about. */ - const char **reg_dummy; - register_info_type *reg_info_dummy; - -#ifdef DEBUG - /* Counts the total number of registers pushed. */ - unsigned num_regs_pushed = 0; -#endif - - DEBUG_PRINT1 ("\n\nEntering re_match_2.\n"); - - INIT_FAIL_STACK (); - - /* Do not bother to initialize all the register variables if there are - no groups in the pattern, as it takes a fair amount of time. If - there are groups, we include space for register 0 (the whole - pattern), even though we never use it, since it simplifies the - array indexing. We should fix this. */ - if (bufp->re_nsub) - { - regstart = REGEX_TALLOC (num_regs, const char *); - regend = REGEX_TALLOC (num_regs, const char *); - old_regstart = REGEX_TALLOC (num_regs, const char *); - old_regend = REGEX_TALLOC (num_regs, const char *); - best_regstart = REGEX_TALLOC (num_regs, const char *); - best_regend = REGEX_TALLOC (num_regs, const char *); - reg_info = REGEX_TALLOC (num_regs, register_info_type); - reg_dummy = REGEX_TALLOC (num_regs, const char *); - reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type); - - if (!(regstart && regend && old_regstart && old_regend && reg_info - && best_regstart && best_regend && reg_dummy && reg_info_dummy)) - { - FREE_VARIABLES (); - return -2; - } - } -#ifdef REGEX_MALLOC - else - { - /* We must initialize all our variables to NULL, so that - `FREE_VARIABLES' doesn't try to free them. */ - regstart = regend = old_regstart = old_regend = best_regstart - = best_regend = reg_dummy = NULL; - reg_info = reg_info_dummy = (register_info_type *) NULL; - } -#endif /* REGEX_MALLOC */ - - /* The starting position is bogus. */ - if (pos < 0 || pos > size1 + size2) - { - FREE_VARIABLES (); - return -1; - } - - /* Initialize subexpression text positions to -1 to mark ones that no - start_memory/stop_memory has been seen for. Also initialize the - register information struct. */ - for (mcnt = 1; mcnt < num_regs; mcnt++) - { - regstart[mcnt] = regend[mcnt] - = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE; - - REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE; - IS_ACTIVE (reg_info[mcnt]) = 0; - MATCHED_SOMETHING (reg_info[mcnt]) = 0; - EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0; - } - - /* We move `string1' into `string2' if the latter's empty -- but not if - `string1' is null. */ - if (size2 == 0 && string1 != NULL) - { - string2 = string1; - size2 = size1; - string1 = 0; - size1 = 0; - } - end1 = string1 + size1; - end2 = string2 + size2; - - /* Compute where to stop matching, within the two strings. */ - if (stop <= size1) - { - end_match_1 = string1 + stop; - end_match_2 = string2; - } - else - { - end_match_1 = end1; - end_match_2 = string2 + stop - size1; - } - - /* `p' scans through the pattern as `d' scans through the data. - `dend' is the end of the input string that `d' points within. `d' - is advanced into the following input string whenever necessary, but - this happens before fetching; therefore, at the beginning of the - loop, `d' can be pointing at the end of a string, but it cannot - equal `string2'. */ - if (size1 > 0 && pos <= size1) - { - d = string1 + pos; - dend = end_match_1; - } - else - { - d = string2 + pos - size1; - dend = end_match_2; - } - - DEBUG_PRINT1 ("The compiled pattern is: "); - DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend); - DEBUG_PRINT1 ("The string to match is: `"); - DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2); - DEBUG_PRINT1 ("'\n"); - - /* This loops over pattern commands. It exits by returning from the - function if the match is complete, or it drops through if the match - fails at this starting point in the input data. */ - for (;;) - { - DEBUG_PRINT2 ("\n0x%x: ", p); - - if (p == pend) - { /* End of pattern means we might have succeeded. */ - DEBUG_PRINT1 ("end of pattern ... "); - - /* If we haven't matched the entire string, and we want the - longest match, try backtracking. */ - if (d != end_match_2) - { - DEBUG_PRINT1 ("backtracking.\n"); - - if (!FAIL_STACK_EMPTY ()) - { /* More failure points to try. */ - boolean same_str_p = (FIRST_STRING_P (match_end) - == MATCHING_IN_FIRST_STRING); - - /* If exceeds best match so far, save it. */ - if (!best_regs_set - || (same_str_p && d > match_end) - || (!same_str_p && !MATCHING_IN_FIRST_STRING)) - { - best_regs_set = true; - match_end = d; - - DEBUG_PRINT1 ("\nSAVING match as best so far.\n"); - - for (mcnt = 1; mcnt < num_regs; mcnt++) - { - best_regstart[mcnt] = regstart[mcnt]; - best_regend[mcnt] = regend[mcnt]; - } - } - goto fail; - } - - /* If no failure points, don't restore garbage. */ - else if (best_regs_set) - { - restore_best_regs: - /* Restore best match. It may happen that `dend == - end_match_1' while the restored d is in string2. - For example, the pattern `x.*y.*z' against the - strings `x-' and `y-z-', if the two strings are - not consecutive in memory. */ - DEBUG_PRINT1 ("Restoring best registers.\n"); - - d = match_end; - dend = ((d >= string1 && d <= end1) - ? end_match_1 : end_match_2); - - for (mcnt = 1; mcnt < num_regs; mcnt++) - { - regstart[mcnt] = best_regstart[mcnt]; - regend[mcnt] = best_regend[mcnt]; - } - } - } /* d != end_match_2 */ - - DEBUG_PRINT1 ("Accepting match.\n"); - - /* If caller wants register contents data back, do it. */ - if (regs && !bufp->no_sub) - { - /* Have the register data arrays been allocated? */ - if (bufp->regs_allocated == REGS_UNALLOCATED) - { /* No. So allocate them with malloc. We need one - extra element beyond `num_regs' for the `-1' marker - GNU code uses. */ - regs->num_regs = MAX (RE_NREGS, num_regs + 1); - regs->start = TALLOC (regs->num_regs, regoff_t); - regs->end = TALLOC (regs->num_regs, regoff_t); - if (regs->start == NULL || regs->end == NULL) - return -2; - bufp->regs_allocated = REGS_REALLOCATE; - } - else if (bufp->regs_allocated == REGS_REALLOCATE) - { /* Yes. If we need more elements than were already - allocated, reallocate them. If we need fewer, just - leave it alone. */ - if (regs->num_regs < num_regs + 1) - { - regs->num_regs = num_regs + 1; - RETALLOC (regs->start, regs->num_regs, regoff_t); - RETALLOC (regs->end, regs->num_regs, regoff_t); - if (regs->start == NULL || regs->end == NULL) - return -2; - } - } - else - assert (bufp->regs_allocated == REGS_FIXED); - - /* Convert the pointer data in `regstart' and `regend' to - indices. Register zero has to be set differently, - since we haven't kept track of any info for it. */ - if (regs->num_regs > 0) - { - regs->start[0] = pos; - regs->end[0] = (MATCHING_IN_FIRST_STRING ? d - string1 - : d - string2 + size1); - } - - /* Go through the first `min (num_regs, regs->num_regs)' - registers, since that is all we initialized. */ - for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++) - { - if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) - regs->start[mcnt] = regs->end[mcnt] = -1; - else - { - regs->start[mcnt] = POINTER_TO_OFFSET (regstart[mcnt]); - regs->end[mcnt] = POINTER_TO_OFFSET (regend[mcnt]); - } - } - - /* If the regs structure we return has more elements than - were in the pattern, set the extra elements to -1. If - we (re)allocated the registers, this is the case, - because we always allocate enough to have at least one - -1 at the end. */ - for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++) - regs->start[mcnt] = regs->end[mcnt] = -1; - } /* regs && !bufp->no_sub */ - - FREE_VARIABLES (); - DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n", - nfailure_points_pushed, nfailure_points_popped, - nfailure_points_pushed - nfailure_points_popped); - DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed); - - mcnt = d - pos - (MATCHING_IN_FIRST_STRING - ? string1 - : string2 - size1); - - DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt); - - return mcnt; - } - - /* Otherwise match next pattern command. */ -#ifdef SWITCH_ENUM_BUG - switch ((int) ((re_opcode_t) *p++)) -#else - switch ((re_opcode_t) *p++) -#endif - { - /* Ignore these. Used to ignore the n of succeed_n's which - currently have n == 0. */ - case no_op: - DEBUG_PRINT1 ("EXECUTING no_op.\n"); - break; - - - /* Match the next n pattern characters exactly. The following - byte in the pattern defines n, and the n bytes after that - are the characters to match. */ - case exactn: - mcnt = *p++; - DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt); - - /* This is written out as an if-else so we don't waste time - testing `translate' inside the loop. */ - if (translate) - { - do - { - PREFETCH (); - if (translate[(unsigned char) *d++] != (char) *p++) - goto fail; - } - while (--mcnt); - } - else - { - do - { - PREFETCH (); - if (*d++ != (char) *p++) goto fail; - } - while (--mcnt); - } - SET_REGS_MATCHED (); - break; - - - /* Match any character except possibly a newline or a null. */ - case anychar: - DEBUG_PRINT1 ("EXECUTING anychar.\n"); - - PREFETCH (); - - if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n') - || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) - goto fail; - - SET_REGS_MATCHED (); - DEBUG_PRINT2 (" Matched `%d'.\n", *d); - d++; - break; - - - case charset: - case charset_not: - { - register unsigned char c; - boolean not = (re_opcode_t) *(p - 1) == charset_not; - - DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : ""); - - PREFETCH (); - c = TRANSLATE (*d); /* The character to match. */ - - /* Cast to `unsigned' instead of `unsigned char' in case the - bit list is a full 32 bytes long. */ - if (c < (unsigned) (*p * BYTEWIDTH) - && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) - not = !not; - - p += 1 + *p; - - if (!not) goto fail; - - SET_REGS_MATCHED (); - d++; - break; - } - - - /* The beginning of a group is represented by start_memory. - The arguments are the register number in the next byte, and the - number of groups inner to this one in the next. The text - matched within the group is recorded (in the internal - registers data structure) under the register number. */ - case start_memory: - DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]); - - /* Find out if this group can match the empty string. */ - p1 = p; /* To send to group_match_null_string_p. */ - - if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE) - REG_MATCH_NULL_STRING_P (reg_info[*p]) - = group_match_null_string_p (&p1, pend, reg_info); - - /* Save the position in the string where we were the last time - we were at this open-group operator in case the group is - operated upon by a repetition operator, e.g., with `(a*)*b' - against `ab'; then we want to ignore where we are now in - the string in case this attempt to match fails. */ - old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) - ? REG_UNSET (regstart[*p]) ? d : regstart[*p] - : regstart[*p]; - DEBUG_PRINT2 (" old_regstart: %d\n", - POINTER_TO_OFFSET (old_regstart[*p])); - - regstart[*p] = d; - DEBUG_PRINT2 (" regstart: %d\n", POINTER_TO_OFFSET (regstart[*p])); - - IS_ACTIVE (reg_info[*p]) = 1; - MATCHED_SOMETHING (reg_info[*p]) = 0; - - /* This is the new highest active register. */ - highest_active_reg = *p; - - /* If nothing was active before, this is the new lowest active - register. */ - if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) - lowest_active_reg = *p; - - /* Move past the register number and inner group count. */ - p += 2; - break; - - - /* The stop_memory opcode represents the end of a group. Its - arguments are the same as start_memory's: the register - number, and the number of inner groups. */ - case stop_memory: - DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]); - - /* We need to save the string position the last time we were at - this close-group operator in case the group is operated - upon by a repetition operator, e.g., with `((a*)*(b*)*)*' - against `aba'; then we want to ignore where we are now in - the string in case this attempt to match fails. */ - old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p]) - ? REG_UNSET (regend[*p]) ? d : regend[*p] - : regend[*p]; - DEBUG_PRINT2 (" old_regend: %d\n", - POINTER_TO_OFFSET (old_regend[*p])); - - regend[*p] = d; - DEBUG_PRINT2 (" regend: %d\n", POINTER_TO_OFFSET (regend[*p])); - - /* This register isn't active anymore. */ - IS_ACTIVE (reg_info[*p]) = 0; - - /* If this was the only register active, nothing is active - anymore. */ - if (lowest_active_reg == highest_active_reg) - { - lowest_active_reg = NO_LOWEST_ACTIVE_REG; - highest_active_reg = NO_HIGHEST_ACTIVE_REG; - } - else - { /* We must scan for the new highest active register, since - it isn't necessarily one less than now: consider - (a(b)c(d(e)f)g). When group 3 ends, after the f), the - new highest active register is 1. */ - unsigned char r = *p - 1; - while (r > 0 && !IS_ACTIVE (reg_info[r])) - r--; - - /* If we end up at register zero, that means that we saved - the registers as the result of an `on_failure_jump', not - a `start_memory', and we jumped to past the innermost - `stop_memory'. For example, in ((.)*) we save - registers 1 and 2 as a result of the *, but when we pop - back to the second ), we are at the stop_memory 1. - Thus, nothing is active. */ - if (r == 0) - { - lowest_active_reg = NO_LOWEST_ACTIVE_REG; - highest_active_reg = NO_HIGHEST_ACTIVE_REG; - } - else - highest_active_reg = r; - } - - /* If just failed to match something this time around with a - group that's operated on by a repetition operator, try to - force exit from the ``loop'', and restore the register - information for this group that we had before trying this - last match. */ - if ((!MATCHED_SOMETHING (reg_info[*p]) - || (re_opcode_t) p[-3] == start_memory) - && (p + 2) < pend) - { - boolean is_a_jump_n = false; - - p1 = p + 2; - mcnt = 0; - switch ((re_opcode_t) *p1++) - { - case jump_n: - is_a_jump_n = true; - case pop_failure_jump: - case maybe_pop_jump: - case jump: - case dummy_failure_jump: - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - if (is_a_jump_n) - p1 += 2; - break; - - default: - /* do nothing */ ; - } - p1 += mcnt; - - /* If the next operation is a jump backwards in the pattern - to an on_failure_jump right before the start_memory - corresponding to this stop_memory, exit from the loop - by forcing a failure after pushing on the stack the - on_failure_jump's jump in the pattern, and d. */ - if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump - && (re_opcode_t) p1[3] == start_memory && p1[4] == *p) - { - /* If this group ever matched anything, then restore - what its registers were before trying this last - failed match, e.g., with `(a*)*b' against `ab' for - regstart[1], and, e.g., with `((a*)*(b*)*)*' - against `aba' for regend[3]. - - Also restore the registers for inner groups for, - e.g., `((a*)(b*))*' against `aba' (register 3 would - otherwise get trashed). */ - - if (EVER_MATCHED_SOMETHING (reg_info[*p])) - { - unsigned r; - - EVER_MATCHED_SOMETHING (reg_info[*p]) = 0; - - /* Restore this and inner groups' (if any) registers. */ - for (r = *p; r < *p + *(p + 1); r++) - { - regstart[r] = old_regstart[r]; - - /* xx why this test? */ - if ((int) old_regend[r] >= (int) regstart[r]) - regend[r] = old_regend[r]; - } - } - p1++; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - PUSH_FAILURE_POINT (p1 + mcnt, d, -2); - - goto fail; - } - } - - /* Move past the register number and the inner group count. */ - p += 2; - break; - - - /* \<digit> has been turned into a `duplicate' command which is - followed by the numeric value of <digit> as the register number. */ - case duplicate: - { - register const char *d2, *dend2; - int regno = *p++; /* Get which register to match against. */ - DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno); - - /* Can't back reference a group which we've never matched. */ - if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) - goto fail; - - /* Where in input to try to start matching. */ - d2 = regstart[regno]; - - /* Where to stop matching; if both the place to start and - the place to stop matching are in the same string, then - set to the place to stop, otherwise, for now have to use - the end of the first string. */ - - dend2 = ((FIRST_STRING_P (regstart[regno]) - == FIRST_STRING_P (regend[regno])) - ? regend[regno] : end_match_1); - for (;;) - { - /* If necessary, advance to next segment in register - contents. */ - while (d2 == dend2) - { - if (dend2 == end_match_2) break; - if (dend2 == regend[regno]) break; - - /* End of string1 => advance to string2. */ - d2 = string2; - dend2 = regend[regno]; - } - /* At end of register contents => success */ - if (d2 == dend2) break; - - /* If necessary, advance to next segment in data. */ - PREFETCH (); - - /* How many characters left in this segment to match. */ - mcnt = dend - d; - - /* Want how many consecutive characters we can match in - one shot, so, if necessary, adjust the count. */ - if (mcnt > dend2 - d2) - mcnt = dend2 - d2; - - /* Compare that many; failure if mismatch, else move - past them. */ - if (translate - ? bcmp_translate (d, d2, mcnt, translate) - : bcmp (d, d2, mcnt)) - goto fail; - d += mcnt, d2 += mcnt; - } - } - break; - - - /* begline matches the empty string at the beginning of the string - (unless `not_bol' is set in `bufp'), and, if - `newline_anchor' is set, after newlines. */ - case begline: - DEBUG_PRINT1 ("EXECUTING begline.\n"); - - if (AT_STRINGS_BEG (d)) - { - if (!bufp->not_bol) break; - } - else if (d[-1] == '\n' && bufp->newline_anchor) - { - break; - } - /* In all other cases, we fail. */ - goto fail; - - - /* endline is the dual of begline. */ - case endline: - DEBUG_PRINT1 ("EXECUTING endline.\n"); - - if (AT_STRINGS_END (d)) - { - if (!bufp->not_eol) break; - } - - /* We have to ``prefetch'' the next character. */ - else if ((d == end1 ? *string2 : *d) == '\n' - && bufp->newline_anchor) - { - break; - } - goto fail; - - - /* Match at the very beginning of the data. */ - case begbuf: - DEBUG_PRINT1 ("EXECUTING begbuf.\n"); - if (AT_STRINGS_BEG (d)) - break; - goto fail; - - - /* Match at the very end of the data. */ - case endbuf: - DEBUG_PRINT1 ("EXECUTING endbuf.\n"); - if (AT_STRINGS_END (d)) - break; - goto fail; - - - /* on_failure_keep_string_jump is used to optimize `.*\n'. It - pushes NULL as the value for the string on the stack. Then - `pop_failure_point' will keep the current value for the - string, instead of restoring it. To see why, consider - matching `foo\nbar' against `.*\n'. The .* matches the foo; - then the . fails against the \n. But the next thing we want - to do is match the \n against the \n; if we restored the - string value, we would be back at the foo. - - Because this is used only in specific cases, we don't need to - check all the things that `on_failure_jump' does, to make - sure the right things get saved on the stack. Hence we don't - share its code. The only reason to push anything on the - stack at all is that otherwise we would have to change - `anychar's code to do something besides goto fail in this - case; that seems worse than this. */ - case on_failure_keep_string_jump: - DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump"); - - EXTRACT_NUMBER_AND_INCR (mcnt, p); - DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt); - - PUSH_FAILURE_POINT (p + mcnt, NULL, -2); - break; - - - /* Uses of on_failure_jump: - - Each alternative starts with an on_failure_jump that points - to the beginning of the next alternative. Each alternative - except the last ends with a jump that in effect jumps past - the rest of the alternatives. (They really jump to the - ending jump of the following alternative, because tensioning - these jumps is a hassle.) - - Repeats start with an on_failure_jump that points past both - the repetition text and either the following jump or - pop_failure_jump back to this on_failure_jump. */ - case on_failure_jump: - on_failure: - DEBUG_PRINT1 ("EXECUTING on_failure_jump"); - - EXTRACT_NUMBER_AND_INCR (mcnt, p); - DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt); - - /* If this on_failure_jump comes right before a group (i.e., - the original * applied to a group), save the information - for that group and all inner ones, so that if we fail back - to this point, the group's information will be correct. - For example, in \(a*\)*\1, we need the preceding group, - and in \(\(a*\)b*\)\2, we need the inner group. */ - - /* We can't use `p' to check ahead because we push - a failure point to `p + mcnt' after we do this. */ - p1 = p; - - /* We need to skip no_op's before we look for the - start_memory in case this on_failure_jump is happening as - the result of a completed succeed_n, as in \(a\)\{1,3\}b\1 - against aba. */ - while (p1 < pend && (re_opcode_t) *p1 == no_op) - p1++; - - if (p1 < pend && (re_opcode_t) *p1 == start_memory) - { - /* We have a new highest active register now. This will - get reset at the start_memory we are about to get to, - but we will have saved all the registers relevant to - this repetition op, as described above. */ - highest_active_reg = *(p1 + 1) + *(p1 + 2); - if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) - lowest_active_reg = *(p1 + 1); - } - - DEBUG_PRINT1 (":\n"); - PUSH_FAILURE_POINT (p + mcnt, d, -2); - break; - - - /* A smart repeat ends with `maybe_pop_jump'. - We change it to either `pop_failure_jump' or `jump'. */ - case maybe_pop_jump: - EXTRACT_NUMBER_AND_INCR (mcnt, p); - DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt); - { - register unsigned char *p2 = p; - - /* Compare the beginning of the repeat with what in the - pattern follows its end. If we can establish that there - is nothing that they would both match, i.e., that we - would have to backtrack because of (as in, e.g., `a*a') - then we can change to pop_failure_jump, because we'll - never have to backtrack. - - This is not true in the case of alternatives: in - `(a|ab)*' we do need to backtrack to the `ab' alternative - (e.g., if the string was `ab'). But instead of trying to - detect that here, the alternative has put on a dummy - failure point which is what we will end up popping. */ - - /* Skip over open/close-group commands. */ - while (p2 + 2 < pend - && ((re_opcode_t) *p2 == stop_memory - || (re_opcode_t) *p2 == start_memory)) - p2 += 3; /* Skip over args, too. */ - - /* If we're at the end of the pattern, we can change. */ - if (p2 == pend) - { - /* Consider what happens when matching ":\(.*\)" - against ":/". I don't really understand this code - yet. */ - p[-3] = (unsigned char) pop_failure_jump; - DEBUG_PRINT1 - (" End of pattern: change to `pop_failure_jump'.\n"); - } - - else if ((re_opcode_t) *p2 == exactn - || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) - { - register unsigned char c - = *p2 == (unsigned char) endline ? '\n' : p2[2]; - p1 = p + mcnt; - - /* p1[0] ... p1[2] are the `on_failure_jump' corresponding - to the `maybe_finalize_jump' of this case. Examine what - follows. */ - if ((re_opcode_t) p1[3] == exactn && p1[5] != c) - { - p[-3] = (unsigned char) pop_failure_jump; - DEBUG_PRINT3 (" %c != %c => pop_failure_jump.\n", - c, p1[5]); - } - - else if ((re_opcode_t) p1[3] == charset - || (re_opcode_t) p1[3] == charset_not) - { - int not = (re_opcode_t) p1[3] == charset_not; - - if (c < (unsigned char) (p1[4] * BYTEWIDTH) - && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) - not = !not; - - /* `not' is equal to 1 if c would match, which means - that we can't change to pop_failure_jump. */ - if (!not) - { - p[-3] = (unsigned char) pop_failure_jump; - DEBUG_PRINT1 (" No match => pop_failure_jump.\n"); - } - } - } - } - p -= 2; /* Point at relative address again. */ - if ((re_opcode_t) p[-1] != pop_failure_jump) - { - p[-1] = (unsigned char) jump; - DEBUG_PRINT1 (" Match => jump.\n"); - goto unconditional_jump; - } - /* Note fall through. */ - - - /* The end of a simple repeat has a pop_failure_jump back to - its matching on_failure_jump, where the latter will push a - failure point. The pop_failure_jump takes off failure - points put on by this pop_failure_jump's matching - on_failure_jump; we got through the pattern to here from the - matching on_failure_jump, so didn't fail. */ - case pop_failure_jump: - { - /* We need to pass separate storage for the lowest and - highest registers, even though we don't care about the - actual values. Otherwise, we will restore only one - register from the stack, since lowest will == highest in - `pop_failure_point'. */ - unsigned dummy_low_reg, dummy_high_reg; - unsigned char *pdummy; - const char *sdummy; - - DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n"); - POP_FAILURE_POINT (sdummy, pdummy, - dummy_low_reg, dummy_high_reg, - reg_dummy, reg_dummy, reg_info_dummy); - } - /* Note fall through. */ - - - /* Unconditionally jump (without popping any failure points). */ - case jump: - unconditional_jump: - EXTRACT_NUMBER_AND_INCR (mcnt, p); /* Get the amount to jump. */ - DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt); - p += mcnt; /* Do the jump. */ - DEBUG_PRINT2 ("(to 0x%x).\n", p); - break; - - - /* We need this opcode so we can detect where alternatives end - in `group_match_null_string_p' et al. */ - case jump_past_alt: - DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n"); - goto unconditional_jump; - - - /* Normally, the on_failure_jump pushes a failure point, which - then gets popped at pop_failure_jump. We will end up at - pop_failure_jump, also, and with a pattern of, say, `a+', we - are skipping over the on_failure_jump, so we have to push - something meaningless for pop_failure_jump to pop. */ - case dummy_failure_jump: - DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n"); - /* It doesn't matter what we push for the string here. What - the code at `fail' tests is the value for the pattern. */ - PUSH_FAILURE_POINT (0, 0, -2); - goto unconditional_jump; - - - /* At the end of an alternative, we need to push a dummy failure - point in case we are followed by a `pop_failure_jump', because - we don't want the failure point for the alternative to be - popped. For example, matching `(a|ab)*' against `aab' - requires that we match the `ab' alternative. */ - case push_dummy_failure: - DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n"); - /* See comments just above at `dummy_failure_jump' about the - two zeroes. */ - PUSH_FAILURE_POINT (0, 0, -2); - break; - - /* Have to succeed matching what follows at least n times. - After that, handle like `on_failure_jump'. */ - case succeed_n: - EXTRACT_NUMBER (mcnt, p + 2); - DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt); - - assert (mcnt >= 0); - /* Originally, this is how many times we HAVE to succeed. */ - if (mcnt > 0) - { - mcnt--; - p += 2; - STORE_NUMBER_AND_INCR (p, mcnt); - DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p, mcnt); - } - else if (mcnt == 0) - { - DEBUG_PRINT2 (" Setting two bytes from 0x%x to no_op.\n", p+2); - p[2] = (unsigned char) no_op; - p[3] = (unsigned char) no_op; - goto on_failure; - } - break; - - case jump_n: - EXTRACT_NUMBER (mcnt, p + 2); - DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt); - - /* Originally, this is how many times we CAN jump. */ - if (mcnt) - { - mcnt--; - STORE_NUMBER (p + 2, mcnt); - goto unconditional_jump; - } - /* If don't have to jump any more, skip over the rest of command. */ - else - p += 4; - break; - - case set_number_at: - { - DEBUG_PRINT1 ("EXECUTING set_number_at.\n"); - - EXTRACT_NUMBER_AND_INCR (mcnt, p); - p1 = p + mcnt; - EXTRACT_NUMBER_AND_INCR (mcnt, p); - DEBUG_PRINT3 (" Setting 0x%x to %d.\n", p1, mcnt); - STORE_NUMBER (p1, mcnt); - break; - } - - case wordbound: - DEBUG_PRINT1 ("EXECUTING wordbound.\n"); - if (AT_WORD_BOUNDARY (d)) - break; - goto fail; - - case notwordbound: - DEBUG_PRINT1 ("EXECUTING notwordbound.\n"); - if (AT_WORD_BOUNDARY (d)) - goto fail; - break; - - case wordbeg: - DEBUG_PRINT1 ("EXECUTING wordbeg.\n"); - if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) - break; - goto fail; - - case wordend: - DEBUG_PRINT1 ("EXECUTING wordend.\n"); - if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1) - && (!WORDCHAR_P (d) || AT_STRINGS_END (d))) - break; - goto fail; - -#ifdef emacs -#ifdef emacs19 - case before_dot: - DEBUG_PRINT1 ("EXECUTING before_dot.\n"); - if (PTR_CHAR_POS ((unsigned char *) d) >= point) - goto fail; - break; - - case at_dot: - DEBUG_PRINT1 ("EXECUTING at_dot.\n"); - if (PTR_CHAR_POS ((unsigned char *) d) != point) - goto fail; - break; - - case after_dot: - DEBUG_PRINT1 ("EXECUTING after_dot.\n"); - if (PTR_CHAR_POS ((unsigned char *) d) <= point) - goto fail; - break; -#else /* not emacs19 */ - case at_dot: - DEBUG_PRINT1 ("EXECUTING at_dot.\n"); - if (PTR_CHAR_POS ((unsigned char *) d) + 1 != point) - goto fail; - break; -#endif /* not emacs19 */ - - case syntaxspec: - DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt); - mcnt = *p++; - goto matchsyntax; - - case wordchar: - DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n"); - mcnt = (int) Sword; - matchsyntax: - PREFETCH (); - if (SYNTAX (*d++) != (enum syntaxcode) mcnt) - goto fail; - SET_REGS_MATCHED (); - break; - - case notsyntaxspec: - DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt); - mcnt = *p++; - goto matchnotsyntax; - - case notwordchar: - DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n"); - mcnt = (int) Sword; - matchnotsyntax: - PREFETCH (); - if (SYNTAX (*d++) == (enum syntaxcode) mcnt) - goto fail; - SET_REGS_MATCHED (); - break; - -#else /* not emacs */ - case wordchar: - DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n"); - PREFETCH (); - if (!WORDCHAR_P (d)) - goto fail; - SET_REGS_MATCHED (); - d++; - break; - - case notwordchar: - DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n"); - PREFETCH (); - if (WORDCHAR_P (d)) - goto fail; - SET_REGS_MATCHED (); - d++; - break; -#endif /* not emacs */ - - default: - abort (); - } - continue; /* Successfully executed one pattern command; keep going. */ - - - /* We goto here if a matching operation fails. */ - fail: - if (!FAIL_STACK_EMPTY ()) - { /* A restart point is known. Restore to that state. */ - DEBUG_PRINT1 ("\nFAIL:\n"); - POP_FAILURE_POINT (d, p, - lowest_active_reg, highest_active_reg, - regstart, regend, reg_info); - - /* If this failure point is a dummy, try the next one. */ - if (!p) - goto fail; - - /* If we failed to the end of the pattern, don't examine *p. */ - assert (p <= pend); - if (p < pend) - { - boolean is_a_jump_n = false; - - /* If failed to a backwards jump that's part of a repetition - loop, need to pop this failure point and use the next one. */ - switch ((re_opcode_t) *p) - { - case jump_n: - is_a_jump_n = true; - case maybe_pop_jump: - case pop_failure_jump: - case jump: - p1 = p + 1; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - p1 += mcnt; - - if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n) - || (!is_a_jump_n - && (re_opcode_t) *p1 == on_failure_jump)) - goto fail; - break; - default: - /* do nothing */ ; - } - } - - if (d >= string1 && d <= end1) - dend = end_match_1; - } - else - break; /* Matching at this starting point really fails. */ - } /* for (;;) */ - - if (best_regs_set) - goto restore_best_regs; - - FREE_VARIABLES (); - - return -1; /* Failure to match. */ -} /* re_match_2 */ - -/* Subroutine definitions for re_match_2. */ - - -/* We are passed P pointing to a register number after a start_memory. - - Return true if the pattern up to the corresponding stop_memory can - match the empty string, and false otherwise. - - If we find the matching stop_memory, sets P to point to one past its number. - Otherwise, sets P to an undefined byte less than or equal to END. - - We don't handle duplicates properly (yet). */ - -static boolean -group_match_null_string_p (p, end, reg_info) - unsigned char **p, *end; - register_info_type *reg_info; -{ - int mcnt; - /* Point to after the args to the start_memory. */ - unsigned char *p1 = *p + 2; - - while (p1 < end) - { - /* Skip over opcodes that can match nothing, and return true or - false, as appropriate, when we get to one that can't, or to the - matching stop_memory. */ - - switch ((re_opcode_t) *p1) - { - /* Could be either a loop or a series of alternatives. */ - case on_failure_jump: - p1++; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - - /* If the next operation is not a jump backwards in the - pattern. */ - - if (mcnt >= 0) - { - /* Go through the on_failure_jumps of the alternatives, - seeing if any of the alternatives cannot match nothing. - The last alternative starts with only a jump, - whereas the rest start with on_failure_jump and end - with a jump, e.g., here is the pattern for `a|b|c': - - /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6 - /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3 - /exactn/1/c - - So, we have to first go through the first (n-1) - alternatives and then deal with the last one separately. */ - - - /* Deal with the first (n-1) alternatives, which start - with an on_failure_jump (see above) that jumps to right - past a jump_past_alt. */ - - while ((re_opcode_t) p1[mcnt-3] == jump_past_alt) - { - /* `mcnt' holds how many bytes long the alternative - is, including the ending `jump_past_alt' and - its number. */ - - if (!alt_match_null_string_p (p1, p1 + mcnt - 3, - reg_info)) - return false; - - /* Move to right after this alternative, including the - jump_past_alt. */ - p1 += mcnt; - - /* Break if it's the beginning of an n-th alternative - that doesn't begin with an on_failure_jump. */ - if ((re_opcode_t) *p1 != on_failure_jump) - break; - - /* Still have to check that it's not an n-th - alternative that starts with an on_failure_jump. */ - p1++; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - if ((re_opcode_t) p1[mcnt-3] != jump_past_alt) - { - /* Get to the beginning of the n-th alternative. */ - p1 -= 3; - break; - } - } - - /* Deal with the last alternative: go back and get number - of the `jump_past_alt' just before it. `mcnt' contains - the length of the alternative. */ - EXTRACT_NUMBER (mcnt, p1 - 2); - - if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info)) - return false; - - p1 += mcnt; /* Get past the n-th alternative. */ - } /* if mcnt > 0 */ - break; - - - case stop_memory: - assert (p1[1] == **p); - *p = p1 + 2; - return true; - - - default: - if (!common_op_match_null_string_p (&p1, end, reg_info)) - return false; - } - } /* while p1 < end */ - - return false; -} /* group_match_null_string_p */ - - -/* Similar to group_match_null_string_p, but doesn't deal with alternatives: - It expects P to be the first byte of a single alternative and END one - byte past the last. The alternative can contain groups. */ - -static boolean -alt_match_null_string_p (p, end, reg_info) - unsigned char *p, *end; - register_info_type *reg_info; -{ - int mcnt; - unsigned char *p1 = p; - - while (p1 < end) - { - /* Skip over opcodes that can match nothing, and break when we get - to one that can't. */ - - switch ((re_opcode_t) *p1) - { - /* It's a loop. */ - case on_failure_jump: - p1++; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - p1 += mcnt; - break; - - default: - if (!common_op_match_null_string_p (&p1, end, reg_info)) - return false; - } - } /* while p1 < end */ - - return true; -} /* alt_match_null_string_p */ - - -/* Deals with the ops common to group_match_null_string_p and - alt_match_null_string_p. - - Sets P to one after the op and its arguments, if any. */ - -static boolean -common_op_match_null_string_p (p, end, reg_info) - unsigned char **p, *end; - register_info_type *reg_info; -{ - int mcnt; - boolean ret; - int reg_no; - unsigned char *p1 = *p; - - switch ((re_opcode_t) *p1++) - { - case no_op: - case begline: - case endline: - case begbuf: - case endbuf: - case wordbeg: - case wordend: - case wordbound: - case notwordbound: -#ifdef emacs - case before_dot: - case at_dot: - case after_dot: -#endif - break; - - case start_memory: - reg_no = *p1; - assert (reg_no > 0 && reg_no <= MAX_REGNUM); - ret = group_match_null_string_p (&p1, end, reg_info); - - /* Have to set this here in case we're checking a group which - contains a group and a back reference to it. */ - - if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) - REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret; - - if (!ret) - return false; - break; - - /* If this is an optimized succeed_n for zero times, make the jump. */ - case jump: - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - if (mcnt >= 0) - p1 += mcnt; - else - return false; - break; - - case succeed_n: - /* Get to the number of times to succeed. */ - p1 += 2; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - - if (mcnt == 0) - { - p1 -= 4; - EXTRACT_NUMBER_AND_INCR (mcnt, p1); - p1 += mcnt; - } - else - return false; - break; - - case duplicate: - if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) - return false; - break; - - case set_number_at: - p1 += 4; - - default: - /* All other opcodes mean we cannot match the empty string. */ - return false; - } - - *p = p1; - return true; -} /* common_op_match_null_string_p */ - - -/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN - bytes; nonzero otherwise. */ - -static int -bcmp_translate (s1, s2, len, translate) - unsigned char *s1, *s2; - register int len; - char *translate; -{ - register unsigned char *p1 = s1, *p2 = s2; - while (len) - { - if (translate[*p1++] != translate[*p2++]) return 1; - len--; - } - return 0; -} - -/* Entry points for GNU code. */ - -/* re_compile_pattern is the GNU regular expression compiler: it - compiles PATTERN (of length SIZE) and puts the result in BUFP. - Returns 0 if the pattern was valid, otherwise an error string. - - Assumes the `allocated' (and perhaps `buffer') and `translate' fields - are set in BUFP on entry. - - We call regex_compile to do the actual compilation. */ - -const char * -re_compile_pattern (pattern, length, bufp) - const char *pattern; - int length; - struct re_pattern_buffer *bufp; -{ - reg_errcode_t ret; - - /* GNU code is written to assume at least RE_NREGS registers will be set - (and at least one extra will be -1). */ - bufp->regs_allocated = REGS_UNALLOCATED; - - /* And GNU code determines whether or not to get register information - by passing null for the REGS argument to re_match, etc., not by - setting no_sub. */ - bufp->no_sub = 0; - - /* Match anchors at newline. */ - bufp->newline_anchor = 1; - - ret = regex_compile (pattern, length, re_syntax_options, bufp); - - return re_error_msg[(int) ret]; -} - -/* Entry points compatible with 4.2 BSD regex library. We don't define - them if this is an Emacs or POSIX compilation. */ - -#if !defined (emacs) && !defined (_POSIX_SOURCE) - -/* BSD has one and only one pattern buffer. */ -static struct re_pattern_buffer re_comp_buf; - -char * -re_comp (s) - const char *s; -{ - reg_errcode_t ret; - - if (!s) - { - if (!re_comp_buf.buffer) - return "No previous regular expression"; - return 0; - } - - if (!re_comp_buf.buffer) - { - re_comp_buf.buffer = (unsigned char *) malloc (200); - if (re_comp_buf.buffer == NULL) - return "Memory exhausted"; - re_comp_buf.allocated = 200; - - re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH); - if (re_comp_buf.fastmap == NULL) - return "Memory exhausted"; - } - - /* Since `re_exec' always passes NULL for the `regs' argument, we - don't need to initialize the pattern buffer fields which affect it. */ - - /* Match anchors at newlines. */ - re_comp_buf.newline_anchor = 1; - - ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf); - - /* Yes, we're discarding `const' here. */ - return (char *) re_error_msg[(int) ret]; -} - - -int -re_exec (s) - const char *s; -{ - const int len = strlen (s); - return - 0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0); -} -#endif /* not emacs and not _POSIX_SOURCE */ - -/* POSIX.2 functions. Don't define these for Emacs. */ - -#ifndef emacs - -/* regcomp takes a regular expression as a string and compiles it. - - PREG is a regex_t *. We do not expect any fields to be initialized, - since POSIX says we shouldn't. Thus, we set - - `buffer' to the compiled pattern; - `used' to the length of the compiled pattern; - `syntax' to RE_SYNTAX_POSIX_EXTENDED if the - REG_EXTENDED bit in CFLAGS is set; otherwise, to - RE_SYNTAX_POSIX_BASIC; - `newline_anchor' to REG_NEWLINE being set in CFLAGS; - `fastmap' and `fastmap_accurate' to zero; - `re_nsub' to the number of subexpressions in PATTERN. - - PATTERN is the address of the pattern string. - - CFLAGS is a series of bits which affect compilation. - - If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we - use POSIX basic syntax. - - If REG_NEWLINE is set, then . and [^...] don't match newline. - Also, regexec will try a match beginning after every newline. - - If REG_ICASE is set, then we considers upper- and lowercase - versions of letters to be equivalent when matching. - - If REG_NOSUB is set, then when PREG is passed to regexec, that - routine will report only success or failure, and nothing about the - registers. - - It returns 0 if it succeeds, nonzero if it doesn't. (See regex.h for - the return codes and their meanings.) */ - -int -regcomp (preg, pattern, cflags) - regex_t *preg; - const char *pattern; - int cflags; -{ - reg_errcode_t ret; - unsigned syntax - = (cflags & REG_EXTENDED) ? - RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC; - - /* regex_compile will allocate the space for the compiled pattern. */ - preg->buffer = 0; - preg->allocated = 0; - - /* Don't bother to use a fastmap when searching. This simplifies the - REG_NEWLINE case: if we used a fastmap, we'd have to put all the - characters after newlines into the fastmap. This way, we just try - every character. */ - preg->fastmap = 0; - - if (cflags & REG_ICASE) - { - unsigned i; - - preg->translate = (char *) malloc (CHAR_SET_SIZE); - if (preg->translate == NULL) - return (int) REG_ESPACE; - - /* Map uppercase characters to corresponding lowercase ones. */ - for (i = 0; i < CHAR_SET_SIZE; i++) - preg->translate[i] = ISUPPER (i) ? tolower (i) : i; - } - else - preg->translate = NULL; - - /* If REG_NEWLINE is set, newlines are treated differently. */ - if (cflags & REG_NEWLINE) - { /* REG_NEWLINE implies neither . nor [^...] match newline. */ - syntax &= ~RE_DOT_NEWLINE; - syntax |= RE_HAT_LISTS_NOT_NEWLINE; - /* It also changes the matching behavior. */ - preg->newline_anchor = 1; - } - else - preg->newline_anchor = 0; - - preg->no_sub = !!(cflags & REG_NOSUB); - - /* POSIX says a null character in the pattern terminates it, so we - can use strlen here in compiling the pattern. */ - ret = regex_compile (pattern, strlen (pattern), syntax, preg); - - /* POSIX doesn't distinguish between an unmatched open-group and an - unmatched close-group: both are REG_EPAREN. */ - if (ret == REG_ERPAREN) ret = REG_EPAREN; - - return (int) ret; -} - - -/* regexec searches for a given pattern, specified by PREG, in the - string STRING. - - If NMATCH is zero or REG_NOSUB was set in the cflags argument to - `regcomp', we ignore PMATCH. Otherwise, we assume PMATCH has at - least NMATCH elements, and we set them to the offsets of the - corresponding matched substrings. - - EFLAGS specifies `execution flags' which affect matching: if - REG_NOTBOL is set, then ^ does not match at the beginning of the - string; if REG_NOTEOL is set, then $ does not match at the end. - - We return 0 if we find a match and REG_NOMATCH if not. */ - -int -regexec (preg, string, nmatch, pmatch, eflags) - const regex_t *preg; - const char *string; - size_t nmatch; - regmatch_t pmatch[]; - int eflags; -{ - int ret; - struct re_registers regs; - regex_t private_preg; - int len = strlen (string); - boolean want_reg_info = !preg->no_sub && nmatch > 0; - - private_preg = *preg; - - private_preg.not_bol = !!(eflags & REG_NOTBOL); - private_preg.not_eol = !!(eflags & REG_NOTEOL); - - /* The user has told us exactly how many registers to return - information about, via `nmatch'. We have to pass that on to the - matching routines. */ - private_preg.regs_allocated = REGS_FIXED; - - if (want_reg_info) - { - regs.num_regs = nmatch; - regs.start = TALLOC (nmatch, regoff_t); - regs.end = TALLOC (nmatch, regoff_t); - if (regs.start == NULL || regs.end == NULL) - return (int) REG_NOMATCH; - } - - /* Perform the searching operation. */ - ret = re_search (&private_preg, string, len, - /* start: */ 0, /* range: */ len, - want_reg_info ? ®s : (struct re_registers *) 0); - - /* Copy the register information to the POSIX structure. */ - if (want_reg_info) - { - if (ret >= 0) - { - unsigned r; - - for (r = 0; r < nmatch; r++) - { - pmatch[r].rm_so = regs.start[r]; - pmatch[r].rm_eo = regs.end[r]; - } - } - - /* If we needed the temporary register info, free the space now. */ - free (regs.start); - free (regs.end); - } - - /* We want zero return to mean success, unlike `re_search'. */ - return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH; -} - - -/* Returns a message corresponding to an error code, ERRCODE, returned - from either regcomp or regexec. We don't use PREG here. */ - -size_t -regerror (errcode, preg, errbuf, errbuf_size) - int errcode; - const regex_t *preg; - char *errbuf; - size_t errbuf_size; -{ - const char *msg; - size_t msg_size; - - if (errcode < 0 - || errcode >= (sizeof (re_error_msg) / sizeof (re_error_msg[0]))) - /* Only error codes returned by the rest of the code should be passed - to this routine. If we are given anything else, or if other regex - code generates an invalid error code, then the program has a bug. - Dump core so we can fix it. */ - abort (); - - msg = re_error_msg[errcode]; - - /* POSIX doesn't require that we do anything in this case, but why - not be nice. */ - if (! msg) - msg = "Success"; - - msg_size = strlen (msg) + 1; /* Includes the null. */ - - if (errbuf_size != 0) - { - if (msg_size > errbuf_size) - { - strncpy (errbuf, msg, errbuf_size - 1); - errbuf[errbuf_size - 1] = 0; - } - else - strcpy (errbuf, msg); - } - - return msg_size; -} - - -/* Free dynamically allocated space used by PREG. */ - -void -regfree (preg) - regex_t *preg; -{ - if (preg->buffer != NULL) - free (preg->buffer); - preg->buffer = NULL; - - preg->allocated = 0; - preg->used = 0; - - if (preg->fastmap != NULL) - free (preg->fastmap); - preg->fastmap = NULL; - preg->fastmap_accurate = 0; - - if (preg->translate != NULL) - free (preg->translate); - preg->translate = NULL; -} - -#endif /* not emacs */ - -/* -Local variables: -make-backup-files: t -version-control: t -trim-versions-without-asking: nil -End: -*/ diff --git a/gnu/usr.bin/cvs/lib/y.tab.h b/gnu/usr.bin/cvs/lib/y.tab.h deleted file mode 100644 index 4a541d2c97f7..000000000000 --- a/gnu/usr.bin/cvs/lib/y.tab.h +++ /dev/null @@ -1,18 +0,0 @@ -#define tAGO 257 -#define tDAY 258 -#define tDAYZONE 259 -#define tID 260 -#define tMERIDIAN 261 -#define tMINUTE_UNIT 262 -#define tMONTH 263 -#define tMONTH_UNIT 264 -#define tSEC_UNIT 265 -#define tSNUMBER 266 -#define tUNUMBER 267 -#define tZONE 268 -#define tDST 269 -typedef union { - time_t Number; - enum _MERIDIAN Meridian; -} YYSTYPE; -extern YYSTYPE yylval; diff --git a/gnu/usr.bin/cvs/mkmodules/xxx b/gnu/usr.bin/cvs/mkmodules/xxx deleted file mode 100644 index f0dd87dee7e7..000000000000 --- a/gnu/usr.bin/cvs/mkmodules/xxx +++ /dev/null @@ -1,5320 +0,0 @@ -# 1 "/usr/src/gnu/cvs/mkmodules/mkmodules.c" - - - - - - - - - - - - - -# 1 "/usr/include/sys/syslimits.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 14 "/usr/src/gnu/cvs/mkmodules/mkmodules.c" 2 - -# 1 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 1 - - -# 1 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 1 - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/types.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -typedef unsigned char u_char; -typedef unsigned short u_short; -typedef unsigned int u_int; -typedef unsigned long u_long; -typedef unsigned short ushort; - -typedef char * caddr_t; -typedef long daddr_t; -typedef short dev_t; -typedef u_long ino_t; -typedef long off_t; -typedef u_short nlink_t; -typedef long swblk_t; -typedef long segsz_t; -typedef u_short uid_t; -typedef u_short gid_t; -typedef short pid_t; -typedef u_short mode_t; -typedef u_long fixpt_t; - - -typedef struct _uquad { u_long val[2]; } u_quad; -typedef struct _quad { long val[2]; } quad; -typedef long * qaddr_t; - - - - - - -# 1 "/usr/include/machine/ansi.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 69 "/usr/include/sys/types.h" 2 - - -# 1 "/usr/include/machine/types.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct _physadr { - int r[1]; -} *physadr; - -typedef struct label_t { - int val[6]; -} label_t; - -typedef u_long vm_offset_t; -typedef u_long vm_size_t; - - -# 71 "/usr/include/sys/types.h" 2 - - - - -typedef unsigned long clock_t; - - - - -typedef unsigned int size_t; - - - - -typedef long time_t; - - - - - - - - - - - - - - - - -typedef long fd_mask; - - - - - - -typedef struct fd_set { - fd_mask fds_bits[(((256 )+(( (sizeof(fd_mask) * 8 ) )-1))/( (sizeof(fd_mask) * 8 ) )) ]; -} fd_set; - - - - - - -# 132 "/usr/include/sys/types.h" - - - - -# 20 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 2 - -# 1 "/usr/include/sys/stat.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -struct stat -{ - dev_t st_dev; - ino_t st_ino; - mode_t st_mode; - nlink_t st_nlink; - uid_t st_uid; - gid_t st_gid; - dev_t st_rdev; - off_t st_size; - time_t st_atime; - long st_spare1; - time_t st_mtime; - long st_spare2; - time_t st_ctime; - long st_spare3; - long st_blksize; - long st_blocks; - u_long st_flags; - u_long st_gen; -}; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/cdefs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 76 "/usr/include/sys/cdefs.h" - - - -# 114 "/usr/include/sys/stat.h" 2 - - - -mode_t umask (mode_t) ; -int chmod (const char *, mode_t) ; -int fstat (int, struct stat *) ; -int mkdir (const char *, mode_t) ; -int mkfifo (const char *, mode_t) ; -int stat (const char *, struct stat *) ; - -int fchmod (int, mode_t) ; -int lstat (const char *, struct stat *) ; - - - -# 21 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -off_t lseek (); - - - - - -# 1 "/usr/include/time.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/machine/ansi.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 57 "/usr/include/machine/ansi.h" - -# 39 "/usr/include/time.h" 2 - - - - - - - - - - - - - - - - - - - - - -struct tm { - int tm_sec; - int tm_min; - int tm_hour; - int tm_mday; - int tm_mon; - int tm_year; - int tm_wday; - int tm_yday; - int tm_isdst; - long tm_gmtoff; - char *tm_zone; -}; - -# 1 "/usr/include/sys/cdefs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 78 "/usr/include/sys/cdefs.h" - -# 74 "/usr/include/time.h" 2 - - - -char *asctime (const struct tm *) ; -clock_t clock (void) ; -char *ctime (const time_t *) ; -double difftime (time_t, time_t) ; -struct tm *gmtime (const time_t *) ; -struct tm *localtime (const time_t *) ; -time_t mktime (struct tm *) ; -size_t strftime (char *, size_t, const char *, const struct tm *) ; -time_t time (time_t *) ; - - -void tzset (void) ; - - - -char *timezone (int, int) ; -void tzsetwall (void) ; - - - - -# 72 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 2 - - - -# 86 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" - -# 1 "/usr/include/sys/timeb.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -struct timeb { - time_t time; - unsigned short millitm; - short timezone; - short dstflag; -}; -# 87 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 2 - - - - - - - - - - -# 1 "/usr/include/sys/param.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/types.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 135 "/usr/include/sys/types.h" - -# 46 "/usr/include/sys/param.h" 2 - - - - - - - - - - -# 1 "/usr/include/sys/syslimits.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 56 "/usr/include/sys/param.h" 2 - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/signal.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/machine/trap.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 42 "/usr/include/sys/signal.h" 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/cdefs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 78 "/usr/include/sys/cdefs.h" - -# 90 "/usr/include/sys/signal.h" 2 - - - -typedef void (*sig_t) (int) ; - - -typedef void (*__sighandler_t) (int) ; -typedef unsigned int sigset_t; - - -int sigaddset (sigset_t *, int) ; -int sigdelset (sigset_t *, int) ; -int sigemptyset (sigset_t *) ; -int sigfillset (sigset_t *) ; -int sigismember (const sigset_t *, int) ; - - - - - - - - - - - -struct sigaction { - __sighandler_t sa_handler; - sigset_t sa_mask; - int sa_flags; -}; - - - - - - - - - - - - - - - - - - -struct sigvec { - void (*sv_handler)(); - int sv_mask; - int sv_flags; -}; - - - - - - - -struct sigaltstack { - char *ss_base; - int ss_len; - int ss_onstack; -}; - - - - -struct sigstack { - char *ss_sp; - int ss_onstack; -}; - - - - - - - - -struct sigcontext { - int sc_onstack; - int sc_mask; - int sc_sp; - int sc_fp; - int sc_ap; - int sc_pc; - int sc_ps; -}; - - - - - - - - - - - - - - -# 1 "/usr/include/sys/types.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 135 "/usr/include/sys/types.h" - -# 195 "/usr/include/sys/signal.h" 2 - - - - -__sighandler_t signal (int, __sighandler_t) ; -int raise (int) ; - -int kill (pid_t, int) ; -int sigaction (int, const struct sigaction *, struct sigaction *) ; -int sigpending (sigset_t *) ; -int sigprocmask (int, const sigset_t *, sigset_t *) ; -int sigsuspend (const sigset_t *) ; - - -int killpg (pid_t, int) ; -void psignal (unsigned, const char *) ; -int sigblock (int) ; -int siginterrupt (int, int) ; -int sigpause (int) ; -int sigreturn (struct sigcontext *) ; -int sigsetmask (int) ; -int sigstack (const struct sigstack *, struct sigstack *) ; -int sigvec (int, struct sigvec *, struct sigvec *) ; - - - - - -# 79 "/usr/include/sys/param.h" 2 - - - -# 1 "/usr/include/machine/param.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 82 "/usr/include/sys/param.h" 2 - -# 1 "/usr/include/machine/endian.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/cdefs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 78 "/usr/include/sys/cdefs.h" - -# 55 "/usr/include/machine/endian.h" 2 - - - - - - - - - -# 77 "/usr/include/machine/endian.h" - - - - - - - - - - - - - - - - - - -# 106 "/usr/include/machine/endian.h" - - - - - - - - - - - - -# 83 "/usr/include/sys/param.h" 2 - -# 1 "/usr/include/machine/limits.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 84 "/usr/include/sys/param.h" 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 97 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 2 - - - - - - - - - - - - - - - - - - - -struct utimbuf -{ - long actime; - long modtime; -}; - -int utime (); - - -# 145 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" - -# 1 "/usr/include/strings.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/string.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/machine/ansi.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 57 "/usr/include/machine/ansi.h" - -# 38 "/usr/include/string.h" 2 - - - - - - - - - - - -# 1 "/usr/include/sys/cdefs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 78 "/usr/include/sys/cdefs.h" - -# 49 "/usr/include/string.h" 2 - - - -void *memchr (const void *, int, size_t) ; -int memcmp (const void *, const void *, size_t) ; -void *memcpy (void *, const void *, size_t) ; -void *memmove (void *, const void *, size_t) ; -void *memset (void *, int, size_t) ; -char *strcat (char *, const char *) ; -char *strchr (const char *, int) ; -int strcmp (const char *, const char *) ; -int strcoll (const char *, const char *) ; -char *strcpy (char *, const char *) ; -size_t strcspn (const char *, const char *) ; -char *strerror (int) ; -size_t strlen (const char *) ; -char *strncat (char *, const char *, size_t) ; -int strncmp (const char *, const char *, size_t) ; -char *strncpy (char *, const char *, size_t) ; -char *strpbrk (const char *, const char *) ; -char *strrchr (const char *, int) ; -size_t strspn (const char *, const char *) ; -char *strstr (const char *, const char *) ; -char *strtok (char *, const char *) ; -size_t strxfrm (char *, const char *, size_t) ; - - - -int bcmp (const void *, const void *, size_t) ; -void bcopy (const void *, void *, size_t) ; -void bzero (void *, size_t) ; -int ffs (int) ; -char *index (const char *, int) ; -void *memccpy (void *, const void *, int, size_t) ; -char *rindex (const char *, int) ; -int strcasecmp (const char *, const char *) ; -char *strdup (const char *) ; -void strmode (int, char *) ; -int strncasecmp (const char *, const char *, size_t) ; -char *strsep (char **, const char *) ; -void swab (const void *, void *, size_t) ; - - - - -# 36 "/usr/include/strings.h" 2 - -# 146 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 2 - - - -# 1 "/usr/include/errno.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -extern int errno; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 149 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 2 - - - - -char *getenv (); -char *malloc (); -char *realloc (); -char *calloc (); -extern int errno; - - - - - - -# 173 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" - - - - - - -# 1 "/usr/include/sys/file.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/fcntl.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/types.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 135 "/usr/include/sys/types.h" - -# 46 "/usr/include/sys/fcntl.h" 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 99 "/usr/include/sys/fcntl.h" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -struct flock { - short l_type; - short l_whence; - off_t l_start; - off_t l_len; - pid_t l_pid; -}; - - - - - - - - - - - - -# 1 "/usr/include/sys/cdefs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 78 "/usr/include/sys/cdefs.h" - -# 169 "/usr/include/sys/fcntl.h" 2 - - - -int open (const char *, int, ...) ; -int creat (const char *, mode_t) ; -int fcntl (int, int, ...) ; - -int flock (int, int) ; - - - - - -# 36 "/usr/include/sys/file.h" 2 - -# 1 "/usr/include/sys/unistd.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 37 "/usr/include/sys/file.h" 2 - - -# 73 "/usr/include/sys/file.h" - -# 179 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 2 - -char *getwd (); - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/dir.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/dirent.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -struct dirent { - u_long d_fileno; - u_short d_reclen; - u_short d_namlen; - - - - - char d_name[255 + 1]; - -}; - - - - - - - - - - - -typedef struct _dirdesc { - int dd_fd; - long dd_loc; - long dd_size; - char *dd_buf; - int dd_len; - long dd_seek; -} DIR; - - - - - - - - - - - -# 1 "/usr/include/sys/cdefs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 78 "/usr/include/sys/cdefs.h" - -# 88 "/usr/include/dirent.h" 2 - - - -DIR *opendir (const char *) ; -struct dirent *readdir (DIR *) ; -void rewinddir (DIR *) ; -int closedir (DIR *) ; - -long telldir (const DIR *) ; -void seekdir (DIR *, long) ; -int scandir (const char *, struct dirent ***, - int (*)(struct dirent *), int (*)(const void *, const void *)) ; -int alphasort (const void *, const void *) ; -int getdirentries (int, char *, int, long *) ; - - - - - - -# 44 "/usr/include/sys/dir.h" 2 - - - - - - - - - - - - - - - - - - -# 208 "/usr/src/gnu/cvs/mkmodules/../lib/system.h" 2 - - - - - - - - - - - - - - - - -# 3 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/include/stdio.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/cdefs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 78 "/usr/include/sys/cdefs.h" - -# 42 "/usr/include/stdio.h" 2 - - -# 1 "/usr/include/machine/ansi.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 57 "/usr/include/machine/ansi.h" - -# 44 "/usr/include/stdio.h" 2 - - - - - - - - - - -typedef long fpos_t; - - - - - - - - - - -struct __sbuf { - unsigned char *_base; - int _size; -}; - - - - - - - - - - - - - - - - - - - - - - - - - -typedef struct __sFILE { - unsigned char *_p; - int _r; - int _w; - short _flags; - short _file; - struct __sbuf _bf; - int _lbfsize; - - - void *_cookie; - int (*_close) (void *) ; - int (*_read) (void *, char *, int) ; - fpos_t (*_seek) (void *, fpos_t, int) ; - int (*_write) (void *, const char *, int) ; - - - struct __sbuf _ub; - unsigned char *_up; - int _ur; - - - unsigned char _ubuf[3]; - unsigned char _nbuf[1]; - - - struct __sbuf _lb; - - - int _blksize; - int _offset; -} FILE; - - -extern FILE __sF[]; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void clearerr (FILE *) ; -int fclose (FILE *) ; -int feof (FILE *) ; -int ferror (FILE *) ; -int fflush (FILE *) ; -int fgetc (FILE *) ; -int fgetpos (FILE *, fpos_t *) ; -char *fgets (char *, size_t, FILE *) ; -FILE *fopen (const char *, const char *) ; -int fprintf (FILE *, const char *, ...) ; -int fputc (int, FILE *) ; -int fputs (const char *, FILE *) ; -int fread (void *, size_t, size_t, FILE *) ; -FILE *freopen (const char *, const char *, FILE *) ; -int fscanf (FILE *, const char *, ...) ; -int fseek (FILE *, long, int) ; -int fsetpos (FILE *, const fpos_t *) ; -long ftell (const FILE *) ; -int fwrite (const void *, size_t, size_t, FILE *) ; -int getc (FILE *) ; -int getchar (void) ; -char *gets (char *) ; - -extern int sys_nerr; -extern char *sys_errlist[]; - -void perror (const char *) ; -int printf (const char *, ...) ; -int putc (int, FILE *) ; -int putchar (int) ; -int puts (const char *) ; -int remove (const char *) ; -int rename (const char *, const char *) ; -void rewind (FILE *) ; -int scanf (const char *, ...) ; -void setbuf (FILE *, char *) ; -int setvbuf (FILE *, char *, int, size_t) ; -int sprintf (char *, const char *, ...) ; -int sscanf (char *, const char *, ...) ; -FILE *tmpfile (void) ; -char *tmpnam (char *) ; -int ungetc (int, FILE *) ; -int vfprintf (FILE *, const char *, char * ) ; -int vprintf (const char *, char * ) ; -int vsprintf (char *, const char *, char * ) ; - - - - - - - - - - -char *ctermid (char *) ; -FILE *fdopen (int, const char *) ; -int fileno (FILE *) ; - - - - - - - - -char *fgetline (FILE *, size_t *) ; -int fpurge (FILE *) ; -int getw (FILE *) ; -int pclose (FILE *) ; -FILE *popen (const char *, const char *) ; -int putw (int, FILE *) ; -void setbuffer (FILE *, char *, int) ; -int setlinebuf (FILE *) ; -char *tempnam (const char *, const char *) ; -int snprintf (char *, size_t, const char *, ...) ; -int vsnprintf (char *, size_t, const char *, char * ) ; -int vscanf (const char *, char * ) ; -int vsscanf (const char *, const char *, char * ) ; - - - - - - - - - - - - - -FILE *funopen (const void *, - int (*)(void *, char *, int), - int (*)(void *, const char *, int), - fpos_t (*)(void *, fpos_t, int), - int (*)(void *)) ; - - - - - - - - - -int __srget (FILE *) ; -int __svfscanf (FILE *, const char *, char * ) ; -int __swbuf (int, FILE *) ; - - - - - - - - -static inline int __sputc(int _c, FILE *_p) { - if (--_p->_w >= 0 || (_p->_w >= _p->_lbfsize && (char)_c != '\n')) - return (*_p->_p++ = _c); - else - return (__swbuf(_c, _p)); -} -# 331 "/usr/include/stdio.h" - - - - - - - - - - - - - - - - - - - - - - - -# 4 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/include/ctype.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -extern char _ctype_[]; - - - - - - - - - - - - - - - - - - -# 5 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/include/pwd.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 1 "/usr/include/sys/types.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 135 "/usr/include/sys/types.h" - -# 39 "/usr/include/pwd.h" 2 - - - - - - - - - - - - - - - - - - - - -struct passwd { - char *pw_name; - char *pw_passwd; - int pw_uid; - int pw_gid; - time_t pw_change; - char *pw_class; - char *pw_gecos; - char *pw_dir; - char *pw_shell; - time_t pw_expire; -}; - -# 1 "/usr/include/sys/cdefs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 78 "/usr/include/sys/cdefs.h" - -# 72 "/usr/include/pwd.h" 2 - - - -struct passwd *getpwuid (uid_t) ; -struct passwd *getpwnam (const char *) ; - -struct passwd *getpwent (void) ; -int setpassent (int) ; -int setpwent (void) ; -void endpwent (void) ; - - - - -# 6 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/include/signal.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 222 "/usr/include/signal.h" - -# 7 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/src/gnu/cvs/mkmodules/../cvs/hash.h" 1 - - - - - - - - - - - - - - - - - - -enum ntype -{ - UNKNOWN, HEADER, ENTRIES, FILES, LIST, RCSNODE, - RCSVERS, DIRS, UPDATE, LOCK, NDBMNODE -}; -typedef enum ntype Ntype; - -struct node -{ - Ntype type; - struct node *next; - struct node *prev; - struct node *hashnext; - struct node *hashprev; - char *key; - char *data; - void (*delproc) (); -}; -typedef struct node Node; - -struct list -{ - Node *list; - Node *hasharray[151 ]; - struct list *next; -}; -typedef struct list List; - -struct entnode -{ - char *version; - char *timestamp; - char *options; - char *tag; - char *date; -}; -typedef struct entnode Entnode; - - -List *getlist (void); -Node *findnode (List * list, char *key); -Node *getnode (void); -int addnode (List * list, Node * p); -int walklist (List * list, int (*proc) ()); -void dellist (List ** listp); -void delnode (Node * p); -void freenode (Node * p); -void sortlist (List * list, int (*comp) ()); -# 77 "/usr/src/gnu/cvs/mkmodules/../cvs/hash.h" - -# 8 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/src/gnu/cvs/mkmodules/../cvs/rcs.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -struct rcsnode -{ - int refcount; - int flags; - char *path; - char *head; - char *branch; - List *symbols; - List *versions; - List *dates; -}; -typedef struct rcsnode RCSNode; - -struct rcsversnode -{ - char *version; - char *date; - char *next; - List *branches; -}; -typedef struct rcsversnode RCSVers; - - - - - - - - - - - - - - -List *RCS_parsefiles (List * files, char *xrepos); -RCSNode *RCS_parse (char *file, char *repos); -RCSNode *RCS_parsercsfile (char *rcsfile); -char *RCS_check_kflag (char *arg); -char *RCS_getdate (RCSNode * rcs, char *date, int force_tag_match); -char *RCS_gettag (RCSNode * rcs, char *tag, int force_tag_match); -char *RCS_getversion (RCSNode * rcs, char *tag, char *date, - int force_tag_match); -char *RCS_magicrev (RCSNode *rcs, char *rev); -int RCS_isbranch (char *file, char *rev, List *srcfiles); -char *RCS_whatbranch (char *file, char *tag, List *srcfiles); -char *RCS_head (RCSNode * rcs); -int RCS_datecmp (char *date1, char *date2); -time_t RCS_getrevtime (RCSNode * rcs, char *rev, char *date, int fudge); -void RCS_check_tag (char *tag); -void freercsnode (RCSNode ** rnodep); -# 102 "/usr/src/gnu/cvs/mkmodules/../cvs/rcs.h" - -# 9 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/src/gnu/cvs/mkmodules/../lib/regex.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -typedef unsigned reg_syntax_t; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -extern reg_syntax_t obscure_syntax; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -typedef enum -{ - REG_NOERROR = 0, - REG_NOMATCH, - - - - REG_BADPAT, - REG_ECOLLATE, - REG_ECTYPE, - REG_EESCAPE, - REG_ESUBREG, - REG_EBRACK, - REG_EPAREN, - REG_EBRACE, - REG_BADBR, - REG_ERANGE, - REG_ESPACE, - REG_BADRPT, - - - REG_EEND, - REG_ESIZE, - REG_ERPAREN -} reg_errcode_t; - - - - - - - - - - -struct re_pattern_buffer -{ - - - - - unsigned char *buffer; - - - unsigned long allocated; - - - unsigned long used; - - - reg_syntax_t syntax; - - - - - char *fastmap; - - - - - - char *translate; - - - size_t re_nsub; - - - - - - - unsigned can_be_null : 2; - - - - unsigned fastmap_accurate : 1; - - - - unsigned no_sub : 1; - - - - unsigned not_bol : 1; - - - unsigned not_eol : 1; - - - unsigned newline_anchor : 1; - - - - - unsigned caller_allocated_regs : 1; - -}; - -typedef struct re_pattern_buffer regex_t; - - - - - - - - - - - -typedef int regoff_t; - - - - -struct re_registers -{ - unsigned num_regs; - regoff_t *start; - regoff_t *end; -}; - - - - - - - - - - - - -typedef struct -{ - regoff_t rm_so; - regoff_t rm_eo; -} regmatch_t; - - - - - - - - - - -extern reg_syntax_t re_set_syntax (reg_syntax_t syntax); - - - - -extern const char *re_compile_pattern (const char *pattern, int length, - struct re_pattern_buffer *buffer); - - - - - -extern int re_compile_fastmap (struct re_pattern_buffer *buffer); - - - - - - - -extern int re_search (struct re_pattern_buffer *buffer, - const char *string, int length, - int start, int range, - struct re_registers *regs); - - - - -extern int re_search_2 (struct re_pattern_buffer *buffer, - const char *string1, int length1, - const char *string2, int length2, - int start, int range, - struct re_registers *regs, - int stop); - - - - -extern int re_match (const struct re_pattern_buffer *buffer, - const char *string, int length, - int start, struct re_registers *regs); - - - -extern int re_match_2 (const struct re_pattern_buffer *buffer, - const char *string1, int length1, - const char *string2, int length2, - int start, - struct re_registers *regs, - int stop); - - - - - - - - - - - -extern int regcomp (regex_t *preg, const char *pattern, int cflags); -extern int regexec (const regex_t *preg, const char *string, size_t nmatch, - regmatch_t pmatch[], int eflags); -extern size_t regerror (int errcode, const regex_t *preg, char *errbuf, - size_t errbuf_size); -extern void regfree (regex_t *preg); - -# 468 "/usr/src/gnu/cvs/mkmodules/../lib/regex.h" - - - - - - - - - - - - -# 10 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/src/gnu/cvs/mkmodules/../lib/fnmatch.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -extern int fnmatch (const char *pattern, const char *string, int flags); - - - - - -# 11 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/src/gnu/cvs/mkmodules/../lib/getopt.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - -extern char *optarg; - - - - - - - - - - - - - -extern int optind; - - - - -extern int opterr; - - - - - - - - - - - - - - - - - - - - - -struct option -{ - char *name; - int has_arg; - int *flag; - int val; -}; - - -extern const struct option *_getopt_long_options; - - - - - - - -extern int _getopt_long_only; - - - - - -extern int option_index; - - -int gnu_getopt (int argc, char **argv, const char *shortopts); -int gnu_getopt_long (int argc, char **argv, const char *shortopts, - const struct option *longopts, int *longind); -int gnu_getopt_long_only (int argc, char **argv, const char *shortopts, - const struct option *longopts, int *longind); - - - - - -# 12 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/src/gnu/cvs/mkmodules/../lib/wait.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# 13 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - -# 1 "/usr/src/gnu/cvs/mkmodules/../cvs/config.h" 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -extern void exit (); - - - -extern char *getwd (); - - - - - - - - - - - - - - - -# 14 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - - -# 1 "/usr/src/gnu/cvs/mkmodules/../cvs/myndbm.h" 1 - - - - - - -typedef struct -{ - List *dbm_list; - Node *dbm_next; -} DBM; - -typedef struct -{ - char *dptr; - int dsize; -} datum; - - - - - - - - - - - - - -DBM *mydbm_open (char *file, int flags, int mode); -void mydbm_close (DBM * db); -datum mydbm_fetch (DBM * db, datum key); -datum mydbm_firstkey (DBM * db); -datum mydbm_nextkey (DBM * db); - - - - - - - - - -# 16 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -enum mtype -{ - CHECKOUT, TAG, PATCH -}; - - - - - - -enum classify_type -{ - T_UNKNOWN = 1, - T_CONFLICT, - T_NEEDS_MERGE, - T_MODIFIED, - T_CHECKOUT, - T_ADDED, - T_REMOVED, - T_REMOVE_ENTRY, - T_UPTODATE, - T_TITLE -}; -typedef enum classify_type Ctype; - - - - - - - - -struct vers_ts -{ - char *vn_user; - - - - - - char *vn_rcs; - - char *ts_user; - char *ts_rcs; - char *options; - - char *tag; - char *date; - Entnode *entdata; - RCSNode *srcfile; -}; -typedef struct vers_ts Vers_TS; - - - - - -struct stickydirtag -{ - int aflag; - char *tag; - char *date; - char *options; -}; - - - - - - - - - - - - - - - - -enum direnter_type -{ - R_PROCESS = 1, - R_SKIP_FILES, - R_SKIP_DIRS, - R_SKIP_ALL -}; -typedef enum direnter_type Dtype; - -extern char *program_name, *command_name; -extern char *Rcsbin, *Editor, *CVSroot; -extern char *CurDir; -extern int really_quiet, quiet; -extern int use_editor; -extern int cvswrite; - -extern int trace; -extern int noexec; -extern int logoff; - - - -int Reader_Lock (char *xrepository); -DBM *open_module (void); -FILE *Fopen (char *name, char *mode); -FILE *open_file (char *name, char *mode); -List *Find_Dirs (char *repository, int which); -List *ParseEntries (int aflag); -char *Make_Date (char *rawdate); -char *Name_Repository (char *dir, char *update_dir); -char *Short_Repository (char *repository); -char *getcaller (void); -char *time_stamp (char *file); -char *xmalloc (int bytes); -char *xrealloc (char *ptr, int bytes); -char *xstrdup (char *str); -int No_Difference (char *file, Vers_TS * vers, List * entries); -int Parse_Info (char *infofile, char *repository, int (*callproc) (), int all); -int Reader_Lock (char *xrepository); -int SIG_register (int sig, void (*fn) ()); -int Writer_Lock (List * list); -int gethostname (char *name, int namelen); -int ign_name (char *name); -int isdir (char *file); -int isfile (char *file); -int islink (char *file); -int isreadable (char *file); -int iswritable (char *file); -int link_file (char *from, char *to); -int numdots (char *s); -int run_exec (char *stin, char *stout, char *sterr, int flags); -int unlink_file (char *f); -int update (int argc, char *argv[]); -int xcmp (char *file1, char *file2); -int yesno (void); -time_t get_date (char *date, struct timeb *now); -void Create_Admin (char *dir, char *repository, char *tag, char *date); -void Lock_Cleanup (void); -void ParseTag (char **tagp, char **datep); -void Scratch_Entry (List * list, char *fname); -void WriteTag (char *dir, char *tag, char *date); -void cat_module (int status); -void check_entries (char *dir); -void close_module (DBM * db); -void copy_file (char *from, char *to); -void error (int status, int errnum, char *message,...); -void fperror (FILE * fp, int status, int errnum, char *message,...); -void free_names (int *pargc, char *argv[]); -void freevers_ts (Vers_TS ** versp); -void ign_add (char *ign, int hold); -void ign_add_file (char *file, int hold); -void ign_setup (void); -void line2argv (int *pargc, char *argv[], char *line); -void make_directories (char *name); -void make_directory (char *name); -void rename_file (char *from, char *to); -void run_arg (char *s); -void run_args (char *fmt,...); -void run_print (FILE * fp); -void run_setup (char *fmt,...); -void strip_path (char *path); -void update_delproc (Node * p); -void usage (char **cpp); -void xchmod (char *fname, int writable); -int Checkin (int type, char *file, char *repository, char *rcs, char *rev, - char *tag, char *message, List * entries); -Ctype Classify_File (char *file, char *tag, char *date, char *options, - int force_tag_match, int aflag, char *repository, - List *entries, List *srcfiles, Vers_TS **versp); -List *Find_Names (char *repository, int which, int aflag, - List ** optentries); -void Register (List * list, char *fname, char *vn, char *ts, - char *options, char *tag, char *date); -void Update_Logfile (char *repository, char *xmessage, char *xrevision, - FILE * xlogfp, List * xchanges); -Vers_TS *Version_TS (char *repository, char *options, char *tag, - char *date, char *user, int force_tag_match, - int set_time, List * entries, List * xfiles); -void do_editor (char *dir, char *message, char *repository, - List * changes); -int do_module (DBM * db, char *mname, enum mtype m_type, char *msg, - int (*callback_proc) (), char *where, int shorten, - int local_specified, int run_module_prog, char *extra_arg); -int do_recursion (int (*xfileproc) (), int (*xfilesdoneproc) (), - Dtype (*xdirentproc) (), int (*xdirleaveproc) (), - Dtype xflags, int xwhich, int xaflag, int xreadlock, - int xdosrcs); -int do_update (int argc, char *argv[], char *xoptions, char *xtag, - char *xdate, int xforce, int local, int xbuild, - int xaflag, int xprune, int xpipeout, int which, - char *xjoin_rev1, char *xjoin_rev2, char *preload_update_dir); -void history_write (int type, char *update_dir, char *revs, char *name, - char *repository); -int start_recursion (int (*fileproc) (), int (*filesdoneproc) (), - Dtype (*direntproc) (), int (*dirleaveproc) (), - int argc, char *argv[], int local, int which, - int aflag, int readlock, char *update_preload, - int dosrcs); -void SIG_beginCrSect (); -void SIG_endCrSect (); -# 438 "/usr/src/gnu/cvs/mkmodules/../cvs/cvs.h" - -# 15 "/usr/src/gnu/cvs/mkmodules/mkmodules.c" 2 - - - - - - -PATH_MAX +2 - - -static char rcsid[] = "@(#)mkmodules.c 1.39 92/03/31"; - - - - - - -char *program_name, *command_name; - -char *Rcsbin = "" ; -int noexec = 0; -int trace = 0; - - -static int checkout_file (char *file, char *temp); -static void make_tempfile (char *temp); -static void mkmodules_usage (void); -static void rename_rcsfile (char *temp, char *real); - - - - - - -# 60 "/usr/src/gnu/cvs/mkmodules/mkmodules.c" - - -int -main (argc, argv) - int argc; - char *argv[]; -{ - extern char *getenv (); - char temp[PATH_MAX +2 ]; - char *cp; - - DBM *db; - - - - - - if ((program_name = rindex (argv[0], '/')) == 0 ) - program_name = argv[0]; - else - program_name++; - - if (argc != 2) - mkmodules_usage (); - - if ((cp = getenv ("RCSBIN" )) != 0 ) - Rcsbin = cp; - - - - - - if (Rcsbin[0] != '\0') - { - int len = strlen (Rcsbin); - char *rcsbin; - - if (Rcsbin[len - 1] != '/') - { - rcsbin = Rcsbin; - Rcsbin = xmalloc (len + 2); - (void) strcpy (Rcsbin, rcsbin); - (void) strcat (Rcsbin, "/"); - } - } - - if (chdir (argv[1]) < 0) - error (1, errno, "cannot chdir to %s", argv[1]); - - - - - make_tempfile (temp); - switch (checkout_file ("modules" , temp)) - { - - case 0: - - - if ((db = mydbm_open (temp, 0x0000 , 0666)) != 0 ) - mydbm_close (db); - - - - - rename_rcsfile (temp, "modules" ); - break; - - case -1: - (void) unlink_file (temp); - exit (1); - - - default: - error (0, 0, - "'cvs checkout' is less functional without a %s file", - "modules" ); - break; - } - - (void) unlink_file (temp); - - - - - - make_tempfile (temp); - if (checkout_file ("loginfo" , temp) == 0) - rename_rcsfile (temp, "loginfo" ); - else - error (0, 0, - "no logging of 'cvs commit' messages is done without a %s file", - "loginfo" ); - (void) unlink_file (temp); - - - - - - make_tempfile (temp); - if (checkout_file ("rcsinfo" , temp) == 0) - rename_rcsfile (temp, "rcsinfo" ); - else - error (0, 0, - "a %s file can be used to configure 'cvs commit' templates", - "rcsinfo" ); - (void) unlink_file (temp); - - - - - - make_tempfile (temp); - if (checkout_file ("editinfo" , temp) == 0) - rename_rcsfile (temp, "editinfo" ); - else - error (0, 0, - "a %s file can be used to validate log messages", - "editinfo" ); - (void) unlink_file (temp); - - - - - - make_tempfile (temp); - if (checkout_file ("commitinfo" , temp) == 0) - rename_rcsfile (temp, "commitinfo" ); - else - error (0, 0, - "a %s file can be used to configure 'cvs commit' checking", - "commitinfo" ); - (void) unlink_file (temp); - return (0); -} - - - - -static void -make_tempfile (temp) - char *temp; -{ - static int seed = 0; - int fd; - - if (seed == 0) - seed = getpid (); - while (1) - { - (void) sprintf (temp, "%s%d", ".#" , seed++); - if ((fd = open (temp, 0x0200 | 0x0800 | 0x0002 , 0666)) != -1) - break; - if (errno != 17 ) - error (1, errno, "cannot create temporary file %s", temp); - } - if (close(fd) < 0) - error(1, errno, "cannot close temporary file %s", temp); -} - -static int -checkout_file (file, temp) - char *file; - char *temp; -{ - char rcs[PATH_MAX +2 ]; - int retcode = 0; - - (void) sprintf (rcs, "%s%s", file, ",v" ); - if (!isfile (rcs)) - return (1); - run_setup ("%s%s -q -p", Rcsbin, "co" ); - run_arg (rcs); - if ((retcode = run_exec ( (char *)0 , temp, (char *)0 , 0x0000 )) != 0) - { - error (0, retcode == -1 ? errno : 0, "failed to check out %s file", file); - } - return (retcode); -} - -# 369 "/usr/src/gnu/cvs/mkmodules/mkmodules.c" - - -static void -rename_rcsfile (temp, real) - char *temp; - char *real; -{ - char bak[50]; - - if (chmod (temp, 0444) < 0) - error (0, errno, "warning: cannot chmod %s", temp); - (void) sprintf (bak, "%s%s", ".#" , real); - (void) unlink_file (bak); - (void) rename (real, bak); - (void) rename (temp, real); -} - - - - -void -Lock_Cleanup () -{ -} - -static void -mkmodules_usage () -{ - (void) fprintf ((&__sF[2]) , "Usage: %s modules-directory\n", program_name); - exit (1); -} diff --git a/gnu/usr.bin/dc/dc.info b/gnu/usr.bin/dc/dc.info deleted file mode 100644 index a30fea9f5555..000000000000 --- a/gnu/usr.bin/dc/dc.info +++ /dev/null @@ -1,330 +0,0 @@ -This is Info file dc.info, produced by Makeinfo-1.52 from the input -file dc.texinfo. - - This file documents DC, an arbitrary precision calculator. - - Published by the Free Software Foundation, 675 Massachusetts Avenue, -Cambridge, MA 02139 USA - - Copyright (C) 1984 Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Foundation. - - -File: dc.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) - -* Menu: - -* Introduction:: Introduction -* Printing Commands:: Printing Commands -* Arithmetic:: Arithmetic -* Stack Control:: Stack Control -* Registers:: Registers -* Parameters:: Parameters -* Strings:: Strings -* Status Inquiry:: Status Inquiry -* Notes:: Notes - - -File: dc.info, Node: Introduction, Next: Printing Commands, Prev: Top, Up: Top - -Introduction -************ - - DC is a reverse-polish desk calculator which supports unlimited -precision arithmetic. It also allows you to define and call macros. -Normally DC reads from the standard input; if any command arguments are -given to it, they are filenames, and DC reads and executes the contents -of the files before reading from standard input. All output is to -standard output. - - To exit, use `q'. `C-c' does not exit; it is used to abort macros -that are looping, etc. (Currently this is not true; `C-c' does exit.) - - A reverse-polish calculator stores numbers on a stack. Entering a -number pushes it on the stack. Arithmetic operations pop arguments off -the stack and push the results. - - To enter a number in DC, type the digits, with an optional decimal -point. Exponential notation is not supported. To enter a negative -number, begin the number with `_'. `-' cannot be used for this, as it -is a binary operator for subtraction instead. To enter two numbers in -succession, separate them with spaces or newlines. These have no -meaning as commands. - - -File: dc.info, Node: Printing Commands, Next: Arithmetic, Prev: Introduction, Up: Top - -Printing Commands -***************** - -`p' - Prints the value on the top of the stack, without altering the - stack. A newline is printed after the value. - -`P' - Prints the value on the top of the stack, popping it off, and does - not print a newline after. - -`f' - Prints the entire contents of the stack and the contents of all of - the registers, without altering anything. This is a good command - to use if you are lost or want to figure out what the effect of - some command has been. - - -File: dc.info, Node: Arithmetic, Next: Stack Control, Prev: Printing Commands, Up: Top - -Arithmetic -********** - -`+' - Pops two values off the stack, adds them, and pushes the result. - The precision of the result is determined only by the values of - the arguments, and is enough to be exact. - -`-' - Pops two values, subtracts the first one popped from the second - one popped, and pushes the result. - -`*' - Pops two values, multiplies them, and pushes the result. The - number of fraction digits in the result is controlled by the - current precision flag (see below) and does not depend on the - values being multiplied. - -`/' - Pops two values, divides the second one popped from the first one - popped, and pushes the result. The number of fraction digits is - specified by the precision flag. - -`%' - Pops two values, computes the remainder of the division that the - `/' command would do, and pushes that. The division is done with - as many fraction digits as the precision flag specifies, and the - remainder is also computed with that many fraction digits. - -`^' - Pops two values and exponentiates, using the first value popped as - the exponent and the second popped as the base. The fraction part - of the exponent is ignored. The precision flag specifies the - number of fraction digits in the result. - -`v' - Pops one value, computes its square root, and pushes that. The - precision flag specifies the number of fraction digits in the - result. - - Most arithmetic operations are affected by the "precision flag", -which you can set with the `k' command. The default precision value is -zero, which means that all arithmetic except for addition and -subtraction produces integer results. - - The remainder operation (`%') requires some explanation: applied to -arguments `a' and `b' it produces `a - (b * (a / b))', where `a / b' is -computed in the current precision. - - -File: dc.info, Node: Stack Control, Next: Registers, Prev: Arithmetic, Up: Top - -Stack Control -************* - -`c' - Clears the stack, rendering it empty. - -`d' - Duplicates the value on the top of the stack, pushing another copy - of it. Thus, `4d*p' computes 4 squared and prints it. - - -File: dc.info, Node: Registers, Next: Parameters, Prev: Stack Control, Up: Top - -Registers -********* - - DC provides 128 memory registers, each named by a single ASCII -character. You can store a number in a register and retrieve it later. - -`sR' - Pop the value off the top of the stack and store it into register - R. - -`lR' - Copy the value in register R, and push it onto the stack. This - does not alter the contents of R. - - Each register also contains its own stack. The current register - value is the top of the register's stack. - -`SR' - Pop the value off the top of the (main) stack and push it onto the - stack of register R. The previous value of the register becomes - inaccessible. - -`LR' - Pop the value off the top of register R's stack and push it onto - the main stack. The previous value in register R's stack, if any, - is now accessible via the `lR' command. - - The `f' command prints a list of all registers that have contents -stored in them, together with their contents. Only the current -contents of each register (the top of its stack) is printed. - - -File: dc.info, Node: Parameters, Next: Strings, Prev: Registers, Up: Top - -Parameters -********** - - DC has three parameters that control its operation: the precision, -the input radix, and the output radix. The precision specifies the -number of fraction digits to keep in the result of most arithmetic -operations. The input radix controls the interpretation of numbers -typed in; *all* numbers typed in use this radix. The output radix is -used for printing numbers. - - The input and output radices are separate parameters; you can make -them unequal, which can be useful or confusing. Each radix must be -between 2 and 36 inclusive. The precision must be zero or greater. -The precision is always measured in decimal digits, regardless of the -current input or output radix. - -`i' - Pops the value off the top of the stack and uses it to set the - input radix. - -`o' -`k' - Similarly set the output radix and the precision. - -`I' - Pushes the current input radix on the stack. - -`O' -`K' - Similarly push the current output radix and the current precision. - - -File: dc.info, Node: Strings, Next: Status Inquiry, Prev: Parameters, Up: Top - -Strings -******* - - DC can operate on strings as well as on numbers. The only things you -can do with strings are print them and execute them as macros (which -means that the contents of the string are processed as DC commands). -Both registers and the stack can hold strings, and DC always knows -whether any given object is a string or a number. Some commands such as -arithmetic operations demand numbers as arguments and print errors if -given strings. Other commands can accept either a number or a string; -for example, the `p' command can accept either and prints the object -according to its type. - -`[CHARACTERS]' - Makes a string containing CHARACTERS and pushes it on the stack. - For example, `[foo]P' prints the characters `foo' (with no - newline). - -`x' - Pops a value off the stack and executes it as a macro. Normally - it should be a string; if it is a number, it is simply pushed back - onto the stack. For example, `[1p]x' executes the macro `1p', - which pushes 1 on the stack and prints `1' on a separate line. - - Macros are most often stored in registers; `[1p]sa' stores a macro - to print `1' into register `a', and `lax' invokes the macro. - -`>R' - Pops two values off the stack and compares them assuming they are - numbers, executing the contents of register R as a macro if the - original top-of-stack is greater. Thus, `1 2>a' will invoke - register `a''s contents and `2 1>a' will not. - -`<R' - Similar but invokes the macro if the original top-of-stack is less. - -`=R' - Similar but invokes the macro if the two numbers popped are equal. - This can also be validly used to compare two strings for equality. - -`?' - Reads a line from the terminal and executes it. This command - allows a macro to request input from the user. - -`q' - During the execution of a macro, this comand does not exit DC. - Instead, it exits from that macro and also from the macro which - invoked it (if any). - -`Q' - Pops a value off the stack and uses it as a count of levels of - macro execution to be exited. Thus, `3Q' exits three levels. - - -File: dc.info, Node: Status Inquiry, Next: Notes, Prev: Strings, Up: Top - -Status Inquiry -************** - -`Z' - Pops a value off the stack, calculates the number of digits it has - (or number of characters, if it is a string) and pushes that - number. - -`X' - Pops a value off the stack, calculates the number of fraction - digits it has, and pushes that number. For a string, the value - pushed is -1. - -`z' - Pushes the current stack depth; the number of objects on the stack - before the execution of the `z' command. - -`I' - Pushes the current value of the input radix. - -`O' - Pushes the current value of the output radix. - -`K' - Pushes the current value of the precision. - - -File: dc.info, Node: Notes, Prev: Status Inquiry, Up: Top - -Notes -***** - - The `:' and `;' commands of the Unix DC program are not supported, -as the documentation does not say what they do. The `!' command is not -supported, but will be supported as soon as a library for executing a -line as a command exists. - - - -Tag Table: -Node: Top960 -Node: Introduction1440 -Node: Printing Commands2603 -Node: Arithmetic3211 -Node: Stack Control5168 -Node: Registers5468 -Node: Parameters6586 -Node: Strings7659 -Node: Status Inquiry9857 -Node: Notes10571 - -End Tag Table diff --git a/gnu/usr.bin/dc/dc.texinfo b/gnu/usr.bin/dc/dc.texinfo deleted file mode 100644 index 15b285fbd579..000000000000 --- a/gnu/usr.bin/dc/dc.texinfo +++ /dev/null @@ -1,381 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename dc.info -@settitle DC, An Arbitrary Precision Calculator -@c %**end of header - -@c This file has the new style title page commands. -@c Run `makeinfo' rather than `texinfo-format-buffer'. - -@c smallbook - -@c tex -@c \overfullrule=0pt -@c end tex - -@c Combine indices. -@synindex cp fn -@syncodeindex vr fn -@syncodeindex ky fn -@syncodeindex pg fn -@syncodeindex tp fn - -@ifinfo -This file documents DC, an arbitrary precision calculator. - -Published by the Free Software Foundation, -675 Massachusetts Avenue, -Cambridge, MA 02139 USA - -Copyright (C) 1984 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. -@end ifinfo - -@setchapternewpage odd - -@titlepage -@title DC, An Arbitrary Precision Calculator - -@author by Richard Stallman -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1984 Free Software Foundation, Inc. - -@sp 2 -Published by the Free Software Foundation, @* -675 Massachusetts Avenue, @* -Cambridge, MA 02139 USA - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. - -@end titlepage -@page - -@node Top, Introduction, (dir), (dir) - -@menu -* Introduction:: Introduction -* Printing Commands:: Printing Commands -* Arithmetic:: Arithmetic -* Stack Control:: Stack Control -* Registers:: Registers -* Parameters:: Parameters -* Strings:: Strings -* Status Inquiry:: Status Inquiry -* Notes:: Notes -@end menu - -@node Introduction, Printing Commands, Top, Top -@comment node-name, next, previous, up -@chapter Introduction - -DC is a reverse-polish desk calculator which supports unlimited -precision arithmetic. It also allows you to define and call macros. -Normally DC reads from the standard input; if any command arguments -are given to it, they are filenames, and DC reads and executes the -contents of the files before reading from standard input. All output -is to standard output. - -To exit, use @samp{q}. @kbd{C-c} does not exit; it is used to abort -macros that are looping, etc. (Currently this is not true; @kbd{C-c} -does exit.) - -A reverse-polish calculator stores numbers on a stack. Entering a -number pushes it on the stack. Arithmetic operations pop arguments off -the stack and push the results. - -To enter a number in DC, type the digits, with an optional decimal -point. Exponential notation is not supported. To enter a negative -number, begin the number with @samp{_}. @samp{-} cannot be used for -this, as it is a binary operator for subtraction instead. -To enter two numbers in succession, separate them with spaces or -newlines. These have no meaning as commands. - -@node Printing Commands, Arithmetic, Introduction, Top -@chapter Printing Commands - -@table @samp -@item p -Prints the value on the top of the stack, -without altering the stack. A newline is printed -after the value. - -@item P -Prints the value on the top of the stack, -popping it off, and does not print a newline after. - -@item f -Prints the entire contents of the stack -and the contents of all of the registers, -without altering anything. This is a good command -to use if you are lost or want to figure out -what the effect of some command has been. -@end table - -@node Arithmetic, Stack Control, Printing Commands, Top -@chapter Arithmetic - -@table @samp -@item + -Pops two values off the stack, adds them, -and pushes the result. The precision of the result -is determined only by the values of the arguments, -and is enough to be exact. - -@item - -Pops two values, subtracts the first one popped -from the second one popped, and pushes the result. - -@item * -Pops two values, multiplies them, and pushes the result. -The number of fraction digits in the result is controlled -by the current precision flag (see below) and does not -depend on the values being multiplied. - -@item / -Pops two values, divides the second one popped from -the first one popped, and pushes the result. -The number of fraction digits is specified by the precision flag. - -@item % -Pops two values, computes the remainder of the division -that the @samp{/} command would do, and pushes that. -The division is done with as many fraction digits -as the precision flag specifies, and the remainder -is also computed with that many fraction digits. - -@item ^ -Pops two values and exponentiates, using the first -value popped as the exponent and the second popped as the base. -The fraction part of the exponent is ignored. -The precision flag specifies the number of fraction -digits in the result. - -@item v -Pops one value, computes its square root, and pushes that. -The precision flag specifies the number of fraction digits -in the result. -@end table - -Most arithmetic operations are affected by the "precision flag", -which you can set with the @samp{k} command. The default precision -value is zero, which means that all arithmetic except for -addition and subtraction produces integer results. - -The remainder operation (@samp{%}) requires some explanation: applied to -arguments @samp{a} and @samp{b} it produces @samp{a - (b * (a / b))}, -where @samp{a / b} is computed in the current precision. - -@node Stack Control, Registers, Arithmetic, Top -@chapter Stack Control - -@table @samp -@item c -Clears the stack, rendering it empty. - -@item d -Duplicates the value on the top of the stack, -pushing another copy of it. Thus, -`4d*p' computes 4 squared and prints it. -@end table - -@node Registers, Parameters, Stack Control, Top -@chapter Registers - -DC provides 128 memory registers, each named by a single -ASCII character. You can store a number in a register -and retrieve it later. - -@table @samp -@item s@var{r} -Pop the value off the top of the stack and store -it into register @var{r}. - -@item l@var{r} -Copy the value in register @var{r}, and push it onto -the stack. This does not alter the contents of @var{r}. - -Each register also contains its own stack. The current -register value is the top of the register's stack. - -@item S@var{r} -Pop the value off the top of the (main) stack and -push it onto the stack of register @var{r}. -The previous value of the register becomes inaccessible. - -@item L@var{r} -Pop the value off the top of register @var{r}'s stack -and push it onto the main stack. The previous value -in register @var{r}'s stack, if any, is now accessible -via the `l@var{r}' command. -@end table - -The @samp{f} command prints a list of all registers that have contents -stored in them, together with their contents. Only the -current contents of each register (the top of its stack) -is printed. - -@node Parameters, Strings, Registers, Top -@chapter Parameters - -DC has three parameters that control its operation: the precision, the -input radix, and the output radix. The precision specifies the number -of fraction digits to keep in the result of most arithmetic operations. -The input radix controls the interpretation of numbers typed in; -@emph{all} numbers typed in use this radix. The output radix is used -for printing numbers. - -The input and output radices are separate parameters; you can make them -unequal, which can be useful or confusing. Each radix must be between 2 -and 36 inclusive. The precision must be zero or greater. The precision -is always measured in decimal digits, regardless of the current input or -output radix. - -@table @samp -@item i -Pops the value off the top of the stack -and uses it to set the input radix. - -@item o -@itemx k -Similarly set the output radix and the precision. - -@item I -Pushes the current input radix on the stack. - -@item O -@itemx K -Similarly push the current output radix and the current precision. -@end table - -@node Strings, Status Inquiry, Parameters, Top -@chapter Strings - -DC can operate on strings as well as on numbers. The only things you -can do with strings are print them and execute them as macros (which -means that the contents of the string are processed as DC commands). -Both registers and the stack can hold strings, and DC always knows -whether any given object is a string or a number. Some commands such as -arithmetic operations demand numbers as arguments and print errors if -given strings. Other commands can accept either a number or a string; -for example, the @samp{p} command can accept either and prints the object -according to its type. - -@table @samp -@item [@var{characters}] -Makes a string containing @var{characters} and pushes it -on the stack. For example, @samp{[foo]P} prints the -characters @samp{foo} (with no newline). - -@item x -Pops a value off the stack and executes it as a macro. -Normally it should be a string; if it is a number, -it is simply pushed back onto the stack. -For example, @samp{[1p]x} executes the macro @samp{1p}, which -pushes 1 on the stack and prints @samp{1} on a separate line. - -Macros are most often stored in registers; -@samp{[1p]sa} stores a macro to print @samp{1} into register @samp{a}, -and @samp{lax} invokes the macro. - -@item >@var{r} -Pops two values off the stack and compares them -assuming they are numbers, executing the contents -of register @var{r} as a macro if the original top-of-stack -is greater. Thus, @samp{1 2>a} will invoke register @samp{a}'s contents -and @samp{2 1>a} will not. - -@item <@var{r} -Similar but invokes the macro if the original top-of-stack -is less. - -@item =@var{r} -Similar but invokes the macro if the two numbers popped -are equal. This can also be validly used to compare two -strings for equality. - -@item ? -Reads a line from the terminal and executes it. -This command allows a macro to request input from the user. - -@item q -During the execution of a macro, this comand -does not exit DC. Instead, it exits from that -macro and also from the macro which invoked it (if any). - -@item Q -Pops a value off the stack and uses it as a count -of levels of macro execution to be exited. Thus, -@samp{3Q} exits three levels. -@end table - -@node Status Inquiry, Notes, Strings, Top -@chapter Status Inquiry - -@table @samp -@item Z -Pops a value off the stack, calculates the number of -digits it has (or number of characters, if it is a string) -and pushes that number. - -@item X -Pops a value off the stack, calculates the number of -fraction digits it has, and pushes that number. -For a string, the value pushed is -1. - -@item z -Pushes the current stack depth; the number of -objects on the stack before the execution of the @samp{z} command. - -@item I -Pushes the current value of the input radix. - -@item O -Pushes the current value of the output radix. - -@item K -Pushes the current value of the precision. -@end table - -@node Notes, , Status Inquiry, Top -@chapter Notes - -The @samp{:} and @samp{;} commands of the Unix DC program are -not supported, as the documentation does not say what they do. -The @samp{!} command is not supported, but will be supported -as soon as a library for executing a line as a command exists. - -@contents -@bye diff --git a/gnu/usr.bin/diff/fnmatch.h b/gnu/usr.bin/diff/fnmatch.h deleted file mode 100644 index 1a653ab6314b..000000000000 --- a/gnu/usr.bin/diff/fnmatch.h +++ /dev/null @@ -1,69 +0,0 @@ -/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. - -NOTE: The canonical source of this file is maintained with the GNU C Library. -Bugs can be reported to bug-glibc@prep.ai.mit.edu. - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 2, or (at your option) any -later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef _FNMATCH_H - -#define _FNMATCH_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) -#undef __P -#define __P(args) args -#else /* Not C++ or ANSI C. */ -#undef __P -#define __P(args) () -/* We can get away without defining `const' here only because in this file - it is used only inside the prototype for `fnmatch', which is elided in - non-ANSI C where `const' is problematical. */ -#endif /* C++ or ANSI C. */ - - -/* We #undef these before defining them because some losing systems - (HP-UX A.08.07 for example) define these in <unistd.h>. */ -#undef FNM_PATHNAME -#undef FNM_NOESCAPE -#undef FNM_PERIOD - -/* Bits set in the FLAGS argument to `fnmatch'. */ -#define FNM_PATHNAME (1 << 0) /* No wildcard can ever match `/'. */ -#define FNM_NOESCAPE (1 << 1) /* Backslashes don't quote special chars. */ -#define FNM_PERIOD (1 << 2) /* Leading `.' is matched only explicitly. */ - -#if !defined (_POSIX_C_SOURCE) || _POSIX_C_SOURCE < 2 || defined (_GNU_SOURCE) -#define FNM_FILE_NAME FNM_PATHNAME /* Preferred GNU name. */ -#define FNM_LEADING_DIR (1 << 3) /* Ignore `/...' after a match. */ -#define FNM_CASEFOLD (1 << 4) /* Compare without regard to case. */ -#endif - -/* Value returned by `fnmatch' if STRING does not match PATTERN. */ -#define FNM_NOMATCH 1 - -/* Match STRING against the filename pattern PATTERN, - returning zero if it matches, FNM_NOMATCH if not. */ -extern int fnmatch __P ((const char *__pattern, const char *__string, - int __flags)); - -#ifdef __cplusplus -} -#endif - -#endif /* fnmatch.h */ diff --git a/gnu/usr.bin/diff3/COPYING b/gnu/usr.bin/diff3/COPYING deleted file mode 100644 index a43ea2126fb6..000000000000 --- a/gnu/usr.bin/diff3/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/gnu/usr.bin/diff3/diff3.c b/gnu/usr.bin/diff3/diff3.c deleted file mode 100644 index b9952fc0a04f..000000000000 --- a/gnu/usr.bin/diff3/diff3.c +++ /dev/null @@ -1,1693 +0,0 @@ -/* Three way file comparison program (diff3) for Project GNU. - Copyright (C) 1988, 1989, 1992 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Written by Randy Smith */ - -#if __STDC__ -#define VOID void -#else -#define VOID char -#endif - -#include <stdio.h> -#include <ctype.h> -#include "getopt.h" -#include "system.h" - -/* - * Internal data structures and macros for the diff3 program; includes - * data structures for both diff3 diffs and normal diffs. - */ - -/* Different files within a three way diff. */ -#define FILE0 0 -#define FILE1 1 -#define FILE2 2 - -/* - * A three way diff is built from two two-way diffs; the file which - * the two two-way diffs share is: - */ -#define FILEC FILE2 - -/* - * Different files within a two way diff. - * FC is the common file, FO the other file. - */ -#define FO 0 -#define FC 1 - -/* The ranges are indexed by */ -#define START 0 -#define END 1 - -enum diff_type { - ERROR, /* Should not be used */ - ADD, /* Two way diff add */ - CHANGE, /* Two way diff change */ - DELETE, /* Two way diff delete */ - DIFF_ALL, /* All three are different */ - DIFF_1ST, /* Only the first is different */ - DIFF_2ND, /* Only the second */ - DIFF_3RD /* Only the third */ -}; - -/* Two way diff */ -struct diff_block { - int ranges[2][2]; /* Ranges are inclusive */ - char **lines[2]; /* The actual lines (may contain nulls) */ - int *lengths[2]; /* Line lengths (including newlines, if any) */ - struct diff_block *next; -}; - -/* Three way diff */ - -struct diff3_block { - enum diff_type correspond; /* Type of diff */ - int ranges[3][2]; /* Ranges are inclusive */ - char **lines[3]; /* The actual lines (may contain nulls) */ - int *lengths[3]; /* Line lengths (including newlines, if any) */ - struct diff3_block *next; -}; - -/* - * Access the ranges on a diff block. - */ -#define D_LOWLINE(diff, filenum) \ - ((diff)->ranges[filenum][START]) -#define D_HIGHLINE(diff, filenum) \ - ((diff)->ranges[filenum][END]) -#define D_NUMLINES(diff, filenum) \ - (D_HIGHLINE (diff, filenum) - D_LOWLINE (diff, filenum) + 1) - -/* - * Access the line numbers in a file in a diff by relative line - * numbers (i.e. line number within the diff itself). Note that these - * are lvalues and can be used for assignment. - */ -#define D_RELNUM(diff, filenum, linenum) \ - ((diff)->lines[filenum][linenum]) -#define D_RELLEN(diff, filenum, linenum) \ - ((diff)->lengths[filenum][linenum]) - -/* - * And get at them directly, when that should be necessary. - */ -#define D_LINEARRAY(diff, filenum) \ - ((diff)->lines[filenum]) -#define D_LENARRAY(diff, filenum) \ - ((diff)->lengths[filenum]) - -/* - * Next block. - */ -#define D_NEXT(diff) ((diff)->next) - -/* - * Access the type of a diff3 block. - */ -#define D3_TYPE(diff) ((diff)->correspond) - -/* - * Line mappings based on diffs. The first maps off the top of the - * diff, the second off of the bottom. - */ -#define D_HIGH_MAPLINE(diff, fromfile, tofile, lineno) \ - ((lineno) \ - - D_HIGHLINE ((diff), (fromfile)) \ - + D_HIGHLINE ((diff), (tofile))) - -#define D_LOW_MAPLINE(diff, fromfile, tofile, lineno) \ - ((lineno) \ - - D_LOWLINE ((diff), (fromfile)) \ - + D_LOWLINE ((diff), (tofile))) - -/* - * General memory allocation function. - */ -#define ALLOCATE(number, type) \ - (type *) xmalloc ((number) * sizeof (type)) - -/* Options variables for flags set on command line. */ - -/* If nonzero, treat all files as text files, never as binary. */ -static int always_text; - -/* If nonzero, write out an ed script instead of the standard diff3 format. */ -static int edscript; - -/* If nonzero, in the case of overlapping diffs (type DIFF_ALL), - preserve the lines which would normally be deleted from - file 1 with a special flagging mechanism. */ -static int flagging; - -/* Number of lines to keep in identical prefix and suffix. */ -static int horizon_lines = 10; - -/* If nonzero, do not output information for overlapping diffs. */ -static int simple_only; - -/* If nonzero, do not output information for non-overlapping diffs. */ -static int overlap_only; - -/* If nonzero, show information for DIFF_2ND diffs. */ -static int show_2nd; - -/* If nonzero, include `:wq' at the end of the script - to write out the file being edited. */ -static int finalwrite; - -/* If nonzero, output a merged file. */ -static int merge; - -static char *argv0; - -/* - * Forward function declarations. - */ -static int myread (); -static void fatal (); -static void perror_with_exit (); -static struct diff_block *process_diff (); -static struct diff3_block *make_3way_diff (); -static void output_diff3 (); -static int output_diff3_edscript (); -static int output_diff3_merge (); -static void usage (); - -static struct diff3_block *using_to_diff3_block (); -static int copy_stringlist (); -static struct diff3_block *create_diff3_block (); -static int compare_line_list (); - -static char *read_diff (); -static enum diff_type process_diff_control (); -static char *scan_diff_line (); - -static struct diff3_block *reverse_diff3_blocklist (); - -VOID *xmalloc (); -static VOID *xrealloc (); - -static char diff_program[] = DIFF_PROGRAM; - -static struct option longopts[] = -{ - {"text", 0, NULL, 'a'}, - {"show-all", 0, NULL, 'A'}, - {"ed", 0, NULL, 'e'}, - {"show-overlap", 0, NULL, 'E'}, - {"label", 1, NULL, 'L'}, - {"merge", 0, NULL, 'm'}, - {"overlap-only", 0, NULL, 'x'}, - {"easy-only", 0, NULL, '3'}, - {"version", 0, NULL, 'v'}, - {0, 0, 0, 0} -}; - -/* - * Main program. Calls diff twice on two pairs of input files, - * combines the two diffs, and outputs them. - */ -int -main (argc, argv) - int argc; - char **argv; -{ - extern char *version_string; - int c, i; - int mapping[3]; - int rev_mapping[3]; - int incompat; - int conflicts_found; - struct diff_block *thread0, *thread1, *last_block; - struct diff3_block *diff3; - int tag_count = 0; - char *tag_strings[3]; - extern char *optarg; - char *commonname; - char **file; - struct stat statb; - - incompat = 0; - - argv0 = argv[0]; - - while ((c = getopt_long (argc, argv, "aeimvx3AEXL:", longopts, (int *) 0)) - != EOF) - { - switch (c) - { - case 'a': - always_text = 1; - break; - case 'A': - show_2nd = 1; - flagging = 1; - incompat++; - break; - case 'x': - overlap_only = 1; - incompat++; - break; - case '3': - simple_only = 1; - incompat++; - break; - case 'i': - finalwrite = 1; - break; - case 'm': - merge = 1; - break; - case 'X': - overlap_only = 1; - /* Falls through */ - case 'E': - flagging = 1; - /* Falls through */ - case 'e': - incompat++; - break; - case 'v': - fprintf (stderr, "GNU diff3 version %s\n", version_string); - break; - case 'L': - /* Handle up to three -L options. */ - if (tag_count < 3) - { - tag_strings[tag_count++] = optarg; - break; - } - /* Falls through */ - default: - usage (); - /* NOTREACHED */ - } - } - - edscript = incompat & ~merge; /* -AeExX3 without -m implies ed script. */ - show_2nd |= ~incompat & merge; /* -m without -AeExX3 implies -A. */ - flagging |= ~incompat & merge; - - if (incompat > 1 /* Ensure at most one of -AeExX3. */ - || finalwrite & merge /* -i -m would rewrite input file. */ - || (tag_count && ! flagging) /* -L requires one of -AEX. */ - || argc - optind != 3) - usage (); - - file = &argv[optind]; - - for (i = tag_count; i < 3; i++) - tag_strings[i] = file[i]; - - /* Always compare file1 to file2, even if file2 is "-". - This is needed for -mAeExX3. Using the file0 as - the common file would produce wrong results, because if the - file0-file1 diffs didn't line up with the file0-file2 diffs - (which is entirely possible since we don't use diff's -n option), - diff3 might report phantom changes from file1 to file2. */ - - if (strcmp (file[2], "-") == 0) - { - /* Sigh. We've got standard input as the last arg. We can't - call diff twice on stdin. Use the middle arg as the common - file instead. */ - if (strcmp (file[0], "-") == 0 || strcmp (file[1], "-") == 0) - fatal ("`-' specified for more than one input file"); - mapping[0] = 0; - mapping[1] = 2; - mapping[2] = 1; - } - else - { - /* Normal, what you'd expect */ - mapping[0] = 0; - mapping[1] = 1; - mapping[2] = 2; - } - - for (i = 0; i < 3; i++) - rev_mapping[mapping[i]] = i; - - for (i = 0; i < 3; i++) - if (strcmp (file[i], "-") != 0) - if (stat (file[i], &statb) < 0) - perror_with_exit (file[i]); - else if (S_ISDIR(statb.st_mode)) - { - fprintf (stderr, "%s: %s: Is a directory\n", argv0, file[i]); - exit (2); - } - - - commonname = file[rev_mapping[FILEC]]; - thread1 = process_diff (file[rev_mapping[FILE1]], commonname, &last_block); - if (thread1) - for (i = 0; i < 2; i++) - { - horizon_lines = max (horizon_lines, D_NUMLINES (thread1, i)); - horizon_lines = max (horizon_lines, D_NUMLINES (last_block, i)); - } - thread0 = process_diff (file[rev_mapping[FILE0]], commonname, &last_block); - diff3 = make_3way_diff (thread0, thread1); - if (edscript) - conflicts_found - = output_diff3_edscript (stdout, diff3, mapping, rev_mapping, - tag_strings[0], tag_strings[1], tag_strings[2]); - else if (merge) - { - if (! freopen (file[rev_mapping[FILE0]], "r", stdin)) - perror_with_exit (file[rev_mapping[FILE0]]); - conflicts_found - = output_diff3_merge (stdin, stdout, diff3, mapping, rev_mapping, - tag_strings[0], tag_strings[1], tag_strings[2]); - if (ferror (stdin)) - fatal ("read error"); - } - else - { - output_diff3 (stdout, diff3, mapping, rev_mapping); - conflicts_found = 0; - } - - if (ferror (stdout) || fclose (stdout) != 0) - fatal ("write error"); - exit (conflicts_found); - return conflicts_found; -} - -/* - * Explain, patiently and kindly, how to use this program. Then exit. - */ -static void -usage () -{ - fprintf (stderr, "\ -Usage: %s [options] my-file older-file your-file\n\ -Options:\n\ - [-exAEX3v] [-i|-m] [-L label1 [-L label2 [-L label3]]] [--text] [--ed]\n\ - [--merge] [--show-all] [--show-overlap] [--overlap-only] [--easy-only]\n\ - [--label=label1 [--label=label2 [--label=label3]]] [--version]\n\ - Only one of [exAEX3] is allowed\n", argv0); - exit (2); -} - -/* - * Routines that combine the two diffs together into one. The - * algorithm used follows: - * - * File2 is shared in common between the two diffs. - * Diff02 is the diff between 0 and 2. - * Diff12 is the diff between 1 and 2. - * - * 1) Find the range for the first block in File2. - * a) Take the lowest of the two ranges (in File2) in the two - * current blocks (one from each diff) as being the low - * water mark. Assign the upper end of this block as - * being the high water mark and move the current block up - * one. Mark the block just moved over as to be used. - * b) Check the next block in the diff that the high water - * mark is *not* from. - * - * *If* the high water mark is above - * the low end of the range in that block, - * - * mark that block as to be used and move the current - * block up. Set the high water mark to the max of - * the high end of this block and the current. Repeat b. - * - * 2) Find the corresponding ranges in File0 (from the blocks - * in diff02; line per line outside of diffs) and in File1. - * Create a diff3_block, reserving space as indicated by the ranges. - * - * 3) Copy all of the pointers for file2 in. At least for now, - * do bcmp's between corresponding strings in the two diffs. - * - * 4) Copy all of the pointers for file0 and 1 in. Get what you - * need from file2 (when there isn't a diff block, it's - * identical to file2 within the range between diff blocks). - * - * 5) If the diff blocks you used came from only one of the two - * strings of diffs, then that file (i.e. the one other than - * the common file in that diff) is the odd person out. If you used - * diff blocks from both sets, check to see if files 0 and 1 match: - * - * Same number of lines? If so, do a set of bcmp's (if a - * bcmp matches; copy the pointer over; it'll be easier later - * if you have to do any compares). If they match, 0 & 1 are - * the same. If not, all three different. - * - * Then you do it again, until you run out of blocks. - * - */ - -/* - * This routine makes a three way diff (chain of diff3_block's) from two - * two way diffs (chains of diff_block's). It is assumed that each of - * the two diffs passed are onto the same file (i.e. that each of the - * diffs were made "to" the same file). The three way diff pointer - * returned will have numbering FILE0--the other file in diff02, - * FILE1--the other file in diff12, and FILEC--the common file. - */ -static struct diff3_block * -make_3way_diff (thread0, thread1) - struct diff_block *thread0, *thread1; -{ -/* - * This routine works on the two diffs passed to it as threads. - * Thread number 0 is diff02, thread number 1 is diff12. The USING - * array is set to the base of the list of blocks to be used to - * construct each block of the three way diff; if no blocks from a - * particular thread are to be used, that element of the using array - * is set to 0. The elements LAST_USING array are set to the last - * elements on each of the using lists. - * - * The HIGH_WATER_MARK is set to the highest line number in the common file - * described in any of the diffs in either of the USING lists. The - * HIGH_WATER_THREAD names the thread. Similarly the BASE_WATER_MARK - * and BASE_WATER_THREAD describe the lowest line number in the common file - * described in any of the diffs in either of the USING lists. The - * HIGH_WATER_DIFF is the diff from which the HIGH_WATER_MARK was - * taken. - * - * The HIGH_WATER_DIFF should always be equal to LAST_USING - * [HIGH_WATER_THREAD]. The OTHER_DIFF is the next diff to check for - * higher water, and should always be equal to - * CURRENT[HIGH_WATER_THREAD ^ 0x1]. The OTHER_THREAD is the thread - * in which the OTHER_DIFF is, and hence should always be equal to - * HIGH_WATER_THREAD ^ 0x1. - * - * The variable LAST_DIFF is kept set to the last diff block produced - * by this routine, for line correspondence purposes between that diff - * and the one currently being worked on. It is initialized to - * ZERO_DIFF before any blocks have been created. - */ - - struct diff_block - *using[2], - *last_using[2], - *current[2]; - - int - high_water_mark; - - int - high_water_thread, - base_water_thread, - other_thread; - - struct diff_block - *high_water_diff, - *other_diff; - - struct diff3_block - *result, - *tmpblock, - **result_end, - *last_diff3; - - static struct diff3_block zero_diff3 = { - ERROR, - { {0, 0}, {0, 0}, {0, 0} }, - { (char **) 0, (char **) 0, (char **) 0 }, - { (int *) 0, (int *) 0, (int *) 0 }, - (struct diff3_block *) 0 - }; - - /* Initialization */ - result = 0; - result_end = &result; - current[0] = thread0; current[1] = thread1; - last_diff3 = &zero_diff3; - - /* Sniff up the threads until we reach the end */ - - while (current[0] || current[1]) - { - using[0] = using[1] = last_using[0] = last_using[1] = - (struct diff_block *) 0; - - /* Setup low and high water threads, diffs, and marks. */ - if (!current[0]) - base_water_thread = 1; - else if (!current[1]) - base_water_thread = 0; - else - base_water_thread = - (D_LOWLINE (current[0], FC) > D_LOWLINE (current[1], FC)); - - high_water_thread = base_water_thread; - - high_water_diff = current[high_water_thread]; - -#if 0 - /* low and high waters start off same diff */ - base_water_mark = D_LOWLINE (high_water_diff, FC); -#endif - - high_water_mark = D_HIGHLINE (high_water_diff, FC); - - /* Make the diff you just got info from into the using class */ - using[high_water_thread] - = last_using[high_water_thread] - = high_water_diff; - current[high_water_thread] = high_water_diff->next; - last_using[high_water_thread]->next - = (struct diff_block *) 0; - - /* And mark the other diff */ - other_thread = high_water_thread ^ 0x1; - other_diff = current[other_thread]; - - /* Shuffle up the ladder, checking the other diff to see if it - needs to be incorporated. */ - while (other_diff - && D_LOWLINE (other_diff, FC) <= high_water_mark + 1) - { - - /* Incorporate this diff into the using list. Note that - this doesn't take it off the current list */ - if (using[other_thread]) - last_using[other_thread]->next = other_diff; - else - using[other_thread] = other_diff; - last_using[other_thread] = other_diff; - - /* Take it off the current list. Note that this following - code assumes that other_diff enters it equal to - current[high_water_thread ^ 0x1] */ - current[other_thread] - = current[other_thread]->next; - other_diff->next - = (struct diff_block *) 0; - - /* Set the high_water stuff - If this comparison is equal, then this is the last pass - through this loop; since diff blocks within a given - thread cannot overlap, the high_water_mark will be - *below* the range_start of either of the next diffs. */ - - if (high_water_mark < D_HIGHLINE (other_diff, FC)) - { - high_water_thread ^= 1; - high_water_diff = other_diff; - high_water_mark = D_HIGHLINE (other_diff, FC); - } - - /* Set the other diff */ - other_thread = high_water_thread ^ 0x1; - other_diff = current[other_thread]; - } - - /* The using lists contain a list of all of the blocks to be - included in this diff3_block. Create it. */ - - tmpblock = using_to_diff3_block (using, last_using, - base_water_thread, high_water_thread, - last_diff3); - - if (!tmpblock) - fatal ("internal error: screwup in format of diff blocks"); - - /* Put it on the list. */ - *result_end = tmpblock; - result_end = &tmpblock->next; - - /* Set up corresponding lines correctly. */ - last_diff3 = tmpblock; - } - return result; -} - -/* - * using_to_diff3_block: - * This routine takes two lists of blocks (from two separate diff - * threads) and puts them together into one diff3 block. - * It then returns a pointer to this diff3 block or 0 for failure. - * - * All arguments besides using are for the convenience of the routine; - * they could be derived from the using array. - * LAST_USING is a pair of pointers to the last blocks in the using - * structure. - * LOW_THREAD and HIGH_THREAD tell which threads contain the lowest - * and highest line numbers for File0. - * last_diff3 contains the last diff produced in the calling routine. - * This is used for lines mappings which would still be identical to - * the state that diff ended in. - * - * A distinction should be made in this routine between the two diffs - * that are part of a normal two diff block, and the three diffs that - * are part of a diff3_block. - */ -static struct diff3_block * -using_to_diff3_block (using, last_using, low_thread, high_thread, last_diff3) - struct diff_block - *using[2], - *last_using[2]; - int low_thread, high_thread; - struct diff3_block *last_diff3; -{ - int low[2], high[2]; - struct diff3_block *result; - struct diff_block *ptr; - int d, i; - - /* Find the range in the common file. */ - int lowc = D_LOWLINE (using[low_thread], FC); - int highc = D_HIGHLINE (last_using[high_thread], FC); - - /* Find the ranges in the other files. - If using[d] is null, that means that the file to which that diff - refers is equivalent to the common file over this range. */ - - for (d = 0; d < 2; d++) - if (using[d]) - { - low[d] = D_LOW_MAPLINE (using[d], FC, FO, lowc); - high[d] = D_HIGH_MAPLINE (last_using[d], FC, FO, highc); - } - else - { - low[d] = D_HIGH_MAPLINE (last_diff3, FILEC, FILE0 + d, lowc); - high[d] = D_HIGH_MAPLINE (last_diff3, FILEC, FILE0 + d, highc); - } - - /* Create a block with the appropriate sizes */ - result = create_diff3_block (low[0], high[0], low[1], high[1], lowc, highc); - - /* Copy information for the common file. - Return with a zero if any of the compares failed. */ - - for (d = 0; d < 2; d++) - for (ptr = using[d]; ptr; ptr = D_NEXT (ptr)) - { - int result_offset = D_LOWLINE (ptr, FC) - lowc; - - if (!copy_stringlist (D_LINEARRAY (ptr, FC), - D_LENARRAY (ptr, FC), - D_LINEARRAY (result, FILEC) + result_offset, - D_LENARRAY (result, FILEC) + result_offset, - D_NUMLINES (ptr, FC))) - return 0; - } - - /* Copy information for file d. First deal with anything that might be - before the first diff. */ - - for (d = 0; d < 2; d++) - { - struct diff_block *u = using[d]; - int lo = low[d], hi = high[d]; - - for (i = 0; - i + lo < (u ? D_LOWLINE (u, FO) : hi + 1); - i++) - { - D_RELNUM (result, FILE0 + d, i) = D_RELNUM (result, FILEC, i); - D_RELLEN (result, FILE0 + d, i) = D_RELLEN (result, FILEC, i); - } - - for (ptr = u; ptr; ptr = D_NEXT (ptr)) - { - int result_offset = D_LOWLINE (ptr, FO) - lo; - int linec; - - if (!copy_stringlist (D_LINEARRAY (ptr, FO), - D_LENARRAY (ptr, FO), - D_LINEARRAY (result, FILE0 + d) + result_offset, - D_LENARRAY (result, FILE0 + d) + result_offset, - D_NUMLINES (ptr, FO))) - return 0; - - /* Catch the lines between here and the next diff */ - linec = D_HIGHLINE (ptr, FC) + 1 - lowc; - for (i = D_HIGHLINE (ptr, FO) + 1 - lo; - i < (D_NEXT (ptr) ? D_LOWLINE (D_NEXT (ptr), FO) : hi + 1) - lo; - i++) - { - D_RELNUM (result, FILE0 + d, i) = D_RELNUM (result, FILEC, linec); - D_RELLEN (result, FILE0 + d, i) = D_RELLEN (result, FILEC, linec); - linec++; - } - } - } - - /* Set correspond */ - if (!using[0]) - D3_TYPE (result) = DIFF_2ND; - else if (!using[1]) - D3_TYPE (result) = DIFF_1ST; - else - { - int nl0 = D_NUMLINES (result, FILE0); - int nl1 = D_NUMLINES (result, FILE1); - - if (nl0 != nl1 - || !compare_line_list (D_LINEARRAY (result, FILE0), - D_LENARRAY (result, FILE0), - D_LINEARRAY (result, FILE1), - D_LENARRAY (result, FILE1), - nl0)) - D3_TYPE (result) = DIFF_ALL; - else - D3_TYPE (result) = DIFF_3RD; - } - - return result; -} - -/* - * This routine copies pointers from a list of strings to a different list - * of strings. If a spot in the second list is already filled, it - * makes sure that it is filled with the same string; if not it - * returns 0, the copy incomplete. - * Upon successful completion of the copy, it returns 1. - */ -static int -copy_stringlist (fromptrs, fromlengths, toptrs, tolengths, copynum) - char *fromptrs[], *toptrs[]; - int *fromlengths, *tolengths; - int copynum; -{ - register char - **f = fromptrs, - **t = toptrs; - register int - *fl = fromlengths, - *tl = tolengths; - - while (copynum--) - { - if (*t) - { if (*fl != *tl || bcmp (*f, *t, *fl)) return 0; } - else - { *t = *f ; *tl = *fl; } - - t++; f++; tl++; fl++; - } - return 1; -} - -/* - * Create a diff3_block, with ranges as specified in the arguments. - * Allocate the arrays for the various pointers (and zero them) based - * on the arguments passed. Return the block as a result. - */ -static struct diff3_block * -create_diff3_block (low0, high0, low1, high1, low2, high2) - register int low0, high0, low1, high1, low2, high2; -{ - struct diff3_block *result = ALLOCATE (1, struct diff3_block); - int numlines; - - D3_TYPE (result) = ERROR; - D_NEXT (result) = 0; - - /* Assign ranges */ - D_LOWLINE (result, FILE0) = low0; - D_HIGHLINE (result, FILE0) = high0; - D_LOWLINE (result, FILE1) = low1; - D_HIGHLINE (result, FILE1) = high1; - D_LOWLINE (result, FILE2) = low2; - D_HIGHLINE (result, FILE2) = high2; - - /* Allocate and zero space */ - numlines = D_NUMLINES (result, FILE0); - if (numlines) - { - D_LINEARRAY (result, FILE0) = ALLOCATE (numlines, char *); - D_LENARRAY (result, FILE0) = ALLOCATE (numlines, int); - bzero (D_LINEARRAY (result, FILE0), (numlines * sizeof (char *))); - bzero (D_LENARRAY (result, FILE0), (numlines * sizeof (int))); - } - else - { - D_LINEARRAY (result, FILE0) = (char **) 0; - D_LENARRAY (result, FILE0) = (int *) 0; - } - - numlines = D_NUMLINES (result, FILE1); - if (numlines) - { - D_LINEARRAY (result, FILE1) = ALLOCATE (numlines, char *); - D_LENARRAY (result, FILE1) = ALLOCATE (numlines, int); - bzero (D_LINEARRAY (result, FILE1), (numlines * sizeof (char *))); - bzero (D_LENARRAY (result, FILE1), (numlines * sizeof (int))); - } - else - { - D_LINEARRAY (result, FILE1) = (char **) 0; - D_LENARRAY (result, FILE1) = (int *) 0; - } - - numlines = D_NUMLINES (result, FILE2); - if (numlines) - { - D_LINEARRAY (result, FILE2) = ALLOCATE (numlines, char *); - D_LENARRAY (result, FILE2) = ALLOCATE (numlines, int); - bzero (D_LINEARRAY (result, FILE2), (numlines * sizeof (char *))); - bzero (D_LENARRAY (result, FILE2), (numlines * sizeof (int))); - } - else - { - D_LINEARRAY (result, FILE2) = (char **) 0; - D_LENARRAY (result, FILE2) = (int *) 0; - } - - /* Return */ - return result; -} - -/* - * Compare two lists of lines of text. - * Return 1 if they are equivalent, 0 if not. - */ -static int -compare_line_list (list1, lengths1, list2, lengths2, nl) - char *list1[], *list2[]; - int *lengths1, *lengths2; - int nl; -{ - char - **l1 = list1, - **l2 = list2; - int - *lgths1 = lengths1, - *lgths2 = lengths2; - - while (nl--) - if (!*l1 || !*l2 || *lgths1 != *lgths2++ - || bcmp (*l1++, *l2++, *lgths1++)) - return 0; - return 1; -} - -/* - * Routines to input and parse two way diffs. - */ - -extern char **environ; - -#define DIFF_CHUNK_SIZE 10000 - -static struct diff_block * -process_diff (filea, fileb, last_block) - char *filea, *fileb; - struct diff_block **last_block; -{ - char *diff_contents; - char *diff_limit; - char *scan_diff; - enum diff_type dt; - int i; - struct diff_block *block_list, **block_list_end, *bptr; - - diff_limit = read_diff (filea, fileb, &diff_contents); - scan_diff = diff_contents; - block_list_end = &block_list; - - while (scan_diff < diff_limit) - { - bptr = ALLOCATE (1, struct diff_block); - bptr->lines[0] = bptr->lines[1] = (char **) 0; - bptr->lengths[0] = bptr->lengths[1] = (int *) 0; - - dt = process_diff_control (&scan_diff, bptr); - if (dt == ERROR || *scan_diff != '\n') - { - fprintf (stderr, "%s: diff error: ", argv0); - do - { - putc (*scan_diff, stderr); - } - while (*scan_diff++ != '\n'); - exit (2); - } - scan_diff++; - - /* Force appropriate ranges to be null, if necessary */ - switch (dt) - { - case ADD: - bptr->ranges[0][0]++; - break; - case DELETE: - bptr->ranges[1][0]++; - break; - case CHANGE: - break; - default: - fatal ("internal error: invalid diff type in process_diff"); - break; - } - - /* Allocate space for the pointers for the lines from filea, and - parcel them out among these pointers */ - if (dt != ADD) - { - int numlines = D_NUMLINES (bptr, 0); - bptr->lines[0] = ALLOCATE (numlines, char *); - bptr->lengths[0] = ALLOCATE (numlines, int); - for (i = 0; i < numlines; i++) - scan_diff = scan_diff_line (scan_diff, - &(bptr->lines[0][i]), - &(bptr->lengths[0][i]), - diff_limit, - '<'); - } - - /* Get past the separator for changes */ - if (dt == CHANGE) - { - if (strncmp (scan_diff, "---\n", 4)) - fatal ("invalid diff format; invalid change separator"); - scan_diff += 4; - } - - /* Allocate space for the pointers for the lines from fileb, and - parcel them out among these pointers */ - if (dt != DELETE) - { - int numlines = D_NUMLINES (bptr, 1); - bptr->lines[1] = ALLOCATE (numlines, char *); - bptr->lengths[1] = ALLOCATE (numlines, int); - for (i = 0; i < numlines; i++) - scan_diff = scan_diff_line (scan_diff, - &(bptr->lines[1][i]), - &(bptr->lengths[1][i]), - diff_limit, - '>'); - } - - /* Place this block on the blocklist. */ - *block_list_end = bptr; - block_list_end = &bptr->next; - } - - *block_list_end = 0; - *last_block = bptr; - return block_list; -} - -/* - * This routine will parse a normal format diff control string. It - * returns the type of the diff (ERROR if the format is bad). All of - * the other important information is filled into to the structure - * pointed to by db, and the string pointer (whose location is passed - * to this routine) is updated to point beyond the end of the string - * parsed. Note that only the ranges in the diff_block will be set by - * this routine. - * - * If some specific pair of numbers has been reduced to a single - * number, then both corresponding numbers in the diff block are set - * to that number. In general these numbers are interpetted as ranges - * inclusive, unless being used by the ADD or DELETE commands. It is - * assumed that these will be special cased in a superior routine. - */ - -static enum diff_type -process_diff_control (string, db) - char **string; - struct diff_block *db; -{ - char *s = *string; - int holdnum; - enum diff_type type; - -/* These macros are defined here because they can use variables - defined in this function. Don't try this at home kids, we're - trained professionals! - - Also note that SKIPWHITE only recognizes tabs and spaces, and - that READNUM can only read positive, integral numbers */ - -#define SKIPWHITE(s) { while (*s == ' ' || *s == '\t') s++; } -#define READNUM(s, num) \ - { if (!isdigit (*s)) return ERROR; holdnum = 0; \ - do { holdnum = (*s++ - '0' + holdnum * 10); } \ - while (isdigit (*s)); (num) = holdnum; } - - /* Read first set of digits */ - SKIPWHITE (s); - READNUM (s, db->ranges[0][START]); - - /* Was that the only digit? */ - SKIPWHITE (s); - if (*s == ',') - { - /* Get the next digit */ - s++; - READNUM (s, db->ranges[0][END]); - } - else - db->ranges[0][END] = db->ranges[0][START]; - - /* Get the letter */ - SKIPWHITE (s); - switch (*s) - { - case 'a': - type = ADD; - break; - case 'c': - type = CHANGE; - break; - case 'd': - type = DELETE; - break; - default: - return ERROR; /* Bad format */ - } - s++; /* Past letter */ - - /* Read second set of digits */ - SKIPWHITE (s); - READNUM (s, db->ranges[1][START]); - - /* Was that the only digit? */ - SKIPWHITE (s); - if (*s == ',') - { - /* Get the next digit */ - s++; - READNUM (s, db->ranges[1][END]); - SKIPWHITE (s); /* To move to end */ - } - else - db->ranges[1][END] = db->ranges[1][START]; - - *string = s; - return type; -} - -static char * -read_diff (filea, fileb, output_placement) - char *filea, *fileb; - char **output_placement; -{ - char *argv[7]; - char horizon_arg[256]; - char **ap; - int fds[2]; - char *diff_result; - int current_chunk_size; - int bytes; - int total; - int pid, w; - int wstatus; - - ap = argv; - *ap++ = diff_program; - if (always_text) - *ap++ = "-a"; - sprintf (horizon_arg, "--horizon-lines=%d", horizon_lines); - *ap++ = horizon_arg; - *ap++ = "--"; - *ap++ = filea; - *ap++ = fileb; - *ap = (char *) 0; - - if (pipe (fds) < 0) - perror_with_exit ("pipe failed"); - - pid = vfork (); - if (pid == 0) - { - /* Child */ - close (fds[0]); - if (fds[1] != fileno (stdout)) - { - dup2 (fds[1], fileno (stdout)); - close (fds[1]); - } - execve (diff_program, argv, environ); - /* Avoid stdio, because the parent process's buffers are inherited. */ - write (fileno (stderr), diff_program, strlen (diff_program)); - write (fileno (stderr), ": not found\n", 12); - _exit (2); - } - - if (pid == -1) - perror_with_exit ("fork failed"); - - close (fds[1]); /* Prevent erroneous lack of EOF */ - current_chunk_size = DIFF_CHUNK_SIZE; - diff_result = (char *) xmalloc (current_chunk_size); - total = 0; - do { - bytes = myread (fds[0], - diff_result + total, - current_chunk_size - total); - total += bytes; - if (total == current_chunk_size) - diff_result = (char *) xrealloc (diff_result, (current_chunk_size *= 2)); - } while (bytes); - - if (total != 0 && diff_result[total-1] != '\n') - fatal ("invalid diff format; incomplete last line"); - - *output_placement = diff_result; - - do - if ((w = wait (&wstatus)) == -1) - perror_with_exit ("wait failed"); - while (w != pid); - - if (! (WIFEXITED (wstatus) && WEXITSTATUS (wstatus) < 2)) - fatal ("subsidiary diff failed"); - - return diff_result + total; -} - - -/* - * Scan a regular diff line (consisting of > or <, followed by a - * space, followed by text (including nulls) up to a newline. - * - * This next routine began life as a macro and many parameters in it - * are used as call-by-reference values. - */ -static char * -scan_diff_line (scan_ptr, set_start, set_length, limit, firstchar) - char *scan_ptr, **set_start; - int *set_length; - char *limit; - char firstchar; -{ - char *line_ptr; - - if (!(scan_ptr[0] == (firstchar) - && scan_ptr[1] == ' ')) - fatal ("invalid diff format; incorrect leading line chars"); - - *set_start = line_ptr = scan_ptr + 2; - while (*line_ptr++ != '\n') - ; - - /* Include newline if the original line ended in a newline, - or if an edit script is being generated. - Copy any missing newline message to stderr if an edit script is being - generated, because edit scripts cannot handle missing newlines. - Return the beginning of the next line. */ - *set_length = line_ptr - *set_start; - if (line_ptr < limit && *line_ptr == '\\') - { - if (edscript) - fprintf (stderr, "%s:", argv0); - else - --*set_length; - line_ptr++; - do - { - if (edscript) - putc (*line_ptr, stderr); - } - while (*line_ptr++ != '\n'); - } - - return line_ptr; -} - -/* - * This routine outputs a three way diff passed as a list of - * diff3_block's. - * The argument MAPPING is indexed by external file number (in the - * argument list) and contains the internal file number (from the - * diff passed). This is important because the user expects his - * outputs in terms of the argument list number, and the diff passed - * may have been done slightly differently (if the last argument - * was "-", for example). - * REV_MAPPING is the inverse of MAPPING. - */ -static void -output_diff3 (outputfile, diff, mapping, rev_mapping) - FILE *outputfile; - struct diff3_block *diff; - int mapping[3], rev_mapping[3]; -{ - int i; - int oddoneout; - char *cp; - struct diff3_block *ptr; - int line; - int length; - int dontprint; - static int skew_increment[3] = { 2, 3, 1 }; /* 0==>2==>1==>3 */ - - for (ptr = diff; ptr; ptr = D_NEXT (ptr)) - { - char x[2]; - - switch (ptr->correspond) - { - case DIFF_ALL: - x[0] = '\0'; - dontprint = 3; /* Print them all */ - oddoneout = 3; /* Nobody's odder than anyone else */ - break; - case DIFF_1ST: - case DIFF_2ND: - case DIFF_3RD: - oddoneout = rev_mapping[(int) ptr->correspond - (int) DIFF_1ST]; - - x[0] = oddoneout + '1'; - x[1] = '\0'; - dontprint = oddoneout==0; - break; - default: - fatal ("internal error: invalid diff type passed to output"); - } - fprintf (outputfile, "====%s\n", x); - - /* Go 0, 2, 1 if the first and third outputs are equivalent. */ - for (i = 0; i < 3; - i = (oddoneout == 1 ? skew_increment[i] : i + 1)) - { - int realfile = mapping[i]; - int - lowt = D_LOWLINE (ptr, realfile), - hight = D_HIGHLINE (ptr, realfile); - - fprintf (outputfile, "%d:", i + 1); - switch (lowt - hight) - { - case 1: - fprintf (outputfile, "%da\n", lowt - 1); - break; - case 0: - fprintf (outputfile, "%dc\n", lowt); - break; - default: - fprintf (outputfile, "%d,%dc\n", lowt, hight); - break; - } - - if (i == dontprint) continue; - - for (line = 0; line < hight - lowt + 1; line++) - { - fprintf (outputfile, " "); - cp = D_RELNUM (ptr, realfile, line); - length = D_RELLEN (ptr, realfile, line); - fwrite (cp, sizeof (char), length, outputfile); - } - if (line != 0 && cp[length - 1] != '\n') - fprintf (outputfile, "\n\\ No newline at end of file\n"); - } - } -} - - -/* - * Output to OUTPUTFILE the lines of B taken from FILENUM. - * Double any initial '.'s; yield nonzero if any initial '.'s were doubled. - */ -static int -dotlines (outputfile, b, filenum) - FILE *outputfile; - struct diff3_block *b; - int filenum; -{ - int i; - int leading_dot = 0; - - for (i = 0; - i < D_NUMLINES (b, filenum); - i++) - { - char *line = D_RELNUM (b, filenum, i); - if (line[0] == '.') - { - leading_dot = 1; - fprintf (outputfile, "."); - } - fwrite (line, sizeof (char), - D_RELLEN (b, filenum, i), outputfile); - } - - return leading_dot; -} - -/* - * Output to OUTPUTFILE a '.' line. If LEADING_DOT is nonzero, - * also output a command that removes initial '.'s - * starting with line START and continuing for NUM lines. - */ -static void -undotlines (outputfile, leading_dot, start, num) - FILE *outputfile; - int leading_dot, start, num; -{ - fprintf (outputfile, ".\n"); - if (leading_dot) - if (num == 1) - fprintf (outputfile, "%ds/^\\.//\n", start); - else - fprintf (outputfile, "%d,%ds/^\\.//\n", start, start + num - 1); -} - -/* - * This routine outputs a diff3 set of blocks as an ed script. This - * script applies the changes between file's 2 & 3 to file 1. It - * takes the precise format of the ed script to be output from global - * variables set during options processing. Note that it does - * destructive things to the set of diff3 blocks it is passed; it - * reverses their order (this gets around the problems involved with - * changing line numbers in an ed script). - * - * Note that this routine has the same problem of mapping as the last - * one did; the variable MAPPING maps from file number according to - * the argument list to file number according to the diff passed. All - * files listed below are in terms of the argument list. - * REV_MAPPING is the inverse of MAPPING. - * - * The arguments FILE0, FILE1 and FILE2 are the strings to print - * as the names of the three files. These may be the actual names, - * or may be the arguments specified with -L. - * - * Returns 1 if conflicts were found. - */ - -static int -output_diff3_edscript (outputfile, diff, mapping, rev_mapping, - file0, file1, file2) - FILE *outputfile; - struct diff3_block *diff; - int mapping[3], rev_mapping[3]; - char *file0, *file1, *file2; -{ - int leading_dot; - int conflicts_found = 0, conflict; - struct diff3_block *b; - - for (b = reverse_diff3_blocklist (diff); b; b = b->next) - { - /* Must do mapping correctly. */ - enum diff_type type - = ((b->correspond == DIFF_ALL) ? - DIFF_ALL : - ((enum diff_type) - (((int) DIFF_1ST) - + rev_mapping[(int) b->correspond - (int) DIFF_1ST]))); - - /* If we aren't supposed to do this output block, skip it. */ - switch (type) - { - default: continue; - case DIFF_2ND: if (!show_2nd) continue; conflict = 1; break; - case DIFF_3RD: if (overlap_only) continue; conflict = 0; break; - case DIFF_ALL: if (simple_only) continue; conflict = flagging; break; - } - - if (conflict) - { - conflicts_found = 1; - - - /* Mark end of conflict. */ - - fprintf (outputfile, "%da\n", D_HIGHLINE (b, mapping[FILE0])); - leading_dot = 0; - if (type == DIFF_ALL) - { - if (show_2nd) - { - /* Append lines from FILE1. */ - fprintf (outputfile, "||||||| %s\n", file1); - leading_dot = dotlines (outputfile, b, mapping[FILE1]); - } - /* Append lines from FILE2. */ - fprintf (outputfile, "=======\n"); - leading_dot |= dotlines (outputfile, b, mapping[FILE2]); - } - fprintf (outputfile, ">>>>>>> %s\n", file2); - undotlines (outputfile, leading_dot, - D_HIGHLINE (b, mapping[FILE0]) + 2, - (D_NUMLINES (b, mapping[FILE1]) - + D_NUMLINES (b, mapping[FILE2]) + 1)); - - - /* Mark start of conflict. */ - - fprintf (outputfile, "%da\n<<<<<<< %s\n", - D_LOWLINE (b, mapping[FILE0]) - 1, - type == DIFF_ALL ? file0 : file1); - leading_dot = 0; - if (type == DIFF_2ND) - { - /* Prepend lines from FILE1. */ - leading_dot = dotlines (outputfile, b, mapping[FILE1]); - fprintf (outputfile, "=======\n"); - } - undotlines (outputfile, leading_dot, - D_LOWLINE (b, mapping[FILE0]) + 1, - D_NUMLINES (b, mapping[FILE1])); - } - else if (D_NUMLINES (b, mapping[FILE2]) == 0) - /* Write out a delete */ - { - if (D_NUMLINES (b, mapping[FILE0]) == 1) - fprintf (outputfile, "%dd\n", - D_LOWLINE (b, mapping[FILE0])); - else - fprintf (outputfile, "%d,%dd\n", - D_LOWLINE (b, mapping[FILE0]), - D_HIGHLINE (b, mapping[FILE0])); - } - else - /* Write out an add or change */ - { - switch (D_NUMLINES (b, mapping[FILE0])) - { - case 0: - fprintf (outputfile, "%da\n", - D_HIGHLINE (b, mapping[FILE0])); - break; - case 1: - fprintf (outputfile, "%dc\n", - D_HIGHLINE (b, mapping[FILE0])); - break; - default: - fprintf (outputfile, "%d,%dc\n", - D_LOWLINE (b, mapping[FILE0]), - D_HIGHLINE (b, mapping[FILE0])); - break; - } - - undotlines (outputfile, dotlines (outputfile, b, mapping[FILE2]), - D_LOWLINE (b, mapping[FILE0]), - D_NUMLINES (b, mapping[FILE2])); - } - } - if (finalwrite) fprintf (outputfile, "w\nq\n"); - return conflicts_found; -} - -/* - * Read from INFILE and output to OUTPUTFILE a set of diff3_ blocks DIFF - * as a merged file. This acts like 'ed file0 <[output_diff3_edscript]', - * except that it works even for binary data or incomplete lines. - * - * As before, MAPPING maps from arg list file number to diff file number, - * REV_MAPPING is its inverse, - * and FILE0, FILE1, and FILE2 are the names of the files. - * - * Returns 1 if conflicts were found. - */ - -static int -output_diff3_merge (infile, outputfile, diff, mapping, rev_mapping, - file0, file1, file2) - FILE *infile, *outputfile; - struct diff3_block *diff; - int mapping[3], rev_mapping[3]; - char *file0, *file1, *file2; -{ - int c, i; - int conflicts_found = 0, conflict; - struct diff3_block *b; - int linesread = 0; - - for (b = diff; b; b = b->next) - { - /* Must do mapping correctly. */ - enum diff_type type - = ((b->correspond == DIFF_ALL) ? - DIFF_ALL : - ((enum diff_type) - (((int) DIFF_1ST) - + rev_mapping[(int) b->correspond - (int) DIFF_1ST]))); - char *format_2nd = "<<<<<<< %s\n"; - - /* If we aren't supposed to do this output block, skip it. */ - switch (type) - { - default: continue; - case DIFF_2ND: if (!show_2nd) continue; conflict = 1; break; - case DIFF_3RD: if (overlap_only) continue; conflict = 0; break; - case DIFF_ALL: if (simple_only) continue; conflict = flagging; - format_2nd = "||||||| %s\n"; - break; - } - - /* Copy I lines from file 0. */ - i = D_LOWLINE (b, FILE0) - linesread - 1; - linesread += i; - while (0 <= --i) - do - { - c = getc (infile); - if (c == EOF) - if (ferror (infile)) - perror_with_exit ("input file"); - else if (feof (infile)) - fatal ("input file shrank"); - putc (c, outputfile); - } - while (c != '\n'); - - if (conflict) - { - conflicts_found = 1; - - if (type == DIFF_ALL) - { - /* Put in lines from FILE0 with bracket. */ - fprintf (outputfile, "<<<<<<< %s\n", file0); - for (i = 0; - i < D_NUMLINES (b, mapping[FILE0]); - i++) - fwrite (D_RELNUM (b, mapping[FILE0], i), sizeof (char), - D_RELLEN (b, mapping[FILE0], i), outputfile); - } - - if (show_2nd) - { - /* Put in lines from FILE1 with bracket. */ - fprintf (outputfile, format_2nd, file1); - for (i = 0; - i < D_NUMLINES (b, mapping[FILE1]); - i++) - fwrite (D_RELNUM (b, mapping[FILE1], i), sizeof (char), - D_RELLEN (b, mapping[FILE1], i), outputfile); - } - - fprintf (outputfile, "=======\n"); - } - - /* Put in lines from FILE2. */ - for (i = 0; - i < D_NUMLINES (b, mapping[FILE2]); - i++) - fwrite (D_RELNUM (b, mapping[FILE2], i), sizeof (char), - D_RELLEN (b, mapping[FILE2], i), outputfile); - - if (conflict) - fprintf (outputfile, ">>>>>>> %s\n", file2); - - /* Skip I lines in file 0. */ - i = D_NUMLINES (b, FILE0); - linesread += i; - while (0 <= --i) - while ((c = getc (infile)) != '\n') - if (c == EOF) - if (ferror (infile)) - perror_with_exit ("input file"); - else if (feof (infile)) - { - if (i || b->next) - fatal ("input file shrank"); - return conflicts_found; - } - } - /* Copy rest of common file. */ - while ((c = getc (infile)) != EOF || !(ferror (infile) | feof (infile))) - putc (c, outputfile); - return conflicts_found; -} - -/* - * Reverse the order of the list of diff3 blocks. - */ -static struct diff3_block * -reverse_diff3_blocklist (diff) - struct diff3_block *diff; -{ - register struct diff3_block *tmp, *next, *prev; - - for (tmp = diff, prev = (struct diff3_block *) 0; - tmp; tmp = next) - { - next = tmp->next; - tmp->next = prev; - prev = tmp; - } - - return prev; -} - -static int -myread (fd, ptr, size) - int fd, size; - char *ptr; -{ - int result = read (fd, ptr, size); - if (result < 0) - perror_with_exit ("read failed"); - return result; -} - -VOID * -xmalloc (size) - unsigned size; -{ - VOID *result = (VOID *) malloc (size ? size : 1); - if (!result) - fatal ("virtual memory exhausted"); - return result; -} - -static VOID * -xrealloc (ptr, size) - VOID *ptr; - unsigned size; -{ - VOID *result = (VOID *) realloc (ptr, size ? size : 1); - if (!result) - fatal ("virtual memory exhausted"); - return result; -} - -static void -fatal (string) - char *string; -{ - fprintf (stderr, "%s: %s\n", argv0, string); - exit (2); -} - -static void -perror_with_exit (string) - char *string; -{ - int e = errno; - fprintf (stderr, "%s: ", argv0); - errno = e; - perror (string); - exit (2); -} diff --git a/gnu/usr.bin/diff3/getopt.c b/gnu/usr.bin/diff3/getopt.c deleted file mode 100644 index a59a01339835..000000000000 --- a/gnu/usr.bin/diff3/getopt.c +++ /dev/null @@ -1,731 +0,0 @@ -/* Getopt for GNU. - NOTE: getopt is now part of the C library, so if you don't know what - "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu - before changing it! - - Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 - Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* NOTE!!! AIX requires this to be the first thing in the file. - Do not put ANYTHING before it! */ -#if !defined (__GNUC__) && defined (_AIX) - #pragma alloca -#endif - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else /* not __GNUC__ */ -#if defined (HAVE_ALLOCA_H) || (defined(sparc) && (defined(sun) || (!defined(USG) && !defined(SVR4) && !defined(__svr4__)))) -#include <alloca.h> -#else -#ifndef _AIX -char *alloca (); -#endif -#endif /* alloca.h */ -#endif /* not __GNUC__ */ - -#if !__STDC__ && !defined(const) && IN_GCC -#define const -#endif - -/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */ -#ifndef _NO_PROTO -#define _NO_PROTO -#endif - -#include <stdio.h> - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -#undef alloca -/* Don't include stdlib.h for non-GNU C libraries because some of them - contain conflicting prototypes for getopt. */ -#include <stdlib.h> -#else /* Not GNU C library. */ -#define __alloca alloca -#endif /* GNU C library. */ - -/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a - long-named option. Because this is not POSIX.2 compliant, it is - being phased out. */ -/* #define GETOPT_COMPAT */ - -/* This version of `getopt' appears to the caller like standard Unix `getopt' - but it behaves differently for the user, since it allows the user - to intersperse the options with the other arguments. - - As `getopt' works, it permutes the elements of ARGV so that, - when it is done, all the options precede everything else. Thus - all application programs are extended to handle flexible argument order. - - Setting the environment variable POSIXLY_CORRECT disables permutation. - Then the behavior is completely standard. - - GNU application programs can use a third alternative mode in which - they can distinguish the relative order of options and other arguments. */ - -#include "getopt.h" - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -char *optarg = 0; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -/* XXX 1003.2 says this must be 1 before any call. */ -int optind = 0; - -/* The next char to be scanned in the option-element - in which the last option character we returned was found. - This allows us to pick up the scan where we left off. - - If this is zero, or a null string, it means resume the scan - by advancing to the next ARGV-element. */ - -static char *nextchar; - -/* Callers store zero here to inhibit the error message - for unrecognized options. */ - -int opterr = 1; - -/* Set to an option character which was unrecognized. - This must be initialized on some systems to avoid linking in the - system's own getopt implementation. */ - -int optopt = '?'; - -/* Describe how to deal with options that follow non-option ARGV-elements. - - If the caller did not specify anything, - the default is REQUIRE_ORDER if the environment variable - POSIXLY_CORRECT is defined, PERMUTE otherwise. - - REQUIRE_ORDER means don't recognize them as options; - stop option processing when the first non-option is seen. - This is what Unix does. - This mode of operation is selected by either setting the environment - variable POSIXLY_CORRECT, or using `+' as the first character - of the list of option characters. - - PERMUTE is the default. We permute the contents of ARGV as we scan, - so that eventually all the non-options are at the end. This allows options - to be given in any order, even with programs that were not written to - expect this. - - RETURN_IN_ORDER is an option available to programs that were written - to expect options and other ARGV-elements in any order and that care about - the ordering of the two. We describe each non-option ARGV-element - as if it were the argument of an option with character code 1. - Using `-' as the first character of the list of option characters - selects this mode of operation. - - The special argument `--' forces an end of option-scanning regardless - of the value of `ordering'. In the case of RETURN_IN_ORDER, only - `--' can cause `getopt' to return EOF with `optind' != ARGC. */ - -static enum -{ - REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER -} ordering; - -#ifdef __GNU_LIBRARY__ -/* We want to avoid inclusion of string.h with non-GNU libraries - because there are many ways it can cause trouble. - On some systems, it contains special magic macros that don't work - in GCC. */ -#include <string.h> -#define my_index strchr -#define my_bcopy(src, dst, n) memcpy ((dst), (src), (n)) -#else - -/* Avoid depending on library functions or files - whose names are inconsistent. */ - -char *getenv (); - -static char * -my_index (str, chr) - const char *str; - int chr; -{ - while (*str) - { - if (*str == chr) - return (char *) str; - str++; - } - return 0; -} - -static void -my_bcopy (from, to, size) - const char *from; - char *to; - int size; -{ - int i; - for (i = 0; i < size; i++) - to[i] = from[i]; -} -#endif /* GNU C library. */ - -/* Handle permutation of arguments. */ - -/* Describe the part of ARGV that contains non-options that have - been skipped. `first_nonopt' is the index in ARGV of the first of them; - `last_nonopt' is the index after the last of them. */ - -static int first_nonopt; -static int last_nonopt; - -/* Exchange two adjacent subsequences of ARGV. - One subsequence is elements [first_nonopt,last_nonopt) - which contains all the non-options that have been skipped so far. - The other is elements [last_nonopt,optind), which contains all - the options processed since those non-options were skipped. - - `first_nonopt' and `last_nonopt' are relocated so that they describe - the new indices of the non-options in ARGV after they are moved. */ - -static void -exchange (argv) - char **argv; -{ - int nonopts_size = (last_nonopt - first_nonopt) * sizeof (char *); - char **temp = (char **) __alloca (nonopts_size); - - /* Interchange the two blocks of data in ARGV. */ - - my_bcopy ((char *) &argv[first_nonopt], (char *) temp, nonopts_size); - my_bcopy ((char *) &argv[last_nonopt], (char *) &argv[first_nonopt], - (optind - last_nonopt) * sizeof (char *)); - my_bcopy ((char *) temp, - (char *) &argv[first_nonopt + optind - last_nonopt], - nonopts_size); - - /* Update records for the slots the non-options now occupy. */ - - first_nonopt += (optind - last_nonopt); - last_nonopt = optind; -} - -/* Scan elements of ARGV (whose length is ARGC) for option characters - given in OPTSTRING. - - If an element of ARGV starts with '-', and is not exactly "-" or "--", - then it is an option element. The characters of this element - (aside from the initial '-') are option characters. If `getopt' - is called repeatedly, it returns successively each of the option characters - from each of the option elements. - - If `getopt' finds another option character, it returns that character, - updating `optind' and `nextchar' so that the next call to `getopt' can - resume the scan with the following option character or ARGV-element. - - If there are no more option characters, `getopt' returns `EOF'. - Then `optind' is the index in ARGV of the first ARGV-element - that is not an option. (The ARGV-elements have been permuted - so that those that are not options now come last.) - - OPTSTRING is a string containing the legitimate option characters. - If an option character is seen that is not listed in OPTSTRING, - return '?' after printing an error message. If you set `opterr' to - zero, the error message is suppressed but we still return '?'. - - If a char in OPTSTRING is followed by a colon, that means it wants an arg, - so the following text in the same ARGV-element, or the text of the following - ARGV-element, is returned in `optarg'. Two colons mean an option that - wants an optional arg; if there is text in the current ARGV-element, - it is returned in `optarg', otherwise `optarg' is set to zero. - - If OPTSTRING starts with `-' or `+', it requests different methods of - handling the non-option ARGV-elements. - See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. - - Long-named options begin with `--' instead of `-'. - Their names may be abbreviated as long as the abbreviation is unique - or is an exact match for some defined option. If they have an - argument, it follows the option name in the same ARGV-element, separated - from the option name by a `=', or else the in next ARGV-element. - When `getopt' finds a long-named option, it returns 0 if that option's - `flag' field is nonzero, the value of the option's `val' field - if the `flag' field is zero. - - The elements of ARGV aren't really const, because we permute them. - But we pretend they're const in the prototype to be compatible - with other systems. - - LONGOPTS is a vector of `struct option' terminated by an - element containing a name which is zero. - - LONGIND returns the index in LONGOPT of the long-named option found. - It is only valid when a long-named option has been found by the most - recent call. - - If LONG_ONLY is nonzero, '-' as well as '--' can introduce - long-named options. */ - -int -_getopt_internal (argc, argv, optstring, longopts, longind, long_only) - int argc; - char *const *argv; - const char *optstring; - const struct option *longopts; - int *longind; - int long_only; -{ - int option_index; - - optarg = 0; - - /* Initialize the internal data when the first call is made. - Start processing options with ARGV-element 1 (since ARGV-element 0 - is the program name); the sequence of previously skipped - non-option ARGV-elements is empty. */ - - if (optind == 0) - { - first_nonopt = last_nonopt = optind = 1; - - nextchar = NULL; - - /* Determine how to handle the ordering of options and nonoptions. */ - - if (optstring[0] == '-') - { - ordering = RETURN_IN_ORDER; - ++optstring; - } - else if (optstring[0] == '+') - { - ordering = REQUIRE_ORDER; - ++optstring; - } - else if (getenv ("POSIXLY_CORRECT") != NULL) - ordering = REQUIRE_ORDER; - else - ordering = PERMUTE; - } - - if (nextchar == NULL || *nextchar == '\0') - { - if (ordering == PERMUTE) - { - /* If we have just processed some options following some non-options, - exchange them so that the options come first. */ - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (last_nonopt != optind) - first_nonopt = optind; - - /* Now skip any additional non-options - and extend the range of non-options previously skipped. */ - - while (optind < argc - && (argv[optind][0] != '-' || argv[optind][1] == '\0') -#ifdef GETOPT_COMPAT - && (longopts == NULL - || argv[optind][0] != '+' || argv[optind][1] == '\0') -#endif /* GETOPT_COMPAT */ - ) - optind++; - last_nonopt = optind; - } - - /* Special ARGV-element `--' means premature end of options. - Skip it like a null option, - then exchange with previous non-options as if it were an option, - then skip everything else like a non-option. */ - - if (optind != argc && !strcmp (argv[optind], "--")) - { - optind++; - - if (first_nonopt != last_nonopt && last_nonopt != optind) - exchange ((char **) argv); - else if (first_nonopt == last_nonopt) - first_nonopt = optind; - last_nonopt = argc; - - optind = argc; - } - - /* If we have done all the ARGV-elements, stop the scan - and back over any non-options that we skipped and permuted. */ - - if (optind == argc) - { - /* Set the next-arg-index to point at the non-options - that we previously skipped, so the caller will digest them. */ - if (first_nonopt != last_nonopt) - optind = first_nonopt; - return EOF; - } - - /* If we have come to a non-option and did not permute it, - either stop the scan or describe it to the caller and pass it by. */ - - if ((argv[optind][0] != '-' || argv[optind][1] == '\0') -#ifdef GETOPT_COMPAT - && (longopts == NULL - || argv[optind][0] != '+' || argv[optind][1] == '\0') -#endif /* GETOPT_COMPAT */ - ) - { - if (ordering == REQUIRE_ORDER) - return EOF; - optarg = argv[optind++]; - return 1; - } - - /* We have found another option-ARGV-element. - Start decoding its characters. */ - - nextchar = (argv[optind] + 1 - + (longopts != NULL && argv[optind][1] == '-')); - } - - if (longopts != NULL - && ((argv[optind][0] == '-' - && (argv[optind][1] == '-' || long_only)) -#ifdef GETOPT_COMPAT - || argv[optind][0] == '+' -#endif /* GETOPT_COMPAT */ - )) - { - const struct option *p; - char *s = nextchar; - int exact = 0; - int ambig = 0; - const struct option *pfound = NULL; - int indfound; - - while (*s && *s != '=') - s++; - - /* Test all options for either exact match or abbreviated matches. */ - for (p = longopts, option_index = 0; p->name; - p++, option_index++) - if (!strncmp (p->name, nextchar, s - nextchar)) - { - if (s - nextchar == strlen (p->name)) - { - /* Exact match found. */ - pfound = p; - indfound = option_index; - exact = 1; - break; - } - else if (pfound == NULL) - { - /* First nonexact match found. */ - pfound = p; - indfound = option_index; - } - else - /* Second nonexact match found. */ - ambig = 1; - } - - if (ambig && !exact) - { - if (opterr) - fprintf (stderr, "%s: option `%s' is ambiguous\n", - argv[0], argv[optind]); - nextchar += strlen (nextchar); - optind++; - return '?'; - } - - if (pfound != NULL) - { - option_index = indfound; - optind++; - if (*s) - { - /* Don't test has_arg with >, because some C compilers don't - allow it to be used on enums. */ - if (pfound->has_arg) - optarg = s + 1; - else - { - if (opterr) - { - if (argv[optind - 1][1] == '-') - /* --option */ - fprintf (stderr, - "%s: option `--%s' doesn't allow an argument\n", - argv[0], pfound->name); - else - /* +option or -option */ - fprintf (stderr, - "%s: option `%c%s' doesn't allow an argument\n", - argv[0], argv[optind - 1][0], pfound->name); - } - nextchar += strlen (nextchar); - return '?'; - } - } - else if (pfound->has_arg == 1) - { - if (optind < argc) - optarg = argv[optind++]; - else - { - if (opterr) - fprintf (stderr, "%s: option `%s' requires an argument\n", - argv[0], argv[optind - 1]); - nextchar += strlen (nextchar); - return optstring[0] == ':' ? ':' : '?'; - } - } - nextchar += strlen (nextchar); - if (longind != NULL) - *longind = option_index; - if (pfound->flag) - { - *(pfound->flag) = pfound->val; - return 0; - } - return pfound->val; - } - /* Can't find it as a long option. If this is not getopt_long_only, - or the option starts with '--' or is not a valid short - option, then it's an error. - Otherwise interpret it as a short option. */ - if (!long_only || argv[optind][1] == '-' -#ifdef GETOPT_COMPAT - || argv[optind][0] == '+' -#endif /* GETOPT_COMPAT */ - || my_index (optstring, *nextchar) == NULL) - { - if (opterr) - { - if (argv[optind][1] == '-') - /* --option */ - fprintf (stderr, "%s: unrecognized option `--%s'\n", - argv[0], nextchar); - else - /* +option or -option */ - fprintf (stderr, "%s: unrecognized option `%c%s'\n", - argv[0], argv[optind][0], nextchar); - } - nextchar = (char *) ""; - optind++; - return '?'; - } - } - - /* Look at and handle the next option-character. */ - - { - char c = *nextchar++; - char *temp = my_index (optstring, c); - - /* Increment `optind' when we start to process its last character. */ - if (*nextchar == '\0') - ++optind; - - if (temp == NULL || c == ':') - { - if (opterr) - { -#if 0 - if (c < 040 || c >= 0177) - fprintf (stderr, "%s: unrecognized option, character code 0%o\n", - argv[0], c); - else - fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); -#else - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); -#endif - } - optopt = c; - return '?'; - } - if (temp[1] == ':') - { - if (temp[2] == ':') - { - /* This is an option that accepts an argument optionally. */ - if (*nextchar != '\0') - { - optarg = nextchar; - optind++; - } - else - optarg = 0; - nextchar = NULL; - } - else - { - /* This is an option that requires an argument. */ - if (*nextchar != '\0') - { - optarg = nextchar; - /* If we end this ARGV-element by taking the rest as an arg, - we must advance to the next element now. */ - optind++; - } - else if (optind == argc) - { - if (opterr) - { -#if 0 - fprintf (stderr, "%s: option `-%c' requires an argument\n", - argv[0], c); -#else - /* 1003.2 specifies the format of this message. */ - fprintf (stderr, "%s: option requires an argument -- %c\n", - argv[0], c); -#endif - } - optopt = c; - if (optstring[0] == ':') - c = ':'; - else - c = '?'; - } - else - /* We already incremented `optind' once; - increment it again when taking next ARGV-elt as argument. */ - optarg = argv[optind++]; - nextchar = NULL; - } - } - return c; - } -} - -int -getopt (argc, argv, optstring) - int argc; - char *const *argv; - const char *optstring; -{ - return _getopt_internal (argc, argv, optstring, - (const struct option *) 0, - (int *) 0, - 0); -} - -#endif /* _LIBC or not __GNU_LIBRARY__. */ - -#ifdef TEST - -/* Compile with -DTEST to make an executable for use in testing - the above definition of `getopt'. */ - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - - c = getopt (argc, argv, "abc:d:0123456789"); - if (c == EOF) - break; - - switch (c) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case '?': - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff --git a/gnu/usr.bin/diff3/getopt.h b/gnu/usr.bin/diff3/getopt.h deleted file mode 100644 index 45541f5ac0f9..000000000000 --- a/gnu/usr.bin/diff3/getopt.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Declarations for getopt. - Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if __STDC__ - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#if __STDC__ -#if defined(__GNU_LIBRARY__) -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -#else /* not __GNU_LIBRARY__ */ -extern int getopt (); -#endif /* not __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); -#else /* not __STDC__ */ -extern int getopt (); -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -#endif /* not __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H */ diff --git a/gnu/usr.bin/diff3/getopt1.c b/gnu/usr.bin/diff3/getopt1.c deleted file mode 100644 index a32615ce36e7..000000000000 --- a/gnu/usr.bin/diff3/getopt1.c +++ /dev/null @@ -1,176 +0,0 @@ -/* getopt_long and getopt_long_only entry points for GNU getopt. - Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 - Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "getopt.h" - -#if !__STDC__ && !defined(const) && IN_GCC -#define const -#endif - -#include <stdio.h> - -/* Comment out all this code if we are using the GNU C Library, and are not - actually compiling the library itself. This code is part of the GNU C - Library, but also included in many other GNU distributions. Compiling - and linking in this code is a waste when using the GNU C library - (especially if it is a shared library). Rather than having every GNU - program understand `configure --with-gnu-libc' and omit the object files, - it is simpler to just do this in the source for each such file. */ - -#if defined (_LIBC) || !defined (__GNU_LIBRARY__) - - -/* This needs to come after some library #include - to get __GNU_LIBRARY__ defined. */ -#ifdef __GNU_LIBRARY__ -#include <stdlib.h> -#else -char *getenv (); -#endif - -#ifndef NULL -#define NULL 0 -#endif - -int -getopt_long (argc, argv, options, long_options, opt_index) - int argc; - char *const *argv; - const char *options; - const struct option *long_options; - int *opt_index; -{ - return _getopt_internal (argc, argv, options, long_options, opt_index, 0); -} - -/* Like getopt_long, but '-' as well as '--' can indicate a long option. - If an option that starts with '-' (not '--') doesn't match a long option, - but does match a short option, it is parsed as a short option - instead. */ - -int -getopt_long_only (argc, argv, options, long_options, opt_index) - int argc; - char *const *argv; - const char *options; - const struct option *long_options; - int *opt_index; -{ - return _getopt_internal (argc, argv, options, long_options, opt_index, 1); -} - - -#endif /* _LIBC or not __GNU_LIBRARY__. */ - -#ifdef TEST - -#include <stdio.h> - -int -main (argc, argv) - int argc; - char **argv; -{ - int c; - int digit_optind = 0; - - while (1) - { - int this_option_optind = optind ? optind : 1; - int option_index = 0; - static struct option long_options[] = - { - {"add", 1, 0, 0}, - {"append", 0, 0, 0}, - {"delete", 1, 0, 0}, - {"verbose", 0, 0, 0}, - {"create", 0, 0, 0}, - {"file", 1, 0, 0}, - {0, 0, 0, 0} - }; - - c = getopt_long (argc, argv, "abc:d:0123456789", - long_options, &option_index); - if (c == EOF) - break; - - switch (c) - { - case 0: - printf ("option %s", long_options[option_index].name); - if (optarg) - printf (" with arg %s", optarg); - printf ("\n"); - break; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - if (digit_optind != 0 && digit_optind != this_option_optind) - printf ("digits occur in two different argv-elements.\n"); - digit_optind = this_option_optind; - printf ("option %c\n", c); - break; - - case 'a': - printf ("option a\n"); - break; - - case 'b': - printf ("option b\n"); - break; - - case 'c': - printf ("option c with value `%s'\n", optarg); - break; - - case 'd': - printf ("option d with value `%s'\n", optarg); - break; - - case '?': - break; - - default: - printf ("?? getopt returned character code 0%o ??\n", c); - } - } - - if (optind < argc) - { - printf ("non-option ARGV-elements: "); - while (optind < argc) - printf ("%s ", argv[optind++]); - printf ("\n"); - } - - exit (0); -} - -#endif /* TEST */ diff --git a/gnu/usr.bin/diff3/system.h b/gnu/usr.bin/diff3/system.h deleted file mode 100644 index b17d39a08af8..000000000000 --- a/gnu/usr.bin/diff3/system.h +++ /dev/null @@ -1,159 +0,0 @@ -/* System dependent declarations. - Copyright (C) 1988, 1989, 1992, 1993 Free Software Foundation, Inc. - -This file is part of GNU DIFF. - -GNU DIFF is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. - -GNU DIFF is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU DIFF; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include <sys/types.h> -#include <sys/stat.h> - -#ifndef S_ISDIR -#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) -#endif -#ifndef S_ISREG -#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG) -#endif - -#if HAVE_UNISTD_H -#include <unistd.h> -#endif - -#if HAVE_TIME_H -#include <time.h> -#else -#include <sys/time.h> -#endif - -#if HAVE_FCNTL_H -#include <fcntl.h> -#else -#include <sys/file.h> -#endif - -#if !HAVE_DUP2 -#define dup2(f,t) (close (t), fcntl (f,F_DUPFD,t)) -#endif - -#ifndef O_RDONLY -#define O_RDONLY 0 -#endif - -#if HAVE_SYS_WAIT_H -#ifndef _POSIX_VERSION -/* Prevent the NeXT prototype using union wait from causing problems. */ -#define wait system_wait -#endif -#include <sys/wait.h> -#ifndef _POSIX_VERSION -#undef wait -#endif -#endif /* HAVE_SYS_WAIT_H */ - -#ifndef WEXITSTATUS -#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) -#undef WIFEXITED /* Avoid 4.3BSD incompatibility with Posix. */ -#endif -#ifndef WIFEXITED -#define WIFEXITED(stat_val) (((stat_val) & 255) == 0) -#endif - -#if HAVE_ST_BLKSIZE -#define STAT_BLOCKSIZE(s) (s).st_blksize -#else -#define STAT_BLOCKSIZE(s) (S_ISREG ((s).st_mode) ? 8192 : 4096) -#endif - -#if DIRENT || defined (_POSIX_VERSION) -#include <dirent.h> -#ifdef direct -#undef direct -#endif -#define direct dirent -#else /* ! (DIRENT || defined (_POSIX_VERSION)) */ -#if SYSNDIR -#include <sys/ndir.h> -#else -#if SYSDIR -#include <sys/dir.h> -#else -#include <ndir.h> -#endif -#endif -#endif /* ! (DIRENT || defined (_POSIX_VERSION)) */ - -#if HAVE_VFORK_H -#include <vfork.h> -#endif - -#if HAVE_STRING_H || STDC_HEADERS -#include <string.h> -#ifndef index -#define index strchr -#endif -#ifndef rindex -#define rindex strrchr -#endif -#ifndef bcopy -#define bcopy(s,d,n) memcpy (d,s,n) -#endif -#ifndef bcmp -#define bcmp(s1,s2,n) memcmp (s1,s2,n) -#endif -#ifndef bzero -#define bzero(s,n) memset (s,0,n) -#endif -#else -#include <strings.h> -#endif -#if !HAVE_MEMCHR && !STDC_HEADERS -char *memchr (); -#endif - -#if STDC_HEADERS -#include <stdlib.h> -#include <limits.h> -#else -char *getenv (); -char *malloc (); -char *realloc (); -#if __STDC__ || __GNUC__ -#include "limits.h" -#else -#define INT_MAX 2147483647 -#define CHAR_BIT 8 -#endif -#endif - -#include <errno.h> -#if !STDC_HEADERS -extern int errno; -#endif - -#ifdef TRUE -#undef TRUE -#endif -#ifdef FALSE -#undef FALSE -#endif -#define TRUE 1 -#define FALSE 0 - -#if !__STDC__ -#define volatile -#endif - -#define min(a,b) ((a) <= (b) ? (a) : (b)) -#define max(a,b) ((a) >= (b) ? (a) : (b)) diff --git a/gnu/usr.bin/diff3/version.c b/gnu/usr.bin/diff3/version.c deleted file mode 100644 index cb9d3b9c45c0..000000000000 --- a/gnu/usr.bin/diff3/version.c +++ /dev/null @@ -1,3 +0,0 @@ -/* Version number of GNU diff. */ - -char *version_string = "2.3"; diff --git a/gnu/usr.bin/grep/tests/regress.sh b/gnu/usr.bin/grep/tests/regress.sh deleted file mode 100644 index b947036467e0..000000000000 --- a/gnu/usr.bin/grep/tests/regress.sh +++ /dev/null @@ -1,30 +0,0 @@ -#! /bin/sh -# Regression test for GNU e?grep. -# Usage: regress.sh [dir-containing-egrep] - -builddir=${1-..} - -failures=0 - -# The Khadafy test is brought to you by Scott Anderson . . . -$builddir/egrep -f khadafy.regexp khadafy.lines > khadafy.out -if cmp khadafy.lines khadafy.out -then - rm khadafy.out -else - echo Khadafy test failed -- output left on khadafy.out - failures=1 -fi - -# . . . and the following by Henry Spencer. - -awk -F: -f scriptgen.awk spencer.tests > tmp.script - -if sh tmp.script $builddir -then - rm tmp.script - exit $failures -else - rm tmp.script - exit 1 -fi diff --git a/gnu/usr.bin/groff/eqn/eqn.cc b/gnu/usr.bin/groff/eqn/eqn.cc deleted file mode 100644 index 744a7555afd0..000000000000 --- a/gnu/usr.bin/groff/eqn/eqn.cc +++ /dev/null @@ -1,1162 +0,0 @@ -#ifndef lint -static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/90"; -#endif -#define YYBYACC 1 -#line 20 "/u/jjc/groff/eqn/eqn.y" -#include <stdio.h> -#include <string.h> -#include <stdlib.h> - -#include "lib.h" -#include "box.h" -extern int non_empty_flag; -char *strsave(const char *); -int yylex(); -void yyerror(const char *); -#line 32 "/u/jjc/groff/eqn/eqn.y" -typedef union { - char *str; - box *b; - pile_box *pb; - matrix_box *mb; - int n; - column *col; -} YYSTYPE; -#line 26 "y.tab.c" -#define OVER 257 -#define SMALLOVER 258 -#define SQRT 259 -#define SUB 260 -#define SUP 261 -#define LPILE 262 -#define RPILE 263 -#define CPILE 264 -#define PILE 265 -#define LEFT 266 -#define RIGHT 267 -#define TO 268 -#define FROM 269 -#define SIZE 270 -#define FONT 271 -#define ROMAN 272 -#define BOLD 273 -#define ITALIC 274 -#define FAT 275 -#define ACCENT 276 -#define BAR 277 -#define UNDER 278 -#define ABOVE 279 -#define TEXT 280 -#define QUOTED_TEXT 281 -#define FWD 282 -#define BACK 283 -#define DOWN 284 -#define UP 285 -#define MATRIX 286 -#define COL 287 -#define LCOL 288 -#define RCOL 289 -#define CCOL 290 -#define MARK 291 -#define LINEUP 292 -#define TYPE 293 -#define VCENTER 294 -#define PRIME 295 -#define SPLIT 296 -#define NOSPLIT 297 -#define UACCENT 298 -#define SPECIAL 299 -#define SPACE 300 -#define GFONT 301 -#define GSIZE 302 -#define DEFINE 303 -#define NDEFINE 304 -#define TDEFINE 305 -#define SDEFINE 306 -#define UNDEF 307 -#define IFDEF 308 -#define INCLUDE 309 -#define DELIM 310 -#define CHARTYPE 311 -#define SET 312 -#define GRFONT 313 -#define GBFONT 314 -#define YYERRCODE 256 -short yylhs[] = { -1, - 0, 0, 6, 6, 1, 1, 1, 2, 2, 2, - 2, 2, 3, 3, 3, 3, 4, 4, 7, 7, - 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 8, 11, 11, 12, 12, 13, - 13, 16, 16, 15, 15, 14, 14, 14, 14, 9, - 9, 10, 10, 10, -}; -short yylen[] = { 2, - 0, 1, 1, 2, 1, 2, 2, 1, 3, 3, - 5, 5, 1, 2, 3, 3, 1, 3, 1, 3, - 5, 1, 1, 2, 2, 1, 1, 1, 3, 2, - 2, 2, 2, 4, 5, 3, 2, 2, 2, 3, - 3, 2, 2, 2, 2, 3, 3, 3, 3, 3, - 3, 3, 2, 3, 1, 1, 3, 3, 4, 1, - 2, 1, 3, 3, 4, 2, 2, 2, 2, 1, - 1, 1, 1, 1, -}; -short yydefred[] = { 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 22, 23, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 27, 28, 0, - 0, 3, 5, 0, 13, 0, 0, 17, 14, 70, - 71, 0, 0, 55, 31, 32, 33, 30, 73, 74, - 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 7, 0, 0, 24, 25, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 37, 38, - 39, 0, 4, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, - 0, 29, 15, 16, 9, 0, 0, 20, 18, 40, - 41, 0, 58, 0, 0, 0, 0, 66, 67, 68, - 69, 34, 61, 0, 0, 0, 0, 59, 35, 0, - 0, 0, 11, 12, 21, 0, 64, 0, 0, 65, -}; -short yydgoto[] = { 31, - 32, 33, 34, 35, 36, 84, 38, 43, 44, 52, - 85, 45, 98, 99, 118, 131, -}; -short yysindex[] = { 1488, - 1527, -120, -120, -120, -120, -123, -249, -249, 1566, 1566, - 1566, 1566, 0, 0, -249, -249, -249, -249, -115, 1488, - 1488, -249, 1566, -256, -251, -249, 0, 0, 0, 1488, - 0, 0, 0, -221, 0, -233, 1488, 0, 0, 0, - 0, 1488, -85, 0, 0, 0, 0, 0, 0, 0, - 0, 1488, 1566, 1566, -195, -195, -195, -195, 1566, 1566, - 1566, 1566, -272, 0, 0, 1566, -195, 0, 0, 1566, - 1402, 1527, 1527, 1527, 1527, 1566, 1566, 1566, 0, 0, - 0, 1566, 0, 1488, -113, 1488, 1444, -195, -195, -195, - -195, -195, -195, -117, -117, -117, -117, -118, 0, -195, - -195, 0, 0, 0, 0, -167, -189, 0, 0, 0, - 0, 1488, 0, -106, -123, 1488, -83, 0, 0, 0, - 0, 0, 0, 1527, 1527, 1566, 1488, 0, 0, 1488, - -105, 1488, 0, 0, 0, 1488, 0, -104, 1488, 0, -}; -short yyrindex[] = { 41, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 1220, 46, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 85, 128, 363, 406, 0, 0, - 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -103, 0, 0, 185, 492, 727, 770, - 813, 856, 1091, 0, 0, 0, 0, 0, 0, 1134, - 1177, 0, 0, 0, 0, 42, 1220, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, -102, 0, 0, -101, - 0, 0, 0, 0, 0, 0, 0, 0, -99, 0, -}; -short yygindex[] = { 0, - -7, -69, 3, -66, 458, 9, -26, 52, 27, -63, - -32, 54, 0, -35, 2, -59, -}; -#define YYTABLESIZE 1865 -short yytable[] = { 49, - 8, 50, 42, 39, 105, 116, 122, 63, 37, 8, - 109, 113, 64, 65, 94, 95, 96, 97, 128, 137, - 140, 56, 57, 62, 68, 63, 76, 77, 69, 83, - 40, 41, 51, 53, 54, 72, 73, 86, 71, 132, - 1, 10, 78, 79, 80, 2, 74, 75, 66, 108, - 10, 129, 70, 114, 133, 134, 46, 47, 48, 135, - 87, 81, 123, 83, 82, 0, 59, 60, 61, 62, - 76, 126, 138, 0, 103, 104, 83, 106, 0, 83, - 78, 79, 80, 0, 42, 0, 78, 79, 80, 72, - 73, 0, 0, 42, 8, 0, 119, 120, 121, 81, - 124, 125, 82, 0, 0, 81, 0, 0, 82, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, - 127, 0, 83, 8, 130, 8, 8, 43, 0, 0, - 0, 83, 0, 0, 0, 10, 43, 0, 0, 0, - 130, 51, 0, 0, 139, 117, 117, 117, 117, 0, - 0, 0, 0, 0, 0, 0, 40, 41, 0, 40, - 41, 0, 40, 41, 10, 112, 10, 10, 94, 95, - 96, 97, 112, 136, 136, 56, 57, 62, 42, 63, - 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 42, 0, 42, - 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 43, 0, 43, 43, 0, 0, 0, 0, 0, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, - 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 36, - 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, - 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 0, 0, 44, 42, 42, 42, 42, 42, 42, 42, - 42, 44, 0, 0, 0, 42, 42, 42, 42, 0, - 42, 42, 0, 42, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 43, 0, 0, 45, 43, 43, 43, 43, - 43, 43, 43, 43, 45, 0, 0, 0, 43, 43, - 43, 43, 0, 43, 43, 0, 43, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 36, 0, 36, 36, 0, 0, 53, 0, - 0, 0, 36, 36, 0, 0, 44, 53, 0, 0, - 36, 36, 36, 36, 0, 0, 55, 56, 57, 58, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, - 67, 0, 36, 0, 0, 44, 0, 44, 44, 0, - 0, 47, 0, 0, 0, 0, 0, 0, 0, 45, - 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 88, 89, 0, 0, 0, 0, 90, 91, 92, 93, - 0, 0, 0, 100, 0, 0, 0, 101, 45, 0, - 45, 45, 0, 107, 0, 110, 0, 0, 0, 111, - 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 53, 0, 53, 53, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 47, 0, 47, 47, 0, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, - 0, 44, 44, 44, 44, 44, 44, 44, 44, 0, - 0, 0, 0, 44, 44, 44, 44, 0, 44, 44, - 0, 44, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 0, 0, 0, 45, 45, 45, 45, 45, 45, - 45, 45, 0, 0, 0, 0, 45, 45, 45, 45, - 0, 45, 45, 0, 45, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 0, 0, 46, 53, 53, 53, - 53, 53, 53, 53, 53, 46, 0, 0, 0, 53, - 53, 53, 53, 0, 53, 53, 0, 53, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 0, 0, 48, - 47, 47, 47, 47, 47, 47, 47, 47, 48, 0, - 0, 0, 47, 47, 47, 47, 0, 47, 47, 0, - 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, - 46, 49, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, - 0, 46, 46, 0, 0, 51, 0, 0, 0, 0, - 0, 0, 0, 48, 51, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 48, 0, 48, 48, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 49, 0, 49, 49, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, - 51, 51, 0, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 0, 0, 0, 46, 46, 46, 46, 46, - 46, 46, 46, 0, 0, 0, 0, 46, 46, 46, - 46, 0, 46, 46, 0, 46, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 0, 0, 0, 48, 48, - 48, 48, 48, 48, 48, 48, 0, 0, 0, 0, - 48, 48, 48, 48, 0, 48, 48, 0, 48, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 0, 0, - 50, 49, 49, 49, 49, 49, 49, 49, 49, 50, - 0, 0, 0, 49, 49, 49, 49, 0, 49, 49, - 0, 49, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 0, 0, 52, 51, 51, 51, 51, 51, 51, - 51, 51, 52, 0, 0, 0, 51, 51, 51, 51, - 0, 51, 51, 0, 51, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, - 0, 0, 0, 0, 50, 54, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 50, 0, 50, 50, 0, 0, 19, - 0, 0, 0, 0, 0, 0, 0, 52, 19, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 52, 0, 52, 52, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, - 0, 54, 54, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 0, 19, 19, 0, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 50, 50, 0, 0, 0, 50, - 50, 50, 50, 50, 50, 50, 50, 0, 0, 0, - 0, 50, 50, 50, 50, 0, 50, 50, 0, 50, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 0, - 29, 0, 52, 52, 52, 52, 52, 52, 52, 52, - 0, 0, 0, 0, 52, 52, 52, 52, 0, 52, - 52, 0, 52, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 29, 0, 0, 54, 54, 54, 54, 54, - 54, 54, 54, 0, 0, 0, 0, 54, 54, 54, - 54, 0, 54, 54, 0, 54, 19, 19, 19, 0, - 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 27, 29, 0, 19, 19, - 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, - 19, 19, 19, 19, 0, 19, 19, 0, 19, 0, - 0, 0, 0, 0, 30, 0, 102, 28, 0, 0, - 0, 0, 0, 0, 0, 29, 0, 27, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 30, 0, 0, 28, - 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 27, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 30, 0, 0, 28, 0, 0, 0, 0, 0, 0, - 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, - 0, 0, 28, 0, 0, 0, 0, 0, 0, 27, - 1, 0, 0, 2, 3, 4, 5, 6, 0, 0, - 0, 7, 8, 9, 10, 11, 12, 0, 0, 0, - 0, 13, 14, 15, 16, 17, 18, 19, 30, 0, - 0, 28, 20, 21, 22, 23, 0, 24, 25, 0, - 26, 0, 1, 0, 0, 2, 3, 4, 5, 6, - 115, 0, 0, 7, 8, 9, 10, 11, 12, 0, - 0, 0, 0, 13, 14, 15, 16, 17, 18, 19, - 0, 0, 0, 0, 20, 21, 22, 23, 0, 24, - 25, 0, 26, 0, 0, 0, 1, 0, 0, 2, - 3, 4, 5, 6, 0, 0, 0, 7, 8, 9, - 10, 11, 12, 0, 0, 0, 0, 13, 14, 15, - 16, 17, 18, 19, 0, 0, 0, 0, 20, 21, - 22, 23, 0, 24, 25, 1, 26, 0, 2, 3, - 4, 5, 6, 0, 0, 0, 7, 8, 9, 10, - 11, 12, 0, 0, 0, 0, 13, 14, 15, 16, - 17, 18, 19, 0, 0, 0, 0, 0, 0, 22, - 23, 0, 24, 25, 0, 26, 0, 2, 3, 4, - 5, 6, 0, 0, 0, 7, 8, 9, 10, 11, - 12, 0, 0, 0, 0, 13, 14, 15, 16, 17, - 18, 19, 0, 0, 0, 0, 0, 0, 22, 23, - 0, 24, 25, 0, 26, -}; -short yycheck[] = { 123, - 0, 125, 123, 1, 74, 123, 125, 123, 0, 9, - 77, 125, 20, 21, 287, 288, 289, 290, 125, 125, - 125, 125, 125, 125, 281, 125, 260, 261, 280, 37, - 280, 281, 6, 7, 8, 257, 258, 123, 30, 123, - 0, 0, 276, 277, 278, 0, 268, 269, 22, 76, - 9, 115, 26, 86, 124, 125, 3, 4, 5, 126, - 52, 295, 98, 71, 298, -1, 15, 16, 17, 18, - 260, 261, 132, -1, 72, 73, 84, 75, -1, 87, - 276, 277, 278, -1, 0, -1, 276, 277, 278, 257, - 258, -1, -1, 9, 94, -1, 95, 96, 97, 295, - 268, 269, 298, -1, -1, 295, -1, -1, 298, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 127, - 112, -1, 130, 123, 116, 125, 126, 0, -1, -1, - -1, 139, -1, -1, -1, 94, 9, -1, -1, -1, - 132, 115, -1, -1, 136, 94, 95, 96, 97, -1, - -1, -1, -1, -1, -1, -1, 280, 281, -1, 280, - 281, -1, 280, 281, 123, 279, 125, 126, 287, 288, - 289, 290, 279, 279, 279, 279, 279, 279, 94, 279, - -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 123, -1, 125, - 126, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 123, -1, 125, 126, -1, -1, -1, -1, -1, 259, - 260, 261, 262, 263, 264, 265, 266, 267, -1, -1, - 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, - 280, 281, 282, 283, 284, 285, 286, -1, -1, -1, - -1, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 125, - -1, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, 281, 282, 283, 284, 285, 286, -1, -1, - -1, -1, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 257, 258, 259, 260, 261, 262, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, - -1, -1, 0, 279, 280, 281, 282, 283, 284, 285, - 286, 9, -1, -1, -1, 291, 292, 293, 294, -1, - 296, 297, -1, 299, 257, 258, 259, 260, 261, 262, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 273, 274, 275, -1, -1, 0, 279, 280, 281, 282, - 283, 284, 285, 286, 9, -1, -1, -1, 291, 292, - 293, 294, -1, 296, 297, -1, 299, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 257, 258, -1, 260, 261, -1, -1, 0, -1, - -1, -1, 268, 269, -1, -1, 94, 9, -1, -1, - 276, 277, 278, 279, -1, -1, 9, 10, 11, 12, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 295, - 23, -1, 298, -1, -1, 123, -1, 125, 126, -1, - -1, 0, -1, -1, -1, -1, -1, -1, -1, 94, - 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 53, 54, -1, -1, -1, -1, 59, 60, 61, 62, - -1, -1, -1, 66, -1, -1, -1, 70, 123, -1, - 125, 126, -1, 76, -1, 78, -1, -1, -1, 82, - -1, -1, 94, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 123, -1, 125, 126, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 94, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 123, -1, 125, 126, -1, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, -1, -1, - -1, 279, 280, 281, 282, 283, 284, 285, 286, -1, - -1, -1, -1, 291, 292, 293, 294, -1, 296, 297, - -1, 299, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, -1, -1, -1, 279, 280, 281, 282, 283, 284, - 285, 286, -1, -1, -1, -1, 291, 292, 293, 294, - -1, 296, 297, -1, 299, 257, 258, 259, 260, 261, - 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 273, 274, 275, -1, -1, 0, 279, 280, 281, - 282, 283, 284, 285, 286, 9, -1, -1, -1, 291, - 292, 293, 294, -1, 296, 297, -1, 299, 257, 258, - 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, 273, 274, 275, -1, -1, 0, - 279, 280, 281, 282, 283, 284, 285, 286, 9, -1, - -1, -1, 291, 292, 293, 294, -1, 296, 297, -1, - 299, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, - 94, 9, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 123, - -1, 125, 126, -1, -1, 0, -1, -1, -1, -1, - -1, -1, -1, 94, 9, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 123, -1, 125, 126, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 94, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 123, -1, 125, 126, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 94, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 123, -1, - 125, 126, -1, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, -1, -1, -1, 279, 280, 281, 282, 283, - 284, 285, 286, -1, -1, -1, -1, 291, 292, 293, - 294, -1, 296, 297, -1, 299, 257, 258, 259, 260, - 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, -1, -1, -1, 279, 280, - 281, 282, 283, 284, 285, 286, -1, -1, -1, -1, - 291, 292, 293, 294, -1, 296, 297, -1, 299, 257, - 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, 273, 274, 275, -1, -1, - 0, 279, 280, 281, 282, 283, 284, 285, 286, 9, - -1, -1, -1, 291, 292, 293, 294, -1, 296, 297, - -1, 299, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, - 275, -1, -1, 0, 279, 280, 281, 282, 283, 284, - 285, 286, 9, -1, -1, -1, 291, 292, 293, 294, - -1, 296, 297, -1, 299, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, 94, 9, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 123, -1, 125, 126, -1, -1, 0, - -1, -1, -1, -1, -1, -1, -1, 94, 9, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 123, -1, 125, 126, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 123, - -1, 125, 126, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 94, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 123, -1, 125, 126, -1, 257, 258, 259, - 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, 273, 274, 275, -1, -1, -1, 279, - 280, 281, 282, 283, 284, 285, 286, -1, -1, -1, - -1, 291, 292, 293, 294, -1, 296, 297, -1, 299, - 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, -1, - 9, -1, 279, 280, 281, 282, 283, 284, 285, 286, - -1, -1, -1, -1, 291, 292, 293, 294, -1, 296, - 297, -1, 299, 257, 258, 259, 260, 261, 262, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, - 274, 275, 9, -1, -1, 279, 280, 281, 282, 283, - 284, 285, 286, -1, -1, -1, -1, 291, 292, 293, - 294, -1, 296, 297, -1, 299, 257, 258, 259, -1, - -1, 262, 263, 264, 265, 266, 267, 268, 269, 270, - 271, 272, 273, 274, 275, 94, 9, -1, 279, 280, - 281, 282, 283, 284, 285, 286, -1, -1, -1, -1, - 291, 292, 293, 294, -1, 296, 297, -1, 299, -1, - -1, -1, -1, -1, 123, -1, 125, 126, -1, -1, - -1, -1, -1, -1, -1, 9, -1, 94, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 123, -1, -1, 126, - -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, - -1, 94, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 123, -1, -1, 126, -1, -1, -1, -1, -1, -1, - 94, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 123, - -1, -1, 126, -1, -1, -1, -1, -1, -1, 94, - 259, -1, -1, 262, 263, 264, 265, 266, -1, -1, - -1, 270, 271, 272, 273, 274, 275, -1, -1, -1, - -1, 280, 281, 282, 283, 284, 285, 286, 123, -1, - -1, 126, 291, 292, 293, 294, -1, 296, 297, -1, - 299, -1, 259, -1, -1, 262, 263, 264, 265, 266, - 267, -1, -1, 270, 271, 272, 273, 274, 275, -1, - -1, -1, -1, 280, 281, 282, 283, 284, 285, 286, - -1, -1, -1, -1, 291, 292, 293, 294, -1, 296, - 297, -1, 299, -1, -1, -1, 259, -1, -1, 262, - 263, 264, 265, 266, -1, -1, -1, 270, 271, 272, - 273, 274, 275, -1, -1, -1, -1, 280, 281, 282, - 283, 284, 285, 286, -1, -1, -1, -1, 291, 292, - 293, 294, -1, 296, 297, 259, 299, -1, 262, 263, - 264, 265, 266, -1, -1, -1, 270, 271, 272, 273, - 274, 275, -1, -1, -1, -1, 280, 281, 282, 283, - 284, 285, 286, -1, -1, -1, -1, -1, -1, 293, - 294, -1, 296, 297, -1, 299, -1, 262, 263, 264, - 265, 266, -1, -1, -1, 270, 271, 272, 273, 274, - 275, -1, -1, -1, -1, 280, 281, 282, 283, 284, - 285, 286, -1, -1, -1, -1, -1, -1, 293, 294, - -1, 296, 297, -1, 299, -}; -#define YYFINAL 31 -#ifndef YYDEBUG -#define YYDEBUG 0 -#endif -#define YYMAXTOKEN 314 -#if YYDEBUG -char *yyname[] = { -"end-of-file",0,0,0,0,0,0,0,0,"'\\t'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'^'",0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'{'",0,"'}'","'~'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"OVER", -"SMALLOVER","SQRT","SUB","SUP","LPILE","RPILE","CPILE","PILE","LEFT","RIGHT", -"TO","FROM","SIZE","FONT","ROMAN","BOLD","ITALIC","FAT","ACCENT","BAR","UNDER", -"ABOVE","TEXT","QUOTED_TEXT","FWD","BACK","DOWN","UP","MATRIX","COL","LCOL", -"RCOL","CCOL","MARK","LINEUP","TYPE","VCENTER","PRIME","SPLIT","NOSPLIT", -"UACCENT","SPECIAL","SPACE","GFONT","GSIZE","DEFINE","NDEFINE","TDEFINE", -"SDEFINE","UNDEF","IFDEF","INCLUDE","DELIM","CHARTYPE","SET","GRFONT","GBFONT", -}; -char *yyrule[] = { -"$accept : top", -"top :", -"top : equation", -"equation : mark", -"equation : equation mark", -"mark : from_to", -"mark : MARK mark", -"mark : LINEUP mark", -"from_to : sqrt_over", -"from_to : sqrt_over TO from_to", -"from_to : sqrt_over FROM sqrt_over", -"from_to : sqrt_over FROM sqrt_over TO from_to", -"from_to : sqrt_over FROM sqrt_over FROM from_to", -"sqrt_over : script", -"sqrt_over : SQRT sqrt_over", -"sqrt_over : sqrt_over OVER sqrt_over", -"sqrt_over : sqrt_over SMALLOVER sqrt_over", -"script : nonsup", -"script : simple SUP script", -"nonsup : simple", -"nonsup : simple SUB nonsup", -"nonsup : simple SUB simple SUP script", -"simple : TEXT", -"simple : QUOTED_TEXT", -"simple : SPLIT QUOTED_TEXT", -"simple : NOSPLIT TEXT", -"simple : '^'", -"simple : '~'", -"simple : '\\t'", -"simple : '{' equation '}'", -"simple : PILE pile_arg", -"simple : LPILE pile_arg", -"simple : RPILE pile_arg", -"simple : CPILE pile_arg", -"simple : MATRIX '{' column_list '}'", -"simple : LEFT delim equation RIGHT delim", -"simple : LEFT delim equation", -"simple : simple BAR", -"simple : simple UNDER", -"simple : simple PRIME", -"simple : simple ACCENT simple", -"simple : simple UACCENT simple", -"simple : ROMAN simple", -"simple : BOLD simple", -"simple : ITALIC simple", -"simple : FAT simple", -"simple : FONT text simple", -"simple : SIZE text simple", -"simple : FWD number simple", -"simple : BACK number simple", -"simple : UP number simple", -"simple : DOWN number simple", -"simple : TYPE text simple", -"simple : VCENTER simple", -"simple : SPECIAL text simple", -"number : text", -"pile_element_list : equation", -"pile_element_list : pile_element_list ABOVE equation", -"pile_arg : '{' pile_element_list '}'", -"pile_arg : number '{' pile_element_list '}'", -"column_list : column", -"column_list : column_list column", -"column_element_list : equation", -"column_element_list : column_element_list ABOVE equation", -"column_arg : '{' column_element_list '}'", -"column_arg : number '{' column_element_list '}'", -"column : COL column_arg", -"column : LCOL column_arg", -"column : RCOL column_arg", -"column : CCOL column_arg", -"text : TEXT", -"text : QUOTED_TEXT", -"delim : text", -"delim : '{'", -"delim : '}'", -}; -#endif -#define yyclearin (yychar=(-1)) -#define yyerrok (yyerrflag=0) -#ifdef YYSTACKSIZE -#ifndef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE -#endif -#else -#ifdef YYMAXDEPTH -#define YYSTACKSIZE YYMAXDEPTH -#else -#define YYSTACKSIZE 500 -#define YYMAXDEPTH 500 -#endif -#endif -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short yyss[YYSTACKSIZE]; -YYSTYPE yyvs[YYSTACKSIZE]; -#define yystacksize YYSTACKSIZE -#define YYABORT goto yyabort -#define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab -int -yyparse() -{ - register int yym, yyn, yystate; -#if YYDEBUG - register char *yys; - extern char *getenv(); - - if (yys = getenv("YYDEBUG")) - { - yyn = *yys; - if (yyn >= '0' && yyn <= '9') - yydebug = yyn - '0'; - } -#endif - - yynerrs = 0; - yyerrflag = 0; - yychar = (-1); - - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; - -yyloop: - if (yyn = yydefred[yystate]) goto yyreduce; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, reading %d (%s)\n", yystate, - yychar, yys); - } -#endif - } - if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { -#if YYDEBUG - if (yydebug) - printf("yydebug: state %d, shifting to state %d\n", - yystate, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = (-1); - if (yyerrflag > 0) --yyerrflag; - goto yyloop; - } - if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { - yyn = yytable[yyn]; - goto yyreduce; - } - if (yyerrflag) goto yyinrecovery; -#ifdef lint - goto yynewerror; -#endif -yynewerror: - yyerror("syntax error"); -#ifdef lint - goto yyerrlab; -#endif -yyerrlab: - ++yynerrs; -yyinrecovery: - if (yyerrflag < 3) - { - yyerrflag = 3; - for (;;) - { - if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) - { -#if YYDEBUG - if (yydebug) - printf("yydebug: state %d, error recovery shifting\ - to state %d\n", *yyssp, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - goto yyloop; - } - else - { -#if YYDEBUG - if (yydebug) - printf("yydebug: error recovery discarding state %d\n", - *yyssp); -#endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; - } - } - } - else - { - if (yychar == 0) goto yyabort; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, error recovery discards token %d (%s)\n", - yystate, yychar, yys); - } -#endif - yychar = (-1); - goto yyloop; - } -yyreduce: -#if YYDEBUG - if (yydebug) - printf("yydebug: state %d, reducing by rule %d (%s)\n", - yystate, yyn, yyrule[yyn]); -#endif - yym = yylen[yyn]; - yyval = yyvsp[1-yym]; - switch (yyn) - { -case 2: -#line 126 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].b->top_level(); non_empty_flag = 1; } -break; -case 3: -#line 131 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = yyvsp[0].b; } -break; -case 4: -#line 133 "/u/jjc/groff/eqn/eqn.y" -{ - list_box *lb = yyvsp[-1].b->to_list_box(); - if (!lb) - lb = new list_box(yyvsp[-1].b); - lb->append(yyvsp[0].b); - yyval.b = lb; - } -break; -case 5: -#line 144 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = yyvsp[0].b; } -break; -case 6: -#line 146 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_mark_box(yyvsp[0].b); } -break; -case 7: -#line 148 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_lineup_box(yyvsp[0].b); } -break; -case 8: -#line 153 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = yyvsp[0].b; } -break; -case 9: -#line 155 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_limit_box(yyvsp[-2].b, 0, yyvsp[0].b); } -break; -case 10: -#line 157 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_limit_box(yyvsp[-2].b, yyvsp[0].b, 0); } -break; -case 11: -#line 159 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_limit_box(yyvsp[-4].b, yyvsp[-2].b, yyvsp[0].b); } -break; -case 12: -#line 161 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_limit_box(yyvsp[-4].b, make_limit_box(yyvsp[-2].b, yyvsp[0].b, 0), 0); } -break; -case 13: -#line 166 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = yyvsp[0].b; } -break; -case 14: -#line 168 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_sqrt_box(yyvsp[0].b); } -break; -case 15: -#line 170 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_over_box(yyvsp[-2].b, yyvsp[0].b); } -break; -case 16: -#line 172 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_small_over_box(yyvsp[-2].b, yyvsp[0].b); } -break; -case 17: -#line 177 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = yyvsp[0].b; } -break; -case 18: -#line 179 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_script_box(yyvsp[-2].b, 0, yyvsp[0].b); } -break; -case 19: -#line 184 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = yyvsp[0].b; } -break; -case 20: -#line 186 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_script_box(yyvsp[-2].b, yyvsp[0].b, 0); } -break; -case 21: -#line 188 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_script_box(yyvsp[-4].b, yyvsp[-2].b, yyvsp[0].b); } -break; -case 22: -#line 193 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = split_text(yyvsp[0].str); } -break; -case 23: -#line 195 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new quoted_text_box(yyvsp[0].str); } -break; -case 24: -#line 197 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = split_text(yyvsp[0].str); } -break; -case 25: -#line 199 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new quoted_text_box(yyvsp[0].str); } -break; -case 26: -#line 201 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new half_space_box; } -break; -case 27: -#line 203 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new space_box; } -break; -case 28: -#line 205 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new tab_box; } -break; -case 29: -#line 207 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = yyvsp[-1].b; } -break; -case 30: -#line 209 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].pb->set_alignment(CENTER_ALIGN); yyval.b = yyvsp[0].pb; } -break; -case 31: -#line 211 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].pb->set_alignment(LEFT_ALIGN); yyval.b = yyvsp[0].pb; } -break; -case 32: -#line 213 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].pb->set_alignment(RIGHT_ALIGN); yyval.b = yyvsp[0].pb; } -break; -case 33: -#line 215 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].pb->set_alignment(CENTER_ALIGN); yyval.b = yyvsp[0].pb; } -break; -case 34: -#line 217 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = yyvsp[-1].mb; } -break; -case 35: -#line 219 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_delim_box(yyvsp[-3].str, yyvsp[-2].b, yyvsp[0].str); } -break; -case 36: -#line 221 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_delim_box(yyvsp[-1].str, yyvsp[0].b, 0); } -break; -case 37: -#line 223 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_overline_box(yyvsp[-1].b); } -break; -case 38: -#line 225 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_underline_box(yyvsp[-1].b); } -break; -case 39: -#line 227 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_prime_box(yyvsp[-1].b); } -break; -case 40: -#line 229 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_accent_box(yyvsp[-2].b, yyvsp[0].b); } -break; -case 41: -#line 231 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_uaccent_box(yyvsp[-2].b, yyvsp[0].b); } -break; -case 42: -#line 233 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new font_box(strsave(get_grfont()), yyvsp[0].b); } -break; -case 43: -#line 235 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new font_box(strsave(get_gbfont()), yyvsp[0].b); } -break; -case 44: -#line 237 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new font_box(strsave(get_gfont()), yyvsp[0].b); } -break; -case 45: -#line 239 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new fat_box(yyvsp[0].b); } -break; -case 46: -#line 241 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new font_box(yyvsp[-1].str, yyvsp[0].b); } -break; -case 47: -#line 243 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new size_box(yyvsp[-1].str, yyvsp[0].b); } -break; -case 48: -#line 245 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new hmotion_box(yyvsp[-1].n, yyvsp[0].b); } -break; -case 49: -#line 247 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new hmotion_box(-yyvsp[-1].n, yyvsp[0].b); } -break; -case 50: -#line 249 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new vmotion_box(yyvsp[-1].n, yyvsp[0].b); } -break; -case 51: -#line 251 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new vmotion_box(-yyvsp[-1].n, yyvsp[0].b); } -break; -case 52: -#line 253 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].b->set_spacing_type(yyvsp[-1].str); yyval.b = yyvsp[0].b; } -break; -case 53: -#line 255 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = new vcenter_box(yyvsp[0].b); } -break; -case 54: -#line 257 "/u/jjc/groff/eqn/eqn.y" -{ yyval.b = make_special_box(yyvsp[-1].str, yyvsp[0].b); } -break; -case 55: -#line 262 "/u/jjc/groff/eqn/eqn.y" -{ - int n; - if (sscanf(yyvsp[0].str, "%d", &n) == 1) - yyval.n = n; - a_delete yyvsp[0].str; - } -break; -case 56: -#line 272 "/u/jjc/groff/eqn/eqn.y" -{ yyval.pb = new pile_box(yyvsp[0].b); } -break; -case 57: -#line 274 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[-2].pb->append(yyvsp[0].b); yyval.pb = yyvsp[-2].pb; } -break; -case 58: -#line 279 "/u/jjc/groff/eqn/eqn.y" -{ yyval.pb = yyvsp[-1].pb; } -break; -case 59: -#line 281 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[-1].pb->set_space(yyvsp[-3].n); yyval.pb = yyvsp[-1].pb; } -break; -case 60: -#line 286 "/u/jjc/groff/eqn/eqn.y" -{ yyval.mb = new matrix_box(yyvsp[0].col); } -break; -case 61: -#line 288 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[-1].mb->append(yyvsp[0].col); yyval.mb = yyvsp[-1].mb; } -break; -case 62: -#line 293 "/u/jjc/groff/eqn/eqn.y" -{ yyval.col = new column(yyvsp[0].b); } -break; -case 63: -#line 295 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[-2].col->append(yyvsp[0].b); yyval.col = yyvsp[-2].col; } -break; -case 64: -#line 300 "/u/jjc/groff/eqn/eqn.y" -{ yyval.col = yyvsp[-1].col; } -break; -case 65: -#line 302 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[-1].col->set_space(yyvsp[-3].n); yyval.col = yyvsp[-1].col; } -break; -case 66: -#line 307 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].col->set_alignment(CENTER_ALIGN); yyval.col = yyvsp[0].col; } -break; -case 67: -#line 309 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].col->set_alignment(LEFT_ALIGN); yyval.col = yyvsp[0].col; } -break; -case 68: -#line 311 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].col->set_alignment(RIGHT_ALIGN); yyval.col = yyvsp[0].col; } -break; -case 69: -#line 313 "/u/jjc/groff/eqn/eqn.y" -{ yyvsp[0].col->set_alignment(CENTER_ALIGN); yyval.col = yyvsp[0].col; } -break; -case 70: -#line 317 "/u/jjc/groff/eqn/eqn.y" -{ yyval.str = yyvsp[0].str; } -break; -case 71: -#line 319 "/u/jjc/groff/eqn/eqn.y" -{ yyval.str = yyvsp[0].str; } -break; -case 72: -#line 324 "/u/jjc/groff/eqn/eqn.y" -{ yyval.str = yyvsp[0].str; } -break; -case 73: -#line 326 "/u/jjc/groff/eqn/eqn.y" -{ yyval.str = strsave("{"); } -break; -case 74: -#line 328 "/u/jjc/groff/eqn/eqn.y" -{ yyval.str = strsave("}"); } -break; -#line 1107 "y.tab.c" - } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; - yym = yylhs[yyn]; - if (yystate == 0 && yym == 0) - { -#if YYDEBUG - if (yydebug) - printf("yydebug: after reduction, shifting from state 0 to\ - state %d\n", YYFINAL); -#endif - yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, reading %d (%s)\n", - YYFINAL, yychar, yys); - } -#endif - } - if (yychar == 0) goto yyaccept; - goto yyloop; - } - if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yystate) - yystate = yytable[yyn]; - else - yystate = yydgoto[yym]; -#if YYDEBUG - if (yydebug) - printf("yydebug: after reduction, shifting from state %d \ -to state %d\n", *yyssp, yystate); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate; - *++yyvsp = yyval; - goto yyloop; -yyoverflow: - yyerror("yacc stack overflow"); -yyabort: - return (1); -yyaccept: - return (0); -} diff --git a/gnu/usr.bin/groff/eqn/eqn.tab.h b/gnu/usr.bin/groff/eqn/eqn.tab.h deleted file mode 100644 index 9a8b3cb22595..000000000000 --- a/gnu/usr.bin/groff/eqn/eqn.tab.h +++ /dev/null @@ -1,67 +0,0 @@ -#define OVER 257 -#define SMALLOVER 258 -#define SQRT 259 -#define SUB 260 -#define SUP 261 -#define LPILE 262 -#define RPILE 263 -#define CPILE 264 -#define PILE 265 -#define LEFT 266 -#define RIGHT 267 -#define TO 268 -#define FROM 269 -#define SIZE 270 -#define FONT 271 -#define ROMAN 272 -#define BOLD 273 -#define ITALIC 274 -#define FAT 275 -#define ACCENT 276 -#define BAR 277 -#define UNDER 278 -#define ABOVE 279 -#define TEXT 280 -#define QUOTED_TEXT 281 -#define FWD 282 -#define BACK 283 -#define DOWN 284 -#define UP 285 -#define MATRIX 286 -#define COL 287 -#define LCOL 288 -#define RCOL 289 -#define CCOL 290 -#define MARK 291 -#define LINEUP 292 -#define TYPE 293 -#define VCENTER 294 -#define PRIME 295 -#define SPLIT 296 -#define NOSPLIT 297 -#define UACCENT 298 -#define SPECIAL 299 -#define SPACE 300 -#define GFONT 301 -#define GSIZE 302 -#define DEFINE 303 -#define NDEFINE 304 -#define TDEFINE 305 -#define SDEFINE 306 -#define UNDEF 307 -#define IFDEF 308 -#define INCLUDE 309 -#define DELIM 310 -#define CHARTYPE 311 -#define SET 312 -#define GRFONT 313 -#define GBFONT 314 -typedef union { - char *str; - box *b; - pile_box *pb; - matrix_box *mb; - int n; - column *col; -} YYSTYPE; -extern YYSTYPE yylval; diff --git a/gnu/usr.bin/groff/pic/pic.cc b/gnu/usr.bin/groff/pic/pic.cc deleted file mode 100644 index a85ff8ba1c2b..000000000000 --- a/gnu/usr.bin/groff/pic/pic.cc +++ /dev/null @@ -1,5166 +0,0 @@ -#ifndef lint -static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/90"; -#endif -#define YYBYACC 1 -#line 20 "/u/jjc/groff/pic/pic.y" -#include "pic.h" -#include "ptable.h" -#include "object.h" - -extern int delim_flag; -extern void do_copy(const char *); -extern void copy_rest_thru(const char *, const char *); -extern void copy_file_thru(const char *, const char *, const char *); -extern void push_body(const char *); -extern void do_for(char *var, double from, double to, - int by_is_multiplicative, double by, char *body); -extern void do_lookahead(); - -#undef fmod -#undef rand - -extern "C" { - double fmod(double, double); - int rand(); -} - -/* Maximum number of characters produced by printf("%g") */ -#define GDIGITS 14 - -int yylex(); -void yyerror(const char *); - -void reset(const char *nm); -void reset_all(); - -place *lookup_label(const char *); -void define_label(const char *label, const place *pl); - -direction current_direction; -position current_position; - -implement_ptable(place) - -PTABLE(place) top_table; - -PTABLE(place) *current_table = &top_table; -saved_state *current_saved_state = 0; - -object_list olist; - -const char *ordinal_postfix(int n); -const char *object_type_name(object_type type); -char *format_number(const char *form, double n); -char *do_sprintf(const char *form, const double *v, int nv); - -#line 73 "/u/jjc/groff/pic/pic.y" -typedef union { - char *str; - int n; - double x; - struct { double x, y; } pair; - struct { double x; char *body; } if_data; - struct { char *str; const char *filename; int lineno; } lstr; - struct { double *v; int nv; int maxv; } dv; - struct { double val; int is_multiplicative; } by; - place pl; - object *obj; - corner crn; - path *pth; - object_spec *spec; - saved_state *pstate; - graphics_state state; - object_type obtype; -} YYSTYPE; -#line 76 "y.tab.c" -#define LABEL 257 -#define VARIABLE 258 -#define NUMBER 259 -#define TEXT 260 -#define COMMAND_LINE 261 -#define DELIMITED 262 -#define ORDINAL 263 -#define TH 264 -#define LEFT_ARROW_HEAD 265 -#define RIGHT_ARROW_HEAD 266 -#define DOUBLE_ARROW_HEAD 267 -#define LAST 268 -#define UP 269 -#define DOWN 270 -#define LEFT 271 -#define RIGHT 272 -#define BOX 273 -#define CIRCLE 274 -#define ELLIPSE 275 -#define ARC 276 -#define LINE 277 -#define ARROW 278 -#define MOVE 279 -#define SPLINE 280 -#define HEIGHT 281 -#define RADIUS 282 -#define WIDTH 283 -#define DIAMETER 284 -#define FROM 285 -#define TO 286 -#define AT 287 -#define WITH 288 -#define BY 289 -#define THEN 290 -#define DOTTED 291 -#define DASHED 292 -#define CHOP 293 -#define SAME 294 -#define INVISIBLE 295 -#define LJUST 296 -#define RJUST 297 -#define ABOVE 298 -#define BELOW 299 -#define OF 300 -#define THE 301 -#define WAY 302 -#define BETWEEN 303 -#define AND 304 -#define HERE 305 -#define DOT_N 306 -#define DOT_E 307 -#define DOT_W 308 -#define DOT_S 309 -#define DOT_NE 310 -#define DOT_SE 311 -#define DOT_NW 312 -#define DOT_SW 313 -#define DOT_C 314 -#define DOT_START 315 -#define DOT_END 316 -#define DOT_X 317 -#define DOT_Y 318 -#define DOT_HT 319 -#define DOT_WID 320 -#define DOT_RAD 321 -#define SIN 322 -#define COS 323 -#define ATAN2 324 -#define LOG 325 -#define EXP 326 -#define SQRT 327 -#define K_MAX 328 -#define K_MIN 329 -#define INT 330 -#define RAND 331 -#define COPY 332 -#define THRU 333 -#define TOP 334 -#define BOTTOM 335 -#define UPPER 336 -#define LOWER 337 -#define SH 338 -#define PRINT 339 -#define CW 340 -#define CCW 341 -#define FOR 342 -#define DO 343 -#define IF 344 -#define ELSE 345 -#define ANDAND 346 -#define OROR 347 -#define NOTEQUAL 348 -#define EQUALEQUAL 349 -#define LESSEQUAL 350 -#define GREATEREQUAL 351 -#define LEFT_CORNER 352 -#define RIGHT_CORNER 353 -#define CENTER 354 -#define END 355 -#define START 356 -#define RESET 357 -#define UNTIL 358 -#define PLOT 359 -#define THICKNESS 360 -#define FILL 361 -#define ALIGNED 362 -#define SPRINTF 363 -#define COMMAND 364 -#define DEFINE 365 -#define UNDEF 366 -#define YYERRCODE 256 -short yylhs[] = { -1, - 0, 0, 16, 17, 17, 28, 28, 29, 29, 30, - 30, 30, 30, 30, 30, 30, 30, 30, 31, 30, - 30, 32, 33, 30, 34, 35, 30, 36, 30, 30, - 37, 30, 30, 30, 38, 38, 38, 26, 26, 27, - 27, 27, 39, 7, 23, 23, 2, 2, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, - 15, 15, 15, 15, 40, 42, 15, 15, 41, 41, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 43, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 25, 25, 24, 24, 19, 19, - 6, 6, 6, 6, 6, 6, 44, 44, 5, 5, - 13, 13, 13, 13, 13, 14, 14, 14, 22, 22, - 21, 21, 8, 8, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 11, 11, 12, 12, 12, 10, 10, - 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, -}; -short yylen[] = { 2, - 1, 1, 3, 1, 3, 0, 1, 1, 2, 3, - 4, 1, 1, 1, 1, 1, 2, 2, 0, 3, - 2, 0, 0, 7, 0, 0, 6, 0, 10, 1, - 0, 4, 1, 1, 2, 2, 3, 1, 2, 1, - 1, 1, 0, 5, 0, 2, 1, 1, 3, 3, - 3, 3, 3, 3, 3, 3, 2, 0, 2, 3, - 1, 4, 4, 4, 0, 0, 6, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, - 3, 0, 4, 3, 3, 3, 3, 2, 2, 3, - 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, - 3, 2, 2, 3, 2, 3, 2, 3, 2, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 3, 2, 1, 5, 0, 3, 1, 1, - 1, 3, 3, 5, 5, 6, 1, 4, 3, 3, - 1, 2, 2, 3, 1, 1, 1, 3, 1, 3, - 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, - 1, 2, 1, 2, 3, 1, 1, 2, 1, 4, - 3, 3, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, - 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 2, 3, 4, 4, 6, 4, - 4, 4, 6, 6, 4, 4, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 2, -}; -short yydefred[] = { 0, - 8, 0, 2, 0, 0, 0, 0, 125, 16, 12, - 13, 14, 15, 71, 72, 73, 74, 75, 76, 77, - 78, 0, 19, 0, 0, 0, 0, 0, 0, 0, - 65, 82, 0, 4, 0, 0, 79, 68, 0, 9, - 0, 0, 0, 0, 25, 0, 146, 202, 203, 149, - 151, 187, 188, 145, 174, 175, 176, 177, 178, 179, - 180, 181, 182, 183, 184, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 185, 186, 0, 0, 193, - 194, 199, 201, 200, 0, 0, 0, 0, 0, 131, - 129, 147, 0, 0, 0, 0, 0, 0, 41, 0, - 38, 0, 0, 0, 0, 0, 0, 0, 0, 35, - 0, 0, 0, 0, 0, 31, 3, 0, 113, 114, - 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 102, 0, 0, 0, 111, 112, - 119, 120, 121, 122, 116, 117, 0, 0, 124, 0, - 118, 36, 0, 0, 10, 0, 22, 0, 20, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, - 191, 195, 197, 190, 192, 196, 198, 0, 0, 0, - 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 204, 205, 206, 207, 208, 0, - 142, 0, 0, 163, 155, 156, 157, 158, 159, 160, - 161, 0, 154, 152, 153, 39, 0, 0, 57, 0, - 0, 0, 43, 0, 0, 0, 0, 81, 127, 0, - 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 166, 100, 0, 169, 0, 0, 101, 0, 0, 0, - 0, 0, 37, 0, 0, 0, 0, 0, 0, 62, - 0, 11, 0, 26, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 227, 0, 216, 140, 0, 150, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 148, 132, - 133, 162, 0, 0, 53, 0, 0, 0, 0, 0, - 51, 0, 0, 50, 49, 0, 66, 83, 32, 173, - 0, 0, 0, 164, 0, 168, 0, 0, 23, 0, - 217, 218, 0, 220, 221, 222, 0, 0, 225, 226, - 0, 0, 0, 0, 0, 44, 0, 126, 0, 0, - 172, 171, 165, 0, 0, 27, 0, 0, 0, 134, - 138, 0, 0, 0, 0, 70, 67, 170, 24, 46, - 219, 223, 224, 136, 0, 0, 0, 0, 28, 0, - 0, 29, -}; -short yydgoto[] = { 2, - 105, 179, 107, 396, 90, 91, 33, 92, 93, 262, - 263, 264, 108, 95, 34, 3, 35, 36, 96, 223, - 97, 98, 376, 336, 109, 100, 101, 241, 5, 38, - 46, 283, 374, 158, 350, 401, 243, 39, 329, 114, - 387, 369, 115, 202, -}; -short yysindex[] = { -52, - 0, 0, 0, 5088, -25, -11, 21, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -243, 0,10878, -206,11047, -204,11505, 19,10878, - 0, 0, -275, 0, -52,10742, 0, 0, -42, 0, - -52,11047, 16, -239, 0, -165, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 71, 93, 98, 106, 108, - 120, 139, 147, 153, 156, 0, 0, -110, 44, 0, - 0, 0, 0, 0,11177,11047,11505,11505, 1055, 0, - 0, 0, -45, -61, 2441, -19, 747, 312, 0,10878, - 0, 152,11047,11047, 1515, -89, -228, -61, -98, 0, - 637, -38,10878, -52, -52, 0, 0, 9673, 0, 0, - 0,11829,11829,11829,11829,11505,11505,11505,11505,11621, -11621,11621, 2099,11726, 0,11829,11829,11829, 0, 0, - 0, 0, 0, 0, 0, 0,11505,11829, 0, 1527, - 0, 0, -41,10520, 0,11047, 0, -32, 0,11047, -11047,11047,11047,11047,11047,11047,11047,11047, 9002, 0, - 0, 0, 0, 0, 0, 0, 0, 1494, 183, 187, - -4, -30, 143, 143, -53, 0,11505,11505,11505,11505, -11505,11505,11505,11621,11505,11505,11505,11505,11505,11505, -11505,11621, -43, 199, 0, 0, 0, 0, 0, -17, - 0,11726,11726, 0, 0, 0, 0, 0, 0, 0, - 0, 168, 0, 0, 0, 0,11505, 143, 0,11047, -11047,11505, 0,11047,11047, -229, -229, 0, 0, 148, - 5088, 171, 15, 0, 1527, 1527, 1527, 1527, 1527, 1527, - 1527, 1527, 1055, -19, -19, -19, 1989, 699, 747, 23, - 0, 0, 2428, 0,11284, 648, 0, 1527, 1527, 1527, - 1527, 1527, 0, -11, 21, 0, 0, 0, -61, 0, - -19, 0, 17, 0, 240, 244, 242, 249, 255, 257, - 256, 258, 260, 0, 262, 0, 0,11621, 0, -9, - -27, 184, 252, 252, 1, 1, 1527, -34, 40, 1, - 155, 155, 143, 143, 143, 143, -22, 199, 0, 0, - 0, 0, 1088, -27, 0, 1048, -40, 1, 42, -27, - 0, 1048, -40, 0, 0, 47, 0, 0, 0, 0, - 747, 1989, 1989, 0, 48, 0, 1076, 187, 0, -51, - 0, 0,11047, 0, 0, 0,11047,11047, 0, 0, - 100, 5,11621,11621,11505, 0,11505, 0, 5088, 1989, - 0, 0, 0, -51, 49, 0, 272, 284, 287, 0, - 0, 30, -19, 1487, 1527, 0, 0, 0, 0, 0, - 0, 0, 0, 0,11385, -14,11505, 1527, 0, 1527, - 72, 0, -}; -short yyrindex[] = { 219, - 0, 0, 0, 344, 109, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, - 0, 0, 57, 0, 65, 58, 0, 0, 390, 0, -10629, 0, 0, 412, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9146, 0, - 0, 0, 0, 4421, 8691, 9247, 0, 0, 0, 500, - 0, 0, 0, 0, 411, 0, 564, 0, 0, 0, -10123, 0, 508, 5512, 5512, 0, 0, 122, 0, 0, - 0, 66, 9595, 9353, 9486, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9700, 9804, 9909, 0, 0, - 0, 0, 0, 0, 0, 0, 0,10013, 0, 4967, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 304, 0, 227, - 0, 0, 469, 577, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 3104, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,10455, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5284, 5391, 5708, 5815, 6132, 6239, - 6556, 6663, 0, 6980, 7087, 7404, 0, 0, 0, 0, - 0, 0, 8873, 0, 0, 0, 0, 7511, 7828, 7935, - 8252, 8359, 0,10222, 1933, 1729, 3046, 919, 947, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3982, 4089, 3211, 3543, 2226, 2333, 4860, 8766, 0, 2665, - 1787, 1894, 909, 1016, 1348, 1455, 0, 3650, 0, 0, - 0, 0, 0, 8845, 0, 27, 28, 2772, 0, 140, - 0, 194, 195, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 304, 0, 0, 547, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 575, 0, - 0, 0, 0, 547, 0, 0, 0, 0, 0, 0, - 0, 0, 4528, 33, 52, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, - 0, 0, -}; -short yygindex[] = { 0, - -24, 498, -99, 0, -56, 237, 0, 0, -59, 0, - 0, -215, 515, -74, -117, 161, 0, 0, 1810, -73, - 0, 0, 18, 0, 26, 368, -68, 14, 364, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, -}; -#define YYTABLESIZE 12185 -short yytable[] = { 89, - 244, 153, 200, 111, 229, 89, 1, 198, 196, 200, - 197, 150, 199, 4, 198, 196, 44, 197, 204, 199, - 212, 34, 213, 212, 225, 213, 235, 56, 180, 37, - 8, 226, 232, 40, 195, 211, 280, 200, 212, 298, - 213, 340, 198, 196, 226, 197, 41, 199, 117, 99, - 86, 102, 86, 110, 154, 99, 30, 61, 112, 201, - 178, 151, 183, 184, 6, 89, 201, 235, 56, 116, - 235, 56, 212, 261, 213, 89, 156, 267, 43, 228, - 34, 42, 212, 363, 213, 235, 56, 368, 89, 45, - 367, 394, 128, 157, 201, 128, 159, 245, 246, 247, - 248, 249, 250, 251, 252, 253, 253, 253, 7, 266, - 160, 268, 269, 270, 34, 30, 61, 234, 235, 235, - 56, 7, 271, 272, 89, 99, 371, 372, 318, 253, - 325, 327, 161, 29, 331, 333, 238, 162, 99, 52, - 380, 7, 212, 37, 213, 163, 34, 164, 7, 30, - 61, 235, 56, 7, 388, 320, 321, 6, 89, 165, - 170, 171, 301, 302, 303, 304, 305, 306, 307, 308, - 310, 311, 312, 313, 314, 315, 316, 253, 166, 37, - 52, 30, 61, 52, 342, 343, 167, 266, 266, 6, - 89, 200, 168, 55, 54, 169, 198, 261, 52, 7, - 233, 199, 323, 346, 7, 324, 326, 328, 348, 330, - 332, 47, 227, 47, 7, 152, 273, 50, 6, 50, - 200, 239, 51, 296, 51, 198, 196, 297, 197, 284, - 199, 7, 52, 299, 55, 54, 201, 55, 54, 319, - 347, 172, 173, 232, 210, 195, 7, 300, 201, 236, - 237, 386, 55, 54, 203, 205, 206, 207, 208, 209, - 322, 334, 335, 338, 52, 185, 37, 370, 186, 131, - 131, 131, 337, 253, 240, 242, 339, 201, 349, 344, - 351, 364, 261, 261, 352, 353, 55, 54, 200, 354, - 235, 56, 362, 198, 196, 355, 197, 356, 199, 357, - 359, 358, 360, 366, 373, 234, 375, 381, 390, 6, - 261, 232, 391, 195, 174, 175, 235, 56, 55, 54, - 189, 190, 191, 192, 392, 89, 235, 393, 399, 235, - 89, 89, 89, 402, 89, 89, 89, 89, 253, 253, - 384, 6, 385, 1, 47, 201, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 89, 89, 7, 7, 7, 7, 7, - 398, 7, 400, 235, 56, 58, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 33, - 278, 389, 59, 60, 37, 176, 177, 113, 118, 0, - 0, 0, 222, 52, 0, 89, 89, 0, 0, 0, - 47, 21, 0, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 89, 89, 89, 89, 52, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 0, 7, 7, 7, 7, 7, 7, 33, 0, - 7, 47, 7, 0, 47, 0, 0, 55, 54, 0, - 7, 7, 7, 7, 7, 7, 0, 7, 215, 47, - 21, 7, 7, 0, 0, 6, 6, 0, 6, 6, - 0, 0, 33, 55, 54, 52, 52, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 18, - 0, 215, 0, 47, 21, 215, 0, 17, 215, 215, - 215, 215, 215, 215, 33, 215, 0, 0, 0, 0, - 0, 0, 0, 106, 0, 0, 0, 215, 215, 187, - 215, 189, 190, 191, 192, 47, 21, 0, 94, 155, - 55, 54, 0, 0, 94, 0, 45, 0, 0, 0, - 6, 0, 0, 0, 0, 0, 6, 6, 18, 0, - 6, 215, 6, 48, 215, 0, 17, 0, 0, 0, - 0, 214, 0, 0, 69, 6, 236, 6, 0, 224, - 0, 6, 6, 182, 215, 216, 217, 218, 219, 220, - 0, 221, 18, 215, 0, 0, 0, 0, 0, 94, - 17, 191, 192, 0, 48, 45, 0, 48, 0, 236, - 0, 0, 0, 236, 94, 0, 236, 236, 236, 236, - 236, 236, 48, 236, 18, 0, 0, 94, 0, 0, - 0, 0, 17, 69, 0, 236, 236, 0, 236, 45, - 0, 0, 0, 0, 94, 94, 94, 0, 0, 0, - 0, 0, 0, 282, 0, 0, 48, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 295, 69, 279, 236, - 0, 45, 236, 200, 47, 0, 0, 0, 198, 196, - 0, 197, 0, 199, 200, 0, 0, 0, 48, 198, - 196, 193, 197, 0, 199, 0, 232, 0, 195, 69, - 47, 236, 0, 0, 0, 0, 0, 232, 94, 195, - 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, - 0, 0, 0, 0, 0, 215, 215, 215, 215, 0, - 201, 215, 215, 215, 215, 215, 215, 215, 215, 215, - 215, 201, 0, 0, 0, 0, 0, 0, 0, 215, - 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 215, 215, 215, 215, 215, 215, 0, - 0, 215, 215, 215, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 215, 215, 0, 0, 0, 0, 222, - 215, 215, 215, 215, 215, 215, 215, 215, 215, 215, - 0, 0, 215, 215, 215, 215, 0, 0, 215, 215, - 0, 215, 94, 0, 215, 215, 215, 215, 215, 215, - 215, 215, 215, 215, 215, 0, 0, 48, 215, 215, - 215, 215, 0, 236, 236, 236, 236, 222, 0, 236, - 236, 236, 236, 236, 236, 236, 236, 236, 236, 0, - 377, 0, 0, 48, 378, 379, 0, 236, 236, 236, - 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, - 236, 236, 236, 236, 236, 236, 236, 94, 94, 236, - 236, 236, 236, 236, 236, 236, 236, 236, 236, 236, - 236, 236, 236, 0, 0, 0, 8, 0, 236, 236, - 236, 236, 236, 236, 236, 236, 236, 236, 211, 0, - 236, 236, 236, 236, 0, 0, 236, 236, 63, 236, - 0, 0, 236, 236, 236, 236, 236, 236, 236, 236, - 236, 236, 236, 0, 0, 0, 236, 236, 236, 236, - 0, 211, 0, 0, 0, 211, 64, 0, 211, 211, - 211, 211, 211, 211, 0, 211, 0, 0, 214, 0, - 0, 129, 0, 129, 0, 0, 341, 211, 211, 0, - 211, 215, 216, 217, 218, 219, 220, 63, 221, 0, - 0, 0, 187, 188, 189, 190, 191, 192, 0, 130, - 0, 130, 0, 187, 188, 189, 190, 191, 192, 29, - 0, 211, 0, 0, 211, 64, 214, 0, 0, 0, - 0, 63, 0, 0, 0, 212, 0, 0, 0, 215, - 216, 217, 218, 219, 220, 0, 221, 0, 0, 0, - 0, 0, 0, 211, 0, 0, 0, 0, 0, 64, - 0, 0, 0, 63, 0, 0, 0, 0, 212, 0, - 0, 0, 212, 0, 0, 212, 212, 212, 212, 212, - 212, 0, 212, 0, 0, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 212, 212, 0, 212, 0, 0, - 0, 0, 0, 0, 200, 0, 0, 0, 0, 198, - 196, 200, 197, 0, 199, 0, 198, 196, 193, 197, - 0, 199, 0, 0, 0, 0, 0, 232, 212, 195, - 0, 212, 200, 0, 194, 0, 195, 198, 196, 193, - 197, 0, 199, 0, 200, 0, 0, 0, 0, 198, - 196, 0, 197, 0, 199, 232, 0, 195, 0, 0, - 212, 201, 0, 0, 0, 0, 0, 232, 201, 195, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 211, 211, 211, 211, 201, - 0, 211, 211, 211, 211, 211, 211, 211, 211, 211, - 211, 201, 0, 0, 0, 0, 0, 0, 0, 211, - 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, - 211, 211, 211, 211, 211, 211, 211, 211, 211, 0, - 0, 211, 211, 211, 211, 211, 211, 211, 211, 211, - 211, 211, 211, 211, 211, 0, 0, 0, 0, 0, - 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, - 0, 0, 211, 211, 211, 211, 0, 0, 211, 211, - 0, 211, 0, 0, 211, 211, 211, 211, 211, 211, - 211, 211, 211, 211, 211, 0, 0, 0, 211, 211, - 211, 211, 212, 212, 212, 212, 0, 0, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 0, 0, - 0, 0, 0, 0, 0, 0, 212, 212, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 212, 212, 212, 212, 0, 0, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 0, 0, 0, 0, 0, 212, 212, 212, - 212, 212, 212, 212, 212, 212, 212, 213, 0, 212, - 212, 212, 212, 0, 185, 212, 212, 186, 212, 0, - 0, 212, 212, 212, 212, 212, 212, 212, 212, 212, - 212, 212, 0, 365, 0, 212, 212, 212, 212, 0, - 213, 0, 0, 0, 213, 0, 0, 213, 213, 213, - 213, 213, 213, 230, 213, 189, 190, 191, 192, 0, - 187, 188, 189, 190, 191, 192, 213, 213, 0, 213, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 230, 231, 189, 190, 191, 192, 0, 0, 0, - 0, 0, 0, 187, 188, 189, 190, 191, 192, 0, - 213, 0, 0, 213, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 214, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 213, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 214, 0, 0, - 0, 214, 0, 0, 214, 214, 214, 214, 214, 214, - 0, 214, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 214, 214, 0, 214, 0, 0, 0, - 0, 0, 0, 200, 0, 0, 0, 0, 198, 196, - 200, 197, 0, 199, 0, 198, 196, 193, 197, 0, - 199, 0, 0, 0, 0, 0, 232, 214, 195, 0, - 214, 200, 0, 194, 0, 195, 198, 196, 0, 197, - 0, 199, 0, 200, 0, 0, 0, 0, 198, 196, - 0, 197, 0, 199, 232, 0, 195, 0, 0, 214, - 201, 0, 0, 0, 0, 0, 232, 201, 195, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 213, 213, 213, 213, 201, 0, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 201, 0, 0, 0, 0, 0, 0, 0, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 0, 0, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 0, 0, 0, 0, 0, 213, - 213, 213, 213, 213, 213, 213, 213, 213, 213, 0, - 0, 213, 213, 213, 213, 0, 0, 213, 213, 0, - 213, 0, 0, 213, 213, 213, 213, 213, 213, 213, - 213, 213, 213, 213, 0, 0, 0, 213, 213, 213, - 213, 214, 214, 214, 214, 0, 0, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 0, 14, 0, - 0, 0, 0, 0, 0, 214, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 0, 0, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 0, 0, 0, 0, 395, 214, 214, 214, 214, - 214, 214, 214, 214, 214, 214, 209, 14, 214, 214, - 214, 214, 0, 185, 214, 214, 186, 214, 0, 0, - 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, - 214, 0, 0, 0, 214, 214, 214, 214, 0, 209, - 0, 14, 0, 0, 187, 0, 209, 209, 0, 209, - 209, 209, 187, 188, 189, 190, 191, 192, 0, 230, - 231, 189, 190, 191, 192, 209, 209, 0, 209, 0, - 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, - 230, 231, 189, 190, 191, 192, 0, 0, 0, 0, - 0, 0, 187, 188, 189, 190, 191, 192, 0, 209, - 0, 0, 209, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 210, 181, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 209, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, - 0, 0, 0, 210, 210, 0, 210, 210, 210, 254, - 255, 256, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 210, 210, 0, 210, 0, 0, 0, 0, - 0, 0, 0, 281, 0, 0, 0, 0, 0, 202, - 0, 0, 0, 0, 202, 202, 202, 202, 0, 202, - 0, 0, 0, 0, 0, 187, 210, 0, 0, 210, - 0, 187, 202, 0, 202, 0, 187, 0, 0, 0, - 0, 0, 0, 309, 0, 0, 0, 0, 0, 0, - 0, 317, 0, 0, 0, 0, 0, 0, 210, 0, - 0, 0, 0, 0, 0, 0, 202, 0, 187, 0, - 0, 0, 0, 0, 260, 0, 0, 0, 0, 0, - 0, 0, 0, 209, 209, 209, 209, 0, 0, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 0, - 0, 0, 0, 0, 0, 0, 0, 209, 209, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 209, 209, 209, 0, 0, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 0, 0, 0, 0, 361, 209, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 0, 0, - 209, 209, 209, 209, 0, 0, 209, 209, 0, 209, - 0, 0, 209, 209, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 0, 260, 0, 209, 209, 209, 209, - 210, 210, 210, 210, 0, 0, 210, 210, 210, 210, - 210, 210, 210, 210, 210, 210, 0, 0, 0, 0, - 0, 0, 382, 383, 210, 210, 210, 210, 210, 210, - 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, - 210, 210, 210, 210, 0, 0, 210, 210, 210, 210, - 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, - 0, 0, 0, 0, 0, 210, 210, 210, 210, 210, - 210, 210, 210, 210, 210, 229, 0, 210, 210, 210, - 210, 0, 202, 210, 210, 202, 210, 0, 0, 210, - 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, - 0, 0, 0, 210, 210, 210, 210, 0, 229, 52, - 53, 0, 0, 0, 0, 229, 229, 0, 0, 229, - 0, 0, 0, 0, 0, 0, 0, 0, 202, 202, - 202, 202, 202, 202, 229, 229, 0, 229, 0, 0, - 0, 0, 0, 0, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 229, 0, - 0, 229, 76, 77, 78, 79, 0, 0, 0, 0, - 0, 0, 231, 0, 0, 0, 0, 0, 0, 0, - 80, 81, 82, 83, 84, 0, 0, 0, 0, 0, - 229, 0, 0, 0, 0, 257, 0, 0, 0, 0, - 0, 258, 0, 0, 0, 231, 259, 0, 0, 52, - 53, 0, 231, 231, 0, 0, 231, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 231, 231, 0, 231, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 231, 0, 0, 231, 0, - 0, 0, 76, 77, 78, 79, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 81, 82, 83, 84, 0, 0, 231, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 345, 0, 0, 0, 0, 0, 0, - 0, 0, 229, 229, 229, 229, 210, 0, 229, 229, - 229, 229, 229, 229, 229, 229, 229, 229, 0, 0, - 0, 0, 0, 0, 0, 0, 229, 229, 229, 229, - 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, - 229, 229, 229, 229, 229, 229, 0, 0, 229, 229, - 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, - 229, 229, 0, 0, 0, 0, 0, 229, 229, 229, - 229, 229, 229, 229, 229, 229, 229, 0, 0, 229, - 229, 229, 229, 0, 0, 229, 229, 0, 229, 0, - 0, 229, 229, 229, 229, 229, 229, 229, 229, 229, - 229, 229, 0, 0, 0, 229, 229, 229, 229, 231, - 231, 231, 231, 0, 0, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 0, 0, 0, 0, 0, - 0, 0, 0, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 0, 0, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 0, - 0, 0, 0, 0, 231, 231, 231, 231, 231, 231, - 231, 231, 231, 231, 230, 0, 231, 231, 231, 231, - 0, 0, 231, 231, 0, 231, 0, 0, 231, 231, - 231, 231, 231, 231, 231, 231, 231, 231, 231, 0, - 0, 0, 231, 231, 231, 231, 0, 230, 52, 53, - 0, 0, 0, 0, 230, 230, 0, 0, 230, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 230, 0, 230, 0, 0, 0, - 0, 0, 0, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 0, 0, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 230, 0, 0, - 230, 76, 77, 78, 79, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 76, 77, 78, 79, 0, 80, - 81, 82, 83, 84, 0, 0, 0, 0, 0, 230, - 0, 0, 80, 81, 82, 83, 84, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, - 0, 228, 228, 0, 0, 228, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 228, 0, 228, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 0, 0, 228, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 230, 230, 230, 230, 0, 0, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 0, 0, 0, 0, 0, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, - 230, 230, 0, 0, 230, 230, 0, 230, 0, 0, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 0, 0, 0, 230, 230, 230, 230, 228, 228, - 228, 228, 0, 0, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 0, 15, 0, 0, 0, 0, - 0, 0, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 0, 0, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 0, 0, - 0, 0, 0, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 143, 15, 228, 228, 228, 228, 0, - 0, 228, 228, 0, 228, 0, 0, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 0, 0, - 0, 228, 228, 228, 228, 0, 143, 0, 15, 0, - 0, 188, 0, 143, 143, 0, 143, 143, 143, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 143, 0, 0, 143, 0, 0, 0, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 143, 0, 0, 143, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 143, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 233, 0, 0, 0, 0, 0, 0, - 233, 233, 0, 0, 233, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 233, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 188, 233, 0, 0, 233, 0, 188, 0, - 0, 0, 0, 188, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 233, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 188, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 143, 143, 143, 143, 0, 0, 143, 0, 143, 143, - 143, 143, 143, 143, 143, 143, 0, 0, 0, 0, - 0, 0, 0, 0, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 0, 0, 0, 0, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 143, 143, 143, 143, 143, - 143, 143, 143, 143, 143, 0, 0, 143, 143, 143, - 143, 0, 0, 143, 143, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 143, 143, 143, 143, 143, - 0, 0, 0, 143, 143, 143, 143, 233, 233, 233, - 233, 0, 0, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 0, 0, 0, 0, 0, 0, 0, - 0, 233, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 0, 0, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 0, 0, 0, - 0, 0, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 232, 0, 233, 233, 233, 233, 0, 0, - 233, 233, 0, 233, 0, 0, 233, 233, 233, 233, - 0, 0, 233, 233, 233, 233, 233, 0, 0, 0, - 233, 233, 233, 233, 0, 232, 0, 0, 0, 0, - 0, 0, 232, 232, 0, 0, 232, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 232, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 232, 0, 0, 232, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 232, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 144, 0, 0, 0, 0, 0, 0, 144, - 144, 0, 144, 144, 144, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 144, 0, - 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 144, 0, 0, 144, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, - 232, 232, 232, 0, 0, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 0, 0, 0, 0, 0, - 0, 0, 0, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 0, 0, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 0, - 0, 0, 0, 0, 232, 232, 232, 232, 232, 232, - 232, 232, 232, 232, 0, 0, 232, 232, 232, 232, - 0, 0, 232, 232, 0, 232, 0, 0, 232, 232, - 232, 232, 0, 0, 232, 232, 232, 232, 232, 0, - 0, 0, 232, 232, 232, 232, 144, 144, 144, 144, - 0, 0, 144, 0, 144, 144, 144, 144, 144, 144, - 144, 144, 0, 0, 0, 0, 0, 0, 0, 0, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 0, - 0, 0, 0, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, - 144, 234, 0, 144, 144, 144, 144, 0, 0, 144, - 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 144, 144, 144, 144, 144, 0, 0, 0, 144, - 144, 144, 144, 0, 234, 0, 0, 0, 0, 0, - 0, 234, 234, 0, 0, 234, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 234, 0, 0, 234, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 235, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 234, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 235, 0, 0, 0, 0, 0, 0, 235, 235, - 0, 0, 235, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 235, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 235, 0, 0, 235, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 235, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 234, 234, - 234, 234, 0, 0, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 0, 0, 0, 0, 0, 0, - 0, 0, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 0, 0, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 234, 234, 234, 0, 0, - 0, 0, 0, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 0, 0, 234, 234, 234, 234, 0, - 0, 234, 234, 0, 234, 0, 0, 234, 234, 0, - 0, 0, 0, 234, 234, 234, 234, 234, 0, 0, - 0, 234, 234, 234, 234, 235, 235, 235, 235, 0, - 0, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 235, 0, 0, 0, 0, 0, 0, 0, 0, 235, - 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 235, 235, 235, 235, 235, 235, 235, 235, 235, 0, - 0, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 235, 235, 235, 235, 235, 0, 0, 0, 0, 0, - 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 130, 0, 235, 235, 235, 235, 0, 0, 235, 235, - 0, 235, 0, 0, 0, 235, 0, 0, 0, 0, - 235, 235, 235, 235, 235, 0, 0, 0, 235, 235, - 235, 235, 0, 130, 0, 0, 0, 0, 0, 0, - 130, 130, 0, 130, 130, 130, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, - 0, 0, 130, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 130, 0, 0, 130, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 135, 0, 0, 0, 0, 0, 0, 135, 135, 0, - 0, 135, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 135, 0, 0, 135, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 135, 0, 0, 135, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 130, 130, 130, - 130, 0, 0, 130, 0, 130, 130, 130, 130, 130, - 130, 130, 130, 0, 0, 0, 0, 0, 0, 0, - 0, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, - 0, 0, 0, 0, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 130, 0, 0, 0, - 0, 0, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 0, 0, 130, 130, 130, 130, 0, 0, - 130, 130, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 130, 130, 130, 130, 130, 0, 0, 0, - 130, 130, 130, 130, 135, 135, 135, 135, 0, 0, - 135, 0, 135, 135, 135, 135, 135, 135, 135, 135, - 0, 0, 0, 0, 0, 0, 0, 0, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 135, 135, 135, 0, 0, 0, - 0, 135, 135, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 135, 0, 0, 0, 0, 0, 135, - 135, 135, 135, 135, 135, 135, 135, 135, 135, 139, - 0, 135, 135, 135, 135, 0, 0, 135, 135, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 135, - 135, 135, 135, 135, 0, 0, 0, 135, 135, 135, - 135, 0, 139, 0, 0, 0, 0, 0, 0, 139, - 139, 0, 0, 139, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 139, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 139, 0, 0, 139, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 139, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, - 0, 0, 0, 0, 0, 0, 88, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, - 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 139, 139, 139, 139, - 0, 0, 139, 0, 139, 139, 139, 139, 139, 139, - 139, 139, 0, 0, 0, 0, 0, 0, 0, 0, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 139, 139, 139, 0, - 0, 0, 0, 139, 139, 139, 139, 139, 139, 139, - 139, 139, 139, 139, 139, 139, 0, 0, 32, 0, - 0, 139, 139, 139, 139, 139, 139, 139, 139, 139, - 139, 0, 0, 139, 139, 139, 139, 0, 0, 139, - 139, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 31, 139, 139, 139, 139, 139, 0, 0, 0, 139, - 139, 139, 139, 88, 88, 88, 88, 0, 0, 88, - 0, 88, 88, 88, 88, 88, 88, 88, 88, 0, - 0, 0, 0, 0, 0, 0, 0, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 0, 0, 0, 0, - 0, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 90, 0, 0, 0, 0, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 0, 0, - 88, 88, 88, 88, 0, 0, 88, 88, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 0, 88, 88, - 88, 88, 88, 90, 0, 0, 88, 88, 88, 88, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 90, 0, 6, 7, 0, 8, 9, 0, - 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 0, 0, - 0, 0, 0, 0, 0, 0, 90, 0, 0, 90, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, - 0, 0, 0, 92, 0, 23, 24, 0, 0, 25, - 92, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 27, 0, 28, 0, 0, 92, - 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 92, 0, 0, 92, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 92, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 90, 90, 90, 90, 0, 0, 90, 0, 90, 90, - 90, 90, 90, 90, 90, 90, 0, 0, 0, 0, - 0, 0, 0, 0, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 0, 0, 0, 0, 0, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 0, 0, 6, 0, 0, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 90, 0, 0, 90, 90, 90, - 90, 0, 0, 90, 90, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 90, 90, 90, 90, 90, - 0, 0, 0, 90, 90, 90, 90, 92, 92, 92, - 92, 0, 0, 92, 0, 92, 92, 92, 92, 92, - 92, 92, 92, 0, 0, 0, 0, 0, 0, 0, - 0, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 96, 0, 0, - 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 0, 0, 92, 92, 92, 92, 0, 0, - 92, 92, 0, 0, 0, 0, 0, 0, 0, 0, - 96, 0, 92, 92, 92, 92, 92, 96, 0, 0, - 92, 92, 92, 92, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 96, 0, 6, 6, - 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, - 96, 0, 0, 96, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 94, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 0, 0, 0, 94, 0, 6, - 6, 0, 0, 6, 94, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, - 6, 0, 0, 94, 6, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, - 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 94, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 96, 96, 96, 96, 0, 0, - 96, 0, 96, 96, 96, 96, 96, 96, 96, 96, - 0, 0, 0, 0, 0, 0, 0, 0, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, - 0, 0, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 0, 0, 0, 0, 0, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, - 0, 96, 96, 96, 96, 0, 0, 96, 96, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, - 96, 96, 96, 96, 0, 0, 0, 96, 96, 96, - 96, 94, 94, 94, 94, 0, 0, 94, 0, 94, - 94, 94, 94, 94, 94, 94, 94, 0, 0, 0, - 0, 0, 0, 0, 0, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 0, 0, 0, 0, 0, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 84, 0, 0, 0, 0, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 0, 0, 94, 94, - 94, 94, 0, 0, 94, 94, 0, 0, 0, 0, - 0, 0, 0, 0, 84, 0, 94, 94, 94, 94, - 94, 84, 0, 0, 94, 94, 94, 94, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 84, 0, 0, 84, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 85, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 85, 0, 0, 0, 0, 0, 0, 85, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 85, 0, 0, 85, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 85, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 84, 84, - 84, 84, 0, 0, 84, 0, 84, 84, 84, 84, - 84, 84, 84, 84, 0, 0, 0, 0, 0, 0, - 0, 0, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 0, 0, 0, 0, 0, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 0, 0, - 0, 0, 0, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 0, 0, 84, 84, 84, 84, 0, - 0, 84, 84, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 84, 84, 84, 84, 84, 0, 0, - 0, 84, 84, 84, 84, 85, 85, 85, 85, 0, - 0, 85, 0, 85, 85, 85, 85, 85, 85, 85, - 85, 0, 0, 0, 0, 0, 0, 0, 0, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 0, 0, - 0, 0, 0, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 86, 0, 0, 0, 0, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 0, 0, 85, 85, 85, 85, 0, 0, 85, 85, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, - 85, 85, 85, 85, 85, 86, 0, 0, 85, 85, - 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 86, 0, - 0, 86, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, - 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 87, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 87, 0, 0, 87, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 86, 86, 86, 86, 0, 0, 86, 0, - 86, 86, 86, 86, 86, 86, 86, 86, 0, 0, - 0, 0, 0, 0, 0, 0, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 0, 0, 0, 0, 0, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 0, 0, 0, 0, 0, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 0, 0, 86, - 86, 86, 86, 0, 0, 86, 86, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 86, 86, 86, - 86, 86, 0, 0, 0, 86, 86, 86, 86, 87, - 87, 87, 87, 0, 0, 87, 0, 87, 87, 87, - 87, 87, 87, 87, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 0, 0, 0, 0, 0, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 97, - 0, 0, 0, 0, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 0, 0, 87, 87, 87, 87, - 0, 0, 87, 87, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 0, 87, 87, 87, 87, 87, 97, - 0, 0, 87, 87, 87, 87, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 97, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 97, 0, 0, 97, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 97, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, - 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 98, - 0, 0, 98, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 98, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, - 0, 0, 97, 0, 97, 97, 97, 97, 97, 97, - 97, 97, 0, 0, 0, 0, 0, 0, 0, 0, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, - 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 97, 97, 0, 0, 0, 0, - 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, - 97, 0, 0, 97, 97, 97, 97, 0, 0, 97, - 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, - 97, 97, 97, 98, 98, 98, 98, 0, 0, 98, - 0, 98, 98, 98, 98, 98, 98, 98, 98, 0, - 0, 0, 0, 0, 0, 0, 0, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 98, 98, 98, 0, 0, 0, 0, - 0, 98, 98, 98, 98, 98, 98, 98, 98, 98, - 98, 98, 98, 99, 0, 0, 0, 0, 98, 98, - 98, 98, 98, 98, 98, 98, 98, 98, 0, 0, - 98, 98, 98, 98, 0, 0, 98, 98, 0, 0, - 0, 0, 0, 0, 0, 0, 99, 0, 98, 98, - 98, 98, 98, 99, 0, 0, 98, 98, 98, 98, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 99, 0, 0, 99, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 104, 0, 0, 0, 0, 0, 0, - 104, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 104, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 104, 0, 0, 104, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 104, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 99, 99, 99, 0, 0, 99, 0, 99, 99, - 99, 99, 99, 99, 99, 99, 0, 0, 0, 0, - 0, 0, 0, 0, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 0, 0, 0, 0, 0, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 0, 0, 0, 0, 0, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 0, 0, 99, 99, 99, - 99, 0, 0, 99, 99, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 99, 99, 99, 99, 99, - 0, 0, 0, 99, 99, 99, 99, 104, 104, 104, - 104, 0, 0, 104, 0, 104, 104, 104, 104, 104, - 104, 104, 104, 0, 0, 0, 0, 0, 0, 0, - 0, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 0, 0, 0, 0, 0, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 104, 104, 104, 106, 0, 0, - 0, 0, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 0, 0, 104, 104, 104, 104, 0, 0, - 104, 104, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 0, 104, 104, 104, 104, 104, 106, 0, 0, - 104, 104, 104, 104, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 106, 0, 0, 106, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, - 0, 0, 0, 0, 110, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 110, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 110, 0, 0, - 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 110, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 106, 106, 106, 106, 0, 0, - 106, 0, 106, 106, 106, 106, 106, 106, 106, 106, - 0, 0, 0, 0, 0, 0, 0, 0, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 106, 106, 106, 0, 0, 0, - 0, 0, 106, 106, 106, 106, 106, 106, 106, 106, - 106, 106, 106, 106, 0, 0, 0, 0, 0, 106, - 106, 106, 106, 106, 106, 106, 106, 106, 106, 0, - 0, 106, 106, 106, 106, 0, 0, 106, 106, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, - 106, 106, 106, 106, 0, 0, 0, 106, 106, 106, - 106, 110, 110, 110, 110, 0, 0, 110, 0, 110, - 110, 110, 110, 110, 110, 110, 110, 0, 0, 0, - 0, 0, 0, 0, 0, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 0, 0, 0, 0, 0, 110, - 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 123, 0, 0, 0, 0, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 0, 0, 110, 110, - 110, 110, 0, 0, 110, 110, 0, 0, 0, 0, - 0, 0, 0, 0, 123, 0, 110, 110, 110, 110, - 110, 123, 0, 0, 110, 110, 110, 110, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 123, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 123, 0, 0, 123, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 108, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 108, 0, 0, 0, 0, 0, 0, 108, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 108, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 108, 0, 0, 108, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 123, 123, - 123, 123, 0, 0, 123, 0, 123, 123, 123, 123, - 123, 123, 123, 123, 0, 0, 0, 0, 0, 0, - 0, 0, 123, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, - 123, 0, 0, 0, 0, 0, 123, 123, 123, 123, - 123, 123, 123, 123, 123, 123, 123, 123, 0, 0, - 0, 0, 0, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 0, 0, 123, 123, 123, 123, 0, - 0, 123, 123, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 123, 123, 123, 123, 123, 0, 0, - 0, 123, 123, 123, 123, 108, 108, 108, 108, 0, - 0, 108, 0, 108, 108, 108, 108, 108, 108, 108, - 108, 0, 0, 0, 0, 0, 0, 0, 0, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 108, 108, 108, 0, 0, - 0, 0, 0, 108, 108, 108, 108, 108, 108, 108, - 108, 108, 108, 108, 108, 0, 0, 0, 0, 0, - 108, 108, 108, 108, 108, 108, 108, 108, 108, 108, - 141, 0, 108, 108, 108, 108, 0, 0, 108, 108, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 108, 108, 108, 108, 108, 0, 0, 0, 108, 108, - 108, 108, 0, 141, 0, 0, 0, 0, 0, 0, - 141, 141, 0, 141, 141, 141, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, - 0, 0, 141, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 141, 0, 0, 141, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, - 0, 0, 0, 0, 0, 228, 228, 0, 0, 228, - 0, 0, 0, 0, 0, 141, 0, 0, 0, 0, - 0, 0, 0, 0, 228, 228, 0, 228, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 234, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 228, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 167, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 234, 0, 0, 234, 0, - 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 234, 0, 167, 0, 0, 0, 0, - 0, 0, 167, 0, 0, 0, 0, 167, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 167, 0, 0, 0, 0, 0, 234, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 141, 141, 141, - 141, 0, 0, 141, 0, 141, 141, 141, 141, 141, - 141, 141, 141, 0, 0, 167, 0, 0, 167, 234, - 0, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 0, 0, 0, 0, 141, 141, 0, 167, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 141, 141, 141, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 228, 228, 228, 228, 0, 0, 228, 0, - 141, 141, 0, 228, 104, 0, 228, 228, 0, 0, - 0, 103, 294, 0, 0, 0, 87, 0, 0, 0, - 141, 141, 141, 141, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 0, 0, 0, 0, 0, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 86, 0, 228, - 228, 228, 228, 0, 0, 0, 0, 0, 234, 0, - 0, 228, 228, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 0, 0, 0, 0, 0, 0, 228, 167, - 167, 167, 167, 0, 234, 167, 0, 167, 167, 167, - 167, 167, 167, 0, 234, 40, 0, 234, 0, 0, - 0, 0, 0, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 167, 167, 167, 167, 167, 167, 167, 167, - 167, 167, 0, 0, 0, 0, 0, 167, 40, 0, - 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, - 234, 234, 0, 0, 167, 167, 167, 167, 167, 167, - 167, 167, 167, 167, 40, 0, 0, 0, 0, 0, - 0, 0, 167, 167, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 167, 167, 167, 167, 0, 0, 40, 0, - 0, 40, 0, 0, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 47, 48, - 49, 8, 0, 0, 50, 0, 0, 0, 0, 51, - 40, 0, 52, 53, 0, 0, 0, 0, 0, 42, - 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 42, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, - 0, 0, 0, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 0, 0, 76, 77, 78, 79, 42, - 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 95, 80, 81, 82, 83, 84, 0, 0, - 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, - 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 40, 40, 40, 0, 0, 40, 0, - 0, 95, 0, 40, 0, 0, 40, 40, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 95, 0, 0, 0, 0, - 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, - 40, 40, 0, 0, 0, 0, 0, 40, 40, 40, - 40, 40, 40, 40, 40, 40, 40, 95, 0, 40, - 40, 40, 40, 0, 0, 93, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 40, 40, 40, - 40, 40, 0, 42, 42, 42, 42, 0, 40, 42, - 0, 0, 0, 0, 42, 0, 0, 42, 42, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 93, 0, 0, 0, 0, 0, - 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 0, 0, 0, 0, 0, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 93, 0, - 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 91, 0, 0, 0, 42, 42, - 42, 42, 42, 0, 0, 0, 0, 0, 0, 42, - 93, 0, 95, 0, 0, 0, 0, 95, 95, 95, - 0, 95, 95, 95, 95, 0, 0, 0, 0, 0, - 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 187, 91, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 91, 0, 0, - 0, 0, 95, 95, 0, 0, 0, 0, 0, 103, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 95, 95, 95, 95, 0, 0, 0, 91, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 93, 0, 0, 0, 0, - 93, 93, 93, 0, 93, 93, 93, 93, 103, 0, - 0, 0, 0, 32, 0, 0, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 93, 93, 188, 0, 0, 0, 0, - 0, 0, 103, 0, 0, 31, 0, 0, 0, 0, - 0, 0, 0, 105, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 103, 93, 93, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 93, 93, 93, 93, 0, - 0, 0, 0, 0, 91, 0, 0, 0, 0, 91, - 91, 91, 105, 91, 91, 91, 91, 0, 0, 0, - 0, 0, 0, 0, 0, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 0, 0, 105, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 109, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 105, 6, - 7, 0, 8, 9, 91, 91, 0, 0, 0, 0, - 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 0, 91, 91, 91, 91, 0, 103, - 0, 0, 0, 0, 103, 103, 103, 109, 103, 103, - 103, 103, 0, 0, 0, 0, 0, 0, 0, 0, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, - 0, 109, 0, 0, 22, 0, 0, 0, 0, 0, - 23, 24, 107, 0, 25, 0, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, - 0, 28, 0, 109, 0, 29, 30, 0, 0, 103, - 103, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, - 103, 103, 103, 105, 0, 0, 0, 0, 105, 105, - 105, 107, 105, 105, 105, 105, 0, 0, 0, 0, - 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 105, 105, 105, 0, 0, 107, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 107, 0, 0, - 0, 0, 0, 105, 105, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, - 0, 0, 80, 105, 105, 105, 105, 0, 109, 0, - 0, 0, 0, 109, 109, 109, 0, 109, 109, 109, - 109, 80, 0, 0, 0, 0, 0, 0, 0, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 109, 109, - 109, 109, 109, 109, 109, 109, 109, 109, 0, 0, - 0, 0, 0, 0, 0, 80, 0, 0, 80, 0, - 0, 146, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 80, 109, 109, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 146, 0, 146, 146, 109, 109, - 109, 109, 107, 0, 0, 0, 0, 107, 107, 107, - 146, 107, 107, 107, 107, 0, 0, 0, 0, 0, - 0, 0, 0, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 107, 107, 107, 107, 107, 107, 107, 107, - 107, 107, 0, 0, 146, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 146, 0, 0, 0, - 0, 0, 107, 107, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 107, 107, 107, 107, 0, 0, 0, 80, - 80, 80, 0, 0, 0, 80, 0, 80, 80, 80, - 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, - 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 0, 0, 0, 0, 0, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, - 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 236, 0, 80, 80, 80, 80, - 0, 0, 80, 80, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 80, 80, 80, 80, 80, 0, - 0, 0, 80, 80, 80, 0, 0, 0, 0, 0, - 0, 236, 146, 146, 0, 236, 236, 236, 236, 236, - 0, 236, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 236, 236, 0, 236, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 146, 146, 0, 0, 0, 0, 236, 0, 0, - 0, 0, 88, 0, 0, 146, 146, 146, 146, 85, - 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 146, 146, 146, 146, 146, 0, 236, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 32, 0, 0, 0, 0, 86, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 0, 6, 0, - 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 236, 6, - 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, - 0, 6, 0, 0, 236, 0, 0, 236, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 88, 0, 274, 275, 49, 8, - 9, 103, 50, 0, 0, 0, 87, 51, 10, 11, - 276, 277, 14, 15, 16, 17, 18, 19, 20, 21, - 236, 236, 236, 236, 236, 236, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 54, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 65, 0, 86, 0, 0, - 0, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75, 22, 0, 76, 77, 78, 79, 23, 24, 0, - 0, 25, 0, 26, 0, 0, 0, 0, 0, 0, - 0, 80, 81, 82, 83, 84, 27, 0, 28, 0, - 0, 0, 29, 30, 0, 6, 6, 6, 6, 6, - 0, 6, 0, 0, 0, 0, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, - 88, 0, 0, 0, 0, 0, 0, 85, 0, 0, - 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 0, 6, 6, 6, 6, 6, 6, 0, 0, - 6, 0, 6, 86, 0, 0, 0, 0, 0, 0, - 6, 6, 6, 6, 6, 6, 0, 6, 0, 0, - 0, 6, 6, 0, 0, 0, 0, 0, 47, 48, - 49, 8, 0, 0, 50, 0, 119, 120, 121, 51, - 122, 123, 124, 125, 0, 0, 0, 0, 0, 0, - 0, 0, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 144, 0, 0, 0, 0, 0, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, - 0, 0, 0, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 0, 0, 76, 77, 78, 79, 104, - 0, 145, 146, 0, 0, 0, 103, 0, 0, 0, - 0, 87, 0, 80, 81, 82, 83, 84, 0, 0, - 0, 147, 148, 149, 29, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 47, 48, 49, 8, 0, 0, - 50, 0, 86, 0, 0, 51, 0, 0, 52, 53, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 54, 55, 56, 57, 58, 59, 60, 61, - 62, 63, 64, 65, 0, 0, 0, 0, 0, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 104, - 0, 76, 77, 78, 79, 0, 85, 0, 0, 0, - 0, 87, 0, 0, 0, 0, 0, 0, 0, 80, - 81, 82, 83, 84, 0, 0, 0, 0, 0, 0, - 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 86, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 47, 48, 49, 8, 0, 0, 50, - 0, 0, 0, 0, 51, 0, 104, 52, 53, 0, - 0, 0, 0, 265, 0, 0, 0, 0, 87, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 0, 0, 0, 0, 0, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 0, 86, - 76, 77, 78, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, - 82, 83, 84, 0, 0, 0, 0, 0, 0, 29, - 0, 0, 0, 0, 0, 0, 0, 88, 0, 0, - 0, 0, 0, 0, 103, 0, 397, 0, 0, 87, - 0, 0, 0, 47, 48, 49, 8, 0, 0, 50, - 0, 0, 0, 0, 51, 0, 0, 52, 53, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 86, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 0, 0, 0, 0, 0, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 0, 0, - 76, 77, 78, 79, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 80, 81, - 82, 83, 84, 0, 0, 0, 0, 88, 0, 29, - 47, 48, 49, 8, 103, 0, 50, 0, 0, 87, - 0, 51, 0, 0, 52, 53, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 54, 55, - 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, - 86, 0, 0, 0, 0, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 0, 0, 76, 77, 78, - 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 80, 81, 82, 83, 84, - 0, 47, 48, 49, 0, 0, 29, 50, 0, 0, - 0, 0, 51, 88, 0, 52, 53, 0, 0, 0, - 85, 0, 0, 0, 0, 87, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 0, 0, 0, 0, 0, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 86, 0, 76, 77, - 78, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 80, 81, 82, 83, - 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 88, 0, - 0, 47, 48, 49, 0, 265, 0, 50, 0, 0, - 87, 0, 51, 0, 0, 52, 53, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 86, 0, 0, 0, 0, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 0, 0, 76, 77, - 78, 79, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 80, 81, 82, 83, - 84, 88, 0, 0, 0, 0, 0, 0, 103, 0, - 0, 0, 0, 87, 0, 0, 0, 47, 48, 49, - 0, 0, 0, 50, 0, 0, 0, 0, 51, 0, - 0, 52, 53, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 86, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, - 0, 0, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 0, 0, 76, 77, 78, 79, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 80, 81, 82, 83, 84, 0, 0, 0, - 0, 0, 47, 48, 49, 0, 0, 0, 50, 0, - 0, 0, 0, 51, 0, 0, 52, 53, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 0, 0, 0, 0, 0, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 0, 0, 76, - 77, 78, 79, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 80, 81, 82, - 83, 84, 0, 0, 0, 47, 48, 49, 0, 0, - 0, 50, 0, 0, 0, 0, 51, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 54, 55, 56, 57, 58, 59, 60, - 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 0, 0, 76, 77, 78, 79, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 80, 81, 82, 83, 84, -}; -short yycheck[] = { 24, - 118, 44, 37, 28, 104, 30, 59, 42, 43, 37, - 45, 36, 47, 0, 42, 43, 260, 45, 93, 47, - 43, 0, 45, 43, 98, 45, 0, 0, 85, 4, - 260, 100, 60, 59, 62, 95, 154, 37, 43, 44, - 45, 257, 42, 43, 113, 45, 58, 47, 35, 24, - 96, 258, 96, 258, 41, 30, 0, 0, 40, 94, - 85, 36, 87, 88, 0, 0, 94, 41, 41, 345, - 44, 44, 43, 133, 45, 100, 61, 134, 58, 104, - 59, 61, 43, 44, 45, 59, 59, 41, 113, 333, - 44, 62, 41, 333, 94, 44, 262, 122, 123, 124, - 125, 126, 127, 128, 129, 130, 131, 132, 0, 134, - 40, 136, 137, 138, 93, 59, 59, 346, 347, 93, - 93, 0, 147, 148, 59, 100, 342, 343, 203, 154, - 230, 231, 40, 363, 234, 235, 111, 40, 113, 0, - 41, 33, 43, 118, 45, 40, 125, 40, 40, 93, - 93, 125, 125, 45, 370, 212, 213, 93, 93, 40, - 271, 272, 187, 188, 189, 190, 191, 192, 193, 194, - 195, 196, 197, 198, 199, 200, 201, 202, 40, 154, - 41, 125, 125, 44, 258, 259, 40, 212, 213, 125, - 125, 37, 40, 0, 0, 40, 42, 257, 59, 91, - 290, 47, 227, 263, 96, 230, 231, 232, 265, 234, - 235, 257, 61, 257, 93, 258, 258, 263, 0, 263, - 37, 260, 268, 41, 268, 42, 43, 41, 45, 262, - 47, 123, 93, 264, 41, 41, 94, 44, 44, 257, - 265, 352, 353, 60, 46, 62, 125, 301, 94, 348, - 349, 369, 59, 59, 300, 317, 318, 319, 320, 321, - 93, 236, 237, 93, 125, 300, 241, 341, 303, 43, - 44, 45, 125, 298, 114, 115, 262, 94, 262, 257, - 41, 304, 342, 343, 41, 44, 93, 93, 37, 41, - 264, 264, 302, 42, 43, 41, 45, 41, 47, 44, - 41, 44, 41, 262, 257, 346, 358, 303, 260, 91, - 370, 60, 41, 62, 271, 272, 290, 290, 125, 125, - 348, 349, 350, 351, 41, 260, 300, 41, 343, 303, - 265, 266, 267, 262, 269, 270, 271, 272, 363, 364, - 365, 123, 367, 0, 41, 94, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 257, 258, 259, 260, 261, - 395, 263, 397, 347, 347, 343, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 0, - 154, 374, 343, 343, 369, 352, 353, 30, 35, -1, - -1, -1, 91, 264, -1, 340, 341, -1, -1, -1, - 0, 0, -1, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 360, 361, 362, 363, 290, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, -1, 334, 335, 336, 337, 338, 339, 59, -1, - 342, 41, 344, -1, 44, -1, -1, 264, 264, -1, - 352, 353, 354, 355, 356, 357, -1, 359, 0, 59, - 59, 363, 364, -1, -1, 257, 258, -1, 260, 261, - -1, -1, 93, 290, 290, 346, 347, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, 0, - -1, 33, -1, 93, 93, 37, -1, 0, 40, 41, - 42, 43, 44, 45, 125, 47, -1, -1, -1, -1, - -1, -1, -1, 26, -1, -1, -1, 59, 60, 346, - 62, 348, 349, 350, 351, 125, 125, -1, 24, 42, - 347, 347, -1, -1, 30, -1, 0, -1, -1, -1, - 332, -1, -1, -1, -1, -1, 338, 339, 59, -1, - 342, 93, 344, 0, 96, -1, 59, -1, -1, -1, - -1, 260, -1, -1, 0, 357, 0, 359, -1, 268, - -1, 363, 364, 86, 273, 274, 275, 276, 277, 278, - -1, 280, 93, 125, -1, -1, -1, -1, -1, 85, - 93, 350, 351, -1, 41, 59, -1, 44, -1, 33, - -1, -1, -1, 37, 100, -1, 40, 41, 42, 43, - 44, 45, 59, 47, 125, -1, -1, 113, -1, -1, - -1, -1, 125, 59, -1, 59, 60, -1, 62, 93, - -1, -1, -1, -1, 130, 131, 132, -1, -1, -1, - -1, -1, -1, 156, -1, -1, 93, 160, 161, 162, - 163, 164, 165, 166, 167, 168, 169, 93, 154, 93, - -1, 125, 96, 37, 264, -1, -1, -1, 42, 43, - -1, 45, -1, 47, 37, -1, -1, -1, 125, 42, - 43, 44, 45, -1, 47, -1, 60, -1, 62, 125, - 290, 125, -1, -1, -1, -1, -1, 60, 194, 62, - -1, -1, -1, -1, -1, -1, 202, -1, -1, -1, - -1, -1, -1, -1, -1, 257, 258, 259, 260, -1, - 94, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 94, -1, -1, -1, -1, -1, -1, -1, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, -1, - -1, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, 91, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - -1, -1, 334, 335, 336, 337, -1, -1, 340, 341, - -1, 343, 298, -1, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, -1, -1, 264, 360, 361, - 362, 363, -1, 257, 258, 259, 260, 91, -1, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, - 353, -1, -1, 290, 357, 358, -1, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 298, 299, 300, 363, 364, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, -1, -1, -1, 260, -1, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 0, -1, - 334, 335, 336, 337, -1, -1, 340, 341, 0, 343, - -1, -1, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, -1, -1, -1, 360, 361, 362, 363, - -1, 33, -1, -1, -1, 37, 0, -1, 40, 41, - 42, 43, 44, 45, -1, 47, -1, -1, 260, -1, - -1, 43, -1, 45, -1, -1, 268, 59, 60, -1, - 62, 273, 274, 275, 276, 277, 278, 59, 280, -1, - -1, -1, 346, 347, 348, 349, 350, 351, -1, 43, - -1, 45, -1, 346, 347, 348, 349, 350, 351, 363, - -1, 93, -1, -1, 96, 59, 260, -1, -1, -1, - -1, 93, -1, -1, -1, 0, -1, -1, -1, 273, - 274, 275, 276, 277, 278, -1, 280, -1, -1, -1, - -1, -1, -1, 125, -1, -1, -1, -1, -1, 93, - -1, -1, -1, 125, -1, -1, -1, -1, 33, -1, - -1, -1, 37, -1, -1, 40, 41, 42, 43, 44, - 45, -1, 47, -1, -1, -1, -1, -1, -1, -1, - -1, 125, -1, -1, 59, 60, -1, 62, -1, -1, - -1, -1, -1, -1, 37, -1, -1, -1, -1, 42, - 43, 37, 45, -1, 47, -1, 42, 43, 44, 45, - -1, 47, -1, -1, -1, -1, -1, 60, 93, 62, - -1, 96, 37, -1, 60, -1, 62, 42, 43, 44, - 45, -1, 47, -1, 37, -1, -1, -1, -1, 42, - 43, -1, 45, -1, 47, 60, -1, 62, -1, -1, - 125, 94, -1, -1, -1, -1, -1, 60, 94, 62, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 257, 258, 259, 260, 94, - -1, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, 94, -1, -1, -1, -1, -1, -1, -1, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, -1, - -1, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - -1, -1, 334, 335, 336, 337, -1, -1, 340, 341, - -1, 343, -1, -1, 346, 347, 348, 349, 350, 351, - 352, 353, 354, 355, 356, -1, -1, -1, 360, 361, - 362, 363, 257, 258, 259, 260, -1, -1, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, - -1, -1, -1, -1, -1, -1, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, -1, -1, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, -1, -1, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 0, -1, 334, - 335, 336, 337, -1, 300, 340, 341, 303, 343, -1, - -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, -1, 286, -1, 360, 361, 362, 363, -1, - 33, -1, -1, -1, 37, -1, -1, 40, 41, 42, - 43, 44, 45, 346, 47, 348, 349, 350, 351, -1, - 346, 347, 348, 349, 350, 351, 59, 60, -1, 62, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 346, 347, 348, 349, 350, 351, -1, -1, -1, - -1, -1, -1, 346, 347, 348, 349, 350, 351, -1, - 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, - -1, 37, -1, -1, 40, 41, 42, 43, 44, 45, - -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 59, 60, -1, 62, -1, -1, -1, - -1, -1, -1, 37, -1, -1, -1, -1, 42, 43, - 37, 45, -1, 47, -1, 42, 43, 44, 45, -1, - 47, -1, -1, -1, -1, -1, 60, 93, 62, -1, - 96, 37, -1, 60, -1, 62, 42, 43, -1, 45, - -1, 47, -1, 37, -1, -1, -1, -1, 42, 43, - -1, 45, -1, 47, 60, -1, 62, -1, -1, 125, - 94, -1, -1, -1, -1, -1, 60, 94, 62, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 257, 258, 259, 260, 94, -1, - 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, - 94, -1, -1, -1, -1, -1, -1, -1, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, 300, -1, -1, - 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, -1, -1, -1, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, -1, - -1, 334, 335, 336, 337, -1, -1, 340, 341, -1, - 343, -1, -1, 346, 347, 348, 349, 350, 351, 352, - 353, 354, 355, 356, -1, -1, -1, 360, 361, 362, - 363, 257, 258, 259, 260, -1, -1, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, -1, 0, -1, - -1, -1, -1, -1, -1, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, -1, -1, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, -1, -1, -1, -1, 289, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 0, 59, 334, 335, - 336, 337, -1, 300, 340, 341, 303, 343, -1, -1, - 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, -1, -1, -1, 360, 361, 362, 363, -1, 33, - -1, 93, -1, -1, 96, -1, 40, 41, -1, 43, - 44, 45, 346, 347, 348, 349, 350, 351, -1, 346, - 347, 348, 349, 350, 351, 59, 60, -1, 62, -1, - -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, - 346, 347, 348, 349, 350, 351, -1, -1, -1, -1, - -1, -1, 346, 347, 348, 349, 350, 351, -1, 93, - -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 0, 85, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, - -1, -1, -1, 40, 41, -1, 43, 44, 45, 130, - 131, 132, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 59, 60, -1, 62, -1, -1, -1, -1, - -1, -1, -1, 154, -1, -1, -1, -1, -1, 37, - -1, -1, -1, -1, 42, 43, 44, 45, -1, 47, - -1, -1, -1, -1, -1, 257, 93, -1, -1, 96, - -1, 263, 60, -1, 62, -1, 268, -1, -1, -1, - -1, -1, -1, 194, -1, -1, -1, -1, -1, -1, - -1, 202, -1, -1, -1, -1, -1, -1, 125, -1, - -1, -1, -1, -1, -1, -1, 94, -1, 300, -1, - -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, - -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, - 264, 265, 266, 267, 268, 269, 270, 271, 272, -1, - -1, -1, -1, -1, -1, -1, -1, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 298, 299, 300, -1, -1, 303, - 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, -1, -1, -1, -1, 298, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, -1, -1, - 334, 335, 336, 337, -1, -1, 340, 341, -1, 343, - -1, -1, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, -1, 46, -1, 360, 361, 362, 363, - 257, 258, 259, 260, -1, -1, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, - -1, -1, 363, 364, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, -1, -1, 303, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - -1, -1, -1, -1, -1, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, 0, -1, 334, 335, 336, - 337, -1, 300, 340, 341, 303, 343, -1, -1, 346, - 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, - -1, -1, -1, 360, 361, 362, 363, -1, 33, 271, - 272, -1, -1, -1, -1, 40, 41, -1, -1, 44, - -1, -1, -1, -1, -1, -1, -1, -1, 346, 347, - 348, 349, 350, 351, 59, 60, -1, 62, -1, -1, - -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, - -1, 96, 334, 335, 336, 337, -1, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, - 352, 353, 354, 355, 356, -1, -1, -1, -1, -1, - 125, -1, -1, -1, -1, 257, -1, -1, -1, -1, - -1, 263, -1, -1, -1, 33, 268, -1, -1, 271, - 272, -1, 40, 41, -1, -1, 44, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, 60, -1, 62, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, - -1, -1, 334, 335, 336, 337, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 352, 353, 354, 355, 356, -1, -1, 125, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 46, -1, -1, -1, -1, -1, -1, - -1, -1, 257, 258, 259, 260, 46, -1, 263, 264, - 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, - -1, -1, -1, -1, -1, -1, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, -1, -1, 303, 304, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, -1, -1, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, -1, -1, 334, - 335, 336, 337, -1, -1, 340, 341, -1, 343, -1, - -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, -1, -1, -1, 360, 361, 362, 363, 257, - 258, 259, 260, -1, -1, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, - -1, -1, -1, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, -1, -1, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, -1, - -1, -1, -1, -1, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 0, -1, 334, 335, 336, 337, - -1, -1, 340, 341, -1, 343, -1, -1, 346, 347, - 348, 349, 350, 351, 352, 353, 354, 355, 356, -1, - -1, -1, 360, 361, 362, 363, -1, 33, 271, 272, - -1, -1, -1, -1, 40, 41, -1, -1, 44, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 59, 60, -1, 62, -1, -1, -1, - -1, -1, -1, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 93, -1, -1, - 96, 334, 335, 336, 337, -1, -1, -1, -1, -1, - -1, 0, -1, -1, 334, 335, 336, 337, -1, 352, - 353, 354, 355, 356, -1, -1, -1, -1, -1, 125, - -1, -1, 352, 353, 354, 355, 356, -1, -1, -1, - -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, - -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 59, 60, -1, 62, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 257, 258, 259, 260, -1, -1, 263, 264, 265, - 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, - -1, -1, -1, -1, -1, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, 300, -1, -1, 303, 304, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, -1, -1, -1, -1, -1, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, -1, -1, 334, 335, - 336, 337, -1, -1, 340, 341, -1, 343, -1, -1, - 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, - 356, -1, -1, -1, 360, 361, 362, 363, 257, 258, - 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, -1, 0, -1, -1, -1, -1, - -1, -1, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, -1, -1, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, -1, -1, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, 0, 59, 334, 335, 336, 337, -1, - -1, 340, 341, -1, 343, -1, -1, 346, 347, 348, - 349, 350, 351, 352, 353, 354, 355, 356, -1, -1, - -1, 360, 361, 362, 363, -1, 33, -1, 93, -1, - -1, 96, -1, 40, 41, -1, 43, 44, 45, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 59, -1, -1, 62, -1, -1, -1, -1, - 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 93, -1, -1, 96, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, - 40, 41, -1, -1, 44, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 257, 93, -1, -1, 96, -1, 263, -1, - -1, -1, -1, 268, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 300, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, - -1, -1, -1, -1, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, -1, -1, -1, -1, 304, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, -1, -1, 334, 335, 336, - 337, -1, -1, 340, 341, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 352, 353, 354, 355, 356, - -1, -1, -1, 360, 361, 362, 363, 257, 258, 259, - 260, -1, -1, 263, 264, 265, 266, 267, 268, 269, - 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, - -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - 300, -1, -1, 303, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - -1, -1, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, 0, -1, 334, 335, 336, 337, -1, -1, - 340, 341, -1, 343, -1, -1, 346, 347, 348, 349, - -1, -1, 352, 353, 354, 355, 356, -1, -1, -1, - 360, 361, 362, 363, -1, 33, -1, -1, -1, -1, - -1, -1, 40, 41, -1, -1, 44, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 33, -1, -1, -1, -1, -1, -1, 40, - 41, -1, 43, 44, 45, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, - -1, 62, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, - 258, 259, 260, -1, -1, 263, 264, 265, 266, 267, - 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, - -1, -1, -1, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, -1, -1, 303, 304, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, -1, - -1, -1, -1, -1, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, -1, -1, 334, 335, 336, 337, - -1, -1, 340, 341, -1, 343, -1, -1, 346, 347, - 348, 349, -1, -1, 352, 353, 354, 355, 356, -1, - -1, -1, 360, 361, 362, 363, 257, 258, 259, 260, - -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, -1, - -1, -1, -1, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, - 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 0, -1, 334, 335, 336, 337, -1, -1, 340, - 341, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 352, 353, 354, 355, 356, -1, -1, -1, 360, - 361, 362, 363, -1, 33, -1, -1, -1, -1, -1, - -1, 40, 41, -1, -1, 44, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, -1, 40, 41, - -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, - 259, 260, -1, -1, 263, 264, 265, 266, 267, 268, - 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, - -1, -1, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, 300, -1, -1, 303, 304, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, -1, -1, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, -1, -1, 334, 335, 336, 337, -1, - -1, 340, 341, -1, 343, -1, -1, 346, 347, -1, - -1, -1, -1, 352, 353, 354, 355, 356, -1, -1, - -1, 360, 361, 362, 363, 257, 258, 259, 260, -1, - -1, 263, 264, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, 300, -1, - -1, 303, 304, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 0, -1, 334, 335, 336, 337, -1, -1, 340, 341, - -1, 343, -1, -1, -1, 347, -1, -1, -1, -1, - 352, 353, 354, 355, 356, -1, -1, -1, 360, 361, - 362, 363, -1, 33, -1, -1, -1, -1, -1, -1, - 40, 41, -1, 43, 44, 45, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, - -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 0, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 33, -1, -1, -1, -1, -1, -1, 40, 41, -1, - -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 59, -1, -1, 62, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, - 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, - 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, - -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - -1, -1, -1, -1, 304, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - -1, -1, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, -1, -1, 334, 335, 336, 337, -1, -1, - 340, 341, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 352, 353, 354, 355, 356, -1, -1, -1, - 360, 361, 362, 363, 257, 258, 259, 260, -1, -1, - 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, - -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, -1, -1, -1, - -1, 304, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, -1, -1, -1, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, 0, - -1, 334, 335, 336, 337, -1, -1, 340, 341, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 352, - 353, 354, 355, 356, -1, -1, -1, 360, 361, 362, - 363, -1, 33, -1, -1, -1, -1, -1, -1, 40, - 41, -1, -1, 44, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, - -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, - -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, - -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, -1, - -1, -1, -1, 304, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, -1, -1, 91, -1, - -1, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, -1, -1, 334, 335, 336, 337, -1, -1, 340, - 341, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 123, 352, 353, 354, 355, 356, -1, -1, -1, 360, - 361, 362, 363, 257, 258, 259, 260, -1, -1, 263, - -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, - -1, -1, -1, -1, -1, -1, -1, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 298, 299, -1, -1, -1, -1, - -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 0, -1, -1, -1, -1, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, -1, -1, - 334, 335, 336, 337, -1, -1, 340, 341, -1, -1, - -1, -1, -1, -1, -1, -1, 33, -1, 352, 353, - 354, 355, 356, 40, -1, -1, 360, 361, 362, 363, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 59, -1, 257, 258, -1, 260, 261, -1, - -1, -1, -1, -1, -1, -1, 269, 270, 271, 272, - 273, 274, 275, 276, 277, 278, 279, 280, -1, -1, - -1, -1, -1, -1, -1, -1, 93, -1, -1, 96, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 332, - -1, -1, -1, 33, -1, 338, 339, -1, -1, 342, - 40, 344, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 357, -1, 359, -1, -1, 59, - 363, 364, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, - -1, -1, -1, -1, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, -1, -1, -1, -1, -1, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - -1, -1, 91, -1, -1, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, -1, -1, 334, 335, 336, - 337, -1, -1, 340, 341, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 123, 352, 353, 354, 355, 356, - -1, -1, -1, 360, 361, 362, 363, 257, 258, 259, - 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, - 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, - -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - -1, -1, -1, -1, -1, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 0, -1, -1, - -1, -1, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, -1, -1, 334, 335, 336, 337, -1, -1, - 340, 341, -1, -1, -1, -1, -1, -1, -1, -1, - 33, -1, 352, 353, 354, 355, 356, 40, -1, -1, - 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 59, -1, 257, 258, - -1, 260, 261, -1, -1, -1, -1, -1, -1, -1, - 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, - 279, 280, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 332, -1, -1, -1, 33, -1, 338, - 339, -1, -1, 342, 40, 344, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 357, -1, - 359, -1, -1, 59, 363, 364, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, - 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, - 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, - -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, -1, -1, -1, - -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, -1, -1, -1, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, -1, - -1, 334, 335, 336, 337, -1, -1, 340, 341, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 352, - 353, 354, 355, 356, -1, -1, -1, 360, 361, 362, - 363, 257, 258, 259, 260, -1, -1, 263, -1, 265, - 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, - -1, -1, -1, -1, -1, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, -1, -1, -1, -1, -1, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 0, -1, -1, -1, -1, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, -1, -1, 334, 335, - 336, 337, -1, -1, 340, 341, -1, -1, -1, -1, - -1, -1, -1, -1, 33, -1, 352, 353, 354, 355, - 356, 40, -1, -1, 360, 361, 362, 363, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, -1, 40, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, - 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, - 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, - -1, -1, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, -1, -1, -1, -1, -1, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, -1, -1, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, -1, -1, 334, 335, 336, 337, -1, - -1, 340, 341, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 352, 353, 354, 355, 356, -1, -1, - -1, 360, 361, 362, 363, 257, 258, 259, 260, -1, - -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, -1, -1, - -1, -1, -1, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, 0, -1, -1, -1, -1, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - -1, -1, 334, 335, 336, 337, -1, -1, 340, 341, - -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, - 352, 353, 354, 355, 356, 40, -1, -1, 360, 361, - 362, 363, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, - -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, - -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 257, 258, 259, 260, -1, -1, 263, -1, - 265, 266, 267, 268, 269, 270, 271, 272, -1, -1, - -1, -1, -1, -1, -1, -1, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, -1, -1, -1, -1, -1, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, -1, -1, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, -1, -1, 334, - 335, 336, 337, -1, -1, 340, 341, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 352, 353, 354, - 355, 356, -1, -1, -1, 360, 361, 362, 363, 257, - 258, 259, 260, -1, -1, 263, -1, 265, 266, 267, - 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, - -1, -1, -1, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, -1, -1, -1, -1, -1, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, 0, - -1, -1, -1, -1, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, -1, -1, 334, 335, 336, 337, - -1, -1, 340, 341, -1, -1, -1, -1, -1, -1, - -1, -1, 33, -1, 352, 353, 354, 355, 356, 40, - -1, -1, 360, 361, 362, 363, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 59, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 93, -1, -1, 96, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 125, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, - -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 59, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 93, - -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 257, 258, 259, 260, - -1, -1, 263, -1, 265, 266, 267, 268, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, -1, - -1, -1, -1, -1, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, -1, -1, -1, -1, - -1, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, -1, -1, 334, 335, 336, 337, -1, -1, 340, - 341, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 352, 353, 354, 355, 356, -1, -1, -1, 360, - 361, 362, 363, 257, 258, 259, 260, -1, -1, 263, - -1, 265, 266, 267, 268, 269, 270, 271, 272, -1, - -1, -1, -1, -1, -1, -1, -1, 281, 282, 283, - 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, - 294, 295, 296, 297, 298, 299, -1, -1, -1, -1, - -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, 0, -1, -1, -1, -1, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, -1, -1, - 334, 335, 336, 337, -1, -1, 340, 341, -1, -1, - -1, -1, -1, -1, -1, -1, 33, -1, 352, 353, - 354, 355, 356, 40, -1, -1, 360, 361, 362, 363, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 93, -1, -1, 96, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 125, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, - 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 257, 258, 259, 260, -1, -1, 263, -1, 265, 266, - 267, 268, 269, 270, 271, 272, -1, -1, -1, -1, - -1, -1, -1, -1, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, -1, -1, -1, -1, -1, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - -1, -1, -1, -1, -1, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, -1, -1, 334, 335, 336, - 337, -1, -1, 340, 341, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 352, 353, 354, 355, 356, - -1, -1, -1, 360, 361, 362, 363, 257, 258, 259, - 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, - 270, 271, 272, -1, -1, -1, -1, -1, -1, -1, - -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - -1, -1, -1, -1, -1, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, 0, -1, -1, - -1, -1, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, -1, -1, 334, 335, 336, 337, -1, -1, - 340, 341, -1, -1, -1, -1, -1, -1, -1, -1, - 33, -1, 352, 353, 354, 355, 356, 40, -1, -1, - 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 93, -1, -1, 96, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 125, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, - -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, - 96, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 125, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, - 263, -1, 265, 266, 267, 268, 269, 270, 271, 272, - -1, -1, -1, -1, -1, -1, -1, -1, 281, 282, - 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, - 293, 294, 295, 296, 297, 298, 299, -1, -1, -1, - -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, -1, -1, -1, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, -1, - -1, 334, 335, 336, 337, -1, -1, 340, 341, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 352, - 353, 354, 355, 356, -1, -1, -1, 360, 361, 362, - 363, 257, 258, 259, 260, -1, -1, 263, -1, 265, - 266, 267, 268, 269, 270, 271, 272, -1, -1, -1, - -1, -1, -1, -1, -1, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, -1, -1, -1, -1, -1, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 0, -1, -1, -1, -1, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, -1, -1, 334, 335, - 336, 337, -1, -1, 340, 341, -1, -1, -1, -1, - -1, -1, -1, -1, 33, -1, 352, 353, 354, 355, - 356, 40, -1, -1, 360, 361, 362, 363, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, -1, 40, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 59, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 93, -1, -1, 96, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 125, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, - 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, - 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, - -1, -1, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, -1, -1, -1, -1, -1, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, -1, -1, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, -1, -1, 334, 335, 336, 337, -1, - -1, 340, 341, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 352, 353, 354, 355, 356, -1, -1, - -1, 360, 361, 362, 363, 257, 258, 259, 260, -1, - -1, 263, -1, 265, 266, 267, 268, 269, 270, 271, - 272, -1, -1, -1, -1, -1, -1, -1, -1, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, -1, -1, - -1, -1, -1, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 0, -1, 334, 335, 336, 337, -1, -1, 340, 341, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 352, 353, 354, 355, 356, -1, -1, -1, 360, 361, - 362, 363, -1, 33, -1, -1, -1, -1, -1, -1, - 40, 41, -1, 43, 44, 45, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, - -1, -1, 62, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 93, -1, -1, 96, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, - -1, -1, -1, -1, -1, 40, 41, -1, -1, 44, - -1, -1, -1, -1, -1, 125, -1, -1, -1, -1, - -1, -1, -1, -1, 59, 60, -1, 62, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 93, -1, - -1, 96, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 41, -1, -1, 44, -1, - 125, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 59, -1, 33, -1, -1, -1, -1, - -1, -1, 40, -1, -1, -1, -1, 45, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, -1, -1, -1, -1, -1, 93, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 257, 258, 259, - 260, -1, -1, 263, -1, 265, 266, 267, 268, 269, - 270, 271, 272, -1, -1, 93, -1, -1, 96, 125, - -1, 281, 282, 283, 284, 285, 286, 287, 288, 289, - 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, - -1, -1, -1, -1, 304, 305, -1, 125, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 317, 318, 319, - 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, 257, 258, 259, 260, -1, -1, 263, -1, - 340, 341, -1, 268, 33, -1, 271, 272, -1, -1, - -1, 40, 41, -1, -1, -1, 45, -1, -1, -1, - 360, 361, 362, 363, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, -1, -1, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 96, -1, 334, - 335, 336, 337, -1, -1, -1, -1, -1, 264, -1, - -1, 346, 347, 348, 349, 350, 351, 352, 353, 354, - 355, 356, -1, -1, -1, -1, -1, -1, 363, 257, - 258, 259, 260, -1, 290, 263, -1, 265, 266, 267, - 268, 269, 270, -1, 300, 0, -1, 303, -1, -1, - -1, -1, -1, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, -1, -1, -1, -1, -1, 305, 33, -1, - -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, - 346, 347, -1, -1, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 59, -1, -1, -1, -1, -1, - -1, -1, 340, 341, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 360, 361, 362, 363, -1, -1, 93, -1, - -1, 96, -1, -1, -1, -1, 0, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 257, 258, - 259, 260, -1, -1, 263, -1, -1, -1, -1, 268, - 125, -1, 271, 272, -1, -1, -1, -1, -1, 33, - -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 59, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, -1, -1, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, -1, -1, 334, 335, 336, 337, 93, - -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0, 352, 353, 354, 355, 356, -1, -1, - -1, -1, -1, -1, 363, -1, -1, -1, -1, -1, - -1, 125, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 257, 258, 259, 260, -1, -1, 263, -1, - -1, 59, -1, 268, -1, -1, 271, 272, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 93, -1, -1, -1, -1, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, -1, -1, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, 125, -1, 334, - 335, 336, 337, -1, -1, 0, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 352, 353, 354, - 355, 356, -1, 257, 258, 259, 260, -1, 363, 263, - -1, -1, -1, -1, 268, -1, -1, 271, 272, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 59, -1, -1, -1, -1, -1, - -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, -1, -1, -1, -1, -1, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, 93, -1, - 334, 335, 336, 337, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 0, -1, -1, -1, 352, 353, - 354, 355, 356, -1, -1, -1, -1, -1, -1, 363, - 125, -1, 260, -1, -1, -1, -1, 265, 266, 267, - -1, 269, 270, 271, 272, -1, -1, -1, -1, -1, - -1, -1, -1, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, 300, 59, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 93, -1, -1, - -1, -1, 340, 341, -1, -1, -1, -1, -1, 0, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 360, 361, 362, 363, -1, -1, -1, 125, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, - 265, 266, 267, -1, 269, 270, 271, 272, 59, -1, - -1, -1, -1, 91, -1, -1, 281, 282, 283, 284, - 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, - 295, 296, 297, 298, 299, 300, -1, -1, -1, -1, - -1, -1, 93, -1, -1, 123, -1, -1, -1, -1, - -1, -1, -1, 0, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 125, 340, 341, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 360, 361, 362, 363, -1, - -1, -1, -1, -1, 260, -1, -1, -1, -1, 265, - 266, 267, 59, 269, 270, 271, 272, -1, -1, -1, - -1, -1, -1, -1, -1, 281, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, - 296, 297, 298, 299, -1, -1, 93, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 0, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 125, 257, - 258, -1, 260, 261, 340, 341, -1, -1, -1, -1, - -1, 269, 270, 271, 272, 273, 274, 275, 276, 277, - 278, 279, 280, -1, 360, 361, 362, 363, -1, 260, - -1, -1, -1, -1, 265, 266, 267, 59, 269, 270, - 271, 272, -1, -1, -1, -1, -1, -1, -1, -1, - 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, - 291, 292, 293, 294, 295, 296, 297, 298, 299, -1, - -1, 93, -1, -1, 332, -1, -1, -1, -1, -1, - 338, 339, 0, -1, 342, -1, 344, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 357, - -1, 359, -1, 125, -1, 363, 364, -1, -1, 340, - 341, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 360, - 361, 362, 363, 260, -1, -1, -1, -1, 265, 266, - 267, 59, 269, 270, 271, 272, -1, -1, -1, -1, - -1, -1, -1, -1, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, -1, -1, 93, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 0, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, -1, -1, - -1, -1, -1, 340, 341, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, - -1, -1, 40, 360, 361, 362, 363, -1, 260, -1, - -1, -1, -1, 265, 266, 267, -1, 269, 270, 271, - 272, 59, -1, -1, -1, -1, -1, -1, -1, 281, - 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, - 292, 293, 294, 295, 296, 297, 298, 299, -1, -1, - -1, -1, -1, -1, -1, 93, -1, -1, 96, -1, - -1, 0, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 125, 340, 341, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 43, -1, 45, 46, 360, 361, - 362, 363, 260, -1, -1, -1, -1, 265, 266, 267, - 59, 269, 270, 271, 272, -1, -1, -1, -1, -1, - -1, -1, -1, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, -1, -1, 93, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 125, -1, -1, -1, - -1, -1, 340, 341, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 360, 361, 362, 363, -1, -1, -1, 257, - 258, 259, -1, -1, -1, 263, -1, 265, 266, 267, - 268, 269, 270, 271, 272, -1, -1, -1, -1, -1, - -1, -1, -1, 281, 282, 283, 284, 285, 286, 287, - 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, - 298, 299, -1, -1, -1, -1, -1, 305, 306, 307, - 308, 309, 310, 311, 312, 313, 314, 315, 316, -1, - -1, -1, -1, -1, 322, 323, 324, 325, 326, 327, - 328, 329, 330, 331, 0, -1, 334, 335, 336, 337, - -1, -1, 340, 341, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 352, 353, 354, 355, 356, -1, - -1, -1, 360, 361, 362, -1, -1, -1, -1, -1, - -1, 37, 271, 272, -1, 41, 42, 43, 44, 45, - -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 59, 60, -1, 62, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, - 319, 320, 321, -1, -1, -1, -1, 93, -1, -1, - -1, -1, 33, -1, -1, 334, 335, 336, 337, 40, - -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, - -1, -1, -1, 352, 353, 354, 355, 356, -1, 125, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 91, -1, -1, -1, -1, 96, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 123, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 33, -1, -1, -1, -1, -1, -1, 40, -1, - -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 264, 91, - -1, -1, -1, -1, 96, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 290, -1, -1, -1, -1, -1, - -1, 123, -1, -1, 300, -1, -1, 303, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 33, -1, 257, 258, 259, 260, - 261, 40, 263, -1, -1, -1, 45, 268, 269, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, - 346, 347, 348, 349, 350, 351, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 305, 306, 307, 308, 309, 310, - 311, 312, 313, 314, 315, 316, -1, 96, -1, -1, - -1, 322, 323, 324, 325, 326, 327, 328, 329, 330, - 331, 332, -1, 334, 335, 336, 337, 338, 339, -1, - -1, 342, -1, 344, -1, -1, -1, -1, -1, -1, - -1, 352, 353, 354, 355, 356, 357, -1, 359, -1, - -1, -1, 363, 364, -1, 257, 258, 259, 260, 261, - -1, 263, -1, -1, -1, -1, 268, 269, 270, 271, - 272, 273, 274, 275, 276, 277, 278, 279, 280, -1, - 33, -1, -1, -1, -1, -1, -1, 40, -1, -1, - -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - 332, -1, 334, 335, 336, 337, 338, 339, -1, -1, - 342, -1, 344, 96, -1, -1, -1, -1, -1, -1, - 352, 353, 354, 355, 356, 357, -1, 359, -1, -1, - -1, 363, 364, -1, -1, -1, -1, -1, 257, 258, - 259, 260, -1, -1, 263, -1, 265, 266, 267, 268, - 269, 270, 271, 272, -1, -1, -1, -1, -1, -1, - -1, -1, 281, 282, 283, 284, 285, 286, 287, 288, - 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, - 299, -1, -1, -1, -1, -1, 305, 306, 307, 308, - 309, 310, 311, 312, 313, 314, 315, 316, -1, -1, - -1, -1, -1, 322, 323, 324, 325, 326, 327, 328, - 329, 330, 331, -1, -1, 334, 335, 336, 337, 33, - -1, 340, 341, -1, -1, -1, 40, -1, -1, -1, - -1, 45, -1, 352, 353, 354, 355, 356, -1, -1, - -1, 360, 361, 362, 363, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 257, 258, 259, 260, -1, -1, - 263, -1, 96, -1, -1, 268, -1, -1, 271, 272, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 305, 306, 307, 308, 309, 310, 311, 312, - 313, 314, 315, 316, -1, -1, -1, -1, -1, 322, - 323, 324, 325, 326, 327, 328, 329, 330, 331, 33, - -1, 334, 335, 336, 337, -1, 40, -1, -1, -1, - -1, 45, -1, -1, -1, -1, -1, -1, -1, 352, - 353, 354, 355, 356, -1, -1, -1, -1, -1, -1, - 363, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 96, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, - -1, -1, -1, -1, 268, -1, 33, 271, 272, -1, - -1, -1, -1, 40, -1, -1, -1, -1, 45, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, -1, -1, -1, -1, -1, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, -1, 96, - 334, 335, 336, 337, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 352, 353, - 354, 355, 356, -1, -1, -1, -1, -1, -1, 363, - -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, - -1, -1, -1, -1, 40, -1, 42, -1, -1, 45, - -1, -1, -1, 257, 258, 259, 260, -1, -1, 263, - -1, -1, -1, -1, 268, -1, -1, 271, 272, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 96, 305, 306, 307, 308, 309, 310, 311, 312, 313, - 314, 315, 316, -1, -1, -1, -1, -1, 322, 323, - 324, 325, 326, 327, 328, 329, 330, 331, -1, -1, - 334, 335, 336, 337, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 352, 353, - 354, 355, 356, -1, -1, -1, -1, 33, -1, 363, - 257, 258, 259, 260, 40, -1, 263, -1, -1, 45, - -1, 268, -1, -1, 271, 272, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 305, 306, - 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, - 96, -1, -1, -1, -1, 322, 323, 324, 325, 326, - 327, 328, 329, 330, 331, -1, -1, 334, 335, 336, - 337, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 352, 353, 354, 355, 356, - -1, 257, 258, 259, -1, -1, 363, 263, -1, -1, - -1, -1, 268, 33, -1, 271, 272, -1, -1, -1, - 40, -1, -1, -1, -1, 45, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, -1, -1, -1, -1, -1, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, 96, -1, 334, 335, - 336, 337, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 352, 353, 354, 355, - 356, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, - -1, 257, 258, 259, -1, 40, -1, 263, -1, -1, - 45, -1, 268, -1, -1, 271, 272, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 305, - 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, - 316, 96, -1, -1, -1, -1, 322, 323, 324, 325, - 326, 327, 328, 329, 330, 331, -1, -1, 334, 335, - 336, 337, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 352, 353, 354, 355, - 356, 33, -1, -1, -1, -1, -1, -1, 40, -1, - -1, -1, -1, 45, -1, -1, -1, 257, 258, 259, - -1, -1, -1, 263, -1, -1, -1, -1, 268, -1, - -1, 271, 272, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 96, 305, 306, 307, 308, 309, - 310, 311, 312, 313, 314, 315, 316, -1, -1, -1, - -1, -1, 322, 323, 324, 325, 326, 327, 328, 329, - 330, 331, -1, -1, 334, 335, 336, 337, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 352, 353, 354, 355, 356, -1, -1, -1, - -1, -1, 257, 258, 259, -1, -1, -1, 263, -1, - -1, -1, -1, 268, -1, -1, 271, 272, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, - 315, 316, -1, -1, -1, -1, -1, 322, 323, 324, - 325, 326, 327, 328, 329, 330, 331, -1, -1, 334, - 335, 336, 337, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 352, 353, 354, - 355, 356, -1, -1, -1, 257, 258, 259, -1, -1, - -1, 263, -1, -1, -1, -1, 268, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 305, 306, 307, 308, 309, 310, 311, - 312, 313, 314, 315, 316, -1, -1, -1, -1, -1, - 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, - -1, -1, 334, 335, 336, 337, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 352, 353, 354, 355, 356, -}; -#define YYFINAL 2 -#ifndef YYDEBUG -#define YYDEBUG 0 -#endif -#define YYMAXTOKEN 366 -#if YYDEBUG -char *yyname[] = { -"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -"'!'",0,0,0,"'%'",0,0,"'('","')'","'*'","'+'","','","'-'","'.'","'/'",0,0,0,0,0, -0,0,0,0,0,"':'","';'","'<'","'='","'>'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,"'['",0,"']'","'^'",0,"'`'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,"'{'",0,"'}'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"LABEL","VARIABLE","NUMBER", -"TEXT","COMMAND_LINE","DELIMITED","ORDINAL","TH","LEFT_ARROW_HEAD", -"RIGHT_ARROW_HEAD","DOUBLE_ARROW_HEAD","LAST","UP","DOWN","LEFT","RIGHT","BOX", -"CIRCLE","ELLIPSE","ARC","LINE","ARROW","MOVE","SPLINE","HEIGHT","RADIUS", -"WIDTH","DIAMETER","FROM","TO","AT","WITH","BY","THEN","DOTTED","DASHED","CHOP", -"SAME","INVISIBLE","LJUST","RJUST","ABOVE","BELOW","OF","THE","WAY","BETWEEN", -"AND","HERE","DOT_N","DOT_E","DOT_W","DOT_S","DOT_NE","DOT_SE","DOT_NW", -"DOT_SW","DOT_C","DOT_START","DOT_END","DOT_X","DOT_Y","DOT_HT","DOT_WID", -"DOT_RAD","SIN","COS","ATAN2","LOG","EXP","SQRT","K_MAX","K_MIN","INT","RAND", -"COPY","THRU","TOP","BOTTOM","UPPER","LOWER","SH","PRINT","CW","CCW","FOR","DO", -"IF","ELSE","ANDAND","OROR","NOTEQUAL","EQUALEQUAL","LESSEQUAL","GREATEREQUAL", -"LEFT_CORNER","RIGHT_CORNER","CENTER","END","START","RESET","UNTIL","PLOT", -"THICKNESS","FILL","ALIGNED","SPRINTF","COMMAND","DEFINE","UNDEF", -}; -char *yyrule[] = { -"$accept : top", -"top : optional_separator", -"top : element_list", -"element_list : optional_separator middle_element_list optional_separator", -"middle_element_list : element", -"middle_element_list : middle_element_list separator element", -"optional_separator :", -"optional_separator : separator", -"separator : ';'", -"separator : separator ';'", -"placeless_element : VARIABLE '=' any_expr", -"placeless_element : VARIABLE ':' '=' any_expr", -"placeless_element : UP", -"placeless_element : DOWN", -"placeless_element : LEFT", -"placeless_element : RIGHT", -"placeless_element : COMMAND_LINE", -"placeless_element : COMMAND print_args", -"placeless_element : PRINT print_args", -"$$1 :", -"placeless_element : SH $$1 DELIMITED", -"placeless_element : COPY TEXT", -"$$2 :", -"$$3 :", -"placeless_element : COPY TEXT THRU $$2 DELIMITED $$3 until", -"$$4 :", -"$$5 :", -"placeless_element : COPY THRU $$4 DELIMITED $$5 until", -"$$6 :", -"placeless_element : FOR VARIABLE '=' expr TO expr optional_by DO $$6 DELIMITED", -"placeless_element : simple_if", -"$$7 :", -"placeless_element : simple_if ELSE $$7 DELIMITED", -"placeless_element : reset_variables", -"placeless_element : RESET", -"reset_variables : RESET VARIABLE", -"reset_variables : reset_variables VARIABLE", -"reset_variables : reset_variables ',' VARIABLE", -"print_args : print_arg", -"print_args : print_args print_arg", -"print_arg : expr", -"print_arg : text", -"print_arg : position", -"$$8 :", -"simple_if : IF any_expr THEN $$8 DELIMITED", -"until :", -"until : UNTIL TEXT", -"any_expr : expr", -"any_expr : text_expr", -"text_expr : text EQUALEQUAL text", -"text_expr : text NOTEQUAL text", -"text_expr : text_expr ANDAND text_expr", -"text_expr : text_expr ANDAND expr", -"text_expr : expr ANDAND text_expr", -"text_expr : text_expr OROR text_expr", -"text_expr : text_expr OROR expr", -"text_expr : expr OROR text_expr", -"text_expr : '!' text_expr", -"optional_by :", -"optional_by : BY expr", -"optional_by : BY '*' expr", -"element : object_spec", -"element : LABEL ':' optional_separator element", -"element : LABEL ':' optional_separator position_not_place", -"element : LABEL ':' optional_separator place", -"$$9 :", -"$$10 :", -"element : '{' $$9 element_list '}' $$10 optional_element", -"element : placeless_element", -"optional_element :", -"optional_element : element", -"object_spec : BOX", -"object_spec : CIRCLE", -"object_spec : ELLIPSE", -"object_spec : ARC", -"object_spec : LINE", -"object_spec : ARROW", -"object_spec : MOVE", -"object_spec : SPLINE", -"object_spec : text", -"object_spec : PLOT expr", -"object_spec : PLOT expr text", -"$$11 :", -"object_spec : '[' $$11 element_list ']'", -"object_spec : object_spec HEIGHT expr", -"object_spec : object_spec RADIUS expr", -"object_spec : object_spec WIDTH expr", -"object_spec : object_spec DIAMETER expr", -"object_spec : object_spec expr", -"object_spec : object_spec UP", -"object_spec : object_spec UP expr", -"object_spec : object_spec DOWN", -"object_spec : object_spec DOWN expr", -"object_spec : object_spec RIGHT", -"object_spec : object_spec RIGHT expr", -"object_spec : object_spec LEFT", -"object_spec : object_spec LEFT expr", -"object_spec : object_spec FROM position", -"object_spec : object_spec TO position", -"object_spec : object_spec AT position", -"object_spec : object_spec WITH path", -"object_spec : object_spec BY expr_pair", -"object_spec : object_spec THEN", -"object_spec : object_spec DOTTED", -"object_spec : object_spec DOTTED expr", -"object_spec : object_spec DASHED", -"object_spec : object_spec DASHED expr", -"object_spec : object_spec FILL", -"object_spec : object_spec FILL expr", -"object_spec : object_spec CHOP", -"object_spec : object_spec CHOP expr", -"object_spec : object_spec SAME", -"object_spec : object_spec INVISIBLE", -"object_spec : object_spec LEFT_ARROW_HEAD", -"object_spec : object_spec RIGHT_ARROW_HEAD", -"object_spec : object_spec DOUBLE_ARROW_HEAD", -"object_spec : object_spec CW", -"object_spec : object_spec CCW", -"object_spec : object_spec text", -"object_spec : object_spec LJUST", -"object_spec : object_spec RJUST", -"object_spec : object_spec ABOVE", -"object_spec : object_spec BELOW", -"object_spec : object_spec THICKNESS expr", -"object_spec : object_spec ALIGNED", -"text : TEXT", -"text : SPRINTF '(' TEXT sprintf_args ')'", -"sprintf_args :", -"sprintf_args : sprintf_args ',' expr", -"position : position_not_place", -"position : place", -"position_not_place : expr_pair", -"position_not_place : position '+' expr_pair", -"position_not_place : position '-' expr_pair", -"position_not_place : '(' position ',' position ')'", -"position_not_place : expr between position AND position", -"position_not_place : expr '<' position ',' position '>'", -"between : BETWEEN", -"between : OF THE WAY BETWEEN", -"expr_pair : expr ',' expr", -"expr_pair : '(' expr_pair ')'", -"place : label", -"place : label corner", -"place : corner label", -"place : corner OF label", -"place : HERE", -"label : LABEL", -"label : nth_primitive", -"label : label '.' LABEL", -"ordinal : ORDINAL", -"ordinal : '`' any_expr TH", -"optional_ordinal_last : LAST", -"optional_ordinal_last : ordinal LAST", -"nth_primitive : ordinal object_type", -"nth_primitive : optional_ordinal_last object_type", -"object_type : BOX", -"object_type : CIRCLE", -"object_type : ELLIPSE", -"object_type : ARC", -"object_type : LINE", -"object_type : ARROW", -"object_type : SPLINE", -"object_type : '[' ']'", -"object_type : TEXT", -"label_path : '.' LABEL", -"label_path : label_path '.' LABEL", -"relative_path : corner", -"relative_path : label_path", -"relative_path : label_path corner", -"path : relative_path", -"path : ORDINAL LAST object_type relative_path", -"path : LAST object_type relative_path", -"path : ORDINAL object_type relative_path", -"path : LABEL relative_path", -"corner : DOT_N", -"corner : DOT_E", -"corner : DOT_W", -"corner : DOT_S", -"corner : DOT_NE", -"corner : DOT_SE", -"corner : DOT_NW", -"corner : DOT_SW", -"corner : DOT_C", -"corner : DOT_START", -"corner : DOT_END", -"corner : TOP", -"corner : BOTTOM", -"corner : LEFT", -"corner : RIGHT", -"corner : UPPER LEFT", -"corner : LOWER LEFT", -"corner : UPPER RIGHT", -"corner : LOWER RIGHT", -"corner : LEFT_CORNER", -"corner : RIGHT_CORNER", -"corner : UPPER LEFT_CORNER", -"corner : LOWER LEFT_CORNER", -"corner : UPPER RIGHT_CORNER", -"corner : LOWER RIGHT_CORNER", -"corner : CENTER", -"corner : START", -"corner : END", -"expr : VARIABLE", -"expr : NUMBER", -"expr : place DOT_X", -"expr : place DOT_Y", -"expr : place DOT_HT", -"expr : place DOT_WID", -"expr : place DOT_RAD", -"expr : expr '+' expr", -"expr : expr '-' expr", -"expr : expr '*' expr", -"expr : expr '/' expr", -"expr : expr '%' expr", -"expr : expr '^' expr", -"expr : '-' expr", -"expr : '(' any_expr ')'", -"expr : SIN '(' any_expr ')'", -"expr : COS '(' any_expr ')'", -"expr : ATAN2 '(' any_expr ',' any_expr ')'", -"expr : LOG '(' any_expr ')'", -"expr : EXP '(' any_expr ')'", -"expr : SQRT '(' any_expr ')'", -"expr : K_MAX '(' any_expr ',' any_expr ')'", -"expr : K_MIN '(' any_expr ',' any_expr ')'", -"expr : INT '(' any_expr ')'", -"expr : RAND '(' any_expr ')'", -"expr : RAND '(' ')'", -"expr : expr '<' expr", -"expr : expr LESSEQUAL expr", -"expr : expr '>' expr", -"expr : expr GREATEREQUAL expr", -"expr : expr EQUALEQUAL expr", -"expr : expr NOTEQUAL expr", -"expr : expr ANDAND expr", -"expr : expr OROR expr", -"expr : '!' expr", -}; -#endif -#define yyclearin (yychar=(-1)) -#define yyerrok (yyerrflag=0) -#ifdef YYSTACKSIZE -#ifndef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE -#endif -#else -#ifdef YYMAXDEPTH -#define YYSTACKSIZE YYMAXDEPTH -#else -#define YYSTACKSIZE 500 -#define YYMAXDEPTH 500 -#endif -#endif -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short yyss[YYSTACKSIZE]; -YYSTYPE yyvs[YYSTACKSIZE]; -#define yystacksize YYSTACKSIZE -#line 1514 "/u/jjc/groff/pic/pic.y" - -/* bison defines const to be empty unless __STDC__ is defined, which it -isn't under cfront */ - -#ifdef const -#undef const -#endif - -static struct { - const char *name; - double val; - int scaled; // non-zero if val should be multiplied by scale -} defaults_table[] = { - { "arcrad", .25, 1 }, - { "arrowht", .1, 1 }, - { "arrowwid", .05, 1 }, - { "circlerad", .25, 1 }, - { "boxht", .5, 1 }, - { "boxwid", .75, 1 }, - { "boxrad", 0.0, 1 }, - { "dashwid", .05, 1 }, - { "ellipseht", .5, 1 }, - { "ellipsewid", .75, 1 }, - { "moveht", .5, 1 }, - { "movewid", .5, 1 }, - { "lineht", .5, 1 }, - { "linewid", .5, 1 }, - { "textht", 0.0, 1 }, - { "textwid", 0.0, 1 }, - { "scale", 1.0, 0 }, - { "linethick", -1.0, 0 }, // in points - { "fillval", .5, 0 }, - { "arrowhead", 1.0, 0 }, - { "maxpswid", 8.5, 0 }, - { "maxpsht", 11.0, 0 }, -}; - -place *lookup_label(const char *label) -{ - saved_state *state = current_saved_state; - PTABLE(place) *tbl = current_table; - for (;;) { - place *pl = tbl->lookup(label); - if (pl) - return pl; - if (!state) - return 0; - tbl = state->tbl; - state = state->prev; - } -} - -void define_label(const char *label, const place *pl) -{ - place *p = new place; - *p = *pl; - current_table->define(label, p); -} - -int lookup_variable(const char *name, double *val) -{ - place *pl = lookup_label(name); - if (pl) { - *val = pl->x; - return 1; - } - return 0; -} - -void define_variable(const char *name, double val) -{ - place *p = new place; - p->obj = 0; - p->x = val; - p->y = 0.0; - current_table->define(name, p); - if (strcmp(name, "scale") == 0) { - // When the scale changes, reset all scaled pre-defined variables to - // their default values. - for (int i = 0; i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++) - if (defaults_table[i].scaled) - define_variable(defaults_table[i].name, val*defaults_table[i].val); - } -} - -// called once only (not once per parse) - -void parse_init() -{ - current_direction = RIGHT_DIRECTION; - current_position.x = 0.0; - current_position.y = 0.0; - // This resets everything to its default value. - reset_all(); -} - -void reset(const char *nm) -{ - for (int i = 0; i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++) - if (strcmp(nm, defaults_table[i].name) == 0) { - double val = defaults_table[i].val; - if (defaults_table[i].scaled) { - double scale; - lookup_variable("scale", &scale); - val *= scale; - } - define_variable(defaults_table[i].name, val); - return; - } - lex_error("`%1' is not a predefined variable", nm); -} - -void reset_all() -{ - // We only have to explicitly reset the pre-defined variables that - // aren't scaled because `scale' is not scaled, and changing the - // value of `scale' will reset all the pre-defined variables that - // are scaled. - for (int i = 0; i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++) - if (!defaults_table[i].scaled) - define_variable(defaults_table[i].name, defaults_table[i].val); -} - -// called after each parse - -void parse_cleanup() -{ - while (current_saved_state != 0) { - delete current_table; - current_table = current_saved_state->tbl; - saved_state *tem = current_saved_state; - current_saved_state = current_saved_state->prev; - delete tem; - } - assert(current_table == &top_table); - PTABLE_ITERATOR(place) iter(current_table); - const char *key; - place *pl; - while (iter.next(&key, &pl)) - if (pl->obj != 0) { - position pos = pl->obj->origin(); - pl->obj = 0; - pl->x = pos.x; - pl->y = pos.y; - } - while (olist.head != 0) { - object *tem = olist.head; - olist.head = olist.head->next; - delete tem; - } - olist.tail = 0; - current_direction = RIGHT_DIRECTION; - current_position.x = 0.0; - current_position.y = 0.0; -} - -const char *ordinal_postfix(int n) -{ - if (n < 10 || n > 20) - switch (n % 10) { - case 1: - return "st"; - case 2: - return "nd"; - case 3: - return "rd"; - } - return "th"; -} - -const char *object_type_name(object_type type) -{ - switch (type) { - case BOX_OBJECT: - return "box"; - case CIRCLE_OBJECT: - return "circle"; - case ELLIPSE_OBJECT: - return "ellipse"; - case ARC_OBJECT: - return "arc"; - case SPLINE_OBJECT: - return "spline"; - case LINE_OBJECT: - return "line"; - case ARROW_OBJECT: - return "arrow"; - case MOVE_OBJECT: - return "move"; - case TEXT_OBJECT: - return "\"\""; - case BLOCK_OBJECT: - return "[]"; - case OTHER_OBJECT: - case MARK_OBJECT: - default: - break; - } - return "object"; -} - -static char sprintf_buf[1024]; - -char *format_number(const char *form, double n) -{ - if (form == 0) - form = "%g"; - else { - // this is a fairly feeble attempt at validation of the format - int nspecs = 0; - for (const char *p = form; *p != '\0'; p++) - if (*p == '%') { - if (p[1] == '%') - p++; - else - nspecs++; - } - if (nspecs > 1) { - lex_error("bad format `%1'", form); - return strsave(form); - } - } - sprintf(sprintf_buf, form, n); - return strsave(sprintf_buf); -} - -char *do_sprintf(const char *form, const double *v, int nv) -{ - string result; - int i = 0; - string one_format; - while (*form) { - if (*form == '%') { - one_format += *form++; - for (; *form != '\0' && strchr("#-+ 0123456789.", *form) != 0; form++) - one_format += *form; - if (*form == '\0' || strchr("eEfgG%", *form) == 0) { - lex_error("bad sprintf format"); - result += one_format; - result += form; - break; - } - if (*form == '%') { - one_format += *form++; - one_format += '\0'; - sprintf(sprintf_buf, one_format.contents()); - } - else { - if (i >= nv) { - lex_error("too few arguments to sprintf"); - result += one_format; - result += form; - break; - } - one_format += *form++; - one_format += '\0'; - sprintf(sprintf_buf, one_format.contents(), v[i++]); - } - one_format.clear(); - result += sprintf_buf; - } - else - result += *form++; - } - result += '\0'; - return strsave(result.contents()); -} -#line 3387 "y.tab.c" -#define YYABORT goto yyabort -#define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab -int -yyparse() -{ - register int yym, yyn, yystate; -#if YYDEBUG - register char *yys; - extern char *getenv(); - - if (yys = getenv("YYDEBUG")) - { - yyn = *yys; - if (yyn >= '0' && yyn <= '9') - yydebug = yyn - '0'; - } -#endif - - yynerrs = 0; - yyerrflag = 0; - yychar = (-1); - - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; - -yyloop: - if (yyn = yydefred[yystate]) goto yyreduce; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, reading %d (%s)\n", yystate, - yychar, yys); - } -#endif - } - if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { -#if YYDEBUG - if (yydebug) - printf("yydebug: state %d, shifting to state %d\n", - yystate, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = (-1); - if (yyerrflag > 0) --yyerrflag; - goto yyloop; - } - if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { - yyn = yytable[yyn]; - goto yyreduce; - } - if (yyerrflag) goto yyinrecovery; -#ifdef lint - goto yynewerror; -#endif -yynewerror: - yyerror("syntax error"); -#ifdef lint - goto yyerrlab; -#endif -yyerrlab: - ++yynerrs; -yyinrecovery: - if (yyerrflag < 3) - { - yyerrflag = 3; - for (;;) - { - if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) - { -#if YYDEBUG - if (yydebug) - printf("yydebug: state %d, error recovery shifting\ - to state %d\n", *yyssp, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - goto yyloop; - } - else - { -#if YYDEBUG - if (yydebug) - printf("yydebug: error recovery discarding state %d\n", - *yyssp); -#endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; - } - } - } - else - { - if (yychar == 0) goto yyabort; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, error recovery discards token %d (%s)\n", - yystate, yychar, yys); - } -#endif - yychar = (-1); - goto yyloop; - } -yyreduce: -#if YYDEBUG - if (yydebug) - printf("yydebug: state %d, reducing by rule %d (%s)\n", - yystate, yyn, yyrule[yyn]); -#endif - yym = yylen[yyn]; - yyval = yyvsp[1-yym]; - switch (yyn) - { -case 2: -#line 272 "/u/jjc/groff/pic/pic.y" -{ - if (olist.head) - print_picture(olist.head); - } -break; -case 3: -#line 281 "/u/jjc/groff/pic/pic.y" -{ yyval.pl = yyvsp[-1].pl; } -break; -case 4: -#line 286 "/u/jjc/groff/pic/pic.y" -{ yyval.pl = yyvsp[0].pl; } -break; -case 5: -#line 288 "/u/jjc/groff/pic/pic.y" -{ yyval.pl = yyvsp[-2].pl; } -break; -case 10: -#line 303 "/u/jjc/groff/pic/pic.y" -{ - define_variable(yyvsp[-2].str, yyvsp[0].x); - a_delete yyvsp[-2].str; - } -break; -case 11: -#line 308 "/u/jjc/groff/pic/pic.y" -{ - place *p = lookup_label(yyvsp[-3].str); - if (!p) { - lex_error("variable `%1' not defined", yyvsp[-3].str); - YYABORT; - } - p->obj = 0; - p->x = yyvsp[0].x; - p->y = 0.0; - a_delete yyvsp[-3].str; - } -break; -case 12: -#line 320 "/u/jjc/groff/pic/pic.y" -{ current_direction = UP_DIRECTION; } -break; -case 13: -#line 322 "/u/jjc/groff/pic/pic.y" -{ current_direction = DOWN_DIRECTION; } -break; -case 14: -#line 324 "/u/jjc/groff/pic/pic.y" -{ current_direction = LEFT_DIRECTION; } -break; -case 15: -#line 326 "/u/jjc/groff/pic/pic.y" -{ current_direction = RIGHT_DIRECTION; } -break; -case 16: -#line 328 "/u/jjc/groff/pic/pic.y" -{ - olist.append(make_command_object(yyvsp[0].lstr.str, yyvsp[0].lstr.filename, - yyvsp[0].lstr.lineno)); - } -break; -case 17: -#line 333 "/u/jjc/groff/pic/pic.y" -{ - olist.append(make_command_object(yyvsp[0].lstr.str, yyvsp[0].lstr.filename, - yyvsp[0].lstr.lineno)); - } -break; -case 18: -#line 338 "/u/jjc/groff/pic/pic.y" -{ - fprintf(stderr, "%s\n", yyvsp[0].lstr.str); - a_delete yyvsp[0].lstr.str; - fflush(stderr); - } -break; -case 19: -#line 344 "/u/jjc/groff/pic/pic.y" -{ delim_flag = 1; } -break; -case 20: -#line 346 "/u/jjc/groff/pic/pic.y" -{ - delim_flag = 0; - system(yyvsp[0].str); - a_delete yyvsp[0].str; - } -break; -case 21: -#line 352 "/u/jjc/groff/pic/pic.y" -{ - if (yychar < 0) - do_lookahead(); - do_copy(yyvsp[0].lstr.str); - /* do not delete the filename*/ - } -break; -case 22: -#line 359 "/u/jjc/groff/pic/pic.y" -{ delim_flag = 2; } -break; -case 23: -#line 361 "/u/jjc/groff/pic/pic.y" -{ delim_flag = 0; } -break; -case 24: -#line 363 "/u/jjc/groff/pic/pic.y" -{ - if (yychar < 0) - do_lookahead(); - copy_file_thru(yyvsp[-5].lstr.str, yyvsp[-2].str, yyvsp[0].str); - /* do not delete the filename*/ - a_delete yyvsp[-2].str; - a_delete yyvsp[0].str; - } -break; -case 25: -#line 372 "/u/jjc/groff/pic/pic.y" -{ delim_flag = 2; } -break; -case 26: -#line 374 "/u/jjc/groff/pic/pic.y" -{ delim_flag = 0; } -break; -case 27: -#line 376 "/u/jjc/groff/pic/pic.y" -{ - if (yychar < 0) - do_lookahead(); - copy_rest_thru(yyvsp[-2].str, yyvsp[0].str); - a_delete yyvsp[-2].str; - a_delete yyvsp[0].str; - } -break; -case 28: -#line 384 "/u/jjc/groff/pic/pic.y" -{ delim_flag = 1; } -break; -case 29: -#line 386 "/u/jjc/groff/pic/pic.y" -{ - delim_flag = 0; - if (yychar < 0) - do_lookahead(); - do_for(yyvsp[-8].str, yyvsp[-6].x, yyvsp[-4].x, yyvsp[-3].by.is_multiplicative, yyvsp[-3].by.val, yyvsp[0].str); - } -break; -case 30: -#line 393 "/u/jjc/groff/pic/pic.y" -{ - if (yychar < 0) - do_lookahead(); - if (yyvsp[0].if_data.x != 0.0) - push_body(yyvsp[0].if_data.body); - a_delete yyvsp[0].if_data.body; - } -break; -case 31: -#line 401 "/u/jjc/groff/pic/pic.y" -{ delim_flag = 1; } -break; -case 32: -#line 403 "/u/jjc/groff/pic/pic.y" -{ - delim_flag = 0; - if (yychar < 0) - do_lookahead(); - if (yyvsp[-3].if_data.x != 0.0) - push_body(yyvsp[-3].if_data.body); - else - push_body(yyvsp[0].str); - a_delete yyvsp[-3].if_data.body; - a_delete yyvsp[0].str; - } -break; -case 34: -#line 416 "/u/jjc/groff/pic/pic.y" -{ define_variable("scale", 1.0); } -break; -case 35: -#line 421 "/u/jjc/groff/pic/pic.y" -{ reset(yyvsp[0].str); a_delete yyvsp[0].str; } -break; -case 36: -#line 423 "/u/jjc/groff/pic/pic.y" -{ reset(yyvsp[0].str); a_delete yyvsp[0].str; } -break; -case 37: -#line 425 "/u/jjc/groff/pic/pic.y" -{ reset(yyvsp[0].str); a_delete yyvsp[0].str; } -break; -case 38: -#line 430 "/u/jjc/groff/pic/pic.y" -{ yyval.lstr = yyvsp[0].lstr; } -break; -case 39: -#line 432 "/u/jjc/groff/pic/pic.y" -{ - yyval.lstr.str = new char[strlen(yyvsp[-1].lstr.str) + strlen(yyvsp[0].lstr.str) + 1]; - strcpy(yyval.lstr.str, yyvsp[-1].lstr.str); - strcat(yyval.lstr.str, yyvsp[0].lstr.str); - a_delete yyvsp[-1].lstr.str; - a_delete yyvsp[0].lstr.str; - if (yyvsp[-1].lstr.filename) { - yyval.lstr.filename = yyvsp[-1].lstr.filename; - yyval.lstr.lineno = yyvsp[-1].lstr.lineno; - } - else if (yyvsp[0].lstr.filename) { - yyval.lstr.filename = yyvsp[0].lstr.filename; - yyval.lstr.lineno = yyvsp[0].lstr.lineno; - } - } -break; -case 40: -#line 451 "/u/jjc/groff/pic/pic.y" -{ - yyval.lstr.str = new char[GDIGITS + 1]; - sprintf(yyval.lstr.str, "%g", yyvsp[0].x); - yyval.lstr.filename = 0; - yyval.lstr.lineno = 0; - } -break; -case 41: -#line 458 "/u/jjc/groff/pic/pic.y" -{ yyval.lstr = yyvsp[0].lstr; } -break; -case 42: -#line 460 "/u/jjc/groff/pic/pic.y" -{ - yyval.lstr.str = new char[GDIGITS + 2 + GDIGITS + 1]; - sprintf(yyval.lstr.str, "%g, %g", yyvsp[0].pair.x, yyvsp[0].pair.y); - yyval.lstr.filename = 0; - yyval.lstr.lineno = 0; - } -break; -case 43: -#line 469 "/u/jjc/groff/pic/pic.y" -{ delim_flag = 1; } -break; -case 44: -#line 471 "/u/jjc/groff/pic/pic.y" -{ delim_flag = 0; yyval.if_data.x = yyvsp[-3].x; yyval.if_data.body = yyvsp[0].str; } -break; -case 45: -#line 476 "/u/jjc/groff/pic/pic.y" -{ yyval.str = 0; } -break; -case 46: -#line 478 "/u/jjc/groff/pic/pic.y" -{ yyval.str = yyvsp[0].lstr.str; } -break; -case 47: -#line 483 "/u/jjc/groff/pic/pic.y" -{ yyval.x = yyvsp[0].x; } -break; -case 48: -#line 485 "/u/jjc/groff/pic/pic.y" -{ yyval.x = yyvsp[0].x; } -break; -case 49: -#line 490 "/u/jjc/groff/pic/pic.y" -{ - yyval.x = strcmp(yyvsp[-2].lstr.str, yyvsp[0].lstr.str) == 0; - a_delete yyvsp[-2].lstr.str; - a_delete yyvsp[0].lstr.str; - } -break; -case 50: -#line 496 "/u/jjc/groff/pic/pic.y" -{ - yyval.x = strcmp(yyvsp[-2].lstr.str, yyvsp[0].lstr.str) != 0; - a_delete yyvsp[-2].lstr.str; - a_delete yyvsp[0].lstr.str; - } -break; -case 51: -#line 502 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x != 0.0 && yyvsp[0].x != 0.0); } -break; -case 52: -#line 504 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x != 0.0 && yyvsp[0].x != 0.0); } -break; -case 53: -#line 506 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x != 0.0 && yyvsp[0].x != 0.0); } -break; -case 54: -#line 508 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x != 0.0 || yyvsp[0].x != 0.0); } -break; -case 55: -#line 510 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x != 0.0 || yyvsp[0].x != 0.0); } -break; -case 56: -#line 512 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x != 0.0 || yyvsp[0].x != 0.0); } -break; -case 57: -#line 514 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[0].x == 0.0); } -break; -case 58: -#line 520 "/u/jjc/groff/pic/pic.y" -{ yyval.by.val = 1.0; yyval.by.is_multiplicative = 0; } -break; -case 59: -#line 522 "/u/jjc/groff/pic/pic.y" -{ yyval.by.val = yyvsp[0].x; yyval.by.is_multiplicative = 0; } -break; -case 60: -#line 524 "/u/jjc/groff/pic/pic.y" -{ yyval.by.val = yyvsp[0].x; yyval.by.is_multiplicative = 1; } -break; -case 61: -#line 529 "/u/jjc/groff/pic/pic.y" -{ - yyval.pl.obj = yyvsp[0].spec->make_object(¤t_position, - ¤t_direction); - if (yyval.pl.obj == 0) - YYABORT; - delete yyvsp[0].spec; - if (yyval.pl.obj) - olist.append(yyval.pl.obj); - else { - yyval.pl.x = current_position.x; - yyval.pl.y = current_position.y; - } - } -break; -case 62: -#line 543 "/u/jjc/groff/pic/pic.y" -{ yyval.pl = yyvsp[0].pl; define_label(yyvsp[-3].str, & yyval.pl); a_delete yyvsp[-3].str; } -break; -case 63: -#line 545 "/u/jjc/groff/pic/pic.y" -{ - yyval.pl.obj = 0; - yyval.pl.x = yyvsp[0].pair.x; - yyval.pl.y = yyvsp[0].pair.y; - define_label(yyvsp[-3].str, & yyval.pl); - a_delete yyvsp[-3].str; - } -break; -case 64: -#line 553 "/u/jjc/groff/pic/pic.y" -{ - yyval.pl = yyvsp[0].pl; - define_label(yyvsp[-3].str, & yyval.pl); - a_delete yyvsp[-3].str; - } -break; -case 65: -#line 559 "/u/jjc/groff/pic/pic.y" -{ - yyval.state.x = current_position.x; - yyval.state.y = current_position.y; - yyval.state.dir = current_direction; - } -break; -case 66: -#line 565 "/u/jjc/groff/pic/pic.y" -{ - current_position.x = yyvsp[-2].state.x; - current_position.y = yyvsp[-2].state.y; - current_direction = yyvsp[-2].state.dir; - } -break; -case 67: -#line 571 "/u/jjc/groff/pic/pic.y" -{ - yyval.pl = yyvsp[-3].pl; - } -break; -case 68: -#line 575 "/u/jjc/groff/pic/pic.y" -{ - yyval.pl.obj = 0; - yyval.pl.x = current_position.x; - yyval.pl.y = current_position.y; - } -break; -case 69: -#line 584 "/u/jjc/groff/pic/pic.y" -{} -break; -case 70: -#line 586 "/u/jjc/groff/pic/pic.y" -{} -break; -case 71: -#line 591 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(BOX_OBJECT); - } -break; -case 72: -#line 595 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(CIRCLE_OBJECT); - } -break; -case 73: -#line 599 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(ELLIPSE_OBJECT); - } -break; -case 74: -#line 603 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(ARC_OBJECT); - yyval.spec->dir = current_direction; - } -break; -case 75: -#line 608 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(LINE_OBJECT); - lookup_variable("lineht", & yyval.spec->segment_height); - lookup_variable("linewid", & yyval.spec->segment_width); - yyval.spec->dir = current_direction; - } -break; -case 76: -#line 615 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(ARROW_OBJECT); - lookup_variable("lineht", & yyval.spec->segment_height); - lookup_variable("linewid", & yyval.spec->segment_width); - yyval.spec->dir = current_direction; - } -break; -case 77: -#line 622 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(MOVE_OBJECT); - lookup_variable("moveht", & yyval.spec->segment_height); - lookup_variable("movewid", & yyval.spec->segment_width); - yyval.spec->dir = current_direction; - } -break; -case 78: -#line 629 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(SPLINE_OBJECT); - lookup_variable("lineht", & yyval.spec->segment_height); - lookup_variable("linewid", & yyval.spec->segment_width); - yyval.spec->dir = current_direction; - } -break; -case 79: -#line 636 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(TEXT_OBJECT); - yyval.spec->text = new text_item(yyvsp[0].lstr.str, yyvsp[0].lstr.filename, yyvsp[0].lstr.lineno); - } -break; -case 80: -#line 641 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(TEXT_OBJECT); - yyval.spec->text = new text_item(format_number(0, yyvsp[0].x), 0, -1); - } -break; -case 81: -#line 646 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = new object_spec(TEXT_OBJECT); - yyval.spec->text = new text_item(format_number(yyvsp[0].lstr.str, yyvsp[-1].x), - yyvsp[0].lstr.filename, yyvsp[0].lstr.lineno); - a_delete yyvsp[0].lstr.str; - } -break; -case 82: -#line 653 "/u/jjc/groff/pic/pic.y" -{ - saved_state *p = new saved_state; - yyval.pstate = p; - p->x = current_position.x; - p->y = current_position.y; - p->dir = current_direction; - p->tbl = current_table; - p->prev = current_saved_state; - current_position.x = 0.0; - current_position.y = 0.0; - current_table = new PTABLE(place); - current_saved_state = p; - olist.append(make_mark_object()); - } -break; -case 83: -#line 668 "/u/jjc/groff/pic/pic.y" -{ - current_position.x = yyvsp[-2].pstate->x; - current_position.y = yyvsp[-2].pstate->y; - current_direction = yyvsp[-2].pstate->dir; - yyval.spec = new object_spec(BLOCK_OBJECT); - olist.wrap_up_block(& yyval.spec->oblist); - yyval.spec->tbl = current_table; - current_table = yyvsp[-2].pstate->tbl; - current_saved_state = yyvsp[-2].pstate->prev; - delete yyvsp[-2].pstate; - } -break; -case 84: -#line 680 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->height = yyvsp[0].x; - yyval.spec->flags |= HAS_HEIGHT; - } -break; -case 85: -#line 686 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->radius = yyvsp[0].x; - yyval.spec->flags |= HAS_RADIUS; - } -break; -case 86: -#line 692 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->width = yyvsp[0].x; - yyval.spec->flags |= HAS_WIDTH; - } -break; -case 87: -#line 698 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->radius = yyvsp[0].x/2.0; - yyval.spec->flags |= HAS_RADIUS; - } -break; -case 88: -#line 704 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= HAS_SEGMENT; - switch (yyval.spec->dir) { - case UP_DIRECTION: - yyval.spec->segment_pos.y += yyvsp[0].x; - break; - case DOWN_DIRECTION: - yyval.spec->segment_pos.y -= yyvsp[0].x; - break; - case RIGHT_DIRECTION: - yyval.spec->segment_pos.x += yyvsp[0].x; - break; - case LEFT_DIRECTION: - yyval.spec->segment_pos.x -= yyvsp[0].x; - break; - } - } -break; -case 89: -#line 723 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->dir = UP_DIRECTION; - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.y += yyval.spec->segment_height; - } -break; -case 90: -#line 730 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->dir = UP_DIRECTION; - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.y += yyvsp[0].x; - } -break; -case 91: -#line 737 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->dir = DOWN_DIRECTION; - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.y -= yyval.spec->segment_height; - } -break; -case 92: -#line 744 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->dir = DOWN_DIRECTION; - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.y -= yyvsp[0].x; - } -break; -case 93: -#line 751 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->dir = RIGHT_DIRECTION; - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.x += yyval.spec->segment_width; - } -break; -case 94: -#line 758 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->dir = RIGHT_DIRECTION; - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.x += yyvsp[0].x; - } -break; -case 95: -#line 765 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->dir = LEFT_DIRECTION; - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.x -= yyval.spec->segment_width; - } -break; -case 96: -#line 772 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->dir = LEFT_DIRECTION; - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.x -= yyvsp[0].x; - } -break; -case 97: -#line 779 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->flags |= HAS_FROM; - yyval.spec->from.x = yyvsp[0].pair.x; - yyval.spec->from.y = yyvsp[0].pair.y; - } -break; -case 98: -#line 786 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - if (yyval.spec->flags & HAS_SEGMENT) - yyval.spec->segment_list = new segment(yyval.spec->segment_pos, - yyval.spec->segment_is_absolute, - yyval.spec->segment_list); - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.x = yyvsp[0].pair.x; - yyval.spec->segment_pos.y = yyvsp[0].pair.y; - yyval.spec->segment_is_absolute = 1; - yyval.spec->flags |= HAS_TO; - yyval.spec->to.x = yyvsp[0].pair.x; - yyval.spec->to.y = yyvsp[0].pair.y; - } -break; -case 99: -#line 801 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->flags |= HAS_AT; - yyval.spec->at.x = yyvsp[0].pair.x; - yyval.spec->at.y = yyvsp[0].pair.y; - if (yyval.spec->type != ARC_OBJECT) { - yyval.spec->flags |= HAS_FROM; - yyval.spec->from.x = yyvsp[0].pair.x; - yyval.spec->from.y = yyvsp[0].pair.y; - } - } -break; -case 100: -#line 813 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->flags |= HAS_WITH; - yyval.spec->with = yyvsp[0].pth; - } -break; -case 101: -#line 819 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->flags |= HAS_SEGMENT; - yyval.spec->segment_pos.x += yyvsp[0].pair.x; - yyval.spec->segment_pos.y += yyvsp[0].pair.y; - } -break; -case 102: -#line 826 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - if (yyval.spec->flags & HAS_SEGMENT) { - yyval.spec->segment_list = new segment(yyval.spec->segment_pos, - yyval.spec->segment_is_absolute, - yyval.spec->segment_list); - yyval.spec->flags &= ~HAS_SEGMENT; - yyval.spec->segment_pos.x = yyval.spec->segment_pos.y = 0.0; - yyval.spec->segment_is_absolute = 0; - } - } -break; -case 103: -#line 838 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= IS_DOTTED; - lookup_variable("dashwid", & yyval.spec->dash_width); - } -break; -case 104: -#line 844 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->flags |= IS_DOTTED; - yyval.spec->dash_width = yyvsp[0].x; - } -break; -case 105: -#line 850 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= IS_DASHED; - lookup_variable("dashwid", & yyval.spec->dash_width); - } -break; -case 106: -#line 856 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->flags |= IS_DASHED; - yyval.spec->dash_width = yyvsp[0].x; - } -break; -case 107: -#line 862 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= IS_DEFAULT_FILLED; - } -break; -case 108: -#line 867 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->flags |= IS_FILLED; - yyval.spec->fill = yyvsp[0].x; - } -break; -case 109: -#line 873 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - /* line chop chop means line chop 0 chop 0*/ - if (yyval.spec->flags & IS_DEFAULT_CHOPPED) { - yyval.spec->flags |= IS_CHOPPED; - yyval.spec->flags &= ~IS_DEFAULT_CHOPPED; - yyval.spec->start_chop = yyval.spec->end_chop = 0.0; - } - else if (yyval.spec->flags & IS_CHOPPED) { - yyval.spec->end_chop = 0.0; - } - else { - yyval.spec->flags |= IS_DEFAULT_CHOPPED; - } - } -break; -case 110: -#line 889 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - if (yyval.spec->flags & IS_DEFAULT_CHOPPED) { - yyval.spec->flags |= IS_CHOPPED; - yyval.spec->flags &= ~IS_DEFAULT_CHOPPED; - yyval.spec->start_chop = 0.0; - yyval.spec->end_chop = yyvsp[0].x; - } - else if (yyval.spec->flags & IS_CHOPPED) { - yyval.spec->end_chop = yyvsp[0].x; - } - else { - yyval.spec->start_chop = yyval.spec->end_chop = yyvsp[0].x; - yyval.spec->flags |= IS_CHOPPED; - } - } -break; -case 111: -#line 906 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= IS_SAME; - } -break; -case 112: -#line 911 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= IS_INVISIBLE; - } -break; -case 113: -#line 916 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= HAS_LEFT_ARROW_HEAD; - } -break; -case 114: -#line 921 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= HAS_RIGHT_ARROW_HEAD; - } -break; -case 115: -#line 926 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= (HAS_LEFT_ARROW_HEAD|HAS_RIGHT_ARROW_HEAD); - } -break; -case 116: -#line 931 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= IS_CLOCKWISE; - } -break; -case 117: -#line 936 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags &= ~IS_CLOCKWISE; - } -break; -case 118: -#line 941 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - for (text_item **p = & yyval.spec->text; *p; p = &(*p)->next) - ; - *p = new text_item(yyvsp[0].lstr.str, yyvsp[0].lstr.filename, yyvsp[0].lstr.lineno); - } -break; -case 119: -#line 948 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - if (yyval.spec->text) { - for (text_item *p = yyval.spec->text; p->next; p = p->next) - ; - p->adj.h = LEFT_ADJUST; - } - } -break; -case 120: -#line 957 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - if (yyval.spec->text) { - for (text_item *p = yyval.spec->text; p->next; p = p->next) - ; - p->adj.h = RIGHT_ADJUST; - } - } -break; -case 121: -#line 966 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - if (yyval.spec->text) { - for (text_item *p = yyval.spec->text; p->next; p = p->next) - ; - p->adj.v = ABOVE_ADJUST; - } - } -break; -case 122: -#line 975 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - if (yyval.spec->text) { - for (text_item *p = yyval.spec->text; p->next; p = p->next) - ; - p->adj.v = BELOW_ADJUST; - } - } -break; -case 123: -#line 984 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-2].spec; - yyval.spec->flags |= HAS_THICKNESS; - yyval.spec->thickness = yyvsp[0].x; - } -break; -case 124: -#line 990 "/u/jjc/groff/pic/pic.y" -{ - yyval.spec = yyvsp[-1].spec; - yyval.spec->flags |= IS_ALIGNED; - } -break; -case 125: -#line 998 "/u/jjc/groff/pic/pic.y" -{ - yyval.lstr = yyvsp[0].lstr; - } -break; -case 126: -#line 1002 "/u/jjc/groff/pic/pic.y" -{ - yyval.lstr.filename = yyvsp[-2].lstr.filename; - yyval.lstr.lineno = yyvsp[-2].lstr.lineno; - yyval.lstr.str = do_sprintf(yyvsp[-2].lstr.str, yyvsp[-1].dv.v, yyvsp[-1].dv.nv); - a_delete yyvsp[-1].dv.v; - a_delete yyvsp[-2].lstr.str; - } -break; -case 127: -#line 1013 "/u/jjc/groff/pic/pic.y" -{ - yyval.dv.v = 0; - yyval.dv.nv = 0; - yyval.dv.maxv = 0; - } -break; -case 128: -#line 1019 "/u/jjc/groff/pic/pic.y" -{ - yyval.dv = yyvsp[-2].dv; - if (yyval.dv.nv >= yyval.dv.maxv) { - if (yyval.dv.nv == 0) { - yyval.dv.v = new double[4]; - yyval.dv.maxv = 4; - } - else { - double *oldv = yyval.dv.v; - yyval.dv.maxv *= 2; - yyval.dv.v = new double[yyval.dv.maxv]; - memcpy(yyval.dv.v, oldv, yyval.dv.nv*sizeof(double)); - a_delete oldv; - } - } - yyval.dv.v[yyval.dv.nv] = yyvsp[0].x; - yyval.dv.nv += 1; - } -break; -case 129: -#line 1041 "/u/jjc/groff/pic/pic.y" -{ yyval.pair = yyvsp[0].pair; } -break; -case 130: -#line 1043 "/u/jjc/groff/pic/pic.y" -{ - position pos = yyvsp[0].pl; - yyval.pair.x = pos.x; - yyval.pair.y = pos.y; - } -break; -case 131: -#line 1052 "/u/jjc/groff/pic/pic.y" -{ yyval.pair = yyvsp[0].pair; } -break; -case 132: -#line 1054 "/u/jjc/groff/pic/pic.y" -{ - yyval.pair.x = yyvsp[-2].pair.x + yyvsp[0].pair.x; - yyval.pair.y = yyvsp[-2].pair.y + yyvsp[0].pair.y; - } -break; -case 133: -#line 1059 "/u/jjc/groff/pic/pic.y" -{ - yyval.pair.x = yyvsp[-2].pair.x - yyvsp[0].pair.x; - yyval.pair.y = yyvsp[-2].pair.y - yyvsp[0].pair.y; - } -break; -case 134: -#line 1064 "/u/jjc/groff/pic/pic.y" -{ - yyval.pair.x = yyvsp[-3].pair.x; - yyval.pair.y = yyvsp[-1].pair.y; - } -break; -case 135: -#line 1069 "/u/jjc/groff/pic/pic.y" -{ - yyval.pair.x = (1.0 - yyvsp[-4].x)*yyvsp[-2].pair.x + yyvsp[-4].x*yyvsp[0].pair.x; - yyval.pair.y = (1.0 - yyvsp[-4].x)*yyvsp[-2].pair.y + yyvsp[-4].x*yyvsp[0].pair.y; - } -break; -case 136: -#line 1074 "/u/jjc/groff/pic/pic.y" -{ - yyval.pair.x = (1.0 - yyvsp[-5].x)*yyvsp[-3].pair.x + yyvsp[-5].x*yyvsp[-1].pair.x; - yyval.pair.y = (1.0 - yyvsp[-5].x)*yyvsp[-3].pair.y + yyvsp[-5].x*yyvsp[-1].pair.y; - } -break; -case 139: -#line 1087 "/u/jjc/groff/pic/pic.y" -{ yyval.pair.x = yyvsp[-2].x; yyval.pair.y = yyvsp[0].x; } -break; -case 140: -#line 1089 "/u/jjc/groff/pic/pic.y" -{ yyval.pair = yyvsp[-1].pair; } -break; -case 141: -#line 1094 "/u/jjc/groff/pic/pic.y" -{ yyval.pl = yyvsp[0].pl; } -break; -case 142: -#line 1096 "/u/jjc/groff/pic/pic.y" -{ - path pth(yyvsp[0].crn); - if (!pth.follow(yyvsp[-1].pl, & yyval.pl)) - YYABORT; - } -break; -case 143: -#line 1102 "/u/jjc/groff/pic/pic.y" -{ - path pth(yyvsp[-1].crn); - if (!pth.follow(yyvsp[0].pl, & yyval.pl)) - YYABORT; - } -break; -case 144: -#line 1108 "/u/jjc/groff/pic/pic.y" -{ - path pth(yyvsp[-2].crn); - if (!pth.follow(yyvsp[0].pl, & yyval.pl)) - YYABORT; - } -break; -case 145: -#line 1114 "/u/jjc/groff/pic/pic.y" -{ - yyval.pl.x = current_position.x; - yyval.pl.y = current_position.y; - yyval.pl.obj = 0; - } -break; -case 146: -#line 1123 "/u/jjc/groff/pic/pic.y" -{ - place *p = lookup_label(yyvsp[0].str); - if (!p) { - lex_error("there is no place `%1'", yyvsp[0].str); - YYABORT; - } - yyval.pl = *p; - a_delete yyvsp[0].str; - } -break; -case 147: -#line 1133 "/u/jjc/groff/pic/pic.y" -{ - yyval.pl.obj = yyvsp[0].obj; - } -break; -case 148: -#line 1137 "/u/jjc/groff/pic/pic.y" -{ - path pth(yyvsp[0].str); - if (!pth.follow(yyvsp[-2].pl, & yyval.pl)) - YYABORT; - } -break; -case 149: -#line 1146 "/u/jjc/groff/pic/pic.y" -{ yyval.n = yyvsp[0].n; } -break; -case 150: -#line 1148 "/u/jjc/groff/pic/pic.y" -{ - /* XXX Check for overflow (and non-integers?).*/ - yyval.n = (int)yyvsp[-1].x; - } -break; -case 151: -#line 1156 "/u/jjc/groff/pic/pic.y" -{ yyval.n = 1; } -break; -case 152: -#line 1158 "/u/jjc/groff/pic/pic.y" -{ yyval.n = yyvsp[-1].n; } -break; -case 153: -#line 1163 "/u/jjc/groff/pic/pic.y" -{ - int count = 0; - for (object *p = olist.head; p != 0; p = p->next) - if (p->type() == yyvsp[0].obtype && ++count == yyvsp[-1].n) { - yyval.obj = p; - break; - } - if (p == 0) { - lex_error("there is no %1%2 %3", yyvsp[-1].n, ordinal_postfix(yyvsp[-1].n), - object_type_name(yyvsp[0].obtype)); - YYABORT; - } - } -break; -case 154: -#line 1177 "/u/jjc/groff/pic/pic.y" -{ - int count = 0; - for (object *p = olist.tail; p != 0; p = p->prev) - if (p->type() == yyvsp[0].obtype && ++count == yyvsp[-1].n) { - yyval.obj = p; - break; - } - if (p == 0) { - lex_error("there is no %1%2 last %3", yyvsp[-1].n, - ordinal_postfix(yyvsp[-1].n), object_type_name(yyvsp[0].obtype)); - YYABORT; - } - } -break; -case 155: -#line 1194 "/u/jjc/groff/pic/pic.y" -{ yyval.obtype = BOX_OBJECT; } -break; -case 156: -#line 1196 "/u/jjc/groff/pic/pic.y" -{ yyval.obtype = CIRCLE_OBJECT; } -break; -case 157: -#line 1198 "/u/jjc/groff/pic/pic.y" -{ yyval.obtype = ELLIPSE_OBJECT; } -break; -case 158: -#line 1200 "/u/jjc/groff/pic/pic.y" -{ yyval.obtype = ARC_OBJECT; } -break; -case 159: -#line 1202 "/u/jjc/groff/pic/pic.y" -{ yyval.obtype = LINE_OBJECT; } -break; -case 160: -#line 1204 "/u/jjc/groff/pic/pic.y" -{ yyval.obtype = ARROW_OBJECT; } -break; -case 161: -#line 1206 "/u/jjc/groff/pic/pic.y" -{ yyval.obtype = SPLINE_OBJECT; } -break; -case 162: -#line 1208 "/u/jjc/groff/pic/pic.y" -{ yyval.obtype = BLOCK_OBJECT; } -break; -case 163: -#line 1210 "/u/jjc/groff/pic/pic.y" -{ yyval.obtype = TEXT_OBJECT; } -break; -case 164: -#line 1215 "/u/jjc/groff/pic/pic.y" -{ - yyval.pth = new path(yyvsp[0].str); - } -break; -case 165: -#line 1219 "/u/jjc/groff/pic/pic.y" -{ - yyval.pth = yyvsp[-2].pth; - yyval.pth->append(yyvsp[0].str); - } -break; -case 166: -#line 1227 "/u/jjc/groff/pic/pic.y" -{ - yyval.pth = new path(yyvsp[0].crn); - } -break; -case 167: -#line 1234 "/u/jjc/groff/pic/pic.y" -{ - yyval.pth = yyvsp[0].pth; - } -break; -case 168: -#line 1238 "/u/jjc/groff/pic/pic.y" -{ - yyval.pth = yyvsp[-1].pth; - yyval.pth->append(yyvsp[0].crn); - } -break; -case 169: -#line 1246 "/u/jjc/groff/pic/pic.y" -{ - yyval.pth = yyvsp[0].pth; - } -break; -case 170: -#line 1251 "/u/jjc/groff/pic/pic.y" -{ - lex_warning("`%1%2 last %3' in `with' argument ignored", - yyvsp[-3].n, ordinal_postfix(yyvsp[-3].n), object_type_name(yyvsp[-1].obtype)); - yyval.pth = yyvsp[0].pth; - } -break; -case 171: -#line 1257 "/u/jjc/groff/pic/pic.y" -{ - lex_warning("`last %1' in `with' argument ignored", - object_type_name(yyvsp[-1].obtype)); - yyval.pth = yyvsp[0].pth; - } -break; -case 172: -#line 1263 "/u/jjc/groff/pic/pic.y" -{ - lex_warning("`%1%2 %3' in `with' argument ignored", - yyvsp[-2].n, ordinal_postfix(yyvsp[-2].n), object_type_name(yyvsp[-1].obtype)); - yyval.pth = yyvsp[0].pth; - } -break; -case 173: -#line 1269 "/u/jjc/groff/pic/pic.y" -{ - lex_warning("initial `%1' in `with' argument ignored", yyvsp[-1].str); - a_delete yyvsp[-1].str; - yyval.pth = yyvsp[0].pth; - } -break; -case 174: -#line 1278 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::north; } -break; -case 175: -#line 1280 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::east; } -break; -case 176: -#line 1282 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::west; } -break; -case 177: -#line 1284 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::south; } -break; -case 178: -#line 1286 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::north_east; } -break; -case 179: -#line 1288 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object:: south_east; } -break; -case 180: -#line 1290 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::north_west; } -break; -case 181: -#line 1292 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::south_west; } -break; -case 182: -#line 1294 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::center; } -break; -case 183: -#line 1296 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::start; } -break; -case 184: -#line 1298 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::end; } -break; -case 185: -#line 1300 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::north; } -break; -case 186: -#line 1302 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::south; } -break; -case 187: -#line 1304 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::west; } -break; -case 188: -#line 1306 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::east; } -break; -case 189: -#line 1308 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::north_west; } -break; -case 190: -#line 1310 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::south_west; } -break; -case 191: -#line 1312 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::north_east; } -break; -case 192: -#line 1314 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::south_east; } -break; -case 193: -#line 1316 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::west; } -break; -case 194: -#line 1318 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::east; } -break; -case 195: -#line 1320 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::north_west; } -break; -case 196: -#line 1322 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::south_west; } -break; -case 197: -#line 1324 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::north_east; } -break; -case 198: -#line 1326 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::south_east; } -break; -case 199: -#line 1328 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::center; } -break; -case 200: -#line 1330 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::start; } -break; -case 201: -#line 1332 "/u/jjc/groff/pic/pic.y" -{ yyval.crn = &object::end; } -break; -case 202: -#line 1337 "/u/jjc/groff/pic/pic.y" -{ - if (!lookup_variable(yyvsp[0].str, & yyval.x)) { - lex_error("there is no variable `%1'", yyvsp[0].str); - YYABORT; - } - a_delete yyvsp[0].str; - } -break; -case 203: -#line 1345 "/u/jjc/groff/pic/pic.y" -{ yyval.x = yyvsp[0].x; } -break; -case 204: -#line 1347 "/u/jjc/groff/pic/pic.y" -{ - if (yyvsp[-1].pl.obj != 0) - yyval.x = yyvsp[-1].pl.obj->origin().x; - else - yyval.x = yyvsp[-1].pl.x; - } -break; -case 205: -#line 1354 "/u/jjc/groff/pic/pic.y" -{ - if (yyvsp[-1].pl.obj != 0) - yyval.x = yyvsp[-1].pl.obj->origin().y; - else - yyval.x = yyvsp[-1].pl.y; - } -break; -case 206: -#line 1361 "/u/jjc/groff/pic/pic.y" -{ - if (yyvsp[-1].pl.obj != 0) - yyval.x = yyvsp[-1].pl.obj->height(); - else - yyval.x = 0.0; - } -break; -case 207: -#line 1368 "/u/jjc/groff/pic/pic.y" -{ - if (yyvsp[-1].pl.obj != 0) - yyval.x = yyvsp[-1].pl.obj->width(); - else - yyval.x = 0.0; - } -break; -case 208: -#line 1375 "/u/jjc/groff/pic/pic.y" -{ - if (yyvsp[-1].pl.obj != 0) - yyval.x = yyvsp[-1].pl.obj->radius(); - else - yyval.x = 0.0; - } -break; -case 209: -#line 1382 "/u/jjc/groff/pic/pic.y" -{ yyval.x = yyvsp[-2].x + yyvsp[0].x; } -break; -case 210: -#line 1384 "/u/jjc/groff/pic/pic.y" -{ yyval.x = yyvsp[-2].x - yyvsp[0].x; } -break; -case 211: -#line 1386 "/u/jjc/groff/pic/pic.y" -{ yyval.x = yyvsp[-2].x * yyvsp[0].x; } -break; -case 212: -#line 1388 "/u/jjc/groff/pic/pic.y" -{ - if (yyvsp[0].x == 0.0) { - lex_error("division by zero"); - YYABORT; - } - yyval.x = yyvsp[-2].x/yyvsp[0].x; - } -break; -case 213: -#line 1396 "/u/jjc/groff/pic/pic.y" -{ - if (yyvsp[0].x == 0.0) { - lex_error("modulus by zero"); - YYABORT; - } - yyval.x = fmod(yyvsp[-2].x, yyvsp[0].x); - } -break; -case 214: -#line 1404 "/u/jjc/groff/pic/pic.y" -{ - errno = 0; - yyval.x = pow(yyvsp[-2].x, yyvsp[0].x); - if (errno == EDOM) { - lex_error("arguments to `^' operator out of domain"); - YYABORT; - } - if (errno == ERANGE) { - lex_error("result of `^' operator out of range"); - YYABORT; - } - } -break; -case 215: -#line 1417 "/u/jjc/groff/pic/pic.y" -{ yyval.x = -yyvsp[0].x; } -break; -case 216: -#line 1419 "/u/jjc/groff/pic/pic.y" -{ yyval.x = yyvsp[-1].x; } -break; -case 217: -#line 1421 "/u/jjc/groff/pic/pic.y" -{ - errno = 0; - yyval.x = sin(yyvsp[-1].x); - if (errno == ERANGE) { - lex_error("sin result out of range"); - YYABORT; - } - } -break; -case 218: -#line 1430 "/u/jjc/groff/pic/pic.y" -{ - errno = 0; - yyval.x = cos(yyvsp[-1].x); - if (errno == ERANGE) { - lex_error("cos result out of range"); - YYABORT; - } - } -break; -case 219: -#line 1439 "/u/jjc/groff/pic/pic.y" -{ - errno = 0; - yyval.x = atan2(yyvsp[-3].x, yyvsp[-1].x); - if (errno == EDOM) { - lex_error("atan2 argument out of domain"); - YYABORT; - } - if (errno == ERANGE) { - lex_error("atan2 result out of range"); - YYABORT; - } - } -break; -case 220: -#line 1452 "/u/jjc/groff/pic/pic.y" -{ - errno = 0; - yyval.x = log10(yyvsp[-1].x); - if (errno == ERANGE) { - lex_error("log result out of range"); - YYABORT; - } - } -break; -case 221: -#line 1461 "/u/jjc/groff/pic/pic.y" -{ - errno = 0; - yyval.x = pow(10.0, yyvsp[-1].x); - if (errno == ERANGE) { - lex_error("exp result out of range"); - YYABORT; - } - } -break; -case 222: -#line 1470 "/u/jjc/groff/pic/pic.y" -{ - errno = 0; - yyval.x = sqrt(yyvsp[-1].x); - if (errno == EDOM) { - lex_error("sqrt argument out of domain"); - YYABORT; - } - } -break; -case 223: -#line 1479 "/u/jjc/groff/pic/pic.y" -{ yyval.x = yyvsp[-3].x > yyvsp[-1].x ? yyvsp[-3].x : yyvsp[-1].x; } -break; -case 224: -#line 1481 "/u/jjc/groff/pic/pic.y" -{ yyval.x = yyvsp[-3].x < yyvsp[-1].x ? yyvsp[-3].x : yyvsp[-1].x; } -break; -case 225: -#line 1483 "/u/jjc/groff/pic/pic.y" -{ yyval.x = floor(yyvsp[-1].x); } -break; -case 226: -#line 1485 "/u/jjc/groff/pic/pic.y" -{ yyval.x = 1.0 + floor(((rand()&0x7fff)/double(0x7fff))*yyvsp[-1].x); } -break; -case 227: -#line 1487 "/u/jjc/groff/pic/pic.y" -{ - /* return a random number in the range [0,1) */ - /* portable, but not very random */ - yyval.x = (rand() & 0x7fff) / double(0x8000); - } -break; -case 228: -#line 1493 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x < yyvsp[0].x); } -break; -case 229: -#line 1495 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x <= yyvsp[0].x); } -break; -case 230: -#line 1497 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x > yyvsp[0].x); } -break; -case 231: -#line 1499 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x >= yyvsp[0].x); } -break; -case 232: -#line 1501 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x == yyvsp[0].x); } -break; -case 233: -#line 1503 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x != yyvsp[0].x); } -break; -case 234: -#line 1505 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x != 0.0 && yyvsp[0].x != 0.0); } -break; -case 235: -#line 1507 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[-2].x != 0.0 || yyvsp[0].x != 0.0); } -break; -case 236: -#line 1509 "/u/jjc/groff/pic/pic.y" -{ yyval.x = (yyvsp[0].x == 0.0); } -break; -#line 5111 "y.tab.c" - } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; - yym = yylhs[yyn]; - if (yystate == 0 && yym == 0) - { -#if YYDEBUG - if (yydebug) - printf("yydebug: after reduction, shifting from state 0 to\ - state %d\n", YYFINAL); -#endif - yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, reading %d (%s)\n", - YYFINAL, yychar, yys); - } -#endif - } - if (yychar == 0) goto yyaccept; - goto yyloop; - } - if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yystate) - yystate = yytable[yyn]; - else - yystate = yydgoto[yym]; -#if YYDEBUG - if (yydebug) - printf("yydebug: after reduction, shifting from state %d \ -to state %d\n", *yyssp, yystate); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate; - *++yyvsp = yyval; - goto yyloop; -yyoverflow: - yyerror("yacc stack overflow"); -yyabort: - return (1); -yyaccept: - return (0); -} diff --git a/gnu/usr.bin/groff/pic/pic.tab.h b/gnu/usr.bin/groff/pic/pic.tab.h deleted file mode 100644 index c71bdfd2cd3e..000000000000 --- a/gnu/usr.bin/groff/pic/pic.tab.h +++ /dev/null @@ -1,129 +0,0 @@ -#define LABEL 257 -#define VARIABLE 258 -#define NUMBER 259 -#define TEXT 260 -#define COMMAND_LINE 261 -#define DELIMITED 262 -#define ORDINAL 263 -#define TH 264 -#define LEFT_ARROW_HEAD 265 -#define RIGHT_ARROW_HEAD 266 -#define DOUBLE_ARROW_HEAD 267 -#define LAST 268 -#define UP 269 -#define DOWN 270 -#define LEFT 271 -#define RIGHT 272 -#define BOX 273 -#define CIRCLE 274 -#define ELLIPSE 275 -#define ARC 276 -#define LINE 277 -#define ARROW 278 -#define MOVE 279 -#define SPLINE 280 -#define HEIGHT 281 -#define RADIUS 282 -#define WIDTH 283 -#define DIAMETER 284 -#define FROM 285 -#define TO 286 -#define AT 287 -#define WITH 288 -#define BY 289 -#define THEN 290 -#define DOTTED 291 -#define DASHED 292 -#define CHOP 293 -#define SAME 294 -#define INVISIBLE 295 -#define LJUST 296 -#define RJUST 297 -#define ABOVE 298 -#define BELOW 299 -#define OF 300 -#define THE 301 -#define WAY 302 -#define BETWEEN 303 -#define AND 304 -#define HERE 305 -#define DOT_N 306 -#define DOT_E 307 -#define DOT_W 308 -#define DOT_S 309 -#define DOT_NE 310 -#define DOT_SE 311 -#define DOT_NW 312 -#define DOT_SW 313 -#define DOT_C 314 -#define DOT_START 315 -#define DOT_END 316 -#define DOT_X 317 -#define DOT_Y 318 -#define DOT_HT 319 -#define DOT_WID 320 -#define DOT_RAD 321 -#define SIN 322 -#define COS 323 -#define ATAN2 324 -#define LOG 325 -#define EXP 326 -#define SQRT 327 -#define K_MAX 328 -#define K_MIN 329 -#define INT 330 -#define RAND 331 -#define COPY 332 -#define THRU 333 -#define TOP 334 -#define BOTTOM 335 -#define UPPER 336 -#define LOWER 337 -#define SH 338 -#define PRINT 339 -#define CW 340 -#define CCW 341 -#define FOR 342 -#define DO 343 -#define IF 344 -#define ELSE 345 -#define ANDAND 346 -#define OROR 347 -#define NOTEQUAL 348 -#define EQUALEQUAL 349 -#define LESSEQUAL 350 -#define GREATEREQUAL 351 -#define LEFT_CORNER 352 -#define RIGHT_CORNER 353 -#define CENTER 354 -#define END 355 -#define START 356 -#define RESET 357 -#define UNTIL 358 -#define PLOT 359 -#define THICKNESS 360 -#define FILL 361 -#define ALIGNED 362 -#define SPRINTF 363 -#define COMMAND 364 -#define DEFINE 365 -#define UNDEF 366 -typedef union { - char *str; - int n; - double x; - struct { double x, y; } pair; - struct { double x; char *body; } if_data; - struct { char *str; const char *filename; int lineno; } lstr; - struct { double *v; int nv; int maxv; } dv; - struct { double val; int is_multiplicative; } by; - place pl; - object *obj; - corner crn; - path *pth; - object_spec *spec; - saved_state *pstate; - graphics_state state; - object_type obtype; -} YYSTYPE; -extern YYSTYPE yylval; diff --git a/gnu/usr.bin/groff/refer/label.cc b/gnu/usr.bin/groff/refer/label.cc deleted file mode 100644 index 44254650d414..000000000000 --- a/gnu/usr.bin/groff/refer/label.cc +++ /dev/null @@ -1,1593 +0,0 @@ -#ifndef lint -static char yysccsid[] = "@(#)yaccpar 1.8 (Berkeley) 01/20/90"; -#endif -#define YYBYACC 1 -#line 22 "/u/jjc/groff/refer/label.y" - -#include "refer.h" -#include "refid.h" -#include "ref.h" -#include "token.h" - -int yylex(); -void yyerror(const char *); -int yyparse(); - -static const char *format_serial(char c, int n); - -struct label_info { - int start; - int length; - int count; - int total; - label_info(const string &); -}; - -label_info *lookup_label(const string &label); - -struct expression { - enum { - /* Does the tentative label depend on the reference?*/ - CONTAINS_VARIABLE = 01, - CONTAINS_STAR = 02, - CONTAINS_FORMAT = 04, - CONTAINS_AT = 010 - }; - virtual ~expression() { } - virtual void evaluate(int, const reference &, string &, - substring_position &) = 0; - virtual unsigned analyze() { return 0; } -}; - -class at_expr : public expression { -public: - at_expr() { } - void evaluate(int, const reference &, string &, substring_position &); - unsigned analyze() { return CONTAINS_VARIABLE|CONTAINS_AT; } -}; - -class format_expr : public expression { - char type; - int width; - int first_number; -public: - format_expr(char c, int w = 0, int f = 1) - : type(c), width(w), first_number(f) { } - void evaluate(int, const reference &, string &, substring_position &); - unsigned analyze() { return CONTAINS_FORMAT; } -}; - -class field_expr : public expression { - int number; - char name; -public: - field_expr(char nm, int num) : name(nm), number(num) { } - void evaluate(int, const reference &, string &, substring_position &); - unsigned analyze() { return CONTAINS_VARIABLE; } -}; - -class literal_expr : public expression { - string s; -public: - literal_expr(const char *ptr, int len) : s(ptr, len) { } - void evaluate(int, const reference &, string &, substring_position &); -}; - -class unary_expr : public expression { -protected: - expression *expr; -public: - unary_expr(expression *e) : expr(e) { } - ~unary_expr() { delete expr; } - void evaluate(int, const reference &, string &, substring_position &) = 0; - unsigned analyze() { return expr ? expr->analyze() : 0; } -}; - -/* This caches the analysis of an expression.*/ - -class analyzed_expr : public unary_expr { - unsigned flags; -public: - analyzed_expr(expression *); - void evaluate(int, const reference &, string &, substring_position &); - unsigned analyze() { return flags; } -}; - -class star_expr : public unary_expr { -public: - star_expr(expression *e) : unary_expr(e) { } - void evaluate(int, const reference &, string &, substring_position &); - unsigned analyze() { - return ((expr ? (expr->analyze() & ~CONTAINS_VARIABLE) : 0) - | CONTAINS_STAR); - } -}; - -typedef void map_func(const char *, const char *, string &); - -class map_expr : public unary_expr { - map_func *func; -public: - map_expr(expression *e, map_func *f) : unary_expr(e), func(f) { } - void evaluate(int, const reference &, string &, substring_position &); -}; - -typedef const char *extractor_func(const char *, const char *, const char **); - -class extractor_expr : public unary_expr { - int part; - extractor_func *func; -public: - enum { BEFORE = +1, MATCH = 0, AFTER = -1 }; - extractor_expr(expression *e, extractor_func *f, int pt) - : unary_expr(e), func(f), part(pt) { } - void evaluate(int, const reference &, string &, substring_position &); -}; - -class truncate_expr : public unary_expr { - int n; -public: - truncate_expr(expression *e, int i) : n(i), unary_expr(e) { } - void evaluate(int, const reference &, string &, substring_position &); -}; - -class separator_expr : public unary_expr { -public: - separator_expr(expression *e) : unary_expr(e) { } - void evaluate(int, const reference &, string &, substring_position &); -}; - -class binary_expr : public expression { -protected: - expression *expr1; - expression *expr2; -public: - binary_expr(expression *e1, expression *e2) : expr1(e1), expr2(e2) { } - ~binary_expr() { delete expr1; delete expr2; } - void evaluate(int, const reference &, string &, substring_position &) = 0; - unsigned analyze() { - return (expr1 ? expr1->analyze() : 0) | (expr2 ? expr2->analyze() : 0); - } -}; - -class alternative_expr : public binary_expr { -public: - alternative_expr(expression *e1, expression *e2) : binary_expr(e1, e2) { } - void evaluate(int, const reference &, string &, substring_position &); -}; - -class list_expr : public binary_expr { -public: - list_expr(expression *e1, expression *e2) : binary_expr(e1, e2) { } - void evaluate(int, const reference &, string &, substring_position &); -}; - -class substitute_expr : public binary_expr { -public: - substitute_expr(expression *e1, expression *e2) : binary_expr(e1, e2) { } - void evaluate(int, const reference &, string &, substring_position &); -}; - -class ternary_expr : public expression { -protected: - expression *expr1; - expression *expr2; - expression *expr3; -public: - ternary_expr(expression *e1, expression *e2, expression *e3) - : expr1(e1), expr2(e2), expr3(e3) { } - ~ternary_expr() { delete expr1; delete expr2; delete expr3; } - void evaluate(int, const reference &, string &, substring_position &) = 0; - unsigned analyze() { - return ((expr1 ? expr1->analyze() : 0) - | (expr2 ? expr2->analyze() : 0) - | (expr3 ? expr3->analyze() : 0)); - } -}; - -class conditional_expr : public ternary_expr { -public: - conditional_expr(expression *e1, expression *e2, expression *e3) - : ternary_expr(e1, e2, e3) { } - void evaluate(int, const reference &, string &, substring_position &); -}; - -static expression *parsed_label = 0; -static expression *parsed_date_label = 0; -static expression *parsed_short_label = 0; - -static expression *parse_result; - -string literals; - -#line 221 "/u/jjc/groff/refer/label.y" -typedef union { - int num; - expression *expr; - struct { int ndigits; int val; } dig; - struct { int start; int len; } str; -} YYSTYPE; -#line 211 "y.tab.c" -#define TOKEN_LETTER 257 -#define TOKEN_LITERAL 258 -#define TOKEN_DIGIT 259 -#define YYERRCODE 256 -short yylhs[] = { -1, - 0, 1, 1, 6, 6, 2, 2, 2, 3, 3, - 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 9, 9, 7, 7, 8, 8, - 10, 10, 10, -}; -short yylen[] = { 2, - 1, 1, 5, 0, 1, 1, 3, 3, 1, 2, - 1, 3, 1, 1, 1, 2, 2, 2, 5, 3, - 3, 2, 3, 3, 0, 1, 1, 2, 1, 2, - 0, 1, 1, -}; -short yydefred[] = { 0, - 0, 14, 13, 0, 0, 0, 0, 5, 0, 0, - 0, 0, 1, 27, 0, 17, 29, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 22, 0, 28, - 30, 23, 24, 0, 0, 0, 32, 33, 0, 0, - 0, 0, 0, 0, 3, 0, 19, -}; -short yydgoto[] = { 7, - 8, 9, 10, 11, 12, 13, 15, 18, 47, 39, -}; -short yysindex[] = { -32, - -257, 0, 0, -240, -32, -32, 0, 0, -18, -32, - -36, -114, 0, 0, -246, 0, 0, -241, -14, -39, - -32, -32, -32, -114, -21, -257, -257, 0, -32, 0, - 0, 0, 0, -25, -32, -32, 0, 0, -223, -246, - -246, -36, -32, -257, 0, -246, 0, -}; -short yyrindex[] = { 35, - 1, 0, 0, 0, -5, -4, 0, 0, 14, 208, - 159, 224, 0, 0, 11, 0, 0, 40, 0, 0, - 2, 0, 0, 253, -220, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 263, 281, 0, 0, 0, 50, - 105, 214, 0, 115, 0, 149, 0, -}; -short yygindex[] = { 0, - 19, 0, 7, 37, -10, 10, -23, 0, 0, 0, -}; -#define YYTABLESIZE 511 -short yytable[] = { 24, - 15, 14, 40, 41, 4, 28, 26, 5, 27, 25, - 16, 29, 30, 2, 19, 20, 16, 31, 17, 23, - 46, 37, 33, 38, 24, 24, 32, 6, 35, 36, - 34, 3, 43, 44, 4, 4, 31, 15, 15, 18, - 15, 15, 15, 15, 21, 15, 15, 16, 16, 20, - 16, 16, 16, 16, 2, 16, 16, 4, 15, 4, - 15, 45, 15, 15, 15, 42, 0, 0, 16, 0, - 16, 2, 16, 16, 16, 2, 18, 18, 0, 18, - 18, 18, 18, 0, 18, 18, 20, 20, 0, 20, - 20, 20, 20, 0, 20, 20, 0, 18, 0, 18, - 0, 18, 18, 18, 21, 22, 0, 20, 0, 20, - 0, 20, 20, 20, 25, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 15, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 16, 0, 16, 0, 0, 0, - 0, 21, 21, 0, 21, 21, 21, 21, 26, 21, - 21, 25, 25, 0, 25, 25, 25, 25, 11, 25, - 25, 0, 21, 18, 21, 18, 21, 21, 21, 0, - 0, 0, 25, 20, 25, 20, 25, 25, 25, 0, - 0, 0, 0, 0, 0, 26, 26, 0, 26, 26, - 26, 26, 0, 26, 26, 11, 11, 0, 11, 11, - 0, 0, 0, 0, 0, 0, 26, 6, 26, 0, - 26, 26, 26, 12, 0, 0, 11, 0, 11, 0, - 11, 11, 11, 9, 1, 2, 0, 0, 21, 0, - 21, 0, 0, 0, 0, 0, 0, 0, 25, 0, - 25, 0, 0, 0, 0, 6, 0, 0, 6, 0, - 12, 12, 10, 12, 12, 0, 0, 15, 15, 0, - 9, 9, 7, 9, 9, 6, 0, 16, 16, 6, - 6, 12, 26, 12, 26, 12, 12, 12, 0, 0, - 8, 9, 11, 9, 11, 9, 9, 9, 0, 10, - 10, 0, 10, 10, 0, 0, 18, 18, 0, 0, - 7, 0, 0, 7, 0, 0, 20, 20, 0, 0, - 10, 0, 10, 0, 10, 10, 10, 0, 8, 0, - 7, 8, 0, 0, 7, 7, 0, 0, 0, 0, - 0, 6, 0, 0, 0, 0, 0, 12, 8, 12, - 0, 0, 8, 8, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, - 0, 25, 25, 0, 0, 0, 10, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 26, 26, 0, 0, 0, - 0, 0, 0, 0, 0, 11, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, - 10, -}; -short yycheck[] = { 10, - 0, 259, 26, 27, 37, 42, 43, 40, 45, 46, - 0, 126, 259, 0, 5, 6, 257, 259, 259, 38, - 44, 43, 62, 45, 35, 36, 41, 60, 22, 23, - 21, 64, 58, 257, 0, 41, 257, 37, 38, 0, - 40, 41, 42, 43, 63, 45, 46, 37, 38, 0, - 40, 41, 42, 43, 41, 45, 46, 62, 58, 58, - 60, 43, 62, 63, 64, 29, -1, -1, 58, -1, - 60, 58, 62, 63, 64, 62, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, -1, 58, -1, 60, - -1, 62, 63, 64, 0, 124, -1, 58, -1, 60, - -1, 62, 63, 64, 0, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 124, -1, 126, -1, -1, -1, - -1, -1, -1, -1, 124, -1, 126, -1, -1, -1, - -1, 37, 38, -1, 40, 41, 42, 43, 0, 45, - 46, 37, 38, -1, 40, 41, 42, 43, 0, 45, - 46, -1, 58, 124, 60, 126, 62, 63, 64, -1, - -1, -1, 58, 124, 60, 126, 62, 63, 64, -1, - -1, -1, -1, -1, -1, 37, 38, -1, 40, 41, - 42, 43, -1, 45, 46, 37, 38, -1, 40, 41, - -1, -1, -1, -1, -1, -1, 58, 0, 60, -1, - 62, 63, 64, 0, -1, -1, 58, -1, 60, -1, - 62, 63, 64, 0, 257, 258, -1, -1, 124, -1, - 126, -1, -1, -1, -1, -1, -1, -1, 124, -1, - 126, -1, -1, -1, -1, 38, -1, -1, 41, -1, - 37, 38, 0, 40, 41, -1, -1, 257, 258, -1, - 37, 38, 0, 40, 41, 58, -1, 257, 258, 62, - 63, 58, 124, 60, 126, 62, 63, 64, -1, -1, - 0, 58, 124, 60, 126, 62, 63, 64, -1, 37, - 38, -1, 40, 41, -1, -1, 257, 258, -1, -1, - 38, -1, -1, 41, -1, -1, 257, 258, -1, -1, - 58, -1, 60, -1, 62, 63, 64, -1, 38, -1, - 58, 41, -1, -1, 62, 63, -1, -1, -1, -1, - -1, 124, -1, -1, -1, -1, -1, 124, 58, 126, - -1, -1, 62, 63, -1, -1, -1, 124, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 257, 258, -1, -1, -1, -1, -1, -1, -1, - -1, 257, 258, -1, -1, -1, 124, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 124, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 124, 257, 258, -1, -1, -1, - -1, -1, -1, -1, -1, 257, 258, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 257, 258, -1, -1, -1, -1, -1, -1, -1, -1, - 257, 258, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 257, - 258, -}; -#define YYFINAL 7 -#ifndef YYDEBUG -#define YYDEBUG 0 -#endif -#define YYMAXTOKEN 259 -#if YYDEBUG -char *yyname[] = { -"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'",0,"'-'","'.'",0,0,0,0,0,0,0,0,0,0,0, -"':'",0,"'<'",0,"'>'","'?'","'@'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"'|'",0, -"'~'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,"TOKEN_LETTER","TOKEN_LITERAL","TOKEN_DIGIT", -}; -char *yyrule[] = { -"$accept : expr", -"expr : optional_conditional", -"conditional : alternative", -"conditional : alternative '?' optional_conditional ':' conditional", -"optional_conditional :", -"optional_conditional : conditional", -"alternative : list", -"alternative : alternative '|' list", -"alternative : alternative '&' list", -"list : substitute", -"list : list substitute", -"substitute : string", -"substitute : substitute '~' string", -"string : '@'", -"string : TOKEN_LITERAL", -"string : TOKEN_LETTER", -"string : TOKEN_LETTER number", -"string : '%' TOKEN_LETTER", -"string : '%' digits", -"string : string '.' flag TOKEN_LETTER optional_number", -"string : string '+' number", -"string : string '-' number", -"string : string '*'", -"string : '(' optional_conditional ')'", -"string : '<' optional_conditional '>'", -"optional_number :", -"optional_number : number", -"number : TOKEN_DIGIT", -"number : number TOKEN_DIGIT", -"digits : TOKEN_DIGIT", -"digits : digits TOKEN_DIGIT", -"flag :", -"flag : '+'", -"flag : '-'", -}; -#endif -#define yyclearin (yychar=(-1)) -#define yyerrok (yyerrflag=0) -#ifdef YYSTACKSIZE -#ifndef YYMAXDEPTH -#define YYMAXDEPTH YYSTACKSIZE -#endif -#else -#ifdef YYMAXDEPTH -#define YYSTACKSIZE YYMAXDEPTH -#else -#define YYSTACKSIZE 500 -#define YYMAXDEPTH 500 -#endif -#endif -int yydebug; -int yynerrs; -int yyerrflag; -int yychar; -short *yyssp; -YYSTYPE *yyvsp; -YYSTYPE yyval; -YYSTYPE yylval; -short yyss[YYSTACKSIZE]; -YYSTYPE yyvs[YYSTACKSIZE]; -#define yystacksize YYSTACKSIZE -#line 397 "/u/jjc/groff/refer/label.y" - -/* bison defines const to be empty unless __STDC__ is defined, which it -isn't under cfront */ - -#ifdef const -#undef const -#endif - -const char *spec_ptr; -const char *spec_end; -const char *spec_cur; - -int yylex() -{ - while (spec_ptr < spec_end && csspace(*spec_ptr)) - spec_ptr++; - spec_cur = spec_ptr; - if (spec_ptr >= spec_end) - return 0; - unsigned char c = *spec_ptr++; - if (csalpha(c)) { - yylval.num = c; - return TOKEN_LETTER; - } - if (csdigit(c)) { - yylval.num = c - '0'; - return TOKEN_DIGIT; - } - if (c == '\'') { - yylval.str.start = literals.length(); - for (; spec_ptr < spec_end; spec_ptr++) { - if (*spec_ptr == '\'') { - if (++spec_ptr < spec_end && *spec_ptr == '\'') - literals += '\''; - else { - yylval.str.len = literals.length() - yylval.str.start; - return TOKEN_LITERAL; - } - } - else - literals += *spec_ptr; - } - yylval.str.len = literals.length() - yylval.str.start; - return TOKEN_LITERAL; - } - return c; -} - -int set_label_spec(const char *label_spec) -{ - spec_cur = spec_ptr = label_spec; - spec_end = strchr(label_spec, '\0'); - literals.clear(); - if (yyparse()) - return 0; - delete parsed_label; - parsed_label = parse_result; - return 1; -} - -int set_date_label_spec(const char *label_spec) -{ - spec_cur = spec_ptr = label_spec; - spec_end = strchr(label_spec, '\0'); - literals.clear(); - if (yyparse()) - return 0; - delete parsed_date_label; - parsed_date_label = parse_result; - return 1; -} - -int set_short_label_spec(const char *label_spec) -{ - spec_cur = spec_ptr = label_spec; - spec_end = strchr(label_spec, '\0'); - literals.clear(); - if (yyparse()) - return 0; - delete parsed_short_label; - parsed_short_label = parse_result; - return 1; -} - -void yyerror(const char *message) -{ - if (spec_cur < spec_end) - command_error("label specification %1 before `%2'", message, spec_cur); - else - command_error("label specification %1 at end of string", - message, spec_cur); -} - -void at_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &) -{ - if (tentative) - ref.canonicalize_authors(result); - else { - const char *end, *start = ref.get_authors(&end); - if (start) - result.append(start, end - start); - } -} - -void format_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &) -{ - if (tentative) - return; - const label_info *lp = ref.get_label_ptr(); - int num = lp == 0 ? ref.get_number() : lp->count; - if (type != '0') - result += format_serial(type, num + 1); - else { - const char *ptr = itoa(num + first_number); - int pad = width - strlen(ptr); - while (--pad >= 0) - result += '0'; - result += ptr; - } -} - -static const char *format_serial(char c, int n) -{ - assert(n > 0); - static char buf[128]; // more than enough. - switch (c) { - case 'i': - case 'I': - { - char *p = buf; - // troff uses z and w to represent 10000 and 5000 in Roman - // numerals; I can find no historical basis for this usage - const char *s = c == 'i' ? "zwmdclxvi" : "ZWMDCLXVI"; - if (n >= 40000) - return itoa(n); - while (n >= 10000) { - *p++ = s[0]; - n -= 10000; - } - for (int i = 1000; i > 0; i /= 10, s += 2) { - int m = n/i; - n -= m*i; - switch (m) { - case 3: - *p++ = s[2]; - /* falls through */ - case 2: - *p++ = s[2]; - /* falls through */ - case 1: - *p++ = s[2]; - break; - case 4: - *p++ = s[2]; - *p++ = s[1]; - break; - case 8: - *p++ = s[1]; - *p++ = s[2]; - *p++ = s[2]; - *p++ = s[2]; - break; - case 7: - *p++ = s[1]; - *p++ = s[2]; - *p++ = s[2]; - break; - case 6: - *p++ = s[1]; - *p++ = s[2]; - break; - case 5: - *p++ = s[1]; - break; - case 9: - *p++ = s[2]; - *p++ = s[0]; - } - } - *p = 0; - break; - } - case 'a': - case 'A': - { - char *p = buf; - // this is derived from troff/reg.c - while (n > 0) { - int d = n % 26; - if (d == 0) - d = 26; - n -= d; - n /= 26; - *p++ = c + d - 1; // ASCII dependent - } - *p-- = 0; - // Reverse it. - char *q = buf; - while (q < p) { - char temp = *q; - *q = *p; - *p = temp; - --p; - ++q; - } - break; - } - default: - assert(0); - } - return buf; -} - -void field_expr::evaluate(int, const reference &ref, - string &result, substring_position &) -{ - const char *end; - const char *start = ref.get_field(name, &end); - if (start) { - start = nth_field(number, start, &end); - if (start) - result.append(start, end - start); - } -} - -void literal_expr::evaluate(int, const reference &, - string &result, substring_position &) -{ - result += s; -} - -analyzed_expr::analyzed_expr(expression *e) -: unary_expr(e), flags(e ? e->analyze() : 0) -{ -} - -void analyzed_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &pos) -{ - if (expr) - expr->evaluate(tentative, ref, result, pos); -} - -void star_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &pos) -{ - const label_info *lp = ref.get_label_ptr(); - if (!tentative - && (lp == 0 || lp->total > 1) - && expr) - expr->evaluate(tentative, ref, result, pos); -} - -void separator_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &pos) -{ - int start_length = result.length(); - int is_first = pos.start < 0; - if (expr) - expr->evaluate(tentative, ref, result, pos); - if (is_first) { - pos.start = start_length; - pos.length = result.length() - start_length; - } -} - -void map_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &) -{ - if (expr) { - string temp; - substring_position temp_pos; - expr->evaluate(tentative, ref, temp, temp_pos); - (*func)(temp.contents(), temp.contents() + temp.length(), result); - } -} - -void extractor_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &) -{ - if (expr) { - string temp; - substring_position temp_pos; - expr->evaluate(tentative, ref, temp, temp_pos); - const char *end, *start = (*func)(temp.contents(), - temp.contents() + temp.length(), - &end); - switch (part) { - case BEFORE: - if (start) - result.append(temp.contents(), start - temp.contents()); - else - result += temp; - break; - case MATCH: - if (start) - result.append(start, end - start); - break; - case AFTER: - if (start) - result.append(end, temp.contents() + temp.length() - end); - break; - default: - assert(0); - } - } -} - -static void first_part(int len, const char *ptr, const char *end, - string &result) -{ - for (;;) { - const char *token_start = ptr; - if (!get_token(&ptr, end)) - break; - const token_info *ti = lookup_token(token_start, ptr); - int counts = ti->sortify_non_empty(token_start, ptr); - if (counts && --len < 0) - break; - if (counts || ti->is_accent()) - result.append(token_start, ptr - token_start); - } -} - -static void last_part(int len, const char *ptr, const char *end, - string &result) -{ - const char *start = ptr; - int count = 0; - for (;;) { - const char *token_start = ptr; - if (!get_token(&ptr, end)) - break; - const token_info *ti = lookup_token(token_start, ptr); - if (ti->sortify_non_empty(token_start, ptr)) - count++; - } - ptr = start; - int skip = count - len; - if (skip > 0) { - for (;;) { - const char *token_start = ptr; - if (!get_token(&ptr, end)) - assert(0); - const token_info *ti = lookup_token(token_start, ptr); - if (ti->sortify_non_empty(token_start, ptr) && --skip < 0) { - ptr = token_start; - break; - } - } - } - first_part(len, ptr, end, result); -} - -void truncate_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &) -{ - if (expr) { - string temp; - substring_position temp_pos; - expr->evaluate(tentative, ref, temp, temp_pos); - const char *start = temp.contents(); - const char *end = start + temp.length(); - if (n > 0) - first_part(n, start, end, result); - else if (n < 0) - last_part(-n, start, end, result); - } -} - -void alternative_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &pos) -{ - int start_length = result.length(); - if (expr1) - expr1->evaluate(tentative, ref, result, pos); - if (result.length() == start_length && expr2) - expr2->evaluate(tentative, ref, result, pos); -} - -void list_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &pos) -{ - if (expr1) - expr1->evaluate(tentative, ref, result, pos); - if (expr2) - expr2->evaluate(tentative, ref, result, pos); -} - -void substitute_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &pos) -{ - int start_length = result.length(); - if (expr1) - expr1->evaluate(tentative, ref, result, pos); - if (result.length() > start_length && result[result.length() - 1] == '-') { - // ought to see if pos covers the - - result.set_length(result.length() - 1); - if (expr2) - expr2->evaluate(tentative, ref, result, pos); - } -} - -void conditional_expr::evaluate(int tentative, const reference &ref, - string &result, substring_position &pos) -{ - string temp; - substring_position temp_pos; - if (expr1) - expr1->evaluate(tentative, ref, temp, temp_pos); - if (temp.length() > 0) { - if (expr2) - expr2->evaluate(tentative, ref, result, pos); - } - else { - if (expr3) - expr3->evaluate(tentative, ref, result, pos); - } -} - -void reference::pre_compute_label() -{ - if (parsed_label != 0 - && (parsed_label->analyze() & expression::CONTAINS_VARIABLE)) { - label.clear(); - substring_position temp_pos; - parsed_label->evaluate(1, *this, label, temp_pos); - label_ptr = lookup_label(label); - } -} - -void reference::compute_label() -{ - label.clear(); - if (parsed_label) - parsed_label->evaluate(0, *this, label, separator_pos); - if (short_label_flag && parsed_short_label) - parsed_short_label->evaluate(0, *this, short_label, short_separator_pos); - if (date_as_label) { - string new_date; - if (parsed_date_label) { - substring_position temp_pos; - parsed_date_label->evaluate(0, *this, new_date, temp_pos); - } - set_date(new_date); - } - if (label_ptr) - label_ptr->count += 1; -} - -void reference::immediate_compute_label() -{ - if (label_ptr) - label_ptr->total = 2; // force use of disambiguator - compute_label(); -} - -int reference::merge_labels(reference **v, int n, label_type type, - string &result) -{ - if (abbreviate_label_ranges) - return merge_labels_by_number(v, n, type, result); - else - return merge_labels_by_parts(v, n, type, result); -} - -int reference::merge_labels_by_number(reference **v, int n, label_type type, - string &result) -{ - if (n <= 1) - return 0; - int num = get_number(); - // Only merge three or more labels. - if (v[0]->get_number() != num + 1 - || v[1]->get_number() != num + 2) - return 0; - for (int i = 2; i < n; i++) - if (v[i]->get_number() != num + i + 1) - break; - result = get_label(type); - result += label_range_indicator; - result += v[i - 1]->get_label(type); - return i; -} - -const substring_position &reference::get_separator_pos(label_type type) const -{ - if (type == SHORT_LABEL && short_label_flag) - return short_separator_pos; - else - return separator_pos; -} - -const string &reference::get_label(label_type type) const -{ - if (type == SHORT_LABEL && short_label_flag) - return short_label; - else - return label; -} - -int reference::merge_labels_by_parts(reference **v, int n, label_type type, - string &result) -{ - if (n <= 0) - return 0; - const string &lb = get_label(type); - const substring_position &sp = get_separator_pos(type); - if (sp.start < 0 - || sp.start != v[0]->get_separator_pos(type).start - || memcmp(lb.contents(), v[0]->get_label(type).contents(), - sp.start) != 0) - return 0; - result = lb; - int i = 0; - do { - result += separate_label_second_parts; - const substring_position &s = v[i]->get_separator_pos(type); - int sep_end_pos = s.start + s.length; - result.append(v[i]->get_label(type).contents() + sep_end_pos, - v[i]->get_label(type).length() - sep_end_pos); - } while (++i < n - && sp.start == v[i]->get_separator_pos(type).start - && memcmp(lb.contents(), v[i]->get_label(type).contents(), - sp.start) == 0); - return i; -} - -string label_pool; - -label_info::label_info(const string &s) -: count(0), total(1), length(s.length()), start(label_pool.length()) -{ - label_pool += s; -} - -static label_info **label_table = 0; -static int label_table_size = 0; -static int label_table_used = 0; - -label_info *lookup_label(const string &label) -{ - if (label_table == 0) { - label_table = new label_info *[17]; - label_table_size = 17; - for (int i = 0; i < 17; i++) - label_table[i] = 0; - } - unsigned h = hash_string(label.contents(), label.length()) % label_table_size; - for (label_info **ptr = label_table + h; - *ptr != 0; - (ptr == label_table) - ? (ptr = label_table + label_table_size - 1) - : ptr--) - if ((*ptr)->length == label.length() - && memcmp(label_pool.contents() + (*ptr)->start, label.contents(), - label.length()) == 0) { - (*ptr)->total += 1; - return *ptr; - } - label_info *result = *ptr = new label_info(label); - if (++label_table_used * 2 > label_table_size) { - // Rehash the table. - label_info **old_table = label_table; - int old_size = label_table_size; - label_table_size = next_size(label_table_size); - label_table = new label_info *[label_table_size]; - int i; - for (i = 0; i < label_table_size; i++) - label_table[i] = 0; - for (i = 0; i < old_size; i++) - if (old_table[i]) { - unsigned h = hash_string(label_pool.contents() + old_table[i]->start, - old_table[i]->length); - for (label_info **p = label_table + (h % label_table_size); - *p != 0; - (p == label_table) - ? (p = label_table + label_table_size - 1) - : --p) - ; - *p = old_table[i]; - } - a_delete old_table; - } - return result; -} - -void clear_labels() -{ - for (int i = 0; i < label_table_size; i++) { - delete label_table[i]; - label_table[i] = 0; - } - label_table_used = 0; - label_pool.clear(); -} - -static void consider_authors(reference **start, reference **end, int i); - -void compute_labels(reference **v, int n) -{ - if (parsed_label - && (parsed_label->analyze() & expression::CONTAINS_AT) - && sort_fields.length() >= 2 - && sort_fields[0] == 'A' - && sort_fields[1] == '+') - consider_authors(v, v + n, 0); - for (int i = 0; i < n; i++) - v[i]->compute_label(); -} - - -/* A reference with a list of authors <A0,A1,...,AN> _needs_ author i -where 0 <= i <= N if there exists a reference with a list of authors -<B0,B1,...,BM> such that <A0,A1,...,AN> != <B0,B1,...,BM> and M >= i -and Aj = Bj for 0 <= j < i. In this case if we can't say ``A0, -A1,...,A(i-1) et al'' because this would match both <A0,A1,...,AN> and -<B0,B1,...,BM>. If a reference needs author i we only have to call -need_author(j) for some j >= i such that the reference also needs -author j. */ - -/* This function handles 2 tasks: -determine which authors are needed (cannot be elided with et al.); -determine which authors can have only last names in the labels. - -References >= start and < end have the same first i author names. -Also they're sorted by A+. */ - -static void consider_authors(reference **start, reference **end, int i) -{ - if (start >= end) - return; - reference **p = start; - if (i >= (*p)->get_nauthors()) { - for (++p; p < end && i >= (*p)->get_nauthors(); p++) - ; - if (p < end && i > 0) { - // If we have an author list <A B C> and an author list <A B C D>, - // then both lists need C. - for (reference **q = start; q < end; q++) - (*q)->need_author(i - 1); - } - start = p; - } - while (p < end) { - reference **last_name_start = p; - reference **name_start = p; - for (++p; - p < end && i < (*p)->get_nauthors() - && same_author_last_name(**last_name_start, **p, i); - p++) { - if (!same_author_name(**name_start, **p, i)) { - consider_authors(name_start, p, i + 1); - name_start = p; - } - } - consider_authors(name_start, p, i + 1); - if (last_name_start == name_start) { - for (reference **q = last_name_start; q < p; q++) - (*q)->set_last_name_unambiguous(i); - } - // If we have an author list <A B C D> and <A B C E>, then the lists - // need author D and E respectively. - if (name_start > start || p < end) { - for (reference **q = last_name_start; q < p; q++) - (*q)->need_author(i); - } - } -} - -int same_author_last_name(const reference &r1, const reference &r2, int n) -{ - const char *ae1; - const char *as1 = r1.get_sort_field(0, n, 0, &ae1); - assert(as1 != 0); - const char *ae2; - const char *as2 = r2.get_sort_field(0, n, 0, &ae2); - assert(as2 != 0); - return ae1 - as1 == ae2 - as2 && memcmp(as1, as2, ae1 - as1) == 0; -} - -int same_author_name(const reference &r1, const reference &r2, int n) -{ - const char *ae1; - const char *as1 = r1.get_sort_field(0, n, -1, &ae1); - assert(as1 != 0); - const char *ae2; - const char *as2 = r2.get_sort_field(0, n, -1, &ae2); - assert(as2 != 0); - return ae1 - as1 == ae2 - as2 && memcmp(as1, as2, ae1 - as1) == 0; -} - - -void int_set::set(int i) -{ - assert(i >= 0); - int bytei = i >> 3; - if (bytei >= v.length()) { - int old_length = v.length(); - v.set_length(bytei + 1); - for (int j = old_length; j <= bytei; j++) - v[j] = 0; - } - v[bytei] |= 1 << (i & 7); -} - -int int_set::get(int i) const -{ - assert(i >= 0); - int bytei = i >> 3; - return bytei >= v.length() ? 0 : (v[bytei] & (1 << (i & 7))) != 0; -} - -void reference::set_last_name_unambiguous(int i) -{ - last_name_unambiguous.set(i); -} - -void reference::need_author(int n) -{ - if (n > last_needed_author) - last_needed_author = n; -} - -const char *reference::get_authors(const char **end) const -{ - if (!computed_authors) { - ((reference *)this)->computed_authors = 1; - string &result = ((reference *)this)->authors; - int na = get_nauthors(); - result.clear(); - for (int i = 0; i < na; i++) { - if (last_name_unambiguous.get(i)) { - const char *e, *start = get_author_last_name(i, &e); - assert(start != 0); - result.append(start, e - start); - } - else { - const char *e, *start = get_author(i, &e); - assert(start != 0); - result.append(start, e - start); - } - if (i == last_needed_author - && et_al.length() > 0 - && et_al_min_elide > 0 - && last_needed_author + et_al_min_elide < na - && na >= et_al_min_total) { - result += et_al; - break; - } - if (i < na - 1) { - if (na == 2) - result += join_authors_exactly_two; - else if (i < na - 2) - result += join_authors_default; - else - result += join_authors_last_two; - } - } - } - const char *start = authors.contents(); - *end = start + authors.length(); - return start; -} - -int reference::get_nauthors() const -{ - if (nauthors < 0) { - const char *dummy; - for (int na = 0; get_author(na, &dummy) != 0; na++) - ; - ((reference *)this)->nauthors = na; - } - return nauthors; -} -#line 1220 "y.tab.c" -#define YYABORT goto yyabort -#define YYACCEPT goto yyaccept -#define YYERROR goto yyerrlab -int -yyparse() -{ - register int yym, yyn, yystate; -#if YYDEBUG - register char *yys; - extern char *getenv(); - - if (yys = getenv("YYDEBUG")) - { - yyn = *yys; - if (yyn >= '0' && yyn <= '9') - yydebug = yyn - '0'; - } -#endif - - yynerrs = 0; - yyerrflag = 0; - yychar = (-1); - - yyssp = yyss; - yyvsp = yyvs; - *yyssp = yystate = 0; - -yyloop: - if (yyn = yydefred[yystate]) goto yyreduce; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, reading %d (%s)\n", yystate, - yychar, yys); - } -#endif - } - if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { -#if YYDEBUG - if (yydebug) - printf("yydebug: state %d, shifting to state %d\n", - yystate, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - yychar = (-1); - if (yyerrflag > 0) --yyerrflag; - goto yyloop; - } - if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yychar) - { - yyn = yytable[yyn]; - goto yyreduce; - } - if (yyerrflag) goto yyinrecovery; -#ifdef lint - goto yynewerror; -#endif -yynewerror: - yyerror("syntax error"); -#ifdef lint - goto yyerrlab; -#endif -yyerrlab: - ++yynerrs; -yyinrecovery: - if (yyerrflag < 3) - { - yyerrflag = 3; - for (;;) - { - if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) - { -#if YYDEBUG - if (yydebug) - printf("yydebug: state %d, error recovery shifting\ - to state %d\n", *yyssp, yytable[yyn]); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate = yytable[yyn]; - *++yyvsp = yylval; - goto yyloop; - } - else - { -#if YYDEBUG - if (yydebug) - printf("yydebug: error recovery discarding state %d\n", - *yyssp); -#endif - if (yyssp <= yyss) goto yyabort; - --yyssp; - --yyvsp; - } - } - } - else - { - if (yychar == 0) goto yyabort; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, error recovery discards token %d (%s)\n", - yystate, yychar, yys); - } -#endif - yychar = (-1); - goto yyloop; - } -yyreduce: -#if YYDEBUG - if (yydebug) - printf("yydebug: state %d, reducing by rule %d (%s)\n", - yystate, yyn, yyrule[yyn]); -#endif - yym = yylen[yyn]; - yyval = yyvsp[1-yym]; - switch (yyn) - { -case 1: -#line 250 "/u/jjc/groff/refer/label.y" -{ parse_result = (yyvsp[0].expr ? new analyzed_expr(yyvsp[0].expr) : 0); } -break; -case 2: -#line 255 "/u/jjc/groff/refer/label.y" -{ yyval.expr = yyvsp[0].expr; } -break; -case 3: -#line 257 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new conditional_expr(yyvsp[-4].expr, yyvsp[-2].expr, yyvsp[0].expr); } -break; -case 4: -#line 262 "/u/jjc/groff/refer/label.y" -{ yyval.expr = 0; } -break; -case 5: -#line 264 "/u/jjc/groff/refer/label.y" -{ yyval.expr = yyvsp[0].expr; } -break; -case 6: -#line 269 "/u/jjc/groff/refer/label.y" -{ yyval.expr = yyvsp[0].expr; } -break; -case 7: -#line 271 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new alternative_expr(yyvsp[-2].expr, yyvsp[0].expr); } -break; -case 8: -#line 273 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new conditional_expr(yyvsp[-2].expr, yyvsp[0].expr, 0); } -break; -case 9: -#line 278 "/u/jjc/groff/refer/label.y" -{ yyval.expr = yyvsp[0].expr; } -break; -case 10: -#line 280 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new list_expr(yyvsp[-1].expr, yyvsp[0].expr); } -break; -case 11: -#line 285 "/u/jjc/groff/refer/label.y" -{ yyval.expr = yyvsp[0].expr; } -break; -case 12: -#line 287 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new substitute_expr(yyvsp[-2].expr, yyvsp[0].expr); } -break; -case 13: -#line 292 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new at_expr; } -break; -case 14: -#line 294 "/u/jjc/groff/refer/label.y" -{ - yyval.expr = new literal_expr(literals.contents() + yyvsp[0].str.start, - yyvsp[0].str.len); - } -break; -case 15: -#line 299 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new field_expr(yyvsp[0].num, 0); } -break; -case 16: -#line 301 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new field_expr(yyvsp[-1].num, yyvsp[0].num - 1); } -break; -case 17: -#line 303 "/u/jjc/groff/refer/label.y" -{ - switch (yyvsp[0].num) { - case 'I': - case 'i': - case 'A': - case 'a': - yyval.expr = new format_expr(yyvsp[0].num); - break; - default: - command_error("unrecognized format `%1'", char(yyvsp[0].num)); - yyval.expr = new format_expr('a'); - break; - } - } -break; -case 18: -#line 319 "/u/jjc/groff/refer/label.y" -{ - yyval.expr = new format_expr('0', yyvsp[0].dig.ndigits, yyvsp[0].dig.val); - } -break; -case 19: -#line 323 "/u/jjc/groff/refer/label.y" -{ - switch (yyvsp[-1].num) { - case 'l': - yyval.expr = new map_expr(yyvsp[-4].expr, lowercase); - break; - case 'u': - yyval.expr = new map_expr(yyvsp[-4].expr, uppercase); - break; - case 'c': - yyval.expr = new map_expr(yyvsp[-4].expr, capitalize); - break; - case 'r': - yyval.expr = new map_expr(yyvsp[-4].expr, reverse_name); - break; - case 'a': - yyval.expr = new map_expr(yyvsp[-4].expr, abbreviate_name); - break; - case 'y': - yyval.expr = new extractor_expr(yyvsp[-4].expr, find_year, yyvsp[-2].num); - break; - case 'n': - yyval.expr = new extractor_expr(yyvsp[-4].expr, find_last_name, yyvsp[-2].num); - break; - default: - yyval.expr = yyvsp[-4].expr; - command_error("unknown function `%1'", char(yyvsp[-1].num)); - break; - } - } -break; -case 20: -#line 354 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new truncate_expr(yyvsp[-2].expr, yyvsp[0].num); } -break; -case 21: -#line 356 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new truncate_expr(yyvsp[-2].expr, -yyvsp[0].num); } -break; -case 22: -#line 358 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new star_expr(yyvsp[-1].expr); } -break; -case 23: -#line 360 "/u/jjc/groff/refer/label.y" -{ yyval.expr = yyvsp[-1].expr; } -break; -case 24: -#line 362 "/u/jjc/groff/refer/label.y" -{ yyval.expr = new separator_expr(yyvsp[-1].expr); } -break; -case 25: -#line 367 "/u/jjc/groff/refer/label.y" -{ yyval.num = -1; } -break; -case 26: -#line 369 "/u/jjc/groff/refer/label.y" -{ yyval.num = yyvsp[0].num; } -break; -case 27: -#line 374 "/u/jjc/groff/refer/label.y" -{ yyval.num = yyvsp[0].num; } -break; -case 28: -#line 376 "/u/jjc/groff/refer/label.y" -{ yyval.num = yyvsp[-1].num*10 + yyvsp[0].num; } -break; -case 29: -#line 381 "/u/jjc/groff/refer/label.y" -{ yyval.dig.ndigits = 1; yyval.dig.val = yyvsp[0].num; } -break; -case 30: -#line 383 "/u/jjc/groff/refer/label.y" -{ yyval.dig.ndigits = yyvsp[-1].dig.ndigits + 1; yyval.dig.val = yyvsp[-1].dig.val*10 + yyvsp[0].num; } -break; -case 31: -#line 389 "/u/jjc/groff/refer/label.y" -{ yyval.num = 0; } -break; -case 32: -#line 391 "/u/jjc/groff/refer/label.y" -{ yyval.num = 1; } -break; -case 33: -#line 393 "/u/jjc/groff/refer/label.y" -{ yyval.num = -1; } -break; -#line 1538 "y.tab.c" - } - yyssp -= yym; - yystate = *yyssp; - yyvsp -= yym; - yym = yylhs[yyn]; - if (yystate == 0 && yym == 0) - { -#if YYDEBUG - if (yydebug) - printf("yydebug: after reduction, shifting from state 0 to\ - state %d\n", YYFINAL); -#endif - yystate = YYFINAL; - *++yyssp = YYFINAL; - *++yyvsp = yyval; - if (yychar < 0) - { - if ((yychar = yylex()) < 0) yychar = 0; -#if YYDEBUG - if (yydebug) - { - yys = 0; - if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; - if (!yys) yys = "illegal-symbol"; - printf("yydebug: state %d, reading %d (%s)\n", - YYFINAL, yychar, yys); - } -#endif - } - if (yychar == 0) goto yyaccept; - goto yyloop; - } - if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && - yyn <= YYTABLESIZE && yycheck[yyn] == yystate) - yystate = yytable[yyn]; - else - yystate = yydgoto[yym]; -#if YYDEBUG - if (yydebug) - printf("yydebug: after reduction, shifting from state %d \ -to state %d\n", *yyssp, yystate); -#endif - if (yyssp >= yyss + yystacksize - 1) - { - goto yyoverflow; - } - *++yyssp = yystate; - *++yyvsp = yyval; - goto yyloop; -yyoverflow: - yyerror("yacc stack overflow"); -yyabort: - return (1); -yyaccept: - return (0); -} diff --git a/gnu/usr.bin/gzip/zcmp b/gnu/usr.bin/gzip/zcmp deleted file mode 100644 index c21e7ef8ae06..000000000000 --- a/gnu/usr.bin/gzip/zcmp +++ /dev/null @@ -1,67 +0,0 @@ -#!/bin/sh - -# Zcmp and zdiff are used to invoke the cmp or the diff pro- -# gram on compressed files. All options specified are passed -# directly to cmp or diff. If only 1 file is specified, then -# the files compared are file1 and an uncompressed file1.gz. -# If two files are specified, then they are uncompressed (if -# necessary) and fed to cmp or diff. The exit status from cmp -# or diff is preserved. - -prog=`echo $0 | sed 's|.*/||'` -case "$prog" in - *cmp) comp=${CMP-cmp} ;; - *) comp=${DIFF-diff} ;; -esac - -OPTIONS= -FILES= -for ARG -do - case "$ARG" in - -*) OPTIONS="$OPTIONS $ARG";; - *) if test -f "$ARG"; then - FILES="$FILES $ARG" - else - echo "${prog}: $ARG not found or not a regular file" - exit 1 - fi ;; - esac -done -if test -z "$FILES"; then - echo "Usage: $prog [${comp}_options] file [file]" - exit 1 -fi -set $FILES -if test $# -eq 1; then - FILE=`echo "$1" | sed 's/[-.][zZtga]*$//'` - gzip -cd "$1" | $comp $OPTIONS - "$FILE" - STAT="$?" - -elif test $# -eq 2; then - case "$1" in - *[-.]gz | *[-.][zZ] | *.t[ga]z) - case "$2" in - *[-.]gz | *[-.][zZ] | *.t[ga]z) - F=`echo "$2" | sed 's|.*/||;s|[-.][zZtga]*$||'` - gzip -cd "$2" > /tmp/"$F".$$ - gzip -cd "$1" | $comp $OPTIONS - /tmp/"$F".$$ - STAT="$?" - /bin/rm -f /tmp/"$F".$$;; - - *) gzip -cd "$1" | $comp $OPTIONS - "$2" - STAT="$?";; - esac;; - *) case "$2" in - *[-.]gz | *[-.][zZ] | *.t[ga]z) - gzip -cd "$2" | $comp $OPTIONS "$1" - - STAT="$?";; - *) $comp $OPTIONS "$1" "$2" - STAT="$?";; - esac;; - esac - exit "$STAT" -else - echo "Usage: $prog [${comp}_options] file [file]" - exit 1 -fi diff --git a/gnu/usr.bin/pr/COPYING b/gnu/usr.bin/pr/COPYING deleted file mode 100644 index a43ea2126fb6..000000000000 --- a/gnu/usr.bin/pr/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/gnu/usr.bin/pr/getopt.h b/gnu/usr.bin/pr/getopt.h deleted file mode 100644 index 45541f5ac0f9..000000000000 --- a/gnu/usr.bin/pr/getopt.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Declarations for getopt. - Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any - later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns EOF, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if __STDC__ - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#if __STDC__ -#if defined(__GNU_LIBRARY__) -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -#else /* not __GNU_LIBRARY__ */ -extern int getopt (); -#endif /* not __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); -#else /* not __STDC__ */ -extern int getopt (); -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -#endif /* not __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* _GETOPT_H */ diff --git a/gnu/usr.bin/pr/version.h b/gnu/usr.bin/pr/version.h deleted file mode 100644 index 63de4fd14719..000000000000 --- a/gnu/usr.bin/pr/version.h +++ /dev/null @@ -1 +0,0 @@ -extern const char *version_string; diff --git a/gnu/usr.bin/ptx/ptx.info b/gnu/usr.bin/ptx/ptx.info deleted file mode 100644 index 3bbd1bb8cf07..000000000000 --- a/gnu/usr.bin/ptx/ptx.info +++ /dev/null @@ -1,496 +0,0 @@ -This is Info file ptx.info, produced by Makeinfo-1.47 from the input -file ./ptx.texinfo. - - This file documents the `ptx' command, which has the purpose of -generated permuted indices for group of files. - - Copyright (C) 1990, 1991, 1993 by the Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Foundation. - - -File: ptx.info, Node: Top, Next: Invoking ptx, Prev: (dir), Up: (dir) - -Introduction -************ - - This is the 0.3 beta release of `ptx', the GNU version of a permuted -index generator. This software has the main goal of providing a -replacement for the traditional `ptx' as found on System V machines, -able to handle small files quickly, while providing a platform for more -development. - - This version reimplements and extends traditional `ptx'. Among -other things, it can produce a readable "KWIC" (keywords in their -context) without the need of `nroff', there is also an option to -produce TeX compatible output. This version does not handle huge input -files, that is, those files which do not fit in memory all at once. - - *Please note* that an overall renaming of all options is -foreseeable. In fact, GNU ptx specifications are not frozen yet. - -* Menu: - -* Invoking ptx:: How to use this program -* Compatibility:: The GNU extensions to `ptx' - - -- The Detailed Node Listing -- - -How to use this program - -* General options:: Options which affect general program behaviour. -* Charset selection:: Underlying character set considerations. -* Input processing:: Input fields, contexts, and keyword selection. -* Output formatting:: Types of output format, and sizing the fields. - - -File: ptx.info, Node: Invoking ptx, Next: Compatibility, Prev: Top, Up: Top - -How to use this program -*********************** - - This tool reads a text file and essentially produces a permuted -index, with each keyword in its context. The calling sketch is one of: - - ptx [OPTION ...] [FILE ...] - - or: - - ptx -G [OPTION ...] [INPUT [OUTPUT]] - - The `-G' (or its equivalent: `--traditional') option disables all -GNU extensions and revert to traditional mode, thus introducing some -limitations, and changes several of the program's default option values. -When `-G' is not specified, GNU extensions are always enabled. GNU -extensions to `ptx' are documented wherever appropriate in this -document. See *Note Compatibility:: for an explicit list of them. - - Individual options are explained later in this document. - - When GNU extensions are enabled, there may be zero, one or several -FILE after the options. If there is no FILE, the program reads the -standard input. If there is one or several FILE, they give the name of -input files which are all read in turn, as if all the input files were -concatenated. However, there is a full contextual break between each -file and, when automatic referencing is requested, file names and line -numbers refer to individual text input files. In all cases, the -program produces the permuted index onto the standard output. - - When GNU extensions are *not* enabled, that is, when the program -operates in traditional mode, there may be zero, one or two parameters -besides the options. If there is no parameters, the program reads the -standard input and produces the permuted index onto the standard output. -If there is only one parameter, it names the text INPUT to be read -instead of the standard input. If two parameters are given, they give -respectively the name of the INPUT file to read and the name of the -OUTPUT file to produce. *Be very careful* to note that, in this case, -the contents of file given by the second parameter is destroyed. This -behaviour is dictated only by System V `ptx' compatibility, because GNU -Standards discourage output parameters not introduced by an option. - - Note that for *any* file named as the value of an option or as an -input text file, a single dash `-' may be used, in which case standard -input is assumed. However, it would not make sense to use this -convention more than once per program invocation. - -* Menu: - -* General options:: Options which affect general program behaviour. -* Charset selection:: Underlying character set considerations. -* Input processing:: Input fields, contexts, and keyword selection. -* Output formatting:: Types of output format, and sizing the fields. - - -File: ptx.info, Node: General options, Next: Charset selection, Prev: Invoking ptx, Up: Invoking ptx - -General options -=============== - -`-C' -`--copyright' - Prints a short note about the Copyright and copying conditions, - then exit without further processing. - -`-G' -`--traditional' - As already explained, this option disables all GNU extensions to - `ptx' and switch to traditional mode. - -`--help' - Prints a short help on standard output, then exit without further - processing. - -`--version' - Prints the program verison on standard output, then exit without - further processing. - - -File: ptx.info, Node: Charset selection, Next: Input processing, Prev: General options, Up: Invoking ptx - -Charset selection -================= - - As it is setup now, the program assumes that the input file is coded -using 8-bit ISO 8859-1 code, also known as Latin-1 character set, -*unless* if it is compiled for MS-DOS, in which case it uses the -character set of the IBM-PC. (GNU `ptx' is not known to work on -smaller MS-DOS machines anymore.) Compared to 7-bit ASCII, the set of -characters which are letters is then different, this fact alters the -behaviour of regular expression matching. Thus, the default regular -expression for a keyword allows foreign or diacriticized letters. -Keyword sorting, however, is still crude; it obeys the underlying -character set ordering quite blindly. - -`-f' -`--ignore-case' - Fold lower case letters to upper case for sorting. - - -File: ptx.info, Node: Input processing, Next: Output formatting, Prev: Charset selection, Up: Invoking ptx - -Word selection -============== - -`-b FILE' -`--break-file=FILE' - This option is an alternative way to option `-W' for describing - which characters make up words. This option introduces the name - of a file which contains a list of characters which can*not* be - part of one word, this file is called the "Break file". Any - character which is not part of the Break file is a word - constituent. If both options `-b' and `-W' are specified, then - `-W' has precedence and `-b' is ignored. - - When GNU extensions are enabled, the only way to avoid newline as a - break character is to write all the break characters in the file - with no newline at all, not even at the end of the file. When GNU - extensions are disabled, spaces, tabs and newlines are always - considered as break characters even if not included in the Break - file. - -`-i FILE' -`--ignore-file=FILE' - The file associated with this option contains a list of words - which will never be taken as keywords in concordance output. It - is called the "Ignore file". The file contains exactly one word - in each line; the end of line separation of words is not subject - to the value of the `-S' option. - - There is a default Ignore file used by `ptx' when this option is - not specified, usually found in `/usr/local/lib/eign' if this has - not been changed at installation time. If you want to deactivate - the default Ignore file, specify `/dev/null' instead. - -`-o FILE' -`--only-file=FILE' - The file associated with this option contains a list of words - which will be retained in concordance output, any word not - mentioned in this file is ignored. The file is called the "Only - file". The file contains exactly one word in each line; the end - of line separation of words is not subject to the value of the - `-S' option. - - There is no default for the Only file. In the case there are both - an Only file and an Ignore file, a word will be subject to be a - keyword only if it is given in the Only file and not given in the - Ignore file. - -`-r' -`--references' - On each input line, the leading sequence of non white characters - will be taken to be a reference that has the purpose of - identifying this input line on the produced permuted index. See - *Note Output formatting:: for more information about reference - production. Using this option change the default value for option - `-S'. - - Using this option, the program does not try very hard to remove - references from contexts in output, but it succeeds in doing so - *when* the context ends exactly at the newline. If option `-r' is - used with `-S' default value, or when GNU extensions are disabled, - this condition is always met and references are completely - excluded from the output contexts. - -`-S REGEXP' -`--sentence-regexp=REGEXP' - This option selects which regular expression will describe the end - of a line or the end of a sentence. In fact, there is other - distinction between end of lines or end of sentences than the - effect of this regular expression, and input line boundaries have - no special significance outside this option. By default, when GNU - extensions are enabled and if `-r' option is not used, end of - sentences are used. In this case, the precise REGEX is imported - from GNU emacs: - - [.?!][]\"')}]*\\($\\|\t\\| \\)[ \t\n]* - - Whenever GNU extensions are disabled or if `-r' option is used, end - of lines are used; in this case, the default REGEXP is just: - - \n - - Using an empty REGEXP is equivalent to completely disabling end of - line or end of sentence recognition. In this case, the whole file - is considered to be a single big line or sentence. The user might - want to disallow all truncation flag generation as well, through - option `-F ""'. *Note Syntax of Regular Expressions: - (emacs)Regexps. - - When the keywords happen to be near the beginning of the input - line or sentence, this often creates an unused area at the - beginning of the output context line; when the keywords happen to - be near the end of the input line or sentence, this often creates - an unused area at the end of the output context line. The program - tries to fill those unused areas by wrapping around context in - them; the tail of the input line or sentence is used to fill the - unused area on the left of the output line; the head of the input - line or sentence is used to fill the unused area on the right of - the output line. - - As a matter of convenience to the user, many usual backslashed - escape sequences, as found in the C language, are recognized and - converted to the corresponding characters by `ptx' itself. - -`-W REGEXP' -`--word-regexp=REGEXP' - This option selects which regular expression will describe each - keyword. By default, if GNU extensions are enabled, a word is a - sequence of letters; the REGEXP used is `\w+'. When GNU - extensions are disabled, a word is by default anything which ends - with a space, a tab or a newline; the REGEXP used is `[^ \t\n]+'. - - An empty REGEXP is equivalent to not using this option, letting the - default dive in. *Note Syntax of Regular Expressions: - (emacs)Regexps. - - As a matter of convenience to the user, many usual backslashed - escape sequences, as found in the C language, are recognized and - converted to the corresponding characters by `ptx' itself. - - -File: ptx.info, Node: Output formatting, Prev: Input processing, Up: Invoking ptx - -Output formatting -================= - - Output format is mainly controlled by `-O' and `-T' options, -described in the table below. When neither `-O' nor `-T' is selected, -and if GNU extensions are enabled, the program choose an output format -suited for a dumb terminal. Each keyword occurrence is output to the -center of one line, surrounded by its left and right contexts. Each -field is properly justified, so the concordance output could readily be -observed. As a special feature, if automatic references are selected -by option `-A' and are output before the left context, that is, if -option `-R' is *not* selected, then a colon is added after the -reference; this nicely interfaces with GNU Emacs `next-error' -processing. In this default output format, each white space character, -like newline and tab, is merely changed to exactly one space, with no -special attempt to compress consecutive spaces. This might change in -the future. Except for those white space characters, every other -character of the underlying set of 256 characters is transmitted -verbatim. - - Output format is further controlled by the following options. - -`-g NUMBER' -`--gap-size=NUMBER' - Select the size of the minimum white gap between the fields on the - output line. - -`-w NUMBER' -`--width=NUMBER' - Select the output maximum width of each final line. If references - are used, they are included or excluded from the output maximum - width depending on the value of option `-R'. If this option is not - selected, that is, when references are output before the left - context, the output maximum width takes into account the maximum - length of all references. If this options is selected, that is, - when references are output after the right context, the output - maximum width does not take into account the space taken by - references, nor the gap that precedes them. - -`-A' -`--auto-reference' - Select automatic references. Each input line will have an - automatic reference made up of the file name and the line ordinal, - with a single colon between them. However, the file name will be - empty when standard input is being read. If both `-A' and `-r' - are selected, then the input reference is still read and skipped, - but the automatic reference is used at output time, overriding the - input reference. - -`-R' -`--right-side-refs' - In default output format, when option `-R' is not used, any - reference produced by the effect of options `-r' or `-A' are given - to the far right of output lines, after the right context. In - default output format, when option `-R' is specified, references - are rather given to the beginning of each output line, before the - left context. For any other output format, option `-R' is almost - ignored, except for the fact that the width of references is *not* - taken into account in total output width given by `-w' whenever - `-R' is selected. - - This option is automatically selected whenever GNU extensions are - disabled. - -`-F STRING' -`--flac-truncation=STRING' - This option will request that any truncation in the output be - reported using the string STRING. Most output fields - theoretically extend towards the beginning or the end of the - current line, or current sentence, as selected with option `-S'. - But there is a maximum allowed output line width, changeable - through option `-w', which is further divided into space for - various output fields. When a field has to be truncated because - cannot extend until the beginning or the end of the current line - to fit in the, then a truncation occurs. By default, the string - used is a single slash, as in `-F /'. - - STRING may have more than one character, as in `-F ...'. Also, in - the particular case STRING is empty (`-F ""'), truncation flagging - is disabled, and no truncation marks are appended in this case. - - As a matter of convenience to the user, many usual backslashed - escape sequences, as found in the C language, are recognized and - converted to the corresponding characters by `ptx' itself. - -`-M STRING' -`--macro-name=STRING' - Select another STRING to be used instead of `xx', while generating - output suitable for `nroff', `troff' or TeX. - -`-O' -`--format=roff' - Choose an output format suitable for `nroff' or `troff' - processing. Each output line will look like: - - .xx "TAIL" "BEFORE" "KEYWORD_AND_AFTER" "HEAD" "REF" - - so it will be possible to write an `.xx' roff macro to take care of - the output typesetting. This is the default output format when GNU - extensions are disabled. Option `-M' might be used to change `xx' - to another macro name. - - In this output format, each non-graphical character, like newline - and tab, is merely changed to exactly one space, with no special - attempt to compress consecutive spaces. Each quote character: `"' - is doubled so it will be correctly processed by `nroff' or `troff'. - -`-T' -`--format=tex' - Choose an output format suitable for TeX processing. Each output - line will look like: - - \xx {TAIL}{BEFORE}{KEYWORD}{AFTER}{HEAD}{REF} - - so it will be possible to write write a `\xx' definition to take - care of the output typesetting. Note that when references are not - being produced, that is, neither option `-A' nor option `-r' is - selected, the last parameter of each `\xx' call is inhibited. - Option `-M' might be used to change `xx' to another macro name. - - In this output format, some special characters, like `$', `%', - `&', `#' and `_' are automatically protected with a backslash. - Curly brackets `{', `}' are also protected with a backslash, but - also enclosed in a pair of dollar signs to force mathematical - mode. The backslash itself produces the sequence `\backslash{}'. - Circumflex and tilde diacritics produce the sequence `^\{ }' and - `~\{ }' respectively. Other diacriticized characters of the - underlying character set produce an appropriate TeX sequence as - far as possible. The other non-graphical characters, like newline - and tab, and all others characters which are not part of ASCII, - are merely changed to exactly one space, with no special attempt - to compress consecutive spaces. Let me know how to improve this - special character processing for TeX. - - -File: ptx.info, Node: Compatibility, Prev: Invoking ptx, Up: Top - -The GNU extensions to `ptx' -*************************** - - This version of `ptx' contains a few features which do not exist in -System V `ptx'. These extra features are suppressed by using the `-G' -command line option, unless overridden by other command line options. -Some GNU extensions cannot be recovered by overriding, so the simple -rule is to avoid `-G' if you care about GNU extensions. Here are the -differences between this program and System V `ptx'. - - * This program can read many input files at once, it always writes - the resulting concordance on standard output. On the other end, - System V `ptx' reads only one file and produce the result on - standard output or, if a second FILE parameter is given on the - command, to that FILE. - - Having output parameters not introduced by options is a quite - dangerous practice which GNU avoids as far as possible. So, for - using `ptx' portably between GNU and System V, you should pay - attention to always use it with a single input file, and always - expect the result on standard output. You might also want to - automatically configure in a `-G' option to `ptx' calls in - products using `ptx', if the configurator finds that the installed - `ptx' accepts `-G'. - - * The only options available in System V `ptx' are options `-b', - `-f', `-g', `-i', `-o', `-r', `-t' and `-w'. All other options - are GNU extensions and are not repeated in this enumeration. - Moreover, some options have a slightly different meaning when GNU - extensions are enabled, as explained below. - - * By default, concordance output is not formatted for `troff' or - `nroff'. It is rather formatted for a dumb terminal. `troff' or - `nroff' output may still be selected through option `-O'. - - * Unless `-R' option is used, the maximum reference width is - subtracted from the total output line width. With GNU extensions - disabled, width of references is not taken into account in the - output line width computations. - - * All 256 characters, even `NUL's, are always read and processed from - input file with no adverse effect, even if GNU extensions are - disabled. However, System V `ptx' does not accept 8-bit - characters, a few control characters are rejected, and the tilda - `~' is condemned. - - * Input line length is only limited by available memory, even if GNU - extensions are disabled. However, System V `ptx' processes only - the first 200 characters in each line. - - * The break (non-word) characters default to be every character - except all letters of the underlying character set, diacriticized - or not. When GNU extensions are disabled, the break characters - default to space, tab and newline only. - - * The program makes better use of output line width. If GNU - extensions are disabled, the program rather tries to imitate - System V `ptx', but still, there are some slight disposition - glitches this program does not completely reproduce. - - * The user can specify both an Ignore file and an Only file. This - is not allowed with System V `ptx'. - - - -Tag Table: -Node: Top939 -Node: Invoking ptx2298 -Node: General options5025 -Node: Charset selection5639 -Node: Input processing6514 -Node: Output formatting12205 -Node: Compatibility18737 - -End Tag Table diff --git a/gnu/usr.bin/ptx/ptx.texinfo b/gnu/usr.bin/ptx/ptx.texinfo deleted file mode 100644 index e690c55f80c1..000000000000 --- a/gnu/usr.bin/ptx/ptx.texinfo +++ /dev/null @@ -1,554 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename ptx.info -@settitle GNU @code{ptx} reference manual -@finalout -@c %**end of header - -@ifinfo -This file documents the @code{ptx} command, which has the purpose of -generated permuted indices for group of files. - -Copyright (C) 1990, 1991, 1993 by the Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. -@end ifinfo - -@titlepage -@title ptx -@subtitle The GNU permuted indexer -@subtitle Edition 0.3, for ptx version 0.3 -@subtitle November 1993 -@author by Francois Pinard - -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1990, 1991, 1993 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. -@end titlepage - -@node Top, Invoking ptx, (dir), (dir) -@chapter Introduction - -This is the 0.3 beta release of @code{ptx}, the GNU version of a -permuted index generator. This software has the main goal of providing -a replacement for the traditional @code{ptx} as found on System V -machines, able to handle small files quickly, while providing a platform -for more development. - -This version reimplements and extends traditional @code{ptx}. Among -other things, it can produce a readable @dfn{KWIC} (keywords in their -context) without the need of @code{nroff}, there is also an option to -produce @TeX{} compatible output. This version does not handle huge -input files, that is, those files which do not fit in memory all at -once. - -@emph{Please note} that an overall renaming of all options is -foreseeable. In fact, GNU ptx specifications are not frozen yet. - -@menu -* Invoking ptx:: How to use this program -* Compatibility:: The GNU extensions to @code{ptx} - - --- The Detailed Node Listing --- - -How to use this program - -* General options:: Options which affect general program behaviour. -* Charset selection:: Underlying character set considerations. -* Input processing:: Input fields, contexts, and keyword selection. -* Output formatting:: Types of output format, and sizing the fields. -@end menu - -@node Invoking ptx, Compatibility, Top, Top -@chapter How to use this program - -This tool reads a text file and essentially produces a permuted index, with -each keyword in its context. The calling sketch is one of: - -@example -ptx [@var{option} @dots{}] [@var{file} @dots{}] -@end example - -or: - -@example -ptx -G [@var{option} @dots{}] [@var{input} [@var{output}]] -@end example - -The @samp{-G} (or its equivalent: @samp{--traditional}) option disables -all GNU extensions and revert to traditional mode, thus introducing some -limitations, and changes several of the program's default option values. -When @samp{-G} is not specified, GNU extensions are always enabled. GNU -extensions to @code{ptx} are documented wherever appropriate in this -document. See @xref{Compatibility} for an explicit list of them. - -Individual options are explained later in this document. - -When GNU extensions are enabled, there may be zero, one or several -@var{file} after the options. If there is no @var{file}, the program -reads the standard input. If there is one or several @var{file}, they -give the name of input files which are all read in turn, as if all the -input files were concatenated. However, there is a full contextual -break between each file and, when automatic referencing is requested, -file names and line numbers refer to individual text input files. In -all cases, the program produces the permuted index onto the standard -output. - -When GNU extensions are @emph{not} enabled, that is, when the program -operates in traditional mode, there may be zero, one or two parameters -besides the options. If there is no parameters, the program reads the -standard input and produces the permuted index onto the standard output. -If there is only one parameter, it names the text @var{input} to be read -instead of the standard input. If two parameters are given, they give -respectively the name of the @var{input} file to read and the name of -the @var{output} file to produce. @emph{Be very careful} to note that, -in this case, the contents of file given by the second parameter is -destroyed. This behaviour is dictated only by System V @code{ptx} -compatibility, because GNU Standards discourage output parameters not -introduced by an option. - -Note that for @emph{any} file named as the value of an option or as an -input text file, a single dash @kbd{-} may be used, in which case -standard input is assumed. However, it would not make sense to use this -convention more than once per program invocation. - -@menu -* General options:: Options which affect general program behaviour. -* Charset selection:: Underlying character set considerations. -* Input processing:: Input fields, contexts, and keyword selection. -* Output formatting:: Types of output format, and sizing the fields. -@end menu - -@node General options, Charset selection, Invoking ptx, Invoking ptx -@section General options - -@table @code - -@item -C -@itemx --copyright -Prints a short note about the Copyright and copying conditions, then -exit without further processing. - -@item -G -@itemx --traditional -As already explained, this option disables all GNU extensions to -@code{ptx} and switch to traditional mode. - -@item --help -Prints a short help on standard output, then exit without further -processing. - -@item --version -Prints the program verison on standard output, then exit without further -processing. - -@end table - -@node Charset selection, Input processing, General options, Invoking ptx -@section Charset selection - -As it is setup now, the program assumes that the input file is coded -using 8-bit ISO 8859-1 code, also known as Latin-1 character set, -@emph{unless} if it is compiled for MS-DOS, in which case it uses the -character set of the IBM-PC. (GNU @code{ptx} is not known to work on -smaller MS-DOS machines anymore.) Compared to 7-bit ASCII, the set of -characters which are letters is then different, this fact alters the -behaviour of regular expression matching. Thus, the default regular -expression for a keyword allows foreign or diacriticized letters. -Keyword sorting, however, is still crude; it obeys the underlying -character set ordering quite blindly. - -@table @code - -@item -f -@itemx --ignore-case -Fold lower case letters to upper case for sorting. - -@end table - -@node Input processing, Output formatting, Charset selection, Invoking ptx -@section Word selection - -@table @code - -@item -b @var{file} -@item --break-file=@var{file} - -This option is an alternative way to option @code{-W} for describing -which characters make up words. This option introduces the name of a -file which contains a list of characters which can@emph{not} be part of -one word, this file is called the @dfn{Break file}. Any character which -is not part of the Break file is a word constituent. If both options -@code{-b} and @code{-W} are specified, then @code{-W} has precedence and -@code{-b} is ignored. - -When GNU extensions are enabled, the only way to avoid newline as a -break character is to write all the break characters in the file with no -newline at all, not even at the end of the file. When GNU extensions -are disabled, spaces, tabs and newlines are always considered as break -characters even if not included in the Break file. - -@item -i @var{file} -@itemx --ignore-file=@var{file} - -The file associated with this option contains a list of words which will -never be taken as keywords in concordance output. It is called the -@dfn{Ignore file}. The file contains exactly one word in each line; the -end of line separation of words is not subject to the value of the -@code{-S} option. - -There is a default Ignore file used by @code{ptx} when this option is -not specified, usually found in @file{/usr/local/lib/eign} if this has -not been changed at installation time. If you want to deactivate the -default Ignore file, specify @code{/dev/null} instead. - -@item -o @var{file} -@itemx --only-file=@var{file} - -The file associated with this option contains a list of words which will -be retained in concordance output, any word not mentioned in this file -is ignored. The file is called the @dfn{Only file}. The file contains -exactly one word in each line; the end of line separation of words is -not subject to the value of the @code{-S} option. - -There is no default for the Only file. In the case there are both an -Only file and an Ignore file, a word will be subject to be a keyword -only if it is given in the Only file and not given in the Ignore file. - -@item -r -@itemx --references - -On each input line, the leading sequence of non white characters will be -taken to be a reference that has the purpose of identifying this input -line on the produced permuted index. See @xref{Output formatting} for -more information about reference production. Using this option change -the default value for option @code{-S}. - -Using this option, the program does not try very hard to remove -references from contexts in output, but it succeeds in doing so -@emph{when} the context ends exactly at the newline. If option -@code{-r} is used with @code{-S} default value, or when GNU extensions -are disabled, this condition is always met and references are completely -excluded from the output contexts. - -@item -S @var{regexp} -@itemx --sentence-regexp=@var{regexp} - -This option selects which regular expression will describe the end of a -line or the end of a sentence. In fact, there is other distinction -between end of lines or end of sentences than the effect of this regular -expression, and input line boundaries have no special significance -outside this option. By default, when GNU extensions are enabled and if -@code{-r} option is not used, end of sentences are used. In this -case, the precise @var{regex} is imported from GNU emacs: - -@example -[.?!][]\"')@}]*\\($\\|\t\\| \\)[ \t\n]* -@end example - -Whenever GNU extensions are disabled or if @code{-r} option is used, end -of lines are used; in this case, the default @var{regexp} is just: - -@example -\n -@end example - -Using an empty REGEXP is equivalent to completely disabling end of line or end -of sentence recognition. In this case, the whole file is considered to -be a single big line or sentence. The user might want to disallow all -truncation flag generation as well, through option @code{-F ""}. -@xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs -Manual}. - -When the keywords happen to be near the beginning of the input line or -sentence, this often creates an unused area at the beginning of the -output context line; when the keywords happen to be near the end of the -input line or sentence, this often creates an unused area at the end of -the output context line. The program tries to fill those unused areas -by wrapping around context in them; the tail of the input line or -sentence is used to fill the unused area on the left of the output line; -the head of the input line or sentence is used to fill the unused area -on the right of the output line. - -As a matter of convenience to the user, many usual backslashed escape -sequences, as found in the C language, are recognized and converted to -the corresponding characters by @code{ptx} itself. - -@item -W @var{regexp} -@itemx --word-regexp=@var{regexp} - -This option selects which regular expression will describe each keyword. -By default, if GNU extensions are enabled, a word is a sequence of -letters; the @var{regexp} used is @code{\w+}. When GNU extensions are -disabled, a word is by default anything which ends with a space, a tab -or a newline; the @var{regexp} used is @code{[^ \t\n]+}. - -An empty REGEXP is equivalent to not using this option, letting the -default dive in. @xref{Regexps, , Syntax of Regular Expressions, emacs, -The GNU Emacs Manual}. - -As a matter of convenience to the user, many usual backslashed escape -sequences, as found in the C language, are recognized and converted to -the corresponding characters by @code{ptx} itself. - -@end table - -@node Output formatting, , Input processing, Invoking ptx -@section Output formatting - -Output format is mainly controlled by @code{-O} and @code{-T} options, -described in the table below. When neither @code{-O} nor @code{-T} is -selected, and if GNU extensions are enabled, the program choose an -output format suited for a dumb terminal. Each keyword occurrence is -output to the center of one line, surrounded by its left and right -contexts. Each field is properly justified, so the concordance output -could readily be observed. As a special feature, if automatic -references are selected by option @code{-A} and are output before the -left context, that is, if option @code{-R} is @emph{not} selected, then -a colon is added after the reference; this nicely interfaces with GNU -Emacs @code{next-error} processing. In this default output format, each -white space character, like newline and tab, is merely changed to -exactly one space, with no special attempt to compress consecutive -spaces. This might change in the future. Except for those white space -characters, every other character of the underlying set of 256 -characters is transmitted verbatim. - -Output format is further controlled by the following options. - -@table @code - -@item -g @var{number} -@itemx --gap-size=@var{number} - -Select the size of the minimum white gap between the fields on the output -line. - -@item -w @var{number} -@itemx --width=@var{number} - -Select the output maximum width of each final line. If references are -used, they are included or excluded from the output maximum width -depending on the value of option @code{-R}. If this option is not -selected, that is, when references are output before the left context, -the output maximum width takes into account the maximum length of all -references. If this options is selected, that is, when references are -output after the right context, the output maximum width does not take -into account the space taken by references, nor the gap that precedes -them. - -@item -A -@itemx --auto-reference - -Select automatic references. Each input line will have an automatic -reference made up of the file name and the line ordinal, with a single -colon between them. However, the file name will be empty when standard -input is being read. If both @code{-A} and @code{-r} are selected, then -the input reference is still read and skipped, but the automatic -reference is used at output time, overriding the input reference. - -@item -R -@itemx --right-side-refs - -In default output format, when option @code{-R} is not used, any -reference produced by the effect of options @code{-r} or @code{-A} are -given to the far right of output lines, after the right context. In -default output format, when option @code{-R} is specified, references -are rather given to the beginning of each output line, before the left -context. For any other output format, option @code{-R} is almost -ignored, except for the fact that the width of references is @emph{not} -taken into account in total output width given by @code{-w} whenever -@code{-R} is selected. - -This option is automatically selected whenever GNU extensions are -disabled. - -@item -F @var{string} -@itemx --flac-truncation=@var{string} - -This option will request that any truncation in the output be reported -using the string @var{string}. Most output fields theoretically extend -towards the beginning or the end of the current line, or current -sentence, as selected with option @code{-S}. But there is a maximum -allowed output line width, changeable through option @code{-w}, which is -further divided into space for various output fields. When a field has -to be truncated because cannot extend until the beginning or the end of -the current line to fit in the, then a truncation occurs. By default, -the string used is a single slash, as in @code{-F /}. - -@var{string} may have more than one character, as in @code{-F ...}. -Also, in the particular case @var{string} is empty (@code{-F ""}), -truncation flagging is disabled, and no truncation marks are appended in -this case. - -As a matter of convenience to the user, many usual backslashed escape -sequences, as found in the C language, are recognized and converted to -the corresponding characters by @code{ptx} itself. - -@item -M @var{string} -@itemx --macro-name=@var{string} - -Select another @var{string} to be used instead of @samp{xx}, while -generating output suitable for @code{nroff}, @code{troff} or @TeX{}. - -@item -O -@itemx --format=roff - -Choose an output format suitable for @code{nroff} or @code{troff} -processing. Each output line will look like: - -@example -.xx "@var{tail}" "@var{before}" "@var{keyword_and_after}" "@var{head}" "@var{ref}" -@end example - -so it will be possible to write an @samp{.xx} roff macro to take care of -the output typesetting. This is the default output format when GNU -extensions are disabled. Option @samp{-M} might be used to change -@samp{xx} to another macro name. - -In this output format, each non-graphical character, like newline and -tab, is merely changed to exactly one space, with no special attempt to -compress consecutive spaces. Each quote character: @kbd{"} is doubled -so it will be correctly processed by @code{nroff} or @code{troff}. - -@item -T -@itemx --format=tex - -Choose an output format suitable for @TeX{} processing. Each output -line will look like: - -@example -\xx @{@var{tail}@}@{@var{before}@}@{@var{keyword}@}@{@var{after}@}@{@var{head}@}@{@var{ref}@} -@end example - -@noindent -so it will be possible to write write a @code{\xx} definition to take -care of the output typesetting. Note that when references are not being -produced, that is, neither option @code{-A} nor option @code{-r} is -selected, the last parameter of each @code{\xx} call is inhibited. -Option @samp{-M} might be used to change @samp{xx} to another macro -name. - -In this output format, some special characters, like @kbd{$}, @kbd{%}, -@kbd{&}, @kbd{#} and @kbd{_} are automatically protected with a -backslash. Curly brackets @kbd{@{}, @kbd{@}} are also protected with a -backslash, but also enclosed in a pair of dollar signs to force -mathematical mode. The backslash itself produces the sequence -@code{\backslash@{@}}. Circumflex and tilde diacritics produce the -sequence @code{^\@{ @}} and @code{~\@{ @}} respectively. Other -diacriticized characters of the underlying character set produce an -appropriate @TeX{} sequence as far as possible. The other non-graphical -characters, like newline and tab, and all others characters which are -not part of ASCII, are merely changed to exactly one space, with no -special attempt to compress consecutive spaces. Let me know how to -improve this special character processing for @TeX{}. - -@end table - -@node Compatibility, , Invoking ptx, Top -@chapter The GNU extensions to @code{ptx} - -This version of @code{ptx} contains a few features which do not exist in -System V @code{ptx}. These extra features are suppressed by using the -@samp{-G} command line option, unless overridden by other command line -options. Some GNU extensions cannot be recovered by overriding, so the -simple rule is to avoid @samp{-G} if you care about GNU extensions. -Here are the differences between this program and System V @code{ptx}. - -@itemize @bullet - -@item -This program can read many input files at once, it always writes the -resulting concordance on standard output. On the other end, System V -@code{ptx} reads only one file and produce the result on standard output -or, if a second @var{file} parameter is given on the command, to that -@var{file}. - -Having output parameters not introduced by options is a quite dangerous -practice which GNU avoids as far as possible. So, for using @code{ptx} -portably between GNU and System V, you should pay attention to always -use it with a single input file, and always expect the result on -standard output. You might also want to automatically configure in a -@samp{-G} option to @code{ptx} calls in products using @code{ptx}, if -the configurator finds that the installed @code{ptx} accepts @samp{-G}. - -@item -The only options available in System V @code{ptx} are options @samp{-b}, -@samp{-f}, @samp{-g}, @samp{-i}, @samp{-o}, @samp{-r}, @samp{-t} and -@samp{-w}. All other options are GNU extensions and are not repeated in -this enumeration. Moreover, some options have a slightly different -meaning when GNU extensions are enabled, as explained below. - -@item -By default, concordance output is not formatted for @code{troff} or -@code{nroff}. It is rather formatted for a dumb terminal. @code{troff} -or @code{nroff} output may still be selected through option @code{-O}. - -@item -Unless @code{-R} option is used, the maximum reference width is -subtracted from the total output line width. With GNU extensions -disabled, width of references is not taken into account in the output -line width computations. - -@item -All 256 characters, even @kbd{NUL}s, are always read and processed from -input file with no adverse effect, even if GNU extensions are disabled. -However, System V @code{ptx} does not accept 8-bit characters, a few -control characters are rejected, and the tilda @kbd{~} is condemned. - -@item -Input line length is only limited by available memory, even if GNU -extensions are disabled. However, System V @code{ptx} processes only -the first 200 characters in each line. - -@item -The break (non-word) characters default to be every character except all -letters of the underlying character set, diacriticized or not. When GNU -extensions are disabled, the break characters default to space, tab and -newline only. - -@item -The program makes better use of output line width. If GNU extensions -are disabled, the program rather tries to imitate System V @code{ptx}, -but still, there are some slight disposition glitches this program does -not completely reproduce. - -@item -The user can specify both an Ignore file and an Only file. This is not -allowed with System V @code{ptx}. - -@end itemize - -@bye diff --git a/gnu/usr.bin/tar/regex.h b/gnu/usr.bin/tar/regex.h deleted file mode 100644 index 0840861da369..000000000000 --- a/gnu/usr.bin/tar/regex.h +++ /dev/null @@ -1,490 +0,0 @@ -/* Definitions for data structures and routines for the regular - expression library, version 0.11. - - Copyright (C) 1985, 89, 90, 91, 92 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef __REGEXP_LIBRARY_H__ -#define __REGEXP_LIBRARY_H__ - -/* POSIX says that <sys/types.h> must be included (by the caller) before - <regex.h>. */ - -#ifdef VMS -/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it - should be there. */ -#include <stddef.h> -#endif - - -/* The following bits are used to determine the regexp syntax we - recognize. The set/not-set meanings are chosen so that Emacs syntax - remains the value 0. The bits are given in alphabetical order, and - the definitions shifted by one from the previous bit; thus, when we - add or remove a bit, only one other definition need change. */ -typedef unsigned reg_syntax_t; - -/* If this bit is not set, then \ inside a bracket expression is literal. - If set, then such a \ quotes the following character. */ -#define RE_BACKSLASH_ESCAPE_IN_LISTS (1) - -/* If this bit is not set, then + and ? are operators, and \+ and \? are - literals. - If set, then \+ and \? are operators and + and ? are literals. */ -#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1) - -/* If this bit is set, then character classes are supported. They are: - [:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:], - [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:]. - If not set, then character classes are not supported. */ -#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1) - -/* If this bit is set, then ^ and $ are always anchors (outside bracket - expressions, of course). - If this bit is not set, then it depends: - ^ is an anchor if it is at the beginning of a regular - expression or after an open-group or an alternation operator; - $ is an anchor if it is at the end of a regular expression, or - before a close-group or an alternation operator. - - This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because - POSIX draft 11.2 says that * etc. in leading positions is undefined. - We already implemented a previous draft which made those constructs - invalid, though, so we haven't changed the code back. */ -#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1) - -/* If this bit is set, then special characters are always special - regardless of where they are in the pattern. - If this bit is not set, then special characters are special only in - some contexts; otherwise they are ordinary. Specifically, - * + ? and intervals are only special when not after the beginning, - open-group, or alternation operator. */ -#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1) - -/* If this bit is set, then *, +, ?, and { cannot be first in an re or - immediately after an alternation or begin-group operator. */ -#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1) - -/* If this bit is set, then . matches newline. - If not set, then it doesn't. */ -#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1) - -/* If this bit is set, then . doesn't match NUL. - If not set, then it does. */ -#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1) - -/* If this bit is set, nonmatching lists [^...] do not match newline. - If not set, they do. */ -#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1) - -/* If this bit is set, either \{...\} or {...} defines an - interval, depending on RE_NO_BK_BRACES. - If not set, \{, \}, {, and } are literals. */ -#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1) - -/* If this bit is set, +, ? and | aren't recognized as operators. - If not set, they are. */ -#define RE_LIMITED_OPS (RE_INTERVALS << 1) - -/* If this bit is set, newline is an alternation operator. - If not set, newline is literal. */ -#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1) - -/* If this bit is set, then `{...}' defines an interval, and \{ and \} - are literals. - If not set, then `\{...\}' defines an interval. */ -#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1) - -/* If this bit is set, (...) defines a group, and \( and \) are literals. - If not set, \(...\) defines a group, and ( and ) are literals. */ -#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1) - -/* If this bit is set, then \<digit> matches <digit>. - If not set, then \<digit> is a back-reference. */ -#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1) - -/* If this bit is set, then | is an alternation operator, and \| is literal. - If not set, then \| is an alternation operator, and | is literal. */ -#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1) - -/* If this bit is set, then an ending range point collating higher - than the starting range point, as in [z-a], is invalid. - If not set, then when ending range point collates higher than the - starting range point, the range is ignored. */ -#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1) - -/* If this bit is set, then an unmatched ) is ordinary. - If not set, then an unmatched ) is invalid. */ -#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1) - -/* This global variable defines the particular regexp syntax to use (for - some interfaces). When a regexp is compiled, the syntax used is - stored in the pattern buffer, so changing this does not affect - already-compiled regexps. */ -extern reg_syntax_t re_syntax_options; - -/* Define combinations of the above bits for the standard possibilities. - (The [[[ comments delimit what gets put into the Texinfo file, so - don't delete them!) */ -/* [[[begin syntaxes]]] */ -#define RE_SYNTAX_EMACS 0 - -#define RE_SYNTAX_AWK \ - (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \ - | RE_UNMATCHED_RIGHT_PAREN_ORD) - -#define RE_SYNTAX_POSIX_AWK \ - (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS) - -#define RE_SYNTAX_GREP \ - (RE_BK_PLUS_QM | RE_CHAR_CLASSES \ - | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \ - | RE_NEWLINE_ALT) - -#define RE_SYNTAX_EGREP \ - (RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \ - | RE_NEWLINE_ALT | RE_NO_BK_PARENS \ - | RE_NO_BK_VBAR) - -#define RE_SYNTAX_POSIX_EGREP \ - (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES) - -/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */ -#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC - -#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC - -/* Syntax bits common to both basic and extended POSIX regex syntax. */ -#define _RE_SYNTAX_POSIX_COMMON \ - (RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \ - | RE_INTERVALS | RE_NO_EMPTY_RANGES) - -#define RE_SYNTAX_POSIX_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM) - -/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes - RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this - isn't minimal, since other operators, such as \`, aren't disabled. */ -#define RE_SYNTAX_POSIX_MINIMAL_BASIC \ - (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS) - -#define RE_SYNTAX_POSIX_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_VBAR \ - | RE_UNMATCHED_RIGHT_PAREN_ORD) - -/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS - replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */ -#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \ - (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \ - | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \ - | RE_NO_BK_PARENS | RE_NO_BK_REFS \ - | RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD) -/* [[[end syntaxes]]] */ - -/* Maximum number of duplicates an interval can allow. Some systems - (erroneously) define this in other header files, but we want our - value, so remove any previous define. */ -#ifdef RE_DUP_MAX -#undef RE_DUP_MAX -#endif -#define RE_DUP_MAX ((1 << 15) - 1) - - -/* POSIX `cflags' bits (i.e., information for `regcomp'). */ - -/* If this bit is set, then use extended regular expression syntax. - If not set, then use basic regular expression syntax. */ -#define REG_EXTENDED 1 - -/* If this bit is set, then ignore case when matching. - If not set, then case is significant. */ -#define REG_ICASE (REG_EXTENDED << 1) - -/* If this bit is set, then anchors do not match at newline - characters in the string. - If not set, then anchors do match at newlines. */ -#define REG_NEWLINE (REG_ICASE << 1) - -/* If this bit is set, then report only success or fail in regexec. - If not set, then returns differ between not matching and errors. */ -#define REG_NOSUB (REG_NEWLINE << 1) - - -/* POSIX `eflags' bits (i.e., information for regexec). */ - -/* If this bit is set, then the beginning-of-line operator doesn't match - the beginning of the string (presumably because it's not the - beginning of a line). - If not set, then the beginning-of-line operator does match the - beginning of the string. */ -#define REG_NOTBOL 1 - -/* Like REG_NOTBOL, except for the end-of-line. */ -#define REG_NOTEOL (1 << 1) - - -/* If any error codes are removed, changed, or added, update the - `re_error_msg' table in regex.c. */ -typedef enum -{ - REG_NOERROR = 0, /* Success. */ - REG_NOMATCH, /* Didn't find a match (for regexec). */ - - /* POSIX regcomp return error codes. (In the order listed in the - standard.) */ - REG_BADPAT, /* Invalid pattern. */ - REG_ECOLLATE, /* Not implemented. */ - REG_ECTYPE, /* Invalid character class name. */ - REG_EESCAPE, /* Trailing backslash. */ - REG_ESUBREG, /* Invalid back reference. */ - REG_EBRACK, /* Unmatched left bracket. */ - REG_EPAREN, /* Parenthesis imbalance. */ - REG_EBRACE, /* Unmatched \{. */ - REG_BADBR, /* Invalid contents of \{\}. */ - REG_ERANGE, /* Invalid range end. */ - REG_ESPACE, /* Ran out of memory. */ - REG_BADRPT, /* No preceding re for repetition op. */ - - /* Error codes we've added. */ - REG_EEND, /* Premature end. */ - REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */ - REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */ -} reg_errcode_t; - -/* This data structure represents a compiled pattern. Before calling - the pattern compiler, the fields `buffer', `allocated', `fastmap', - `translate', and `no_sub' can be set. After the pattern has been - compiled, the `re_nsub' field is available. All other fields are - private to the regex routines. */ - -struct re_pattern_buffer -{ -/* [[[begin pattern_buffer]]] */ - /* Space that holds the compiled pattern. It is declared as - `unsigned char *' because its elements are - sometimes used as array indexes. */ - unsigned char *buffer; - - /* Number of bytes to which `buffer' points. */ - unsigned long allocated; - - /* Number of bytes actually used in `buffer'. */ - unsigned long used; - - /* Syntax setting with which the pattern was compiled. */ - reg_syntax_t syntax; - - /* Pointer to a fastmap, if any, otherwise zero. re_search uses - the fastmap, if there is one, to skip over impossible - starting points for matches. */ - char *fastmap; - - /* Either a translate table to apply to all characters before - comparing them, or zero for no translation. The translation - is applied to a pattern when it is compiled and to a string - when it is matched. */ - char *translate; - - /* Number of subexpressions found by the compiler. */ - size_t re_nsub; - - /* Zero if this pattern cannot match the empty string, one else. - Well, in truth it's used only in `re_search_2', to see - whether or not we should use the fastmap, so we don't set - this absolutely perfectly; see `re_compile_fastmap' (the - `duplicate' case). */ - unsigned can_be_null : 1; - - /* If REGS_UNALLOCATED, allocate space in the `regs' structure - for `max (RE_NREGS, re_nsub + 1)' groups. - If REGS_REALLOCATE, reallocate space if necessary. - If REGS_FIXED, use what's there. */ -#define REGS_UNALLOCATED 0 -#define REGS_REALLOCATE 1 -#define REGS_FIXED 2 - unsigned regs_allocated : 2; - - /* Set to zero when `regex_compile' compiles a pattern; set to one - by `re_compile_fastmap' if it updates the fastmap. */ - unsigned fastmap_accurate : 1; - - /* If set, `re_match_2' does not return information about - subexpressions. */ - unsigned no_sub : 1; - - /* If set, a beginning-of-line anchor doesn't match at the - beginning of the string. */ - unsigned not_bol : 1; - - /* Similarly for an end-of-line anchor. */ - unsigned not_eol : 1; - - /* If true, an anchor at a newline matches. */ - unsigned newline_anchor : 1; - -/* [[[end pattern_buffer]]] */ -}; - -typedef struct re_pattern_buffer regex_t; - - -/* search.c (search_buffer) in Emacs needs this one opcode value. It is - defined both in `regex.c' and here. */ -#define RE_EXACTN_VALUE 1 - -/* Type for byte offsets within the string. POSIX mandates this. */ -typedef int regoff_t; - - -/* This is the structure we store register match data in. See - regex.texinfo for a full description of what registers match. */ -struct re_registers -{ - unsigned num_regs; - regoff_t *start; - regoff_t *end; -}; - - -/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer, - `re_match_2' returns information about at least this many registers - the first time a `regs' structure is passed. */ -#ifndef RE_NREGS -#define RE_NREGS 30 -#endif - - -/* POSIX specification for registers. Aside from the different names than - `re_registers', POSIX uses an array of structures, instead of a - structure of arrays. */ -typedef struct -{ - regoff_t rm_so; /* Byte offset from string's start to substring's start. */ - regoff_t rm_eo; /* Byte offset from string's start to substring's end. */ -} regmatch_t; - -/* Declarations for routines. */ - -/* To avoid duplicating every routine declaration -- once with a - prototype (if we are ANSI), and once without (if we aren't) -- we - use the following macro to declare argument types. This - unfortunately clutters up the declarations a bit, but I think it's - worth it. */ - -#if __STDC__ - -#define _RE_ARGS(args) args - -#else /* not __STDC__ */ - -#define _RE_ARGS(args) () - -#endif /* not __STDC__ */ - -/* Sets the current default syntax to SYNTAX, and return the old syntax. - You can also simply assign to the `re_syntax_options' variable. */ -extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax)); - -/* Compile the regular expression PATTERN, with length LENGTH - and syntax given by the global `re_syntax_options', into the buffer - BUFFER. Return NULL if successful, and an error string if not. */ -extern const char *re_compile_pattern - _RE_ARGS ((const char *pattern, int length, - struct re_pattern_buffer *buffer)); - - -/* Compile a fastmap for the compiled pattern in BUFFER; used to - accelerate searches. Return 0 if successful and -2 if was an - internal error. */ -extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer)); - - -/* Search in the string STRING (with length LENGTH) for the pattern - compiled into BUFFER. Start searching at position START, for RANGE - characters. Return the starting position of the match, -1 for no - match, or -2 for an internal error. Also return register - information in REGS (if REGS and BUFFER->no_sub are nonzero). */ -extern int re_search - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, - int length, int start, int range, struct re_registers *regs)); - - -/* Like `re_search', but search in the concatenation of STRING1 and - STRING2. Also, stop searching at index START + STOP. */ -extern int re_search_2 - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, - int length1, const char *string2, int length2, - int start, int range, struct re_registers *regs, int stop)); - - -/* Like `re_search', but return how many characters in STRING the regexp - in BUFFER matched, starting at position START. */ -extern int re_match - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string, - int length, int start, struct re_registers *regs)); - - -/* Relates to `re_match' as `re_search_2' relates to `re_search'. */ -extern int re_match_2 - _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1, - int length1, const char *string2, int length2, - int start, struct re_registers *regs, int stop)); - - -/* Set REGS to hold NUM_REGS registers, storing them in STARTS and - ENDS. Subsequent matches using BUFFER and REGS will use this memory - for recording register information. STARTS and ENDS must be - allocated with malloc, and must each be at least `NUM_REGS * sizeof - (regoff_t)' bytes long. - - If NUM_REGS == 0, then subsequent matches should allocate their own - register data. - - Unless this function is called, the first search or match using - PATTERN_BUFFER will allocate its own register data, without - freeing the old data. */ -extern void re_set_registers - _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs, - unsigned num_regs, regoff_t *starts, regoff_t *ends)); - -/* 4.2 bsd compatibility. */ -extern char *re_comp _RE_ARGS ((const char *)); -extern int re_exec _RE_ARGS ((const char *)); - -/* POSIX compatibility. */ -extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags)); -extern int regexec - _RE_ARGS ((const regex_t *preg, const char *string, size_t nmatch, - regmatch_t pmatch[], int eflags)); -extern size_t regerror - _RE_ARGS ((int errcode, const regex_t *preg, char *errbuf, - size_t errbuf_size)); -extern void regfree _RE_ARGS ((regex_t *preg)); - -#endif /* not __REGEXP_LIBRARY_H__ */ - -/* -Local variables: -make-backup-files: t -version-control: t -trim-versions-without-asking: nil -End: -*/ diff --git a/gnu/usr.bin/tar/y.tab.h b/gnu/usr.bin/tar/y.tab.h deleted file mode 100644 index 4a541d2c97f7..000000000000 --- a/gnu/usr.bin/tar/y.tab.h +++ /dev/null @@ -1,18 +0,0 @@ -#define tAGO 257 -#define tDAY 258 -#define tDAYZONE 259 -#define tID 260 -#define tMERIDIAN 261 -#define tMINUTE_UNIT 262 -#define tMONTH 263 -#define tMONTH_UNIT 264 -#define tSEC_UNIT 265 -#define tSNUMBER 266 -#define tUNUMBER 267 -#define tZONE 268 -#define tDST 269 -typedef union { - time_t Number; - enum _MERIDIAN Meridian; -} YYSTYPE; -extern YYSTYPE yylval; diff --git a/gnu/usr.bin/texinfo/info-files/info-stnd.info b/gnu/usr.bin/texinfo/info-files/info-stnd.info deleted file mode 100644 index 31f486a45cb4..000000000000 --- a/gnu/usr.bin/texinfo/info-files/info-stnd.info +++ /dev/null @@ -1,1259 +0,0 @@ -This is Info file info-stnd.info, produced by Makeinfo-1.55 from the -input file info-stnd.texi. - -This file documents GNU Info, a program for viewing the on-line -formatted versions of Texinfo files. This documentation is different -from the documentation for the Info reader that is part of GNU Emacs. -If you do not know how to use Info, but have a working Info reader, you -should read that documentation first. - -Copyright (C) 1992, 1993 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -sections entitled "Copying" and "GNU General Public License" are -included exactly as in the original, and provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation -approved by the Free Software Foundation. - - -File: info-stnd.info, Node: Top, Next: What is Info, Prev: (dir), Up: (dir) - -The GNU Info Program -******************** - -This file documents GNU Info, a program for viewing the on-line -formatted versions of Texinfo files, version 2.9. This documentation -is different from the documentation for the Info reader that is part of -GNU Emacs. - -* Menu: - -* What is Info:: -* Options:: Options you can pass on the command line. -* Cursor Commands:: Commands which move the cursor within a node. -* Scrolling Commands:: Commands for moving the node around - in a window. -* Node Commands:: Commands for selecting a new node. -* Searching Commands:: Commands for searching an Info file. -* Xref Commands:: Commands for selecting cross references. -* Window Commands:: Commands which manipulate multiple windows. -* Printing Nodes:: How to print out the contents of a node. -* Miscellaneous Commands:: A few commands that defy categories. -* Variables:: How to change the default behavior of Info. -* GNU Info Global Index:: Global index containing keystrokes, - command names, variable names, - and general concepts. - - -File: info-stnd.info, Node: What is Info, Next: Options, Prev: Top, Up: Top - -What is Info? -************* - -"Info" is a program which is used to view Info files on an ASCII -terminal. "Info files" are the result of processing Texinfo files with -the program `makeinfo' or with one of the Emacs commands, such as `M-x -texinfo-format-buffer'. Texinfo itself is a documentation system that -uses a single source file to produce both on-line information and -printed output. You can typeset and print the files that you read in -Info. - - -File: info-stnd.info, Node: Options, Next: Cursor Commands, Prev: What is Info, Up: Top - -Command Line Options -******************** - -GNU Info accepts several options to control the initial node being -viewed, and to specify which directories to search for Info files. Here -is a template showing an invocation of GNU Info from the shell: - - info [--OPTION-NAME OPTION-VALUE] MENU-ITEM... - -The following OPTION-NAMES are available when invoking Info from the -shell: - -`--directory DIRECTORY-PATH' -`-d DIRECTORY-PATH' - Add DIRECTORY-PATH to the list of directory paths searched when - Info needs to find a file. You may issue `--directory' multiple - times; once for each directory which contains Info files. - Alternatively, you may specify a value for the environment variable - `INFOPATH'; if `--directory' is not given, the value of `INFOPATH' - is used. The value of `INFOPATH' is a colon separated list of - directory names. If you do not supply `INFOPATH' or - `--directory-path', Info uses a default path. - -`--file FILENAME' -`-f FILENAME' - Specify a particular Info file to visit. By default, Info visits - the file `dir'; if you use this option, Info will start with - `(FILENAME)Top' as the first file and node. - -`--node NODENAME' -`-n NODENAME' - Specify a particular node to visit in the initial file that Info - loads. This is especially useful in conjunction with `--file'(1) - (*note Options-Footnotes::). You may specify `--node' multiple - times; for an interactive Info, each NODENAME is visited in its - own window, for a non-interactive Info (such as when `--output' is - given) each NODENAME is processed sequentially. - -`--output FILENAME' -`-o FILENAME' - Specify FILENAME as the name of a file to which to direct output. - Each node that Info visits will be output to FILENAME instead of - interactively viewed. A value of `-' for FILENAME specifies the - standard output. - -`--subnodes' - This option only has meaning when given in conjunction with - `--output'. It means to recursively output the nodes appearing in - the menus of each node being output. Menu items which resolve to - external Info files are not output, and neither are menu items - which are members of an index. Each node is only output once. - -`--help' -`-h' - Produces a relatively brief description of the available Info - options. - -`--version' - Prints the version information of Info and exits. - -`MENU-ITEM' - Info treats its remaining arguments as the names of menu items. - The first argument is a menu item in the initial node visited, - while the second argument is a menu item in the first argument's - node. You can easily move to the node of your choice by - specifying the menu names which describe the path to that node. - For example, - - info emacs buffers - - first selects the menu item `Emacs' in the node `(dir)Top', and - then selects the menu item `Buffers' in the node `(emacs)Top'. - - -File: info-stnd.info, Node: Options-Footnotes, Up: Options - -(1) Of course, you can specify both the file and node in a `--node' -command; but don't forget to escape the open and close parentheses from -the shell as in: `info --node '(emacs)Buffers'' - - -File: info-stnd.info, Node: Cursor Commands, Next: Scrolling Commands, Prev: Options, Up: Top - -Moving the Cursor -***************** - -Many people find that reading screens of text page by page is made -easier when one is able to indicate particular pieces of text with some -kind of pointing device. Since this is the case, GNU Info (both the -Emacs and standalone versions) have several commands which allow you to -move the cursor about the screen. The notation used in this manual to -describe keystrokes is identical to the notation used within the Emacs -manual, and the GNU Readline manual. *Note Character Conventions: -(emacs)Characters, if you are unfamiliar with the notation. - -The following table lists the basic cursor movement commands in Info. -Each entry consists of the key sequence you should type to execute the -cursor movement, the `M-x'(1) (*note Cursor Commands-Footnotes::) -command name (displayed in parentheses), and a short description of -what the command does. All of the cursor motion commands can take an -"numeric" argument (*note `universal-argument': Miscellaneous -Commands.), to find out how to supply them. With a numeric argument, -the motion commands are simply executed that many times; for example, a -numeric argument of 4 given to `next-line' causes the cursor to move -down 4 lines. With a negative numeric argument, the motion is -reversed; an argument of -4 given to the `next-line' command would -cause the cursor to move *up* 4 lines. - -`C-n' (`next-line') - Move the cursor down to the next line. - -`C-p' (`prev-line') - Move the cursor up to the previous line. - -`C-a' (`beginning-of-line') - Move the cursor to the start of the current line. - -`C-e' (`end-of-line') - Move the cursor to the end of the current line. - -`C-f' (`forward-char') - Move the cursor forward a character. - -`C-b' (`backward-char') - Move the cursor backward a character. - -`M-f' (`forward-word') - Move the cursor forward a word. - -`M-b' (`backward-word') - Move the cursor backward a word. - -`M-<' (`beginning-of-node') -`b' - Move the cursor to the start of the current node. - -`M->' (`end-of-node') - Move the cursor to the end of the current node. - -`M-r' (`move-to-window-line') - Move the cursor to a specific line of the window. Without a - numeric argument, `M-r' moves the cursor to the start of the line - in the center of the window. With a numeric argument of N, `M-r' - moves the cursor to the start of the Nth line in the window. - - -File: info-stnd.info, Node: Cursor Commands-Footnotes, Up: Cursor Commands - -(1) `M-x' is also a command; it invokes `execute-extended-command'. -*Note Executing an extended command: (emacs)M-x, for more detailed -information. - - -File: info-stnd.info, Node: Scrolling Commands, Next: Node Commands, Prev: Cursor Commands, Up: Top - -Moving Text Within a Window -*************************** - -Sometimes you are looking at a screenful of text, and only part of the -current paragraph you are reading is visible on the screen. The -commands detailed in this section are used to shift which part of the -current node is visible on the screen. - -`SPC' (`scroll-forward') -`C-v' - Shift the text in this window up. That is, show more of the node - which is currently below the bottom of the window. With a numeric - argument, show that many more lines at the bottom of the window; a - numeric argument of 4 would shift all of the text in the window up - 4 lines (discarding the top 4 lines), and show you four new lines - at the bottom of the window. Without a numeric argument, SPC - takes the bottom two lines of the window and places them at the - top of the window, redisplaying almost a completely new screenful - of lines. - -`DEL' (`scroll-backward') -`M-v' - Shift the text in this window down. The inverse of - `scroll-forward'. - -The `scroll-forward' and `scroll-backward' commands can also move -forward and backward through the node structure of the file. If you -press SPC while viewing the end of a node, or DEL while viewing the -beginning of a node, what happens is controlled by the variable -`scroll-behavior'. *Note `scroll-behavior': Variables, for more -information. - -`C-l' (`redraw-display') - Redraw the display from scratch, or shift the line containing the - cursor to a specified location. With no numeric argument, `C-l' - clears the screen, and then redraws its entire contents. Given a - numeric argument of N, the line containing the cursor is shifted - so that it is on the Nth line of the window. - -`C-x w' (`toggle-wrap') - Toggles the state of line wrapping in the current window. - Normally, lines which are longer than the screen width "wrap", - i.e., they are continued on the next line. Lines which wrap have - a `\' appearing in the rightmost column of the screen. You can - cause such lines to be terminated at the rightmost column by - changing the state of line wrapping in the window with `C-x w'. - When a line which needs more space than one screen width to - display is displayed, a `$' appears in the rightmost column of the - screen, and the remainder of the line is invisible. - - -File: info-stnd.info, Node: Node Commands, Next: Searching Commands, Prev: Scrolling Commands, Up: Top - -Selecting a New Node -******************** - -This section details the numerous Info commands which select a new node -to view in the current window. - -The most basic node commands are `n', `p', `u', and `l'. - -When you are viewing a node, the top line of the node contains some Info -"pointers" which describe where the next, previous, and up nodes are. -Info uses this line to move about the node structure of the file when -you use the following commands: - -`n' (`next-node') - Select the `Next' node. - -`p' (`prev-node') - Select the `Prev' node. - -`u' (`up-node') - Select the `Up' node. - -You can easily select a node that you have already viewed in this window -by using the `l' command - this name stands for "last", and actually -moves through the list of already visited nodes for this window. `l' -with a negative numeric argument moves forward through the history of -nodes for this window, so you can quickly step between two adjacent (in -viewing history) nodes. - -`l' (`history-node') - Select the most recently selected node in this window. - -Two additional commands make it easy to select the most commonly -selected nodes; they are `t' and `d'. - -`t' (`top-node') - Select the node `Top' in the current Info file. - -`d' (`dir-node') - Select the directory node (i.e., the node `(dir)'). - -Here are some other commands which immediately result in the selection -of a different node in the current window: - -`<' (`first-node') - Selects the first node which appears in this file. This node is - most often `Top', but it does not have to be. - -`>' (`last-node') - Select the last node which appears in this file. - -`]' (`global-next-node') - Move forward or down through node structure. If the node that you - are currently viewing has a `Next' pointer, that node is selected. - Otherwise, if this node has a menu, the first menu item is - selected. If there is no `Next' and no menu, the same process is - tried with the `Up' node of this node. - -`[' (`global-prev-node') - Move backward or up through node structure. If the node that you - are currently viewing has a `Prev' pointer, that node is selected. - Otherwise, if the node has an `Up' pointer, that node is selected, - and if it has a menu, the last item in the menu is selected. - -You can get the same behavior as `global-next-node' and -`global-prev-node' while simply scrolling through the file with SPC and -DEL; *Note `scroll-behavior': Variables, for more information. - -`g' (`goto-node') - Read the name of a node and select it. No completion is done while - reading the node name, since the desired node may reside in a - separate file. The node must be typed exactly as it appears in - the Info file. A file name may be included as with any node - specification, for example - - `g(emacs)Buffers' - - finds the node `Buffers' in the Info file `emacs'. - -`C-x k' (`kill-node') - Kill a node. The node name is prompted for in the echo area, with - a default of the current node. "Killing" a node means that Info - tries hard to forget about it, removing it from the list of - history nodes kept for the window where that node is found. - Another node is selected in the window which contained the killed - node. - -`C-x C-f' (`view-file') - Read the name of a file and selects the entire file. The command - `C-x C-f FILENAME' - is equivalent to typing - `g(FILENAME)*' - -`C-x C-b' (`list-visited-nodes') - Make a window containing a menu of all of the currently visited - nodes. This window becomes the selected window, and you may use - the standard Info commands within it. - -`C-x b' (`select-visited-node') - Select a node which has been previously visited in a visible - window. This is similar to `C-x C-b' followed by `m', but no - window is created. - - -File: info-stnd.info, Node: Searching Commands, Next: Xref Commands, Prev: Node Commands, Up: Top - -Searching an Info File -********************** - -GNU Info allows you to search for a sequence of characters throughout an -entire Info file, search through the indices of an Info file, or find -areas within an Info file which discuss a particular topic. - -`s' (`search') - Read a string in the echo area and search for it. - -`C-s' (`isearch-forward') - Interactively search forward through the Info file for a string as - you type it. - -`C-r' (`isearch-backward') - Interactively search backward through the Info file for a string as - you type it. - -`i' (`index-search') - Look up a string in the indices for this Info file, and select a - node where the found index entry points to. - -`,' (`next-index-match') - Move to the node containing the next matching index item from the - last `i' command. - -The most basic searching command is `s' (`search'). The `s' command -prompts you for a string in the echo area, and then searches the -remainder of the Info file for an occurrence of that string. If the -string is found, the node containing it is selected, and the cursor is -left positioned at the start of the found string. Subsequent `s' -commands show you the default search string within `[' and `]'; -pressing RET instead of typing a new string will use the default search -string. - -"Incremental searching" is similar to basic searching, but the string -is looked up while you are typing it, instead of waiting until the -entire search string has been specified. - - -File: info-stnd.info, Node: Xref Commands, Next: Window Commands, Prev: Searching Commands, Up: Top - -Selecting Cross References -************************** - -We have already discussed the `Next', `Prev', and `Up' pointers which -appear at the top of a node. In addition to these pointers, a node may -contain other pointers which refer you to a different node, perhaps in -another Info file. Such pointers are called "cross references", or -"xrefs" for short. - -* Menu: - -* Parts of an Xref:: What a cross reference is made of. -* Selecting Xrefs:: Commands for selecting menu or note items. - - -File: info-stnd.info, Node: Parts of an Xref, Next: Selecting Xrefs, Up: Xref Commands - -Parts of an Xref -================ - -Cross references have two major parts: the first part is called the -"label"; it is the name that you can use to refer to the cross -reference, and the second is the "target"; it is the full name of the -node that the cross reference points to. - -The target is separated from the label by a colon `:'; first the label -appears, and then the target. For example, in the sample menu cross -reference below, the single colon separates the label from the target. - - * Foo Label: Foo Target. More information about Foo. - -Note the `.' which ends the name of the target. The `.' is not part of -the target; it serves only to let Info know where the target name ends. - -A shorthand way of specifying references allows two adjacent colons to -stand for a target name which is the same as the label name: - - * Foo Commands:: Commands pertaining to Foo. - -In the above example, the name of the target is the same as the name of -the label, in this case `Foo Commands'. - -You will normally see two types of cross reference while viewing nodes: -"menu" references, and "note" references. Menu references appear -within a node's menu; they begin with a `*' at the beginning of a line, -and continue with a label, a target, and a comment which describes what -the contents of the node pointed to contains. - -Note references appear within the body of the node text; they begin with -`*Note', and continue with a label and a target. - -Like `Next', `Prev', and `Up' pointers, cross references can point to -any valid node. They are used to refer you to a place where more -detailed information can be found on a particular subject. Here is a -cross reference which points to a node within the Texinfo -documentation: *Note Writing an Xref: (texinfo)xref, for more -information on creating your own texinfo cross references. - - -File: info-stnd.info, Node: Selecting Xrefs, Prev: Parts of an Xref, Up: Xref Commands - -Selecting Xrefs -=============== - -The following table lists the Info commands which operate on menu items. - -`1' (`menu-digit') -`2' ... `9' - Within an Info window, pressing a single digit, (such as `1'), - selects that menu item, and places its node in the current window. - For convenience, there is one exception; pressing `0' selects the - *last* item in the node's menu. - -`0' (`last-menu-item') - Select the last item in the current node's menu. - -`m' (`menu-item') - Reads the name of a menu item in the echo area and selects its - node. Completion is available while reading the menu label. - -`M-x find-menu' - Move the cursor to the start of this node's menu. - -This table lists the Info commands which operate on note cross -references. - -`f' (`xref-item') -`r' - Reads the name of a note cross reference in the echo area and - selects its node. Completion is available while reading the cross - reference label. - -Finally, the next few commands operate on menu or note references alike: - -`TAB' (`move-to-next-xref') - Move the cursor to the start of the next nearest menu item or note - reference in this node. You can then use RET - (`select-reference-this-line') to select the menu or note - reference. - -`M-TAB' (`move-to-prev-xref') - Move the cursor the start of the nearest previous menu item or note - reference in this node. - -`RET' (`select-reference-this-line') - Select the menu item or note reference appearing on this line. - - -File: info-stnd.info, Node: Window Commands, Next: Printing Nodes, Prev: Xref Commands, Up: Top - -Manipulating Multiple Windows -***************************** - -A "window" is a place to show the text of a node. Windows have a view -area where the text of the node is displayed, and an associated "mode -line", which briefly describes the node being viewed. - -GNU Info supports multiple windows appearing in a single screen; each -window is separated from the next by its modeline. At any time, there -is only one "active" window, that is, the window in which the cursor -appears. There are commands available for creating windows, changing -the size of windows, selecting which window is active, and for deleting -windows. - -* Menu: - -* The Mode Line:: What appears in the mode line? -* Basic Windows:: Manipulating windows in Info. -* The Echo Area:: Used for displaying errors and reading input. - - -File: info-stnd.info, Node: The Mode Line, Next: Basic Windows, Up: Window Commands - -The Mode Line -============= - -A "mode line" is a line of inverse video which appears at the bottom of -an Info window. It describes the contents of the window just above it; -this information includes the name of the file and node appearing in -that window, the number of screen lines it takes to display the node, -and the percentage of text that is above the top of the window. It can -also tell you if the indirect tags table for this Info file needs to be -updated, and whether or not the Info file was compressed when stored on -disk. - -Here is a sample mode line for a window containing an uncompressed file -named `dir', showing the node `Top'. - - -----Info: (dir)Top, 40 lines --Top--------------------------------------- - ^^ ^ ^^^ ^^ - (file)Node #lines where - -When a node comes from a file which is compressed on disk, this is -indicated in the mode line with two small `z''s. In addition, if the -Info file containing the node has been split into subfiles, the name of -the subfile containing the node appears in the modeline as well: - - --zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z--------------- - -When Info makes a node internally, such that there is no corresponding -info file on disk, the name of the node is surrounded by asterisks -(`*'). The name itself tells you what the contents of the window are; -the sample mode line below shows an internally constructed node showing -possible completions: - - -----Info: *Completions*, 7 lines --All----------------------------------- - - -File: info-stnd.info, Node: Basic Windows, Next: The Echo Area, Prev: The Mode Line, Up: Window Commands - -Window Commands -=============== - -It can be convenient to view more than one node at a time. To allow -this, Info can display more than one "window". Each window has its own -mode line (*note The Mode Line::.) and history of nodes viewed in that -window (*note `history-node': Node Commands.). - -`C-x o' (`next-window') - Select the next window on the screen. Note that the echo area can - only be selected if it is already in use, and you have left it - temporarily. Normally, `C-x o' simply moves the cursor into the - next window on the screen, or if you are already within the last - window, into the first window on the screen. Given a numeric - argument, `C-x o' moves over that many windows. A negative - argument causes `C-x o' to select the previous window on the - screen. - -`M-x prev-window' - Select the previous window on the screen. This is identical to - `C-x o' with a negative argument. - -`C-x 2' (`split-window') - Split the current window into two windows, both showing the same - node. Each window is one half the size of the original window, - and the cursor remains in the original window. The variable - `automatic-tiling' can cause all of the windows on the screen to - be resized for you automatically, please *note automatic-tiling: - Variables. for more information. - -`C-x 0' (`delete-window') - Delete the current window from the screen. If you have made too - many windows and your screen appears cluttered, this is the way to - get rid of some of them. - -`C-x 1' (`keep-one-window') - Delete all of the windows excepting the current one. - -`ESC C-v' (`scroll-other-window') - Scroll the other window, in the same fashion that `C-v' might - scroll the current window. Given a negative argument, scroll the - "other" window backward. - -`C-x ^' (`grow-window') - Grow (or shrink) the current window. Given a numeric argument, - grow the current window that many lines; with a negative numeric - argument, shrink the window instead. - -`C-x t' (`tile-windows') - Divide the available screen space among all of the visible windows. - Each window is given an equal portion of the screen in which to - display its contents. The variable `automatic-tiling' can cause - `tile-windows' to be called when a window is created or deleted. - *Note `automatic-tiling': Variables. - - -File: info-stnd.info, Node: The Echo Area, Prev: Basic Windows, Up: Window Commands - -The Echo Area -============= - -The "echo area" is a one line window which appears at the bottom of the -screen. It is used to display informative or error messages, and to -read lines of input from you when that is necessary. Almost all of the -commands available in the echo area are identical to their Emacs -counterparts, so please refer to that documentation for greater depth of -discussion on the concepts of editing a line of text. The following -table briefly lists the commands that are available while input is being -read in the echo area: - -`C-f' (`echo-area-forward') - Move forward a character. - -`C-b' (`echo-area-backward') - Move backward a character. - -`C-a' (`echo-area-beg-of-line') - Move to the start of the input line. - -`C-e' (`echo-area-end-of-line') - Move to the end of the input line. - -`M-f' (`echo-area-forward-word') - Move forward a word. - -`M-b' (`echo-area-backward-word') - Move backward a word. - -`C-d' (`echo-area-delete') - Delete the character under the cursor. - -`DEL' (`echo-area-rubout') - Delete the character behind the cursor. - -`C-g' (`echo-area-abort') - Cancel or quit the current operation. If completion is being read, - `C-g' discards the text of the input line which does not match any - completion. If the input line is empty, `C-g' aborts the calling - function. - -`RET' (`echo-area-newline') - Accept (or forces completion of) the current input line. - -`C-q' (`echo-area-quoted-insert') - Insert the next character verbatim. This is how you can insert - control characters into a search string, for example. - -PRINTING CHARACTER (`echo-area-insert') - Insert the character. - -`M-TAB' (`echo-area-tab-insert') - Insert a TAB character. - -`C-t' (`echo-area-transpose-chars') - Transpose the characters at the cursor. - -The next group of commands deal with "killing", and "yanking" text. -For an in depth discussion of killing and yanking, *note Killing and -Deleting: (emacs)Killing. - -`M-d' (`echo-area-kill-word') - Kill the word following the cursor. - -`M-DEL' (`echo-area-backward-kill-word') - Kill the word preceding the cursor. - -`C-k' (`echo-area-kill-line') - Kill the text from the cursor to the end of the line. - -`C-x DEL' (`echo-area-backward-kill-line') - Kill the text from the cursor to the beginning of the line. - -`C-y' (`echo-area-yank') - Yank back the contents of the last kill. - -`M-y' (`echo-area-yank-pop') - Yank back a previous kill, removing the last yanked text first. - -Sometimes when reading input in the echo area, the command that needed -input will only accept one of a list of several choices. The choices -represent the "possible completions", and you must respond with one of -them. Since there are a limited number of responses you can make, Info -allows you to abbreviate what you type, only typing as much of the -response as is necessary to uniquely identify it. In addition, you can -request Info to fill in as much of the response as is possible; this is -called "completion". - -The following commands are available when completing in the echo area: - -`TAB' (`echo-area-complete') -`SPC' - Insert as much of a completion as is possible. - -`?' (`echo-area-possible-completions') - Display a window containing a list of the possible completions of - what you have typed so far. For example, if the available choices - are: - - bar - foliate - food - forget - - and you have typed an `f', followed by `?', the possible - completions would contain: - - foliate - food - forget - - i.e., all of the choices which begin with `f'. Pressing SPC or - TAB would result in `fo' appearing in the echo area, since all of - the choices which begin with `f' continue with `o'. Now, typing - `l' followed by `TAB' results in `foliate' appearing in the echo - area, since that is the only choice which begins with `fol'. - -`ESC C-v' (`echo-area-scroll-completions-window') - Scroll the completions window, if that is visible, or the "other" - window if not. - - -File: info-stnd.info, Node: Printing Nodes, Next: Miscellaneous Commands, Prev: Window Commands, Up: Top - -Printing Out Nodes -****************** - -You may wish to print out the contents of a node as a quick reference -document for later use. Info provides you with a command for doing -this. In general, we recommend that you use TeX to format the document -and print sections of it, by running `tex' on the Texinfo source file. - -`M-x print-node' - Pipe the contents of the current node through the command in the - environment variable `INFO_PRINT_COMMAND'. If the variable does - not exist, the node is simply piped to `lpr'. - - -File: info-stnd.info, Node: Miscellaneous Commands, Next: Variables, Prev: Printing Nodes, Up: Top - -Miscellaneous Commands -********************** - -GNU Info contains several commands which self-document GNU Info: - -`M-x describe-command' - Read the name of an Info command in the echo area and then display - a brief description of what that command does. - -`M-x describe-key' - Read a key sequence in the echo area, and then display the name and - documentation of the Info command that the key sequence invokes. - -`M-x describe-variable' - Read the name of a variable in the echo area and then display a - brief description of what the variable affects. - -`M-x where-is' - Read the name of an Info command in the echo area, and then display - a key sequence which can be typed in order to invoke that command. - -`C-h' (`get-help-window') -`?' - Create (or Move into) the window displaying `*Help*', and place a - node containing a quick reference card into it. This window - displays the most concise information about GNU Info available. - -`h' (`get-info-help-node') - Try hard to visit the node `(info)Help'. The Info file - `info.texi' distributed with GNU Info contains this node. Of - course, the file must first be processed with `makeinfo', and then - placed into the location of your Info directory. - -Here are the commands for creating a numeric argument: - -`C-u' (`universal-argument') - Start (or multiply by 4) the current numeric argument. `C-u' is a - good way to give a small numeric argument to cursor movement or - scrolling commands; `C-u C-v' scrolls the screen 4 lines, while - `C-u C-u C-n' moves the cursor down 16 lines. - -`M-1' (`add-digit-to-numeric-arg') -`M-2' ... `M-9' - Add the digit value of the invoking key to the current numeric - argument. Once Info is reading a numeric argument, you may just - type the digits of the argument, without the Meta prefix. For - example, you might give `C-l' a numeric argument of 32 by typing: - - `C-u 3 2 C-l' - - or - - `M-3 2 C-l' - -`C-g' is used to abort the reading of a multi-character key sequence, -to cancel lengthy operations (such as multi-file searches) and to -cancel reading input in the echo area. - -`C-g' (`abort-key') - Cancel current operation. - -The `q' command of Info simply quits running Info. - -`q' (`quit') - Exit GNU Info. - -If the operating system tells GNU Info that the screen is 60 lines tall, -and it is actually only 40 lines tall, here is a way to tell Info that -the operating system is correct. - -`M-x set-screen-height' - Read a height value in the echo area and set the height of the - displayed screen to that value. - -Finally, Info provides a convenient way to display footnotes which might -be associated with the current node that you are viewing: - -`ESC C-f' (`show-footnotes') - Show the footnotes (if any) associated with the current node in - another window. You can have Info automatically display the - footnotes associated with a node when the node is selected by - setting the variable `automatic-footnotes'. *Note - `automatic-footnotes': Variables. - - -File: info-stnd.info, Node: Variables, Next: GNU Info Global Index, Prev: Miscellaneous Commands, Up: Top - -Manipulating Variables -********************** - -GNU Info contains several "variables" whose values are looked at by -various Info commands. You can change the values of these variables, -and thus change the behavior of Info to more closely match your -environment and Info file reading manner. - -`M-x set-variable' - Read the name of a variable, and the value for it, in the echo - area and then set the variable to that value. Completion is - available when reading the variable name; often, completion is - available when reading the value to give to the variable, but that - depends on the variable itself. If a variable does *not* supply - multiple choices to complete over, it expects a numeric value. - -`M-x describe-variable' - Read the name of a variable in the echo area and then display a - brief description of what the variable affects. - -Here is a list of the variables that you can set in Info. - -`automatic-footnotes' - When set to `On', footnotes appear and disappear automatically. - This variable is `On' by default. When a node is selected, a - window containing the footnotes which appear in that node is - created, and the footnotes are displayed within the new window. - The window that Info creates to contain the footnotes is called - `*Footnotes*'. If a node is selected which contains no footnotes, - and a `*Footnotes*' window is on the screen, the `*Footnotes*' - window is deleted. Footnote windows created in this fashion are - not automatically tiled so that they can use as little of the - display as is possible. - -`automatic-tiling' - When set to `On', creating or deleting a window resizes other - windows. This variable is `Off' by default. Normally, typing - `C-x 2' divides the current window into two equal parts. When - `automatic-tiling' is set to `On', all of the windows are resized - automatically, keeping an equal number of lines visible in each - window. There are exceptions to the automatic tiling; - specifically, the windows `*Completions*' and `*Footnotes*' are - *not* resized through automatic tiling; they remain their original - size. - -`visible-bell' - When set to `On', GNU Info attempts to flash the screen instead of - ringing the bell. This variable is `Off' by default. Of course, - Info can only flash the screen if the terminal allows it; in the - case that the terminal does not allow it, the setting of this - variable has no effect. However, you can make Info perform - quietly by setting the `errors-ring-bell' variable to `Off'. - -`errors-ring-bell' - When set to `On', errors cause the bell to ring. The default - setting of this variable is `On'. - -`gc-compressed-files' - When set to `On', Info garbage collects files which had to be - uncompressed. The default value of this variable is `Off'. - Whenever a node is visited in Info, the Info file containing that - node is read into core, and Info reads information about the tags - and nodes contained in that file. Once the tags information is - read by Info, it is never forgotten. However, the actual text of - the nodes does not need to remain in core unless a particular Info - window needs it. For non-compressed files, the text of the nodes - does not remain in core when it is no longer in use. But - de-compressing a file can be a time consuming operation, and so - Info tries hard not to do it twice. `gc-compressed-files' tells - Info it is okay to garbage collect the text of the nodes of a file - which was compressed on disk. - -`show-index-match' - When set to `On', the portion of the matched search string is - highlighted in the message which explains where the matched search - string was found. The default value of this variable is `On'. - When Info displays the location where an index match was found, - (*note `next-index-match': Searching Commands.), the portion of the - string that you had typed is highlighted by displaying it in the - inverse case from its surrounding characters. - -`scroll-behavior' - Control what happens when forward scrolling is requested at the - end of a node, or when backward scrolling is requested at the - beginning of a node. The default value for this variable is - `Continuous'. There are three possible values for this variable: - - `Continuous' - Try to get the first item in this node's menu, or failing - that, the `Next' node, or failing that, the `Next' of the - `Up'. This behavior is identical to using the `]' - (`global-next-node') and `[' (`global-prev-node') commands. - - `Next Only' - Only try to get the `Next' node. - - `Page Only' - Simply give up, changing nothing. If `scroll-behavior' is - `Page Only', no scrolling command can change the node that is - being viewed. - -`scroll-step' - The number of lines to scroll when the cursor moves out of the - window. Scrolling happens automatically if the cursor has moved - out of the visible portion of the node text when it is time to - display. Usually the scrolling is done so as to put the cursor on - the center line of the current window. However, if the variable - `scroll-step' has a nonzero value, Info attempts to scroll the - node text by that many lines; if that is enough to bring the - cursor back into the window, that is what is done. The default - value of this variable is 0, thus placing the cursor (and the text - it is attached to) in the center of the window. Setting this - variable to 1 causes a kind of "smooth scrolling" which some - people prefer. - -`ISO-Latin' - When set to `On', Info accepts and displays ISO Latin characters. - By default, Info assumes an ASCII character set. `ISO-Latin' tells - Info that it is running in an environment where the European - standard character set is in use, and allows you to input such - characters to Info, as well as display them. - - -File: info-stnd.info, Node: GNU Info Global Index, Prev: Variables, Up: Top - -Global Index -************ - -* Menu: - -* ,: Searching Commands. -* 0, in Info windows: Selecting Xrefs. -* 1 ... 9, in Info windows: Selecting Xrefs. -* 1 ... 9, in Info windows: Selecting Xrefs. -* <: Node Commands. -* >: Node Commands. -* ?, in Info windows: Miscellaneous Commands. -* ?, in the echo area: The Echo Area. -* -subnodes, command line option: Options. -* abort-key: Miscellaneous Commands. -* add-digit-to-numeric-arg: Miscellaneous Commands. -* arguments, command line: Options. -* automatic-footnotes: Variables. -* automatic-tiling: Variables. -* b, in Info windows: Cursor Commands. -* backward-char: Cursor Commands. -* backward-word: Cursor Commands. -* beginning-of-line: Cursor Commands. -* beginning-of-node: Cursor Commands. -* C-a, in Info windows: Cursor Commands. -* C-a, in the echo area: The Echo Area. -* C-b, in Info windows: Cursor Commands. -* C-b, in the echo area: The Echo Area. -* C-d, in the echo area: The Echo Area. -* C-e, in Info windows: Cursor Commands. -* C-e, in the echo area: The Echo Area. -* C-f, in Info windows: Cursor Commands. -* C-f, in the echo area: The Echo Area. -* C-g, in Info windows: Miscellaneous Commands. -* C-g, in the echo area: The Echo Area. -* C-h: Miscellaneous Commands. -* C-k, in the echo area: The Echo Area. -* C-l: Scrolling Commands. -* C-n: Cursor Commands. -* C-p: Cursor Commands. -* C-q, in the echo area: The Echo Area. -* C-r: Searching Commands. -* C-s: Searching Commands. -* C-t, in the echo area: The Echo Area. -* C-u: Miscellaneous Commands. -* C-v: Scrolling Commands. -* C-w: Scrolling Commands. -* C-x 0: Basic Windows. -* C-x 1: Basic Windows. -* C-x 2: Basic Windows. -* C-x b: Node Commands. -* C-x C-b: Node Commands. -* C-x C-f: Node Commands. -* C-x DEL, in the echo area: The Echo Area. -* C-x k: Node Commands. -* C-x o: Basic Windows. -* C-x t: Basic Windows. -* C-x ^: Basic Windows. -* C-y, in the echo area: The Echo Area. -* cancelling the current operation: Miscellaneous Commands. -* cancelling typeahead: Miscellaneous Commands. -* command line options: Options. -* commands, describing: Miscellaneous Commands. -* cursor, moving: Cursor Commands. -* d: Node Commands. -* DEL, in Info windows: Scrolling Commands. -* DEL, in the echo area: The Echo Area. -* delete-window: Basic Windows. -* describe-command: Miscellaneous Commands. -* describe-key: Miscellaneous Commands. -* describe-variable: Variables. -* dir-node: Node Commands. -* directory path: Options. -* echo area: The Echo Area. -* echo-area-abort: The Echo Area. -* echo-area-backward: The Echo Area. -* echo-area-backward-kill-line: The Echo Area. -* echo-area-backward-kill-word: The Echo Area. -* echo-area-backward-word: The Echo Area. -* echo-area-beg-of-line: The Echo Area. -* echo-area-complete: The Echo Area. -* echo-area-delete: The Echo Area. -* echo-area-end-of-line: The Echo Area. -* echo-area-forward: The Echo Area. -* echo-area-forward-word: The Echo Area. -* echo-area-insert: The Echo Area. -* echo-area-kill-line: The Echo Area. -* echo-area-kill-word: The Echo Area. -* echo-area-newline: The Echo Area. -* echo-area-possible-completions: The Echo Area. -* echo-area-quoted-insert: The Echo Area. -* echo-area-rubout: The Echo Area. -* echo-area-scroll-completions-window: The Echo Area. -* echo-area-tab-insert: The Echo Area. -* echo-area-transpose-chars: The Echo Area. -* echo-area-yank: The Echo Area. -* echo-area-yank-pop: The Echo Area. -* end-of-line: Cursor Commands. -* end-of-node: Cursor Commands. -* errors-ring-bell: Variables. -* ESC C-f: Miscellaneous Commands. -* ESC C-v, in Info windows: Basic Windows. -* ESC C-v, in the echo area: The Echo Area. -* f: Selecting Xrefs. -* file, outputting to: Options. -* find-menu: Selecting Xrefs. -* first-node: Node Commands. -* footnotes, displaying: Miscellaneous Commands. -* forward-char: Cursor Commands. -* forward-word: Cursor Commands. -* functions, describing: Miscellaneous Commands. -* g: Node Commands. -* gc-compressed-files: Variables. -* get-help-window: Miscellaneous Commands. -* get-info-help-node: Miscellaneous Commands. -* global-next-node: Node Commands. -* global-prev-node: Node Commands. -* goto-node: Node Commands. -* grow-window: Basic Windows. -* h: Miscellaneous Commands. -* history-node: Node Commands. -* i: Searching Commands. -* index-search: Searching Commands. -* Info file, selecting: Options. -* INFO_PRINT_COMMAND, environment variable: Printing Nodes. -* isearch-backward: Searching Commands. -* isearch-forward: Searching Commands. -* ISO Latin characters: Variables. -* ISO-Latin: Variables. -* keep-one-window: Basic Windows. -* keys, describing: Miscellaneous Commands. -* kill-node: Node Commands. -* l: Node Commands. -* last-menu-item: Selecting Xrefs. -* last-node: Node Commands. -* list-visited-nodes: Node Commands. -* m: Selecting Xrefs. -* M-1 ... M-9: Miscellaneous Commands. -* M-<: Cursor Commands. -* M->: Cursor Commands. -* M-b, in Info windows: Cursor Commands. -* M-b, in the echo area: The Echo Area. -* M-d, in the echo area: The Echo Area. -* M-DEL, in the echo area: The Echo Area. -* M-f, in Info windows: Cursor Commands. -* M-f, in the echo area: The Echo Area. -* M-r: Cursor Commands. -* M-TAB, in Info windows: Selecting Xrefs. -* M-TAB, in the echo area: The Echo Area. -* M-v: Scrolling Commands. -* M-y, in the echo area: The Echo Area. -* menu, following: Options. -* menu-digit: Selecting Xrefs. -* menu-item: Selecting Xrefs. -* move-to-next-xref: Selecting Xrefs. -* move-to-prev-xref: Selecting Xrefs. -* move-to-window-line: Cursor Commands. -* n: Node Commands. -* next-index-match: Searching Commands. -* next-line: Cursor Commands. -* next-node: Node Commands. -* next-window: Basic Windows. -* node, selecting: Options. -* nodes, selection of: Node Commands. -* numeric arguments: Miscellaneous Commands. -* outputting to a file: Options. -* p: Node Commands. -* prev-line: Cursor Commands. -* prev-node: Node Commands. -* prev-window: Basic Windows. -* print-node: Printing Nodes. -* printing: Printing Nodes. -* printing characters, in the echo area: The Echo Area. -* q: Miscellaneous Commands. -* quit: Miscellaneous Commands. -* quitting: Miscellaneous Commands. -* r: Selecting Xrefs. -* redraw-display: Scrolling Commands. -* RET, in Info windows: Selecting Xrefs. -* RET, in the echo area: The Echo Area. -* s: Searching Commands. -* screen, changing the height of: Miscellaneous Commands. -* scroll-backward: Scrolling Commands. -* scroll-behavior: Variables. -* scroll-forward: Scrolling Commands. -* scroll-other-window: Basic Windows. -* scroll-step: Variables. -* scrolling: Scrolling Commands. -* scrolling through node structure: Scrolling Commands. -* search: Searching Commands. -* searching: Searching Commands. -* select-reference-this-line: Selecting Xrefs. -* select-visited-node: Node Commands. -* set-screen-height: Miscellaneous Commands. -* set-variable: Variables. -* show-footnotes: Miscellaneous Commands. -* show-index-match: Variables. -* SPC, in Info windows: Scrolling Commands. -* SPC, in the echo area: The Echo Area. -* split-window: Basic Windows. -* t: Node Commands. -* TAB, in Info windows: Selecting Xrefs. -* TAB, in the echo area: The Echo Area. -* tile-windows: Basic Windows. -* tiling: Basic Windows. -* toggle-wrap: Scrolling Commands. -* top-node: Node Commands. -* u: Node Commands. -* universal-argument: Miscellaneous Commands. -* up-node: Node Commands. -* variables, describing: Variables. -* variables, setting: Variables. -* version information: Options. -* view-file: Node Commands. -* visible-bell: Variables. -* where-is: Miscellaneous Commands. -* windows, creating: Basic Windows. -* windows, deleting: Basic Windows. -* windows, manipulating: Window Commands. -* windows, selecting: Basic Windows. -* xref-item: Selecting Xrefs. -* [: Node Commands. -* ]: Node Commands. - - - -Tag Table: -Node: Top1263 -Node: What is Info2593 -Node: Options3127 -Node: Options-Footnotes6157 -Node: Cursor Commands6411 -Node: Cursor Commands-Footnotes8906 -Node: Scrolling Commands9136 -Node: Node Commands11600 -Node: Searching Commands15563 -Node: Xref Commands17151 -Node: Parts of an Xref17766 -Node: Selecting Xrefs19711 -Node: Window Commands21298 -Node: The Mode Line22233 -Node: Basic Windows23872 -Node: The Echo Area26374 -Node: Printing Nodes30531 -Node: Miscellaneous Commands31174 -Node: Variables34345 -Node: GNU Info Global Index40515 - -End Tag Table diff --git a/gnu/usr.bin/texinfo/info-files/info.info b/gnu/usr.bin/texinfo/info-files/info.info deleted file mode 100644 index b6fd8508b832..000000000000 --- a/gnu/usr.bin/texinfo/info-files/info.info +++ /dev/null @@ -1,777 +0,0 @@ -This is Info file info.info, produced by Makeinfo-1.55 from the input -file info.texi. - - This file describes how to use Info, the on-line, menu-driven GNU -documentation system. - - Copyright (C) 1989, 1992 Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: info.info, Node: Top, Next: Getting Started, Prev: (dir), Up: (dir) - -Info: An Introduction -********************* - - Info is a program for reading documentation, which you are using now. - - To learn how to use Info, type the command `h'. It brings you to a -programmed instruction sequence. - - To learn advanced Info commands, type `n' twice. This brings you to -`Info for Experts', skipping over the . `Getting Started' chapter. - -* Menu: - -* Getting Started:: -* Advanced Info:: -* Create an Info File:: - - -File: info.info, Node: Getting Started, Next: Advanced Info, Prev: Top, Up: Top - -Getting Started -*************** - - This first part of the Info manual describes how to get around inside -of Info. The second part of the manual describes various advanced Info -commands, and how to write an Info as distinct from a Texinfo file. -The third part is about how to generate Info files from Texinfo files. - -* Menu: - -* Help-Small-Screen:: Starting Info on a Small Screen -* Help:: How to use Info -* Help-P:: Returning to the Previous node -* Help-^L:: The Space, Rubout, B and ^L commands. -* Help-M:: Menus -* Help-Adv:: Some advanced Info commands -* Help-Q:: Quitting Info - - -File: info.info, Node: Help-Small-Screen, Next: Help, Up: Getting Started - -Starting Info on a Small Screen -=============================== - - Since your terminal has an unusually small number of lines on its -screen, it is necessary to give you special advice at the beginning. - - If you see the text `--All----' at near the bottom right corner of -the screen, it means the entire text you are looking at fits on the -screen. If you see `--Top----' instead, it means that there is more -text below that does not fit. To move forward through the text and see -another screen full, press the Space bar, SPC. To move back up, press -the key labeled `Rubout' or `Delete' or DEL. - - Here are 40 lines of junk, so you can try SPC and DEL and see what -they do. At the end are instructions of what you should do next. - - This is line 17 -This is line 18 -This is line 19 -This is line 20 -This is line 21 -This is line 22 -This is line 23 -This is line 24 -This is line 25 -This is line 26 -This is line 27 -This is line 28 -This is line 29 -This is line 30 -This is line 31 -This is line 32 -This is line 33 -This is line 34 -This is line 35 -This is line 36 -This is line 37 -This is line 38 -This is line 39 -This is line 40 -This is line 41 -This is line 42 -This is line 43 -This is line 44 -This is line 45 -This is line 46 -This is line 47 -This is line 48 -This is line 49 -This is line 50 -This is line 51 -This is line 52 -This is line 53 -This is line 54 -This is line 55 -This is line 56 -If you have managed to get here, go back to the beginning with DEL, and -come back here again, then you understand SPC and DEL. So now type an -`n'--just one character; do not type the quotes and do not type the -Return key, RET, afterward--to get to the normal start of the course. - - -File: info.info, Node: Help, Next: Help-P, Prev: Help-Small-Screen, Up: Getting Started - -How to use Info -=============== - - You are talking to the program Info, for reading documentation. - - Right now you are looking at one "Node" of Information. A node -contains text describing a specific topic at a specific level of -detail. This node's topic is "how to use Info". - - The top line of a node is its "header". This node's header (look at -it now) says that it is the node named `Help' in the file `info'. It -says that the `Next' node after this one is the node called `Help-P'. -An advanced Info command lets you go to any node whose name you know. - - Besides a `Next', a node can have a `Previous' or an `Up'. This -node has a `Previous' but no `Up', as you can see. - - Now it is time to move on to the `Next' node, named `Help-P'. - - >> Type `n' to move there. Type just one character; do not type -the quotes and do not type a RET afterward. - - `>>' in the margin means it is really time to try a command. - - -File: info.info, Node: Help-P, Next: Help-^L, Prev: Help, Up: Getting Started - -Returning to the Previous node -============================== - - This node is called `Help-P'. The `Previous' node, as you see, is -`Help', which is the one you just came from using the `n' command. -Another `n' command now would take you to the next node, `Help-^L'. - - >> But do not do that yet. First, try the `p' command, which takes - you to the `Previous' node. When you get there, you can do an `n' -again to return here. - - This all probably seems insultingly simple so far, but *do not* be -led into skimming. Things will get more complicated soon. Also, do -not try a new command until you are told it is time to. Otherwise, you -may make Info skip past an important warning that was coming up. - - >> Now do an `n' to get to the node `Help-^L' and learn more. - - -File: info.info, Node: Help-^L, Next: Help-M, Prev: Help-P, Up: Getting Started - -The Space, Rubout, B and ^L commands. -===================================== - - This node's header tells you that you are now at node `Help-^L', and -that `p' would get you back to `Help-P'. The node's title is -underlined; it says what the node is about (most nodes have titles). - - This is a big node and it does not all fit on your display screen. -You can tell that there is more that is not visible because you can see -the string `--Top-----' rather than `--All----' near the bottom right -corner of the screen. - - The SPC, DEL and `b' commands exist to allow you to "move around" in -a node that does not all fit on the screen at once. SPC moves forward, -to show what was below the bottom of the screen. DEL moves backward, -to show what was above the top of the screen (there is not anything -above the top until you have typed some spaces). - - >> Now try typing a SPC (afterward, type a DEL to return here). - - When you type the SPC, the two lines that were at the bottom of the -screen appear at the top, followed by more lines. DEL takes the two -lines from the top and moves them to the bottom, *usually*, but if -there are not a full screen's worth of lines above them they may not -make it all the way to the bottom. - - If you type a SPC when there is no more to see, it rings the bell -and otherwise does nothing. The same goes for a DEL when the header of -the node is visible. - - If your screen is ever garbaged, you can tell Info to print it out -again by typing `C-l' (`Control-L', that is--hold down "Control" and -type an L or `l'). - - >> Type `C-l' now. - - To move back to the beginning of the node you are on, you can type a -lot of DELs. You can also type simply `b' for beginning. - - >> Try that now. (I have put in enough verbiage to make sure you are - not on the first screenful now). Then come back, typing SPC -several times. - - You have just learned a considerable number of commands. If you -want to use one but have trouble remembering which, you should type a ? -which prints out a brief list of commands. When you are finished -looking at the list, make it go away by typing a SPC. - - >> Type a ? now. After it finishes, type a SPC. - - (If you are using the standalone Info reader, type `l' to return -here.) - - From now on, you will encounter large nodes without warning, and -will be expected to know how to use SPC and DEL to move around in them -without being told. Since not all terminals have the same size screen, -it would be impossible to warn you anyway. - - >> Now type `n' to see the description of the `m' command. - - -File: info.info, Node: Help-M, Next: Help-Adv, Prev: Help-^L, Up: Getting Started - -Menus -===== - - Menus and the `m' command - - With only the `n' and `p' commands for moving between nodes, nodes -are restricted to a linear sequence. Menus allow a branching -structure. A menu is a list of other nodes you can move to. It is -actually just part of the text of the node formatted specially so that -Info can interpret it. The beginning of a menu is always identified by -a line which starts with `* Menu:'. A node contains a menu if and only -if it has a line in it which starts that way. The only menu you can -use at any moment is the one in the node you are in. To use a menu in -any other node, you must move to that node first. - - After the start of the menu, each line that starts with a `*' -identifies one subtopic. The line usually contains a brief name for -the subtopic (followed by a `:'), the name of the node that talks about -that subtopic, and optionally some further description of the subtopic. -Lines in the menu that do not start with a `*' have no special -meaning--they are only for the human reader's benefit and do not define -additional subtopics. Here is an example: - - * Foo: FOO's Node This tells about FOO - - The subtopic name is Foo, and the node describing it is `FOO's Node'. -The rest of the line is just for the reader's Information. [[ But this -line is not a real menu item, simply because there is no line above it -which starts with `* Menu:'.]] - - When you use a menu to go to another node (in a way that will be -described soon), what you specify is the subtopic name, the first thing -in the menu line. Info uses it to find the menu line, extracts the -node name from it, and goes to that node. The reason that there is -both a subtopic name and a node name is that the node name must be -meaningful to the computer and may therefore have to be ugly looking. -The subtopic name can be chosen just to be convenient for the user to -specify. Often the node name is convenient for the user to specify and -so both it and the subtopic name are the same. There is an -abbreviation for this: - - * Foo:: This tells about FOO - -This means that the subtopic name and node name are the same; they are -both `Foo'. - - >> Now use SPCs to find the menu in this node, then come back to -the front with a `b'. As you see, a menu is actually visible in its -node. If you cannot find a menu in a node by looking at it, then -the node does not have a menu and the `m' command is not available. - - The command to go to one of the subnodes is `m'--but *do not do it -yet!* Before you use `m', you must understand the difference between -commands and arguments. So far, you have learned several commands that -do not need arguments. When you type one, Info processes it and is -instantly ready for another command. The `m' command is different: it -is incomplete without the "name of the subtopic". Once you have typed -`m', Info tries to read the subtopic name. - - Now look for the line containing many dashes near the bottom of the -screen. There is one more line beneath that one, but usually it is -blank If it is empty, Info is ready for a command, such as `n' or `b' -or SPC or `m'. If that line contains text ending in a colon, it mean -Info is trying to read the "argument" to a command. At such times, -commands do not work, because Info tries to use them as the argument. -You must either type the argument and finish the command you started, -or type `Control-g' to cancel the command. When you have done one of -those things, the line becomes blank again. - - The command to go to a subnode via a menu is `m'. After you type -the `m', the line at the bottom of the screen says `Menu item: '. You -must then type the name of the subtopic you want, and end it with a RET. - - You can abbreviate the subtopic name. If the abbreviation is not -unique, the first matching subtopic is chosen. Some menus put the -shortest possible abbreviation for each subtopic name in capital -letters, so you can see how much you need to type. It does not matter -whether you use upper case or lower case when you type the subtopic. -You should not put any spaces at the end, or inside of the item name, -except for one space where a space appears in the item in the menu. - - Here is a menu to give you a chance to practice. - - * Menu: The menu starts here. - - This menu givs you three ways of going to one place, Help-FOO. - - * Foo: Help-FOO. A node you can visit for fun. -* Bar: Help-FOO. Strange! two ways to get to the same place. -* Help-FOO:: And yet another! ->> Now type just an `m' and see what happens: - - Now you are "inside" an `m' command. Commands cannot be used now; -the next thing you will type must be the name of a subtopic. - - You can change your mind about doing the `m' by typing Control-g. - - >> Try that now; notice the bottom line clear. - - >> Then type another `m'. - - >> Now type `BAR' item name. Do not type RET yet. - - While you are typing the item name, you can use the DEL character to -cancel one character at a time if you make a mistake. - - >> Type one to cancel the `R'. You could type another `R' to -replace it. You do not have to, since `BA' is a valid abbreviation. - - >> Now you are ready to go. Type a RET. - - After visiting Help-FOO, you should return here. - - >> Type `n' to see more commands. - - Here is another way to get to Help-FOO, a menu. You can ignore this -if you want, or else try it (but then please come back to here). - -* Menu: - -* Help-FOO:: - - -File: info.info, Node: Help-FOO, Up: Help-M - -The `u' command ---------------- - - Congratulations! This is the node `Help-FOO'. Unlike the other -nodes you have seen, this one has an `Up': `Help-M', the node you just -came from via the `m' command. This is the usual convention--the nodes -you reach from a menu have `Up' nodes that lead back to the menu. -Menus move Down in the tree, and `Up' moves Up. `Previous', on the -other hand, is usually used to "stay on the same level but go backwards" - - You can go back to the node `Help-M' by typing the command `u' for -"Up". That puts you at the *front* of the node--to get back to where -you were reading you have to type some SPCs. - - >> Now type `u' to move back up to `Help-M'. - - -File: info.info, Node: Help-Adv, Next: Help-Q, Prev: Help-M, Up: Getting Started - -Some advanced Info commands -=========================== - - The course is almost over, so please stick with it to the end. - - If you have been moving around to different nodes and wish to -retrace your steps, the `l' command (`l' for "last") will do that, one -node at a time. If you have been following directions, an `l' command -now will get you back to `Help-M'. Another `l' command would undo the -`u' and get you back to `Help-FOO'. Another `l' would undo the `m' and -get you back to `Help-M'. - - >> Try typing three `l''s, pausing in between to see what each -`l' does. - - Then follow directions again and you will end up back here. - - Note the difference between `l' and `p': `l' moves to where *you* -last were, whereas `p' always moves to the node which the header says -is the `Previous' node (from this node, to `Help-M'). - - The `d' command gets you instantly to the Directory node. This -node, which is the first one you saw when you entered Info, has a menu -which leads (directly, or indirectly through other menus), to all the -nodes that exist. - - >> Try doing a `d', then do an `l' to return here (yes, *do* -return). - - Sometimes, in Info documentation, you will see a cross reference. -Cross references look like this: *Note Cross: Help-Cross. That is a -real, live cross reference which is named `Cross' and points at the -node named `Help-Cross'. - - If you wish to follow a cross reference, you must use the `f' -command. The `f' must be followed by the cross reference name (in this -case, `Cross'). You can use DEL to edit the name, and if you change -your mind about following any reference you can use `Control-g' to -cancel the command. - - Completion is available in the `f' command; you can complete among -all the cross reference names in the current node. - - >> Type `f', followed by `Cross', and a RET. - - To get a list of all the cross references in the current node, you -can type `?' after an `f'. The `f' continues to await a cross -reference name even after printing the list, so if you do not actually -want to follow a reference you should type a `Control-g' to cancel the -`f'. - - >> Type "f?" to get a list of the footnotes in this node. Then type -a `Control-g' and see how the `f' gives up. - - >> Now type `n' to see the last node of the course. - - -File: info.info, Node: Help-Cross, Up: Help-Adv - -The node reached by the cross reference in Info ------------------------------------------------ - - This is the node reached by the cross reference named `Cross'. - - While this node is specifically intended to be reached by a cross -reference, most cross references lead to nodes that "belong" someplace -else far away in the structure of Info. So you cannot expect the -footnote to have a `Next', `Previous' or `Up' pointing back to where -you came from. In general, the `l' (el) command is the only way to get -back there. - - >> Type `l' to return to the node where the cross reference was. - - -File: info.info, Node: Help-Q, Prev: Help-Adv, Up: Getting Started - -Quitting Info -============= - - To get out of Info, back to what you were doing before, type `q' for -"Quit". - - This is the end of the course on using Info. There are some other -commands that are not essential or are meant for experienced users; -they are useful, and you can find them by looking in the directory for -documentation on Info. Finding them will be a good exercise in using -Info in the usual manner. - - >> Type `d' to go to the Info directory node; then type `mInfo' -and RET, to get to the node about Info and see what other help is -available. - - -File: info.info, Node: Advanced Info, Next: Create an Info File, Prev: Getting Started, Up: Top - -Info for Experts -**************** - - This chapter describes various advanced Info commands, and how to -write an Info as distinct from a Texinfo file. (However, in most -cases, writing a Texinfo file is better, since you can use it *both* to -generate an Info file and to make a printed manual. *Note Overview of -Texinfo: (texinfo)Top.) - -* Menu: - -* Expert:: Advanced Info commands: g, s, e, and 1 - 5. -* Add:: Describes how to add new nodes to the hierarchy. - Also tells what nodes look like. -* Menus:: How to add to or create menus in Info nodes. -* Cross-refs:: How to add cross-references to Info nodes. -* Tags:: How to make tag tables for Info files. -* Checking:: Checking an Info File - - -File: info.info, Node: Expert, Next: Add, Up: Advanced Info - -Advanced Info Commands -====================== - - `g', `s', `1', - `5', and `e' - - If you know a node's name, you can go there by typing `g', the name, -and RET. Thus, `gTopRET' would go to the node called `Top' in this -file (its directory node). `gExpertRET' would come back here. - - Unlike `m', `g' does not allow the use of abbreviations. - - To go to a node in another file, you can include the filename in the -node name by putting it at the front, in parentheses. Thus, -`g(dir)TopRET' would go to the Info Directory node, which is node `Top' -in the file `dir'. - - The node name `*' specifies the whole file. So you can look at all -of the current file by typing `g*RET' or all of any other file with -`g(FILENAME)RET'. - - The `s' command allows you to search a whole file for a string. It -switches to the next node if and when that is necessary. You type `s' -followed by the string to search for, terminated by RET. To search for -the same string again, just `s' followed by RET will do. The file's -nodes are scanned in the order they are in in the file, which has no -necessary relationship to the order that they may be in in the tree -structure of menus and `next' pointers. But normally the two orders -are not very different. In any case, you can always do a `b' to find -out what node you have reached, if the header is not visible (this can -happen, because `s' puts your cursor at the occurrence of the string, -not at the beginning of the node). - - If you grudge the system each character of type-in it requires, you -might like to use the commands `1', `2', `3', `4', and `5'. They are -short for the `m' command together with an argument. "1", "2", "3", -"4", and "5". `1' goes through the first item in the current node's -menu; `2' goes through the second item, etc. Note that numbers larger -than 5 are not allowed. If the item you want is that far down, you are -better off using an abbreviation for its name than counting. - - The Info command `e' changes from Info mode to an ordinary Emacs -editing mode, so that you can edit the text of the current node. Type -`C-c C-c' to switch back to Info. The `e' command is allowed only if -the variable `Info-enable-edit' is non-`nil'. - - -File: info.info, Node: Add, Next: Menus, Prev: Expert, Up: Advanced Info - -Adding a new node to Info -========================= - - To add a new topic to the list in the directory, you must: - - 1. Create a node, in some file, to document that topic. - - 2. Put that topic in the menu in the directory. *Note Menu: Menus. - - The new node can live in an existing documentation file, or in a new -one. It must have a ^_ character before it (invisible to the user; -this node has one but you cannot see it), and it ends with either a ^_, -a ^L, or the end of file. Note: If you put in a ^L to end a new node, -be sure that there is a ^_ after it to start the next one, since ^L -cannot *start* a node. Also, a nicer way to make a node boundary be a -page boundary as well is to put a ^L *right after* the ^_. - - The ^_ starting a node must be followed by a newline or a ^L -newline, after which comes the node's header line. The header line -must give the node's name (by which Info finds it), and state the names -of the `Next', `Previous', and `Up' nodes (if there are any). As you -can see, this node's `Up' node is the node `Top', which points at all -the documentation for Info. The `Next' node is `Menus'. - - The keywords "Node", "Previous", "Up" and "Next", may appear in any -order, anywhere in the header line, but the recommended order is the -one in this sentence. Each keyword must be followed by a colon, spaces -and tabs, and then the appropriate name. The name may be terminated -with a tab, a comma, or a newline. A space does not end it; node names -may contain spaces. The case of letters in the names is insignificant. - - A node name has two forms. A node in the current file is named by -what appears after the `Node: ' in that node's first line. For -example, this node's name is `Add'. A node in another file is named by -`(FILENAME)NODE-WITHIN-FILE', as in `(info)Add' for this node. If the -file name is relative, it is taken starting from the standard Info file -directory of your site. The name `(FILENAME)Top' can be abbreviated to -just `(FILENAME)'. By convention, the name `Top' is used for the -"highest" node in any single file--the node whose `Up' points out of -the file. The Directory node is `(dir)'. The `Top' node of a document -file listed in the Directory should have an `Up: (dir)' in it. - - The node name `*' is special: it refers to the entire file. Thus, -`g*' shows you the whole current file. The use of the node `*' is to -make it possible to make old-fashioned, unstructured files into nodes -of the tree. - - The `Node:' name, in which a node states its own name, must not -contain a filename, since Info when searching for a node does not -expect one to be there. The `Next', `Previous' and `Up' names may -contain them. In this node, since the `Up' node is in the same file, -it was not necessary to use one. - - Note that the nodes in this file have a file name in the header -line. The file names are ignored by Info, but they serve as comments -to help identify the node for the user. - - -File: info.info, Node: Menus, Next: Cross-refs, Prev: Add, Up: Advanced Info - -How to Create Menus -=================== - - Any node in the Info hierarchy may have a "menu"--a list of subnodes. -The `m' command searches the current node's menu for the topic which it -reads from the terminal. - - A menu begins with a line starting with `* Menu:'. The rest of the -line is a comment. After the starting line, every line that begins -with a `* ' lists a single topic. The name of the topic-the argument -that the user must give to the `m' command to select this topic--comes -right after the star and space, and is followed by a colon, spaces and -tabs, and the name of the node which discusses that topic. The node -name, like node names following `Next', `Previous' and `Up', may be -terminated with a tab, comma, or newline; it may also be terminated -with a period. - - If the node name and topic name are the same, than rather than -giving the name twice, the abbreviation `* NAME::' may be used (and -should be used, whenever possible, as it reduces the visual clutter in -the menu). - - It is considerate to choose the topic names so that they differ from -each other very near the beginning--this allows the user to type short -abbreviations. In a long menu, it is a good idea to capitalize the -beginning of each item name which is the minimum acceptable -abbreviation for it (a long menu is more than 5 or so entries). - - The nodes listed in a node's menu are called its "subnodes", and it -is their "superior". They should each have an `Up:' pointing at the -superior. It is often useful to arrange all or most of the subnodes in -a sequence of `Next' and `Previous' pointers so that someone who wants -to see them all need not keep revisiting the Menu. - - The Info Directory is simply the menu of the node `(dir)Top'--that -is, node `Top' in file `.../info/dir'. You can put new entries in that -menu just like any other menu. The Info Directory is *not* the same as -the file directory called `info'. It happens that many of Info's files -live on that file directory, but they do not have to; and files on that -directory are not automatically listed in the Info Directory node. - - Also, although the Info node graph is claimed to be a "hierarchy", -in fact it can be *any* directed graph. Shared structures and pointer -cycles are perfectly possible, and can be used if they are appropriate -to the meaning to be expressed. There is no need for all the nodes in -a file to form a connected structure. In fact, this file has two -connected components. You are in one of them, which is under the node -`Top'; the other contains the node `Help' which the `h' command goes -to. In fact, since there is no garbage collector, nothing terrible -happens if a substructure is not pointed to, but such a substructure is -rather useless since nobody can ever find out that it exists. - - -File: info.info, Node: Cross-refs, Next: Tags, Prev: Menus, Up: Advanced Info - -Creating Cross References -========================= - - A cross reference can be placed anywhere in the text, unlike a menu -item which must go at the front of a line. A cross reference looks -like a menu item except that it has `*note' instead of `*'. It -*cannot* be terminated by a `)', because `)''s are so often part of -node names. If you wish to enclose a cross reference in parentheses, -terminate it with a period first. Here are two examples of cross -references pointers: - - *Note details: commands. (See *note 3: Full Proof.) - - They are just examples. The places they "lead to" do not really -exist! - - -File: info.info, Node: Tags, Next: Checking, Prev: Cross-refs, Up: Advanced Info - -Tag Tables for Info Files -========================= - - You can speed up the access to nodes of a large Info file by giving -it a tag table. Unlike the tag table for a program, the tag table for -an Info file lives inside the file itself and is used automatically -whenever Info reads in the file. - - To make a tag table, go to a node in the file using Emacs Info mode -and type `M-x Info-tagify'. Then you must use `C-x C-s' to save the -file. - - Once the Info file has a tag table, you must make certain it is up -to date. If, as a result of deletion of text, any node moves back more -than a thousand characters in the file from the position recorded in -the tag table, Info will no longer be able to find that node. To -update the tag table, use the `Info-tagify' command again. - - An Info file tag table appears at the end of the file and looks like -this: - - ^_ - Tag Table: - File: info, Node: Cross-refs^?21419 - File: info, Node: Tags^?22145 - ^_ - End Tag Table - -Note that it contains one line per node, and this line contains the -beginning of the node's header (ending just after the node name), a DEL -character, and the character position in the file of the beginning of -the node. - - -File: info.info, Node: Checking, Prev: Tags, Up: Advanced Info - -Checking an Info File -===================== - - When creating an Info file, it is easy to forget the name of a node -when you are making a pointer to it from another node. If you put in -the wrong name for a node, this is not detected until someone tries to -go through the pointer using Info. Verification of the Info file is an -automatic process which checks all pointers to nodes and reports any -pointers which are invalid. Every `Next', `Previous', and `Up' is -checked, as is every menu item and every cross reference. In addition, -any `Next' which does not have a `Previous' pointing back is reported. -Only pointers within the file are checked, because checking pointers to -other files would be terribly slow. But those are usually few. - - To check an Info file, do `M-x Info-validate' while looking at any -node of the file with Emacs Info mode. - - -File: info.info, Node: Create an Info File, Prev: Advanced Info, Up: Top - -Creating an Info File from a Makeinfo file -****************************************** - - `makeinfo' is a utility that converts a Texinfo file into an Info -file; `texinfo-format-region' and `texinfo-format-buffer' are GNU Emacs -functions that do the same. - - *Note Creating an Info File: (texinfo)Create an Info File, to learn -how to create an Info file from a Texinfo file. - - *Note Overview of Texinfo: (texinfo)Top, to learn how to write a -Texinfo file. - - - -Tag Table: -Node: Top913 -Node: Getting Started1431 -Node: Help-Small-Screen2179 -Node: Help3921 -Node: Help-P4949 -Node: Help-^L5811 -Node: Help-M8462 -Node: Help-FOO14030 -Node: Help-Adv14766 -Node: Help-Cross17148 -Node: Help-Q17794 -Node: Advanced Info18434 -Node: Expert19330 -Node: Add21601 -Node: Menus24635 -Node: Cross-refs27509 -Node: Tags28211 -Node: Checking29510 -Node: Create an Info File30434 - -End Tag Table diff --git a/gnu/usr.bin/texinfo/info-files/makeinfo.info b/gnu/usr.bin/texinfo/info-files/makeinfo.info deleted file mode 100644 index 81dbe14a40fd..000000000000 --- a/gnu/usr.bin/texinfo/info-files/makeinfo.info +++ /dev/null @@ -1,224 +0,0 @@ -This is Info file makeinfo.info, produced by Makeinfo-1.55 from the -input file makeinfo.texi. - -This file is an extract from the `Texinfo' manual. -It documents `makeinfo', a program that converts Texinfo files into -Info files. - -Copyright (C) 1992, 1993 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation -approved by the Free Software Foundation. - - -File: makeinfo.info, Node: Top, Next: What is makeinfo, Prev: (dir), Up: (dir) - -`makeinfo' -********** - -This file documents the use of the `makeinfo' program, versions 1.51 -and later. It is an extract from the `Texinfo' manual. - -* Menu: - -* What is makeinfo:: - - -File: makeinfo.info, Node: What is makeinfo, Prev: Top, Up: Top - -What is `makeinfo'? -******************* - -`makeinfo' is a program for converting "Texinfo" files into "Info" -files. Texinfo is a documentation system that uses a single source -file to produce both on-line information and printed output. - -You can read the on-line information using Info; type `info' to learn -about Info. *Note Texinfo: (texinfo.texi)Top, to learn about the -Texinfo documentation system. - -* Menu: - -* Formatting Control:: -* Options:: -* Pointer Validation:: - - -File: makeinfo.info, Node: Formatting Control, Next: Options, Up: What is makeinfo - -Controlling Paragraph Formats -============================= - -In general, `makeinfo' "fills" the paragraphs that it outputs to an -Info file. Filling is the process of breaking and connecting lines so -that lines are the same length as or shorter than the number specified -as the fill column. Lines are broken between words. With `makeinfo', -you can control: - - * The width of each paragraph (the "fill-column"). - - * The amount of indentation that the first line of each paragraph - receives (the "paragraph-indentation"). - - -File: makeinfo.info, Node: Options, Next: Pointer Validation, Prev: Formatting Control, Up: What is makeinfo - -Command Line Options -==================== - -The following command line options are available for `makeinfo'. - -`-D VAR' - Cause VAR to be defined. This is equivalent to `@set VAR' in the - Texinfo file. - -`--error-limit LIMIT' - Set the maximum number of errors that `makeinfo' will report - before exiting (on the assumption that continuing would be - useless). The default number of errors that can be reported before - `makeinfo' gives up is 100. - -`--fill-column WIDTH' - Specify the maximum number of columns in a line; this is the - right-hand edge of a line. Paragraphs that are filled will be - filled to this width. The default value for `fill-column' is 72. - -`--footnote-style STYLE' - Set the footnote style to STYLE, either `end' for the end node - style or `separate' for the separate node style. The value set by - this option overrides the value set in a Texinfo file by an - `@footnotestyle' command. When the footnote style is `separate', - `makeinfo' makes a new node containing the footnotes found in the - current node. When the footnote style is `end', `makeinfo' places - the footnote references at the end of the current node. - -`-I DIR' - Add `dir' to the directory search list for finding files that are - included using the `@include' command. By default, `makeinfo' - searches only the current directory. - -`--no-headers' - Do not include menus or node lines in the output. This results in - an ASCII file that you cannot read in Info since it does not - contain the requisite nodes or menus; but you can print such a - file in a single, typewriter-like font and produce acceptable - output. - -`--no-split' - Suppress the splitting stage of `makeinfo'. Normally, large - output files (where the size is greater than 70k bytes) are split - into smaller subfiles, each one approximately 50k bytes. If you - specify `--no-split', `makeinfo' will not split up the output file. - -`--no-pointer-validate' -`--no-validate' - Suppress the pointer-validation phase of `makeinfo'. Normally, - after a Texinfo file is processed, some consistency checks are - made to ensure that cross references can be resolved, etc. *Note - Pointer Validation::. - -`--no-warn' - Suppress the output of warning messages. This does *not* suppress - the output of error messages, only warnings. You might want this - if the file you are creating has examples of Texinfo cross - references within it, and the nodes that are referenced do not - actually exist. - -`--no-number-footnotes' - Supress automatic footnote numbering. By default, `makeinfo' - numbers each footnote sequentially in a single node, resetting the - current footnote number to 1 at the start of each node. - -`--output FILE' -`-o FILE' - Specify that the output should be directed to FILE and not to the - file name specified in the `@setfilename' command found in the - Texinfo source. FILE can be the special token `-', which specifies - standard output. - -`--paragraph-indent INDENT' - Set the paragraph indentation style to INDENT. The value set by - this option overrides the value set in a Texinfo file by an - `@paragraphindent' command. The value of INDENT is interpreted as - follows: - - * If the value of INDENT is `asis', do not change the existing - indentation at the starts of paragraphs. - - * If the value of INDENT is zero, delete any existing - indentation. - - * If the value of INDENT is greater than zero, indent each - paragraph by that number of spaces. - -`--reference-limit LIMIT' - Set the value of the number of references to a node that - `makeinfo' will make without reporting a warning. If a node has - more than this number of references in it, `makeinfo' will make the - references but also report a warning. - -`-U VAR' - Cause VAR to be undefined. This is equivalent to `@clear VAR' in - the Texinfo file. - -`--verbose' - Cause `makeinfo' to display messages saying what it is doing. - Normally, `makeinfo' only outputs messages if there are errors or - warnings. - -`--version' - Report the version number of this copy of `makeinfo'. - - -File: makeinfo.info, Node: Pointer Validation, Prev: Options, Up: What is makeinfo - -Pointer Validation -================== - -If you do not suppress pointer-validation (by using the -`--no-pointer-validation' option), `makeinfo' will check the validity -of the final Info file. Mostly, this means ensuring that nodes you -have referenced really exist. Here is a complete list of what is -checked: - - 1. If a `Next', `Previous', or `Up' node reference is a reference to a - node in the current file and is not an external reference such as - to `(dir)', then the referenced node must exist. - - 2. In every node, if the `Previous' node is different from the `Up' - node, then the `Previous' node must also be pointed to by a `Next' - node. - - 3. Every node except the `Top' node must have an `Up' pointer. - - 4. The node referenced by an `Up' pointer must contain a reference to - the current node in some manner other than through a `Next' - reference. This includes menu entries and cross references. - - 5. If the `Next' reference of a node is not the same as the `Next' - reference of the `Up' reference, then the node referenced by the - `Next' pointer must have a `Previous' pointer that points back to - the current node. This rule allows the last node in a section to - point to the first node of the next chapter. - - - -Tag Table: -Node: Top949 -Node: What is makeinfo1215 -Node: Formatting Control1758 -Node: Options2377 -Node: Pointer Validation6743 - -End Tag Table diff --git a/gnu/usr.bin/texinfo/info-files/texi-files/info-stnd.texi b/gnu/usr.bin/texinfo/info-files/texi-files/info-stnd.texi deleted file mode 100644 index 286973b01334..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi-files/info-stnd.texi +++ /dev/null @@ -1,1359 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@comment %**start of header -@setfilename info-stnd.info -@settitle GNU Info -@set InfoProgVer 2.9 -@paragraphindent none -@footnotestyle separate -@synindex vr cp -@synindex fn cp -@synindex ky cp -@comment %**end of header - -@ifinfo -This file documents GNU Info, a program for viewing the on-line formatted -versions of Texinfo files. This documentation is different from the -documentation for the Info reader that is part of GNU Emacs. If you do -not know how to use Info, but have a working Info reader, you should -read that documentation first. - -Copyright @copyright{} 1992, 1993 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries a copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). -@end ignore - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -sections entitled ``Copying'' and ``GNU General Public License'' are -included exactly as in the original, and provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation -approved by the Free Software Foundation. -@end ifinfo - -@titlepage -@title GNU Info User's Guide -@subtitle For GNU Info version @value{InfoProgVer} -@author Brian J. Fox (bfox@@ai.mit.edu) -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1992, 1993 Free Software Foundation - -Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -sections entitled ``Copying'' and ``GNU General Public License'' are -included exactly as in the original, and provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation -approved by the Free Software Foundation. -@end titlepage - -@ifinfo -@node Top, What is Info, (dir), (dir) -@top The GNU Info Program - -This file documents GNU Info, a program for viewing the on-line -formatted versions of Texinfo files, version @value{InfoProgVer}. This -documentation is different from the documentation for the Info reader -that is part of GNU Emacs. -@end ifinfo - -@menu -* What is Info:: -* Options:: Options you can pass on the command line. -* Cursor Commands:: Commands which move the cursor within a node. -* Scrolling Commands:: Commands for moving the node around - in a window. -* Node Commands:: Commands for selecting a new node. -* Searching Commands:: Commands for searching an Info file. -* Xref Commands:: Commands for selecting cross references. -* Window Commands:: Commands which manipulate multiple windows. -* Printing Nodes:: How to print out the contents of a node. -* Miscellaneous Commands:: A few commands that defy categories. -* Variables:: How to change the default behavior of Info. -* GNU Info Global Index:: Global index containing keystrokes, - command names, variable names, - and general concepts. -@end menu - -@node What is Info, Options, Top, Top -@chapter What is Info? - -@iftex -This file documents GNU Info, a program for viewing the on-line formatted -versions of Texinfo files, version @value{InfoProgVer}. -@end iftex - -@dfn{Info} is a program which is used to view Info files on an ASCII -terminal. @dfn{Info files} are the result of processing Texinfo files -with the program @code{makeinfo} or with one of the Emacs commands, such -as @code{M-x texinfo-format-buffer}. Texinfo itself is a documentation -system that uses a single source file to produce both on-line -information and printed output. You can typeset and print the -files that you read in Info.@refill - -@node Options, Cursor Commands, What is Info, Top -@chapter Command Line Options -@cindex command line options -@cindex arguments, command line - -GNU Info accepts several options to control the initial node being -viewed, and to specify which directories to search for Info files. Here -is a template showing an invocation of GNU Info from the shell: - -@example -info [--@var{option-name} @var{option-value}] @var{menu-item}@dots{} -@end example - -The following @var{option-names} are available when invoking Info from -the shell: - -@table @code -@cindex directory path -@item --directory @var{directory-path} -@itemx -d @var{directory-path} -Add @var{directory-path} to the list of directory paths searched when -Info needs to find a file. You may issue @code{--directory} multiple -times; once for each directory which contains Info files. -Alternatively, you may specify a value for the environment variable -@code{INFOPATH}; if @code{--directory} is not given, the value of -@code{INFOPATH} is used. The value of @code{INFOPATH} is a colon -separated list of directory names. If you do not supply @code{INFOPATH} -or @code{--directory-path}, Info uses a default path. - -@item --file @var{filename} -@itemx -f @var{filename} -@cindex Info file, selecting -Specify a particular Info file to visit. By default, Info visits -the file @code{dir}; if you use this option, Info will start with -@code{(@var{filename})Top} as the first file and node. - -@item --node @var{nodename} -@itemx -n @var{nodename} -@cindex node, selecting -Specify a particular node to visit in the initial file that Info -loads. This is especially useful in conjunction with -@code{--file}@footnote{Of course, you can specify both the file and node -in a @code{--node} command; but don't forget to escape the open and -close parentheses from the shell as in: @code{info --node -'(emacs)Buffers'}}. You may specify @code{--node} multiple times; for -an interactive Info, each @var{nodename} is visited in its own window, -for a non-interactive Info (such as when @code{--output} is given) each -@var{nodename} is processed sequentially. - -@item --output @var{filename} -@itemx -o @var{filename} -@cindex file, outputting to -@cindex outputting to a file -Specify @var{filename} as the name of a file to which to direct output. -Each node that Info visits will be output to @var{filename} instead of -interactively viewed. A value of @code{-} for @var{filename} specifies -the standard output. - -@item --subnodes -@cindex @code{--subnodes}, command line option -This option only has meaning when given in conjunction with -@code{--output}. It means to recursively output the nodes appearing in -the menus of each node being output. Menu items which resolve to -external Info files are not output, and neither are menu items which are -members of an index. Each node is only output once. - -@item --help -@itemx -h -Produces a relatively brief description of the available Info options. - -@item --version -@cindex version information -Prints the version information of Info and exits. - -@item @var{menu-item} -@cindex menu, following -Info treats its remaining arguments as the names of menu items. The -first argument is a menu item in the initial node visited, while -the second argument is a menu item in the first argument's node. -You can easily move to the node of your choice by specifying the menu -names which describe the path to that node. For example, - -@example -info emacs buffers -@end example - -@noindent -first selects the menu item @samp{Emacs} in the node @samp{(dir)Top}, -and then selects the menu item @samp{Buffers} in the node -@samp{(emacs)Top}. -@end table - -@node Cursor Commands, Scrolling Commands, Options, Top -@chapter Moving the Cursor -@cindex cursor, moving - -Many people find that reading screens of text page by page is made -easier when one is able to indicate particular pieces of text with some -kind of pointing device. Since this is the case, GNU Info (both the -Emacs and standalone versions) have several commands which allow you to -move the cursor about the screen. The notation used in this manual to -describe keystrokes is identical to the notation used within the Emacs -manual, and the GNU Readline manual. @xref{Characters, , Character -Conventions, emacs, the GNU Emacs Manual}, if you are unfamiliar with the -notation. - -The following table lists the basic cursor movement commands in Info. -Each entry consists of the key sequence you should type to execute the -cursor movement, the @code{M-x}@footnote{@code{M-x} is also a command; it -invokes @code{execute-extended-command}. @xref{M-x, , Executing an -extended command, emacs, the GNU Emacs Manual}, for more detailed -information.} command name (displayed in parentheses), and a short -description of what the command does. All of the cursor motion commands -can take an @dfn{numeric} argument (@pxref{Miscellaneous Commands, -@code{universal-argument}}), to find out how to supply them. With a -numeric argument, the motion commands are simply executed that -many times; for example, a numeric argument of 4 given to -@code{next-line} causes the cursor to move down 4 lines. With a -negative numeric argument, the motion is reversed; an argument of -4 -given to the @code{next-line} command would cause the cursor to move -@emph{up} 4 lines. - -@table @asis -@item @code{C-n} (@code{next-line}) -@kindex C-n -@findex next-line -Move the cursor down to the next line. - -@item @code{C-p} (@code{prev-line}) -@kindex C-p -@findex prev-line -Move the cursor up to the previous line. - -@item @code{C-a} (@code{beginning-of-line}) -@kindex C-a, in Info windows -@findex beginning-of-line -Move the cursor to the start of the current line. - -@item @code{C-e} (@code{end-of-line}) -@kindex C-e, in Info windows -@findex end-of-line -Move the cursor to the end of the current line. - -@item @code{C-f} (@code{forward-char}) -@kindex C-f, in Info windows -@findex forward-char -Move the cursor forward a character. - -@item @code{C-b} (@code{backward-char}) -@kindex C-b, in Info windows -@findex backward-char -Move the cursor backward a character. - -@item @code{M-f} (@code{forward-word}) -@kindex M-f, in Info windows -@findex forward-word -Move the cursor forward a word. - -@item @code{M-b} (@code{backward-word}) -@kindex M-b, in Info windows -@findex backward-word -Move the cursor backward a word. - -@item @code{M-<} (@code{beginning-of-node}) -@itemx @code{b} -@kindex b, in Info windows -@kindex M-< -@findex beginning-of-node -Move the cursor to the start of the current node. - -@item @code{M->} (@code{end-of-node}) -@kindex M-> -@findex end-of-node -Move the cursor to the end of the current node. - -@item @code{M-r} (@code{move-to-window-line}) -@kindex M-r -@findex move-to-window-line -Move the cursor to a specific line of the window. Without a numeric -argument, @code{M-r} moves the cursor to the start of the line in the -center of the window. With a numeric argument of @var{n}, @code{M-r} -moves the cursor to the start of the @var{n}th line in the window. -@end table - -@node Scrolling Commands, Node Commands, Cursor Commands, Top -@chapter Moving Text Within a Window -@cindex scrolling - -Sometimes you are looking at a screenful of text, and only part of the -current paragraph you are reading is visible on the screen. The -commands detailed in this section are used to shift which part of the -current node is visible on the screen. - -@table @asis -@item @code{SPC} (@code{scroll-forward}) -@itemx @code{C-v} -@kindex SPC, in Info windows -@kindex C-v -@findex scroll-forward -Shift the text in this window up. That is, show more of the node which -is currently below the bottom of the window. With a numeric argument, -show that many more lines at the bottom of the window; a numeric -argument of 4 would shift all of the text in the window up 4 lines -(discarding the top 4 lines), and show you four new lines at the bottom -of the window. Without a numeric argument, @key{SPC} takes the bottom -two lines of the window and places them at the top of the window, -redisplaying almost a completely new screenful of lines. - -@item @code{DEL} (@code{scroll-backward}) -@itemx @code{M-v} -@kindex DEL, in Info windows -@kindex M-v -@findex scroll-backward -Shift the text in this window down. The inverse of -@code{scroll-forward}. -@end table - -@cindex scrolling through node structure -The @code{scroll-forward} and @code{scroll-backward} commands can also -move forward and backward through the node structure of the file. If -you press @key{SPC} while viewing the end of a node, or @key{DEL} while -viewing the beginning of a node, what happens is controlled by the -variable @code{scroll-behavior}. @xref{Variables, -@code{scroll-behavior}}, for more information. - -@table @asis -@item @code{C-l} (@code{redraw-display}) -@kindex C-l -@findex redraw-display -Redraw the display from scratch, or shift the line containing the cursor -to a specified location. With no numeric argument, @samp{C-l} clears -the screen, and then redraws its entire contents. Given a numeric -argument of @var{n}, the line containing the cursor is shifted so that -it is on the @var{n}th line of the window. - -@item @code{C-x w} (@code{toggle-wrap}) -@kindex C-w -@findex toggle-wrap -Toggles the state of line wrapping in the current window. Normally, -lines which are longer than the screen width @dfn{wrap}, i.e., they are -continued on the next line. Lines which wrap have a @samp{\} appearing -in the rightmost column of the screen. You can cause such lines to be -terminated at the rightmost column by changing the state of line -wrapping in the window with @code{C-x w}. When a line which needs more -space than one screen width to display is displayed, a @samp{$} appears -in the rightmost column of the screen, and the remainder of the line is -invisible. -@end table - -@node Node Commands, Searching Commands, Scrolling Commands, Top -@chapter Selecting a New Node -@cindex nodes, selection of - -This section details the numerous Info commands which select a new node -to view in the current window. - -The most basic node commands are @samp{n}, @samp{p}, @samp{u}, and -@samp{l}. - -When you are viewing a node, the top line of the node contains some Info -@dfn{pointers} which describe where the next, previous, and up nodes -are. Info uses this line to move about the node structure of the file -when you use the following commands: - -@table @asis -@item @code{n} (@code{next-node}) -@kindex n -@findex next-node -Select the `Next' node. - -@item @code{p} (@code{prev-node}) -@kindex p -@findex prev-node -Select the `Prev' node. - -@item @code{u} (@code{up-node}) -@kindex u -@findex up-node -Select the `Up' node. -@end table - -You can easily select a node that you have already viewed in this window -by using the @samp{l} command -- this name stands for "last", and -actually moves through the list of already visited nodes for this -window. @samp{l} with a negative numeric argument moves forward through -the history of nodes for this window, so you can quickly step between -two adjacent (in viewing history) nodes. - -@table @asis -@item @code{l} (@code{history-node}) -@kindex l -@findex history-node -Select the most recently selected node in this window. -@end table - -Two additional commands make it easy to select the most commonly -selected nodes; they are @samp{t} and @samp{d}. - -@table @asis -@item @code{t} (@code{top-node}) -@kindex t -@findex top-node -Select the node @samp{Top} in the current Info file. - -@item @code{d} (@code{dir-node}) -@kindex d -@findex dir-node -Select the directory node (i.e., the node @samp{(dir)}). -@end table - -Here are some other commands which immediately result in the selection -of a different node in the current window: - -@table @asis -@item @code{<} (@code{first-node}) -@kindex < -@findex first-node -Selects the first node which appears in this file. This node is most -often @samp{Top}, but it does not have to be. - -@item @code{>} (@code{last-node}) -@kindex > -@findex last-node -Select the last node which appears in this file. - -@item @code{]} (@code{global-next-node}) -@kindex ] -@findex global-next-node -Move forward or down through node structure. If the node that you are -currently viewing has a @samp{Next} pointer, that node is selected. -Otherwise, if this node has a menu, the first menu item is selected. If -there is no @samp{Next} and no menu, the same process is tried with the -@samp{Up} node of this node. - -@item @code{[} (@code{global-prev-node}) -@kindex [ -@findex global-prev-node -Move backward or up through node structure. If the node that you are -currently viewing has a @samp{Prev} pointer, that node is selected. -Otherwise, if the node has an @samp{Up} pointer, that node is selected, -and if it has a menu, the last item in the menu is selected. -@end table - -You can get the same behavior as @code{global-next-node} and -@code{global-prev-node} while simply scrolling through the file with -@key{SPC} and @key{DEL}; @xref{Variables, @code{scroll-behavior}}, for -more information. - -@table @asis -@item @code{g} (@code{goto-node}) -@kindex g -@findex goto-node -Read the name of a node and select it. No completion is done while -reading the node name, since the desired node may reside in a separate -file. The node must be typed exactly as it appears in the Info file. A -file name may be included as with any node specification, for example - -@example -@code{g(emacs)Buffers} -@end example - -finds the node @samp{Buffers} in the Info file @file{emacs}. - -@item @code{C-x k} (@code{kill-node}) -@kindex C-x k -@findex kill-node -Kill a node. The node name is prompted for in the echo area, with a -default of the current node. @dfn{Killing} a node means that Info tries -hard to forget about it, removing it from the list of history nodes kept -for the window where that node is found. Another node is selected in -the window which contained the killed node. - -@item @code{C-x C-f} (@code{view-file}) -@kindex C-x C-f -@findex view-file -Read the name of a file and selects the entire file. The command -@example -@code{C-x C-f @var{filename}} -@end example -is equivalent to typing -@example -@code{g(@var{filename})*} -@end example - -@item @code{C-x C-b} (@code{list-visited-nodes}) -@kindex C-x C-b -@findex list-visited-nodes -Make a window containing a menu of all of the currently visited nodes. -This window becomes the selected window, and you may use the standard -Info commands within it. - -@item @code{C-x b} (@code{select-visited-node}) -@kindex C-x b -@findex select-visited-node -Select a node which has been previously visited in a visible window. -This is similar to @samp{C-x C-b} followed by @samp{m}, but no window is -created. -@end table - -@node Searching Commands, Xref Commands, Node Commands, Top -@chapter Searching an Info File -@cindex searching - -GNU Info allows you to search for a sequence of characters throughout an -entire Info file, search through the indices of an Info file, or find -areas within an Info file which discuss a particular topic. - -@table @asis -@item @code{s} (@code{search}) -@kindex s -@findex search -Read a string in the echo area and search for it. - -@item @code{C-s} (@code{isearch-forward}) -@kindex C-s -@findex isearch-forward -Interactively search forward through the Info file for a string as you -type it. - -@item @code{C-r} (@code{isearch-backward}) -@kindex C-r -@findex isearch-backward -Interactively search backward through the Info file for a string as -you type it. - -@item @code{i} (@code{index-search}) -@kindex i -@findex index-search -Look up a string in the indices for this Info file, and select a node -where the found index entry points to. - -@item @code{,} (@code{next-index-match}) -@kindex , -@findex next-index-match -Move to the node containing the next matching index item from the last -@samp{i} command. -@end table - -The most basic searching command is @samp{s} (@code{search}). The -@samp{s} command prompts you for a string in the echo area, and then -searches the remainder of the Info file for an occurrence of that string. -If the string is found, the node containing it is selected, and the -cursor is left positioned at the start of the found string. Subsequent -@samp{s} commands show you the default search string within @samp{[} and -@samp{]}; pressing @key{RET} instead of typing a new string will use the -default search string. - -@dfn{Incremental searching} is similar to basic searching, but the -string is looked up while you are typing it, instead of waiting until -the entire search string has been specified. - -@node Xref Commands, Window Commands, Searching Commands, Top -@chapter Selecting Cross References - -We have already discussed the @samp{Next}, @samp{Prev}, and @samp{Up} -pointers which appear at the top of a node. In addition to these -pointers, a node may contain other pointers which refer you to a -different node, perhaps in another Info file. Such pointers are called -@dfn{cross references}, or @dfn{xrefs} for short. - -@menu -* Parts of an Xref:: What a cross reference is made of. -* Selecting Xrefs:: Commands for selecting menu or note items. -@end menu - -@node Parts of an Xref, Selecting Xrefs, , Xref Commands -@section Parts of an Xref - -Cross references have two major parts: the first part is called the -@dfn{label}; it is the name that you can use to refer to the cross -reference, and the second is the @dfn{target}; it is the full name of -the node that the cross reference points to. - -The target is separated from the label by a colon @samp{:}; first the -label appears, and then the target. For example, in the sample menu -cross reference below, the single colon separates the label from the -target. - -@example -* Foo Label: Foo Target. More information about Foo. -@end example - -Note the @samp{.} which ends the name of the target. The @samp{.} is -not part of the target; it serves only to let Info know where the target -name ends. - -A shorthand way of specifying references allows two adjacent colons to -stand for a target name which is the same as the label name: - -@example -* Foo Commands:: Commands pertaining to Foo. -@end example - -In the above example, the name of the target is the same as the name of -the label, in this case @code{Foo Commands}. - -You will normally see two types of cross reference while viewing nodes: -@dfn{menu} references, and @dfn{note} references. Menu references -appear within a node's menu; they begin with a @samp{*} at the beginning -of a line, and continue with a label, a target, and a comment which -describes what the contents of the node pointed to contains. - -Note references appear within the body of the node text; they begin with -@code{*Note}, and continue with a label and a target. - -Like @samp{Next}, @samp{Prev}, and @samp{Up} pointers, cross references -can point to any valid node. They are used to refer you to a place -where more detailed information can be found on a particular subject. -Here is a cross reference which points to a node within the Texinfo -documentation: @xref{xref, , Writing an Xref, texinfo, the Texinfo -Manual}, for more information on creating your own texinfo cross -references. - -@node Selecting Xrefs, , Parts of an Xref, Xref Commands -@section Selecting Xrefs - -The following table lists the Info commands which operate on menu items. - -@table @asis -@item @code{1} (@code{menu-digit}) -@itemx @code{2} @dots{} @code{9} -@cindex 1 @dots{} 9, in Info windows -@kindex 1 @dots{} 9, in Info windows -@findex menu-digit -Within an Info window, pressing a single digit, (such as @samp{1}), -selects that menu item, and places its node in the current window. -For convenience, there is one exception; pressing @samp{0} selects the -@emph{last} item in the node's menu. - -@item @code{0} (@code{last-menu-item}) -@kindex 0, in Info windows -@findex last-menu-item -Select the last item in the current node's menu. - -@item @code{m} (@code{menu-item}) -@kindex m -@findex menu-item -Reads the name of a menu item in the echo area and selects its node. -Completion is available while reading the menu label. - -@item @code{M-x find-menu} -@findex find-menu -Move the cursor to the start of this node's menu. -@end table - -This table lists the Info commands which operate on note cross references. - -@table @asis -@item @code{f} (@code{xref-item}) -@itemx @code{r} -@kindex f -@kindex r -@findex xref-item -Reads the name of a note cross reference in the echo area and selects -its node. Completion is available while reading the cross reference -label. -@end table - -Finally, the next few commands operate on menu or note references alike: - -@table @asis -@item @code{TAB} (@code{move-to-next-xref}) -@kindex TAB, in Info windows -@findex move-to-next-xref -Move the cursor to the start of the next nearest menu item or note -reference in this node. You can then use @key{RET} -(@code{select-reference-this-line}) to select the menu or note reference. - -@item @code{M-TAB} (@code{move-to-prev-xref}) -@kindex M-TAB, in Info windows -@findex move-to-prev-xref -Move the cursor the start of the nearest previous menu item or note -reference in this node. - -@item @code{RET} (@code{select-reference-this-line}) -@kindex RET, in Info windows -@findex select-reference-this-line -Select the menu item or note reference appearing on this line. -@end table - -@node Window Commands, Printing Nodes, Xref Commands, Top -@chapter Manipulating Multiple Windows -@cindex windows, manipulating - -A @dfn{window} is a place to show the text of a node. Windows have a -view area where the text of the node is displayed, and an associated -@dfn{mode line}, which briefly describes the node being viewed. - -GNU Info supports multiple windows appearing in a single screen; each -window is separated from the next by its modeline. At any time, there -is only one @dfn{active} window, that is, the window in which the cursor -appears. There are commands available for creating windows, changing -the size of windows, selecting which window is active, and for deleting -windows. - -@menu -* The Mode Line:: What appears in the mode line? -* Basic Windows:: Manipulating windows in Info. -* The Echo Area:: Used for displaying errors and reading input. -@end menu - -@node The Mode Line, Basic Windows, , Window Commands -@section The Mode Line - -A @dfn{mode line} is a line of inverse video which appears at the bottom -of an Info window. It describes the contents of the window just above -it; this information includes the name of the file and node appearing in -that window, the number of screen lines it takes to display the node, -and the percentage of text that is above the top of the window. It can -also tell you if the indirect tags table for this Info file needs to be -updated, and whether or not the Info file was compressed when stored on -disk. - -Here is a sample mode line for a window containing an uncompressed file -named @file{dir}, showing the node @samp{Top}. - -@example -@group ------Info: (dir)Top, 40 lines --Top--------------------------------------- - ^^ ^ ^^^ ^^ - (file)Node #lines where -@end group -@end example - -When a node comes from a file which is compressed on disk, this is -indicated in the mode line with two small @samp{z}'s. In addition, if -the Info file containing the node has been split into subfiles, the name -of the subfile containing the node appears in the modeline as well: - -@example ---zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z--------------- -@end example - -When Info makes a node internally, such that there is no corresponding -info file on disk, the name of the node is surrounded by asterisks -(@samp{*}). The name itself tells you what the contents of the window -are; the sample mode line below shows an internally constructed node -showing possible completions: - -@example ------Info: *Completions*, 7 lines --All----------------------------------- -@end example - -@node Basic Windows, The Echo Area, The Mode Line, Window Commands -@section Window Commands - -It can be convenient to view more than one node at a time. To allow -this, Info can display more than one @dfn{window}. Each window has its -own mode line (@pxref{The Mode Line}) and history of nodes viewed in that -window (@pxref{Node Commands, , @code{history-node}}). - -@table @asis -@item @code{C-x o} (@code{next-window}) -@cindex windows, selecting -@kindex C-x o -@findex next-window -Select the next window on the screen. Note that the echo area can only be -selected if it is already in use, and you have left it temporarily. -Normally, @samp{C-x o} simply moves the cursor into the next window on -the screen, or if you are already within the last window, into the first -window on the screen. Given a numeric argument, @samp{C-x o} moves over -that many windows. A negative argument causes @samp{C-x o} to select -the previous window on the screen. - -@item @code{M-x prev-window} -@findex prev-window -Select the previous window on the screen. This is identical to -@samp{C-x o} with a negative argument. - -@item @code{C-x 2} (@code{split-window}) -@cindex windows, creating -@kindex C-x 2 -@findex split-window -Split the current window into two windows, both showing the same node. -Each window is one half the size of the original window, and the cursor -remains in the original window. The variable @code{automatic-tiling} -can cause all of the windows on the screen to be resized for you -automatically, please @pxref{Variables, , automatic-tiling} for more -information. - -@item @code{C-x 0} (@code{delete-window}) -@cindex windows, deleting -@kindex C-x 0 -@findex delete-window -Delete the current window from the screen. If you have made too many -windows and your screen appears cluttered, this is the way to get rid of -some of them. - -@item @code{C-x 1} (@code{keep-one-window}) -@kindex C-x 1 -@findex keep-one-window -Delete all of the windows excepting the current one. - -@item @code{ESC C-v} (@code{scroll-other-window}) -@kindex ESC C-v, in Info windows -@findex scroll-other-window -Scroll the other window, in the same fashion that @samp{C-v} might -scroll the current window. Given a negative argument, scroll the -"other" window backward. - -@item @code{C-x ^} (@code{grow-window}) -@kindex C-x ^ -@findex grow-window -Grow (or shrink) the current window. Given a numeric argument, grow -the current window that many lines; with a negative numeric argument, -shrink the window instead. - -@item @code{C-x t} (@code{tile-windows}) -@cindex tiling -@kindex C-x t -@findex tile-windows -Divide the available screen space among all of the visible windows. -Each window is given an equal portion of the screen in which to display -its contents. The variable @code{automatic-tiling} can cause -@code{tile-windows} to be called when a window is created or deleted. -@xref{Variables, , @code{automatic-tiling}}. -@end table - -@node The Echo Area, , Basic Windows, Window Commands -@section The Echo Area -@cindex echo area - -The @dfn{echo area} is a one line window which appears at the bottom of -the screen. It is used to display informative or error messages, and to -read lines of input from you when that is necessary. Almost all of the -commands available in the echo area are identical to their Emacs -counterparts, so please refer to that documentation for greater depth of -discussion on the concepts of editing a line of text. The following -table briefly lists the commands that are available while input is being -read in the echo area: - -@table @asis -@item @code{C-f} (@code{echo-area-forward}) -@kindex C-f, in the echo area -@findex echo-area-forward -Move forward a character. - -@item @code{C-b} (@code{echo-area-backward}) -@kindex C-b, in the echo area -@findex echo-area-backward -Move backward a character. - -@item @code{C-a} (@code{echo-area-beg-of-line}) -@kindex C-a, in the echo area -@findex echo-area-beg-of-line -Move to the start of the input line. - -@item @code{C-e} (@code{echo-area-end-of-line}) -@kindex C-e, in the echo area -@findex echo-area-end-of-line -Move to the end of the input line. - -@item @code{M-f} (@code{echo-area-forward-word}) -@kindex M-f, in the echo area -@findex echo-area-forward-word -Move forward a word. - -@item @code{M-b} (@code{echo-area-backward-word}) -@kindex M-b, in the echo area -@findex echo-area-backward-word -Move backward a word. - -@item @code{C-d} (@code{echo-area-delete}) -@kindex C-d, in the echo area -@findex echo-area-delete -Delete the character under the cursor. - -@item @code{DEL} (@code{echo-area-rubout}) -@kindex DEL, in the echo area -@findex echo-area-rubout -Delete the character behind the cursor. - -@item @code{C-g} (@code{echo-area-abort}) -@kindex C-g, in the echo area -@findex echo-area-abort -Cancel or quit the current operation. If completion is being read, -@samp{C-g} discards the text of the input line which does not match any -completion. If the input line is empty, @samp{C-g} aborts the calling -function. - -@item @code{RET} (@code{echo-area-newline}) -@kindex RET, in the echo area -@findex echo-area-newline -Accept (or forces completion of) the current input line. - -@item @code{C-q} (@code{echo-area-quoted-insert}) -@kindex C-q, in the echo area -@findex echo-area-quoted-insert -Insert the next character verbatim. This is how you can insert control -characters into a search string, for example. - -@item @var{printing character} (@code{echo-area-insert}) -@kindex printing characters, in the echo area -@findex echo-area-insert -Insert the character. - -@item @code{M-TAB} (@code{echo-area-tab-insert}) -@kindex M-TAB, in the echo area -@findex echo-area-tab-insert -Insert a TAB character. - -@item @code{C-t} (@code{echo-area-transpose-chars}) -@kindex C-t, in the echo area -@findex echo-area-transpose-chars -Transpose the characters at the cursor. -@end table - -The next group of commands deal with @dfn{killing}, and @dfn{yanking} -text. For an in depth discussion of killing and yanking, -@pxref{Killing, , Killing and Deleting, emacs, the GNU Emacs Manual} - -@table @asis -@item @code{M-d} (@code{echo-area-kill-word}) -@kindex M-d, in the echo area -@findex echo-area-kill-word -Kill the word following the cursor. - -@item @code{M-DEL} (@code{echo-area-backward-kill-word}) -@kindex M-DEL, in the echo area -@findex echo-area-backward-kill-word -Kill the word preceding the cursor. - -@item @code{C-k} (@code{echo-area-kill-line}) -@kindex C-k, in the echo area -@findex echo-area-kill-line -Kill the text from the cursor to the end of the line. - -@item @code{C-x DEL} (@code{echo-area-backward-kill-line}) -@kindex C-x DEL, in the echo area -@findex echo-area-backward-kill-line -Kill the text from the cursor to the beginning of the line. - -@item @code{C-y} (@code{echo-area-yank}) -@kindex C-y, in the echo area -@findex echo-area-yank -Yank back the contents of the last kill. - -@item @code{M-y} (@code{echo-area-yank-pop}) -@kindex M-y, in the echo area -@findex echo-area-yank-pop -Yank back a previous kill, removing the last yanked text first. -@end table - -Sometimes when reading input in the echo area, the command that needed -input will only accept one of a list of several choices. The choices -represent the @dfn{possible completions}, and you must respond with one -of them. Since there are a limited number of responses you can make, -Info allows you to abbreviate what you type, only typing as much of the -response as is necessary to uniquely identify it. In addition, you can -request Info to fill in as much of the response as is possible; this -is called @dfn{completion}. - -The following commands are available when completing in the echo area: - -@table @asis -@item @code{TAB} (@code{echo-area-complete}) -@itemx @code{SPC} -@kindex TAB, in the echo area -@kindex SPC, in the echo area -@findex echo-area-complete -Insert as much of a completion as is possible. - -@item @code{?} (@code{echo-area-possible-completions}) -@kindex ?, in the echo area -@findex echo-area-possible-completions -Display a window containing a list of the possible completions of what -you have typed so far. For example, if the available choices are: - -@example -@group -bar -foliate -food -forget -@end group -@end example - -@noindent -and you have typed an @samp{f}, followed by @samp{?}, the possible -completions would contain: - -@example -@group -foliate -food -forget -@end group -@end example - -@noindent -i.e., all of the choices which begin with @samp{f}. Pressing @key{SPC} -or @key{TAB} would result in @samp{fo} appearing in the echo area, since -all of the choices which begin with @samp{f} continue with @samp{o}. -Now, typing @samp{l} followed by @samp{TAB} results in @samp{foliate} -appearing in the echo area, since that is the only choice which begins -with @samp{fol}. - -@item @code{ESC C-v} (@code{echo-area-scroll-completions-window}) -@kindex ESC C-v, in the echo area -@findex echo-area-scroll-completions-window -Scroll the completions window, if that is visible, or the "other" -window if not. -@end table - -@node Printing Nodes, Miscellaneous Commands, Window Commands, Top -@chapter Printing Out Nodes -@cindex printing - -You may wish to print out the contents of a node as a quick reference -document for later use. Info provides you with a command for doing -this. In general, we recommend that you use @TeX{} to format the -document and print sections of it, by running @code{tex} on the Texinfo -source file. - -@table @asis -@item @code{M-x print-node} -@findex print-node -@cindex INFO_PRINT_COMMAND, environment variable -Pipe the contents of the current node through the command in the -environment variable @code{INFO_PRINT_COMMAND}. If the variable does not -exist, the node is simply piped to @code{lpr}. -@end table - -@node Miscellaneous Commands, Variables, Printing Nodes, Top -@chapter Miscellaneous Commands - -GNU Info contains several commands which self-document GNU Info: - -@table @asis -@item @code{M-x describe-command} -@cindex functions, describing -@cindex commands, describing -@findex describe-command -Read the name of an Info command in the echo area and then display a -brief description of what that command does. - -@item @code{M-x describe-key} -@cindex keys, describing -@findex describe-key -Read a key sequence in the echo area, and then display the name and -documentation of the Info command that the key sequence invokes. - -@item @code{M-x describe-variable} -Read the name of a variable in the echo area and then display a brief -description of what the variable affects. - -@item @code{M-x where-is} -@findex where-is -Read the name of an Info command in the echo area, and then display -a key sequence which can be typed in order to invoke that command. - -@item @code{C-h} (@code{get-help-window}) -@itemx @code{?} -@kindex C-h -@kindex ?, in Info windows -@findex get-help-window -Create (or Move into) the window displaying @code{*Help*}, and place -a node containing a quick reference card into it. This window displays -the most concise information about GNU Info available. - -@item @code{h} (@code{get-info-help-node}) -@kindex h -@findex get-info-help-node -Try hard to visit the node @code{(info)Help}. The Info file -@file{info.texi} distributed with GNU Info contains this node. Of -course, the file must first be processed with @code{makeinfo}, and then -placed into the location of your Info directory. -@end table - -Here are the commands for creating a numeric argument: - -@table @asis -@item @code{C-u} (@code{universal-argument}) -@cindex numeric arguments -@kindex C-u -@findex universal-argument -Start (or multiply by 4) the current numeric argument. @samp{C-u} is -a good way to give a small numeric argument to cursor movement or -scrolling commands; @samp{C-u C-v} scrolls the screen 4 lines, while -@samp{C-u C-u C-n} moves the cursor down 16 lines. - -@item @code{M-1} (@code{add-digit-to-numeric-arg}) -@itemx @code{M-2} @dots{} @code{M-9} -@kindex M-1 @dots{} M-9 -@findex add-digit-to-numeric-arg -Add the digit value of the invoking key to the current numeric -argument. Once Info is reading a numeric argument, you may just type -the digits of the argument, without the Meta prefix. For example, you -might give @samp{C-l} a numeric argument of 32 by typing: - -@example -@kbd{C-u 3 2 C-l} -@end example - -@noindent -or - -@example -@kbd{M-3 2 C-l} -@end example -@end table - -@samp{C-g} is used to abort the reading of a multi-character key -sequence, to cancel lengthy operations (such as multi-file searches) and -to cancel reading input in the echo area. - -@table @asis -@item @code{C-g} (@code{abort-key}) -@cindex cancelling typeahead -@cindex cancelling the current operation -@kindex C-g, in Info windows -@findex abort-key -Cancel current operation. -@end table - -The @samp{q} command of Info simply quits running Info. - -@table @asis -@item @code{q} (@code{quit}) -@cindex quitting -@kindex q -@findex quit -Exit GNU Info. -@end table - -If the operating system tells GNU Info that the screen is 60 lines tall, -and it is actually only 40 lines tall, here is a way to tell Info that -the operating system is correct. - -@table @asis -@item @code{M-x set-screen-height} -@findex set-screen-height -@cindex screen, changing the height of -Read a height value in the echo area and set the height of the -displayed screen to that value. -@end table - -Finally, Info provides a convenient way to display footnotes which might -be associated with the current node that you are viewing: - -@table @asis -@item @code{ESC C-f} (@code{show-footnotes}) -@kindex ESC C-f -@findex show-footnotes -@cindex footnotes, displaying -Show the footnotes (if any) associated with the current node in another -window. You can have Info automatically display the footnotes -associated with a node when the node is selected by setting the variable -@code{automatic-footnotes}. @xref{Variables, , @code{automatic-footnotes}}. -@end table - -@node Variables, GNU Info Global Index, Miscellaneous Commands, Top -@chapter Manipulating Variables - -GNU Info contains several @dfn{variables} whose values are looked at by various -Info commands. You can change the values of these variables, and thus -change the behavior of Info to more closely match your environment and -Info file reading manner. - -@table @asis -@item @code{M-x set-variable} -@cindex variables, setting -@findex set-variable -Read the name of a variable, and the value for it, in the echo area and -then set the variable to that value. Completion is available when -reading the variable name; often, completion is available when reading -the value to give to the variable, but that depends on the variable -itself. If a variable does @emph{not} supply multiple choices to -complete over, it expects a numeric value. - -@item @code{M-x describe-variable} -@cindex variables, describing -@findex describe-variable -Read the name of a variable in the echo area and then display a brief -description of what the variable affects. -@end table - -Here is a list of the variables that you can set in Info. - -@table @code -@item automatic-footnotes -@vindex automatic-footnotes -When set to @code{On}, footnotes appear and disappear automatically. -This variable is @code{On} by default. When a node is selected, a -window containing the footnotes which appear in that node is created, -and the footnotes are displayed within the new window. The window that -Info creates to contain the footnotes is called @samp{*Footnotes*}. If -a node is selected which contains no footnotes, and a @samp{*Footnotes*} -window is on the screen, the @samp{*Footnotes*} window is deleted. -Footnote windows created in this fashion are not automatically tiled so -that they can use as little of the display as is possible. - -@item automatic-tiling -@vindex automatic-tiling -When set to @code{On}, creating or deleting a window resizes other -windows. This variable is @code{Off} by default. Normally, typing -@samp{C-x 2} divides the current window into two equal parts. When -@code{automatic-tiling} is set to @code{On}, all of the windows are -resized automatically, keeping an equal number of lines visible in each -window. There are exceptions to the automatic tiling; specifically, the -windows @samp{*Completions*} and @samp{*Footnotes*} are @emph{not} -resized through automatic tiling; they remain their original size. - -@item visible-bell -@vindex visible-bell -When set to @code{On}, GNU Info attempts to flash the screen instead of -ringing the bell. This variable is @code{Off} by default. Of course, -Info can only flash the screen if the terminal allows it; in the case -that the terminal does not allow it, the setting of this variable has no -effect. However, you can make Info perform quietly by setting the -@code{errors-ring-bell} variable to @code{Off}. - -@item errors-ring-bell -@vindex errors-ring-bell -When set to @code{On}, errors cause the bell to ring. The default -setting of this variable is @code{On}. - -@item gc-compressed-files -@vindex gc-compressed-files -When set to @code{On}, Info garbage collects files which had to be -uncompressed. The default value of this variable is @code{Off}. -Whenever a node is visited in Info, the Info file containing that node -is read into core, and Info reads information about the tags and nodes -contained in that file. Once the tags information is read by Info, it -is never forgotten. However, the actual text of the nodes does not need -to remain in core unless a particular Info window needs it. For -non-compressed files, the text of the nodes does not remain in core when -it is no longer in use. But de-compressing a file can be a time -consuming operation, and so Info tries hard not to do it twice. -@code{gc-compressed-files} tells Info it is okay to garbage collect the -text of the nodes of a file which was compressed on disk. - -@item show-index-match -@vindex show-index-match -When set to @code{On}, the portion of the matched search string is -highlighted in the message which explains where the matched search -string was found. The default value of this variable is @code{On}. -When Info displays the location where an index match was found, -(@pxref{Searching Commands, , @code{next-index-match}}), the portion of the -string that you had typed is highlighted by displaying it in the inverse -case from its surrounding characters. - -@item scroll-behavior -@vindex scroll-behavior -Control what happens when forward scrolling is requested at the end of -a node, or when backward scrolling is requested at the beginning of a -node. The default value for this variable is @code{Continuous}. There -are three possible values for this variable: - -@table @code -@item Continuous -Try to get the first item in this node's menu, or failing that, the -@samp{Next} node, or failing that, the @samp{Next} of the @samp{Up}. -This behavior is identical to using the @samp{]} -(@code{global-next-node}) and @samp{[} (@code{global-prev-node}) -commands. - -@item Next Only -Only try to get the @samp{Next} node. - -@item Page Only -Simply give up, changing nothing. If @code{scroll-behavior} is -@code{Page Only}, no scrolling command can change the node that is being -viewed. -@end table - -@item scroll-step -@vindex scroll-step -The number of lines to scroll when the cursor moves out of the window. -Scrolling happens automatically if the cursor has moved out of the -visible portion of the node text when it is time to display. Usually -the scrolling is done so as to put the cursor on the center line of the -current window. However, if the variable @code{scroll-step} has a -nonzero value, Info attempts to scroll the node text by that many lines; -if that is enough to bring the cursor back into the window, that is what -is done. The default value of this variable is 0, thus placing the -cursor (and the text it is attached to) in the center of the window. -Setting this variable to 1 causes a kind of "smooth scrolling" which -some people prefer. - -@item ISO-Latin -@cindex ISO Latin characters -@vindex ISO-Latin -When set to @code{On}, Info accepts and displays ISO Latin characters. -By default, Info assumes an ASCII character set. @code{ISO-Latin} tells -Info that it is running in an environment where the European standard -character set is in use, and allows you to input such characters to -Info, as well as display them. -@end table - - - -@c the following is incomplete -@ignore -@c node Info for Sys Admins -@c chapter Info for System Administrators - -This text describes some common ways of setting up an Info hierarchy -from scratch, and details the various options that are available when -installing Info. This text is designed for the person who is installing -GNU Info on the system; although users may find the information present -in this section interesting, none of it is vital to understanding how to -use GNU Info. - -@menu -* Setting the INFOPATH:: Where are my Info files kept? -* Editing the DIR node:: What goes in `DIR', and why? -* Storing Info files:: Alternate formats allow flexibility in setups. -* Using `localdir':: Building DIR on the fly. -* Example setups:: Some common ways to organize Info files. -@end menu - -@c node Setting the INFOPATH -@c section Setting the INFOPATH - -Where are my Info files kept? - -@c node Editing the DIR node -@c section Editing the DIR node - -What goes in `DIR', and why? - -@c node Storing Info files -@c section Storing Info files - -Alternate formats allow flexibility in setups. - -@c node Using `localdir' -@c section Using `localdir' - -Building DIR on the fly. - -@c node Example setups -@c section Example setups - -Some common ways to organize Info files. -@end ignore - -@node GNU Info Global Index, , Variables, Top -@appendix Global Index - -@printindex cp - -@contents -@bye diff --git a/gnu/usr.bin/texinfo/info-files/texi-files/info.texi b/gnu/usr.bin/texinfo/info-files/texi-files/info.texi deleted file mode 100644 index 5eec9f10f0e3..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi-files/info.texi +++ /dev/null @@ -1,861 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@comment %**start of header -@setfilename info.info -@settitle Info 1.0 -@comment %**end of header - -@iftex -@finalout -@end iftex - -@ifinfo -This file describes how to use Info, -the on-line, menu-driven GNU documentation system. - -Copyright (C) 1989, 1992 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Free Software Foundation. -@end ifinfo - -@setchapternewpage odd -@titlepage -@sp 11 -@center @titlefont{Info} -@sp 2 -@center The -@sp 2 -@center On-line, Menu-driven -@sp 2 -@center GNU Documentation System - -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1989, 1992, 1993 Free Software Foundation, Inc. -@sp 2 - -Published by the Free Software Foundation @* -675 Massachusetts Avenue, @* -Cambridge, MA 02139 USA @* - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Free Software Foundation. -@end titlepage - -@ifinfo -@node Top, Getting Started, (dir), (dir) -@top Info: An Introduction - -Info is a program for reading documentation, which you are using now. - -To learn how to use Info, type the command @kbd{h}. It brings you -to a programmed instruction sequence. - -@c Need to make sure that `Info-help' goes to the right node, -@c which is the first node of the first chapter. (It should.) -@c (Info-find-node "info" -@c (if (< (window-height) 23) -@c "Help-Small-Screen" -@c "Help"))) - -To learn advanced Info commands, type @kbd{n} twice. This -brings you to @cite{Info for Experts}, skipping over the . -`Getting Started' chapter. -@end ifinfo - -@menu -* Getting Started:: -* Advanced Info:: -* Create an Info File:: -@end menu - -@node Getting Started, Advanced Info, Top, Top -@comment node-name, next, previous, up -@chapter Getting Started - -This first part of the Info manual describes how to get around inside -of Info. The second part of the manual describes various advanced -Info commands, and how to write an Info as distinct from a Texinfo -file. The third part is about how to generate Info files from -Texinfo files. - -@iftex -This manual is primarily designed for use on a computer, so that you can -try Info commands while reading about them. Reading it on paper is less -effective, since you must take it on faith that the commands described -really do what the manual says. By all means go through this manual now -that you have it; but please try going through the on-line version as -well. - -There are two ways of looking at the online version of this manual: - -@enumerate -@item -Type @code{info} at your shell's command line. This approach uses a -small stand-alone program designed just to read Info files. - -@item -Type @code{emacs} at the command line; then type @kbd{C-h i} (Control -@kbd{h}, followed by @kbd{i}). This approach uses -the Info mode of the Emacs program, an editor with many other -capabilities. -@end enumerate - -In either case, then type @kbd{mInfo} (just the letters), followed by -@key{RET}---the ``Return'' or ``Enter'' key. At this point, you should -be ready to follow the instructions in this manual as you read them on -the screen. -@c FIXME! (pesch@cygnus.com, 14 dec 1992) -@c Is it worth worrying about what-if the beginner goes to somebody -@c else's Emacs session, which already has an Info running in the middle -@c of something---in which case these simple instructions won't work? -@end iftex - -@menu -* Help-Small-Screen:: Starting Info on a Small Screen -* Help:: How to use Info -* Help-P:: Returning to the Previous node -* Help-^L:: The Space, Rubout, B and ^L commands. -* Help-M:: Menus -* Help-Adv:: Some advanced Info commands -* Help-Q:: Quitting Info -@end menu - -@node Help-Small-Screen, Help, , Getting Started -@comment node-name, next, previous, up -@section Starting Info on a Small Screen - -@iftex -(In Info, you only see this section if your terminal has a small -number of lines; most readers pass by it without seeing it.) -@end iftex - -Since your terminal has an unusually small number of lines on its -screen, it is necessary to give you special advice at the beginning. - -If you see the text @samp{--All----} at near the bottom right corner -of the screen, it means the entire text you are looking at fits on the -screen. If you see @samp{--Top----} instead, it means that there is -more text below that does not fit. To move forward through the text -and see another screen full, press the Space bar, @key{SPC}. To move -back up, press the key labeled @samp{Rubout} or @samp{Delete} or -@key{DEL}. - -@ifinfo -Here are 40 lines of junk, so you can try @key{SPC} and @key{DEL} and -see what they do. At the end are instructions of what you should do -next. - -This is line 17 @* -This is line 18 @* -This is line 19 @* -This is line 20 @* -This is line 21 @* -This is line 22 @* -This is line 23 @* -This is line 24 @* -This is line 25 @* -This is line 26 @* -This is line 27 @* -This is line 28 @* -This is line 29 @* -This is line 30 @* -This is line 31 @* -This is line 32 @* -This is line 33 @* -This is line 34 @* -This is line 35 @* -This is line 36 @* -This is line 37 @* -This is line 38 @* -This is line 39 @* -This is line 40 @* -This is line 41 @* -This is line 42 @* -This is line 43 @* -This is line 44 @* -This is line 45 @* -This is line 46 @* -This is line 47 @* -This is line 48 @* -This is line 49 @* -This is line 50 @* -This is line 51 @* -This is line 52 @* -This is line 53 @* -This is line 54 @* -This is line 55 @* -This is line 56 @* - -If you have managed to get here, go back to the beginning with -@key{DEL}, and come back here again, then you understand @key{SPC} and -@key{DEL}. So now type an @kbd{n}---just one character; do not type -the quotes and do not type the Return key, @key{RET}, afterward---to -get to the normal start of the course. -@end ifinfo - -@node Help, Help-P, Help-Small-Screen, Getting Started -@comment node-name, next, previous, up -@section How to use Info - -You are talking to the program Info, for reading documentation. - - Right now you are looking at one @dfn{Node} of Information. -A node contains text describing a specific topic at a specific -level of detail. This node's topic is ``how to use Info''. - - The top line of a node is its @dfn{header}. This node's header (look at -it now) says that it is the node named @samp{Help} in the file -@file{info}. It says that the @samp{Next} node after this one is the node -called @samp{Help-P}. An advanced Info command lets you go to any node -whose name you know. - - Besides a @samp{Next}, a node can have a @samp{Previous} or an @samp{Up}. -This node has a @samp{Previous} but no @samp{Up}, as you can see. - - Now it is time to move on to the @samp{Next} node, named @samp{Help-P}. - ->> Type @samp{n} to move there. Type just one character; - do not type the quotes and do not type a @key{RET} afterward. - -@samp{>>} in the margin means it is really time to try a command. - -@node Help-P, Help-^L, Help, Getting Started -@comment node-name, next, previous, up -@section Returning to the Previous node - -This node is called @samp{Help-P}. The @samp{Previous} node, as you see, -is @samp{Help}, which is the one you just came from using the @kbd{n} -command. Another @kbd{n} command now would take you to the next -node, @samp{Help-^L}. - ->> But do not do that yet. First, try the @kbd{p} command, which takes - you to the @samp{Previous} node. When you get there, you can do an - @kbd{n} again to return here. - - This all probably seems insultingly simple so far, but @emph{do not} be -led into skimming. Things will get more complicated soon. Also, -do not try a new command until you are told it is time to. Otherwise, -you may make Info skip past an important warning that was coming up. - ->> Now do an @kbd{n} to get to the node @samp{Help-^L} and learn more. - -@node Help-^L, Help-M, Help-P, Getting Started -@comment node-name, next, previous, up -@section The Space, Rubout, B and ^L commands. - - This node's header tells you that you are now at node @samp{Help-^L}, and -that @kbd{p} would get you back to @samp{Help-P}. The node's title is -underlined; it says what the node is about (most nodes have titles). - - This is a big node and it does not all fit on your display screen. -You can tell that there is more that is not visible because you -can see the string @samp{--Top-----} rather than @samp{--All----} near -the bottom right corner of the screen. - - The @key{SPC}, @key{DEL} and @kbd{b} commands exist to allow you to ``move -around'' in a node that does not all fit on the screen at once. -@key{SPC} moves forward, to show what was below the bottom of the screen. -@key{DEL} moves backward, to show what was above the top of the screen -(there is not anything above the top until you have typed some spaces). - ->> Now try typing a @key{SPC} (afterward, type a @key{DEL} to return here). - - When you type the @key{SPC}, the two lines that were at the bottom -of the screen appear at the top, followed by more lines. @key{DEL} -takes the two lines from the top and moves them to the bottom, -@emph{usually}, but if there are not a full screen's worth of lines above -them they may not make it all the way to the bottom. - - If you type a @key{SPC} when there is no more to see, it rings the -bell and otherwise does nothing. The same goes for a @key{DEL} when -the header of the node is visible. - - If your screen is ever garbaged, you can tell Info to print it out -again by typing @kbd{C-l} (@kbd{Control-L}, that is---hold down ``Control'' and -type an @key{L} or @kbd{l}). - ->> Type @kbd{C-l} now. - - To move back to the beginning of the node you are on, you can type -a lot of @key{DEL}s. You can also type simply @kbd{b} for beginning. - ->> Try that now. (I have put in enough verbiage to make sure you are - not on the first screenful now). Then come back, typing @key{SPC} - several times. - - You have just learned a considerable number of commands. If you -want to use one but have trouble remembering which, you should type -a @key{?} which prints out a brief list of commands. When you are -finished looking at the list, make it go away by typing a @key{SPC}. - ->> Type a @key{?} now. After it finishes, type a @key{SPC}. - - (If you are using the standalone Info reader, type `l' to return here.) - - From now on, you will encounter large nodes without warning, and -will be expected to know how to use @key{SPC} and @key{DEL} to move -around in them without being told. Since not all terminals have -the same size screen, it would be impossible to warn you anyway. - ->> Now type @kbd{n} to see the description of the @kbd{m} command. - -@node Help-M, Help-Adv, Help-^L, Getting Started -@comment node-name, next, previous, up -@section Menus - -Menus and the @kbd{m} command - - With only the @kbd{n} and @kbd{p} commands for moving between nodes, nodes -are restricted to a linear sequence. Menus allow a branching -structure. A menu is a list of other nodes you can move to. It is -actually just part of the text of the node formatted specially so that -Info can interpret it. The beginning of a menu is always identified -by a line which starts with @samp{* Menu:}. A node contains a menu if and -only if it has a line in it which starts that way. The only menu you -can use at any moment is the one in the node you are in. To use a -menu in any other node, you must move to that node first. - - After the start of the menu, each line that starts with a @samp{*} -identifies one subtopic. The line usually contains a brief name -for the subtopic (followed by a @samp{:}), the name of the node that talks -about that subtopic, and optionally some further description of the -subtopic. Lines in the menu that do not start with a @samp{*} have no -special meaning---they are only for the human reader's benefit and do -not define additional subtopics. Here is an example: - -@example -* Foo: FOO's Node This tells about FOO -@end example - -The subtopic name is Foo, and the node describing it is @samp{FOO's Node}. -The rest of the line is just for the reader's Information. -[[ But this line is not a real menu item, simply because there is -no line above it which starts with @samp{* Menu:}.]] - - When you use a menu to go to another node (in a way that will be -described soon), what you specify is the subtopic name, the first -thing in the menu line. Info uses it to find the menu line, extracts -the node name from it, and goes to that node. The reason that there -is both a subtopic name and a node name is that the node name must be -meaningful to the computer and may therefore have to be ugly looking. -The subtopic name can be chosen just to be convenient for the user to -specify. Often the node name is convenient for the user to specify -and so both it and the subtopic name are the same. There is an -abbreviation for this: - -@example -* Foo:: This tells about FOO -@end example - -@noindent -This means that the subtopic name and node name are the same; they are -both @samp{Foo}. - ->> Now use @key{SPC}s to find the menu in this node, then come back to - the front with a @kbd{b}. As you see, a menu is actually visible in - its node. If you cannot find a menu in a node by looking at it, - then the node does not have a menu and the @kbd{m} command is not - available. - - The command to go to one of the subnodes is @kbd{m}---but @emph{do not do it -yet!} Before you use @kbd{m}, you must understand the difference between -commands and arguments. So far, you have learned several commands -that do not need arguments. When you type one, Info processes it and -is instantly ready for another command. The @kbd{m} command is different: -it is incomplete without the @dfn{name of the subtopic}. Once you have -typed @kbd{m}, Info tries to read the subtopic name. - - Now look for the line containing many dashes near the bottom of the -screen. There is one more line beneath that one, but usually it is -blank If it is empty, Info is ready for a command, such as @kbd{n} or @kbd{b} -or @key{SPC} or @kbd{m}. If that line contains text ending in a colon, it -mean Info is trying to read the @dfn{argument} to a command. At such -times, commands do not work, because Info tries to use them as the -argument. You must either type the argument and finish the command -you started, or type @kbd{Control-g} to cancel the command. When you have -done one of those things, the line becomes blank again. - - The command to go to a subnode via a menu is @kbd{m}. After you type -the @kbd{m}, the line at the bottom of the screen says @samp{Menu item: }. -You must then type the name of the subtopic you want, and end it with -a @key{RET}. - - You can abbreviate the subtopic name. If the abbreviation is not -unique, the first matching subtopic is chosen. Some menus put -the shortest possible abbreviation for each subtopic name in capital -letters, so you can see how much you need to type. It does not -matter whether you use upper case or lower case when you type the -subtopic. You should not put any spaces at the end, or inside of the -item name, except for one space where a space appears in the item in -the menu. - - Here is a menu to give you a chance to practice. - -* Menu: The menu starts here. - -This menu givs you three ways of going to one place, Help-FOO. - -* Foo: Help-FOO. A node you can visit for fun.@* -* Bar: Help-FOO. Strange! two ways to get to the same place.@* -* Help-FOO:: And yet another!@* - - ->> Now type just an @kbd{m} and see what happens: - - Now you are ``inside'' an @kbd{m} command. Commands cannot be used -now; the next thing you will type must be the name of a subtopic. - - You can change your mind about doing the @kbd{m} by typing Control-g. - ->> Try that now; notice the bottom line clear. - ->> Then type another @kbd{m}. - ->> Now type @samp{BAR} item name. Do not type @key{RET} yet. - - While you are typing the item name, you can use the @key{DEL} -character to cancel one character at a time if you make a mistake. - ->> Type one to cancel the @samp{R}. You could type another @samp{R} to - replace it. You do not have to, since @samp{BA} is a valid abbreviation. - ->> Now you are ready to go. Type a @key{RET}. - - After visiting Help-FOO, you should return here. - ->> Type @kbd{n} to see more commands. - -@c If a menu appears at the end of this node, remove it. -@c It is an accident of the menu updating command. - -Here is another way to get to Help-FOO, a menu. You can ignore this -if you want, or else try it (but then please come back to here). - -@menu -* Help-FOO:: -@end menu - -@node Help-FOO, , , Help-M -@comment node-name, next, previous, up -@subsection The @kbd{u} command - - Congratulations! This is the node @samp{Help-FOO}. Unlike the other -nodes you have seen, this one has an @samp{Up}: @samp{Help-M}, the node you -just came from via the @kbd{m} command. This is the usual -convention---the nodes you reach from a menu have @samp{Up} nodes that lead -back to the menu. Menus move Down in the tree, and @samp{Up} moves Up. -@samp{Previous}, on the other hand, is usually used to ``stay on the same -level but go backwards'' - - You can go back to the node @samp{Help-M} by typing the command -@kbd{u} for ``Up''. That puts you at the @emph{front} of the -node---to get back to where you were reading you have to type -some @key{SPC}s. - ->> Now type @kbd{u} to move back up to @samp{Help-M}. - -@node Help-Adv, Help-Q, Help-M, Getting Started -@comment node-name, next, previous, up -@section Some advanced Info commands - - The course is almost over, so please stick with it to the end. - - If you have been moving around to different nodes and wish to -retrace your steps, the @kbd{l} command (@kbd{l} for @dfn{last}) will -do that, one node at a time. If you have been following directions, -an @kbd{l} command now will get you back to @samp{Help-M}. Another -@kbd{l} command would undo the @kbd{u} and get you back to -@samp{Help-FOO}. Another @kbd{l} would undo the @kbd{m} and get you -back to @samp{Help-M}. - ->> Try typing three @kbd{l}'s, pausing in between to see what each - @kbd{l} does. - -Then follow directions again and you will end up back here. - - Note the difference between @kbd{l} and @kbd{p}: @kbd{l} moves to -where @emph{you} last were, whereas @kbd{p} always moves to the node -which the header says is the @samp{Previous} node (from this node, to -@samp{Help-M}). - - The @samp{d} command gets you instantly to the Directory node. -This node, which is the first one you saw when you entered Info, -has a menu which leads (directly, or indirectly through other menus), -to all the nodes that exist. - ->> Try doing a @samp{d}, then do an @kbd{l} to return here (yes, - @emph{do} return). - - Sometimes, in Info documentation, you will see a cross reference. -Cross references look like this: @xref{Help-Cross, Cross}. That is a -real, live cross reference which is named @samp{Cross} and points at -the node named @samp{Help-Cross}. - - If you wish to follow a cross reference, you must use the @samp{f} -command. The @samp{f} must be followed by the cross reference name -(in this case, @samp{Cross}). You can use @key{DEL} to edit the name, -and if you change your mind about following any reference you can use -@kbd{Control-g} to cancel the command. - - Completion is available in the @samp{f} command; you can complete among -all the cross reference names in the current node. - ->> Type @samp{f}, followed by @samp{Cross}, and a @key{RET}. - - To get a list of all the cross references in the current node, you can -type @kbd{?} after an @samp{f}. The @samp{f} continues to await a -cross reference name even after printing the list, so if you do not -actually want to follow a reference you should type a @kbd{Control-g} -to cancel the @samp{f}. - ->> Type "f?" to get a list of the footnotes in this node. Then type a - @kbd{Control-g} and see how the @samp{f} gives up. - ->> Now type @kbd{n} to see the last node of the course. - -@c If a menu appears at the end of this node, remove it. -@c It is an accident of the menu updating command. - -@node Help-Cross, , , Help-Adv -@comment node-name, next, previous, up -@unnumberedsubsec The node reached by the cross reference in Info - - This is the node reached by the cross reference named @samp{Cross}. - - While this node is specifically intended to be reached by a cross -reference, most cross references lead to nodes that ``belong'' -someplace else far away in the structure of Info. So you cannot expect -the footnote to have a @samp{Next}, @samp{Previous} or @samp{Up} pointing back to -where you came from. In general, the @kbd{l} (el) command is the only -way to get back there. - ->> Type @kbd{l} to return to the node where the cross reference was. - -@node Help-Q, , Help-Adv, Getting Started -@comment node-name, next, previous, up -@section Quitting Info - - To get out of Info, back to what you were doing before, type @kbd{q} -for @dfn{Quit}. - - This is the end of the course on using Info. There are some other -commands that are not essential or are meant for experienced users; -they are useful, and you can find them by looking in the directory for -documentation on Info. Finding them will be a good exercise in using -Info in the usual manner. - ->> Type @samp{d} to go to the Info directory node; then type - @samp{mInfo} and @key{RET}, to get to the node about Info - and see what other help is available. - -@node Advanced Info, Create an Info File, Getting Started, Top -@comment node-name, next, previous, up -@chapter Info for Experts - -This chapter describes various advanced Info commands, and how to write -an Info as distinct from a Texinfo file. (However, in most cases, writing a -Texinfo file is better, since you can use it @emph{both} to generate an -Info file and to make a printed manual. @xref{Top,, Overview of -Texinfo, texinfo, Texinfo: The GNU Documentation Format}.) - -@menu -* Expert:: Advanced Info commands: g, s, e, and 1 - 5. -* Add:: Describes how to add new nodes to the hierarchy. - Also tells what nodes look like. -* Menus:: How to add to or create menus in Info nodes. -* Cross-refs:: How to add cross-references to Info nodes. -* Tags:: How to make tag tables for Info files. -* Checking:: Checking an Info File -@end menu - -@node Expert, Add, , Advanced Info -@comment node-name, next, previous, up -@section Advanced Info Commands - -@kbd{g}, @kbd{s}, @kbd{1}, -- @kbd{5}, and @kbd{e} - -If you know a node's name, you can go there by typing @kbd{g}, the -name, and @key{RET}. Thus, @kbd{gTop@key{RET}} would go to the node -called @samp{Top} in this file (its directory node). -@kbd{gExpert@key{RET}} would come back here. - -Unlike @kbd{m}, @kbd{g} does not allow the use of abbreviations. - -To go to a node in another file, you can include the filename in the -node name by putting it at the front, in parentheses. Thus, -@kbd{g(dir)Top@key{RET}} would go to the Info Directory node, which is -node @samp{Top} in the file @file{dir}. - -The node name @samp{*} specifies the whole file. So you can look at -all of the current file by typing @kbd{g*@key{RET}} or all of any -other file with @kbd{g(FILENAME)@key{RET}}. - -The @kbd{s} command allows you to search a whole file for a string. -It switches to the next node if and when that is necessary. You -type @kbd{s} followed by the string to search for, terminated by -@key{RET}. To search for the same string again, just @kbd{s} followed -by @key{RET} will do. The file's nodes are scanned in the order -they are in in the file, which has no necessary relationship to the -order that they may be in in the tree structure of menus and @samp{next} pointers. -But normally the two orders are not very different. In any case, -you can always do a @kbd{b} to find out what node you have reached, if -the header is not visible (this can happen, because @kbd{s} puts your -cursor at the occurrence of the string, not at the beginning of the -node). - -If you grudge the system each character of type-in it requires, you -might like to use the commands @kbd{1}, @kbd{2}, @kbd{3}, @kbd{4}, and -@kbd{5}. They are short for the @kbd{m} command together with an -argument. "1", "2", "3", "4", and "5". @kbd{1} goes through the -first item in the current node's menu; @kbd{2} goes through the second -item, etc. Note that numbers larger than 5 are not allowed. If the -item you want is that far down, you are better off using an -abbreviation for its name than counting. - -The Info command @kbd{e} changes from Info mode to an ordinary -Emacs editing mode, so that you can edit the text of the current node. -Type @kbd{C-c C-c} to switch back to Info. The @kbd{e} command is allowed -only if the variable @code{Info-enable-edit} is non-@code{nil}. - -@node Add, Menus, Expert, Advanced Info -@comment node-name, next, previous, up -@section Adding a new node to Info - -To add a new topic to the list in the directory, you must: - -@enumerate -@item -Create a node, in some file, to document that topic. - -@item -Put that topic in the menu in the directory. @xref{Menus, Menu}. -@end enumerate - - The new node can live in an existing documentation file, or in a new -one. It must have a @key{^_} character before it (invisible to the -user; this node has one but you cannot see it), and it ends with either -a @key{^_}, a @key{^L}, or the end of file. Note: If you put in a -@key{^L} to end a new node, be sure that there is a @key{^_} after it -to start the next one, since @key{^L} cannot @emph{start} a node. -Also, a nicer way to make a node boundary be a page boundary as well -is to put a @key{^L} @emph{right after} the @key{^_}. - - The @key{^_} starting a node must be followed by a newline or a -@key{^L} newline, after which comes the node's header line. The -header line must give the node's name (by which Info finds it), -and state the names of the @samp{Next}, @samp{Previous}, and @samp{Up} nodes (if -there are any). As you can see, this node's @samp{Up} node is the node -@samp{Top}, which points at all the documentation for Info. The @samp{Next} -node is @samp{Menus}. - - The keywords @dfn{Node}, @dfn{Previous}, @dfn{Up} and @dfn{Next}, -may appear in any order, anywhere in the header line, but the -recommended order is the one in this sentence. Each keyword must be -followed by a colon, spaces and tabs, and then the appropriate name. -The name may be terminated with a tab, a comma, or a newline. A space -does not end it; node names may contain spaces. The case of letters -in the names is insignificant. - - A node name has two forms. A node in the current file is named by -what appears after the @samp{Node: } in that node's first line. For -example, this node's name is @samp{Add}. A node in another file is -named by @samp{(@var{filename})@var{node-within-file}}, as in -@samp{(info)Add} for this node. If the file name is relative, it is -taken starting from the standard Info file directory of your site. -The name @samp{(@var{filename})Top} can be abbreviated to just -@samp{(@var{filename})}. By convention, the name @samp{Top} is used for -the ``highest'' node in any single file---the node whose @samp{Up} points -out of the file. The Directory node is @file{(dir)}. The @samp{Top} node -of a document file listed in the Directory should have an @samp{Up: -(dir)} in it. - - The node name @kbd{*} is special: it refers to the entire file. -Thus, @kbd{g*} shows you the whole current file. The use of the -node @kbd{*} is to make it possible to make old-fashioned, -unstructured files into nodes of the tree. - - The @samp{Node:} name, in which a node states its own name, must not -contain a filename, since Info when searching for a node does not -expect one to be there. The @samp{Next}, @samp{Previous} and @samp{Up} names may -contain them. In this node, since the @samp{Up} node is in the same file, -it was not necessary to use one. - - Note that the nodes in this file have a file name in the header -line. The file names are ignored by Info, but they serve as comments -to help identify the node for the user. - -@node Menus, Cross-refs, Add, Advanced Info -@comment node-name, next, previous, up -@section How to Create Menus - - Any node in the Info hierarchy may have a @dfn{menu}---a list of subnodes. -The @kbd{m} command searches the current node's menu for the topic which it -reads from the terminal. - - A menu begins with a line starting with @samp{* Menu:}. The rest of the -line is a comment. After the starting line, every line that begins -with a @samp{* } lists a single topic. The name of the topic--the -argument that the user must give to the @kbd{m} command to select this -topic---comes right after the star and space, and is followed by a -colon, spaces and tabs, and the name of the node which discusses that -topic. The node name, like node names following @samp{Next}, @samp{Previous} -and @samp{Up}, may be terminated with a tab, comma, or newline; it may also -be terminated with a period. - - If the node name and topic name are the same, than rather than -giving the name twice, the abbreviation @samp{* NAME::} may be used -(and should be used, whenever possible, as it reduces the visual -clutter in the menu). - - It is considerate to choose the topic names so that they differ -from each other very near the beginning---this allows the user to type -short abbreviations. In a long menu, it is a good idea to capitalize -the beginning of each item name which is the minimum acceptable -abbreviation for it (a long menu is more than 5 or so entries). - - The nodes listed in a node's menu are called its ``subnodes'', and -it is their ``superior''. They should each have an @samp{Up:} pointing at -the superior. It is often useful to arrange all or most of the -subnodes in a sequence of @samp{Next} and @samp{Previous} pointers so that someone who -wants to see them all need not keep revisiting the Menu. - - The Info Directory is simply the menu of the node @samp{(dir)Top}---that -is, node @samp{Top} in file @file{.../info/dir}. You can put new entries -in that menu just like any other menu. The Info Directory is @emph{not} the -same as the file directory called @file{info}. It happens that many of -Info's files live on that file directory, but they do not have to; and -files on that directory are not automatically listed in the Info -Directory node. - - Also, although the Info node graph is claimed to be a ``hierarchy'', -in fact it can be @emph{any} directed graph. Shared structures and -pointer cycles are perfectly possible, and can be used if they are -appropriate to the meaning to be expressed. There is no need for all -the nodes in a file to form a connected structure. In fact, this file -has two connected components. You are in one of them, which is under -the node @samp{Top}; the other contains the node @samp{Help} which the -@kbd{h} command goes to. In fact, since there is no garbage -collector, nothing terrible happens if a substructure is not pointed -to, but such a substructure is rather useless since nobody can -ever find out that it exists. - -@node Cross-refs, Tags, Menus, Advanced Info -@comment node-name, next, previous, up -@section Creating Cross References - - A cross reference can be placed anywhere in the text, unlike a menu -item which must go at the front of a line. A cross reference looks -like a menu item except that it has @samp{*note} instead of @kbd{*}. -It @emph{cannot} be terminated by a @samp{)}, because @samp{)}'s are -so often part of node names. If you wish to enclose a cross reference -in parentheses, terminate it with a period first. Here are two -examples of cross references pointers: - -@example -*Note details: commands. (See *note 3: Full Proof.) -@end example - -They are just examples. The places they ``lead to'' do not really exist! - -@node Tags, Checking, Cross-refs, Advanced Info -@comment node-name, next, previous, up -@section Tag Tables for Info Files - - You can speed up the access to nodes of a large Info file by giving -it a tag table. Unlike the tag table for a program, the tag table for -an Info file lives inside the file itself and is used -automatically whenever Info reads in the file. - - To make a tag table, go to a node in the file using Emacs Info mode and type -@kbd{M-x Info-tagify}. Then you must use @kbd{C-x C-s} to save the -file. - - Once the Info file has a tag table, you must make certain it is up -to date. If, as a result of deletion of text, any node moves back -more than a thousand characters in the file from the position -recorded in the tag table, Info will no longer be able to find that -node. To update the tag table, use the @code{Info-tagify} command again. - - An Info file tag table appears at the end of the file and looks like -this: - -@example -^_ -Tag Table: -File: info, Node: Cross-refs^?21419 -File: info, Node: Tags^?22145 -^_ -End Tag Table -@end example - -@noindent -Note that it contains one line per node, and this line contains -the beginning of the node's header (ending just after the node name), -a @key{DEL} character, and the character position in the file of the -beginning of the node. - -@node Checking, , Tags, Advanced Info -@comment node-name, next, previous, up -@section Checking an Info File - - When creating an Info file, it is easy to forget the name of a node -when you are making a pointer to it from another node. If you put in -the wrong name for a node, this is not detected until someone -tries to go through the pointer using Info. Verification of the Info -file is an automatic process which checks all pointers to nodes and -reports any pointers which are invalid. Every @samp{Next}, @samp{Previous}, and -@samp{Up} is checked, as is every menu item and every cross reference. In -addition, any @samp{Next} which does not have a @samp{Previous} pointing back is -reported. Only pointers within the file are checked, because checking -pointers to other files would be terribly slow. But those are usually -few. - - To check an Info file, do @kbd{M-x Info-validate} while looking at -any node of the file with Emacs Info mode. - -@node Create an Info File, , Advanced Info, Top -@comment node-name, next, previous, up -@chapter Creating an Info File from a Makeinfo file - -@code{makeinfo} is a utility that converts a Texinfo file into an Info -file; @code{texinfo-format-region} and @code{texinfo-format-buffer} are -GNU Emacs functions that do the same. - -@xref{Create an Info File, , Creating an Info File, texinfo, the Texinfo -Manual}, to learn how to create an Info file from a Texinfo file. - -@xref{Top,, Overview of Texinfo, texinfo, Texinfo: The GNU Documentation -Format}, to learn how to write a Texinfo file. - -@bye - diff --git a/gnu/usr.bin/texinfo/info-files/texi-files/makeinfo.texi b/gnu/usr.bin/texinfo/info-files/texi-files/makeinfo.texi deleted file mode 100644 index 21ee2d3c869f..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi-files/makeinfo.texi +++ /dev/null @@ -1,285 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@comment %**start of header -@setfilename makeinfo.info -@set VERSION 1.51 -@paragraphindent none -@comment %**start of header - -@ifinfo -This file is an extract from the @cite{Texinfo} manual.@* -It documents @code{makeinfo}, a program that converts Texinfo -files into Info files. - -Copyright (C) 1992, 1993 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Free Software Foundation. -@end ifinfo - -@titlepage -@title Makeinfo -@author Brian J. Fox and Robert J. Chassell - -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1992, 1993 Free Software Foundation, Inc. - - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Free Software Foundation. -@end titlepage - -@ifinfo -@node Top, What is makeinfo, (dir), (dir) -@unnumbered @code{makeinfo} - -This file documents the use of the @code{makeinfo} program, versions -@value{VERSION} and later. It is an extract from the @cite{Texinfo} manual. -@end ifinfo - -@menu -* What is makeinfo:: -@end menu - -@node What is makeinfo, , Top, Top -@chapter What is @code{makeinfo}? - -@iftex -This file documents the use of the @code{makeinfo} program, versions -@value{VERSION} and later. It is an extract from the @cite{Texinfo} manual. -@end iftex - -@code{makeinfo} is a program for converting @dfn{Texinfo} files into @dfn{Info} -files. Texinfo is a documentation system that uses a single source file to -produce both on-line information and printed output. - -You can read the on-line information using Info; type @code{info} to -learn about Info. -@ifinfo -@xref{Top, Texinfo, Overview of Texinfo, texinfo.texi, Texinfo}, -@end ifinfo -@iftex -See the @cite{Texinfo} manual, -@end iftex -to learn about the Texinfo documentation system. - -@menu -* Formatting Control:: -* Options:: -* Pointer Validation:: -@end menu - -@node Formatting Control, Options, , What is makeinfo -@section Controlling Paragraph Formats - -In general, @code{makeinfo} @dfn{fills} the paragraphs that it outputs -to an Info file. Filling is the process of breaking and connecting -lines so that lines are the same length as or shorter than the number -specified as the fill column. Lines are broken between words. With -@code{makeinfo}, you can control: - -@itemize @bullet -@item -The width of each paragraph (the @dfn{fill-column}). -@item -The amount of indentation that the first line of -each paragraph receives (the @dfn{paragraph-indentation}). -@end itemize - -@node Options, Pointer Validation, Formatting Control, What is makeinfo -@section Command Line Options - -The following command line options are available for @code{makeinfo}. - -@need 100 -@table @code -@item -D @var{var} -Cause @var{var} to be defined. This is equivalent to -@code{@@set @var{var}} in the Texinfo file. - -@need 150 -@item --error-limit @var{limit} -Set the maximum number of errors that @code{makeinfo} will report -before exiting (on the assumption that continuing would be useless). -The default number of errors that can be reported before -@code{makeinfo} gives up is 100.@refill - -@need 150 -@item --fill-column @var{width} -Specify the maximum number of columns in a line; this is the right-hand -edge of a line. Paragraphs that are filled will be filled to this -width. The default value for @code{fill-column} is 72. -@refill - -@item --footnote-style @var{style} -Set the footnote style to @var{style}, either @samp{end} for the end -node style or @samp{separate} for the separate node style. The value -set by this option overrides the value set in a Texinfo file by an -@code{@@footnotestyle} command. When the footnote style is -@samp{separate}, @code{makeinfo} makes a new node containing the -footnotes found in the current node. When the footnote style is -@samp{end}, @code{makeinfo} places the footnote references at the end -of the current node.@refill - -@need 150 -@item -I @var{dir} -Add @code{dir} to the directory search list for finding files that are -included using the @code{@@include} command. By default, -@code{makeinfo} searches only the current directory. - -@need 150 -@item --no-headers -Do not include menus or node lines in the output. This results in an -@sc{ascii} file that you cannot read in Info since it does not contain -the requisite nodes or menus; but you can print such a file in a -single, typewriter-like font and produce acceptable output. - -@need 150 -@item --no-split -Suppress the splitting stage of @code{makeinfo}. Normally, large -output files (where the size is greater than 70k bytes) are split into -smaller subfiles, each one approximately 50k bytes. If you specify -@samp{--no-split}, @code{makeinfo} will not split up the output -file.@refill - -@need 100 -@item --no-pointer-validate -@item --no-validate -Suppress the pointer-validation phase of @code{makeinfo}. Normally, -after a Texinfo file is processed, some consistency checks are made to -ensure that cross references can be resolved, etc. -@xref{Pointer Validation}.@refill - -@need 150 -@item --no-warn -Suppress the output of warning messages. This does @emph{not} -suppress the output of error messages, only warnings. You might -want this if the file you are creating has examples of Texinfo cross -references within it, and the nodes that are referenced do not actually -exist.@refill - -@item --no-number-footnotes -Supress automatic footnote numbering. By default, @code{makeinfo} -numbers each footnote sequentially in a single node, resetting the -current footnote number to 1 at the start of each node. - -@need 150 -@item --output @var{file} -@itemx -o @var{file} -Specify that the output should be directed to @var{file} and not to the -file name specified in the @code{@@setfilename} command found in the Texinfo -source. @var{file} can be the special token @samp{-}, which specifies -standard output. - -@need 150 -@item --paragraph-indent @var{indent} -Set the paragraph indentation style to @var{indent}. The value set by -this option overrides the value set in a Texinfo file by an -@code{@@paragraphindent} command. The value of @var{indent} is -interpreted as follows:@refill - -@itemize @bullet -@item -If the value of @var{indent} is @samp{asis}, do not change the -existing indentation at the starts of paragraphs.@refill - -@item -If the value of @var{indent} is zero, delete any existing -indentation.@refill - -@item -If the value of @var{indent} is greater than zero, indent each -paragraph by that number of spaces.@refill -@end itemize - -@need 100 -@item --reference-limit @var{limit} -Set the value of the number of references to a node that -@code{makeinfo} will make without reporting a warning. If a node has more -than this number of references in it, @code{makeinfo} will make the -references but also report a warning.@refill - -@need 150 -@item -U @var{var} -Cause @var{var} to be undefined. This is equivalent to -@code{@@clear @var{var}} in the Texinfo file. - -@need 100 -@item --verbose -Cause @code{makeinfo} to display messages saying what it is doing. -Normally, @code{makeinfo} only outputs messages if there are errors or -warnings.@refill - -@need 100 -@item --version -Report the version number of this copy of @code{makeinfo}.@refill -@end table - -@node Pointer Validation, , Options, What is makeinfo -@section Pointer Validation -@cindex Pointer validation with @code{makeinfo} -@cindex Validation of pointers - -If you do not suppress pointer-validation (by using the -@samp{--no-pointer-validation} option), @code{makeinfo} -will check the validity of the final Info file. Mostly, -this means ensuring that nodes you have referenced -really exist. Here is a complete list of what is -checked:@refill - -@enumerate -@item -If a `Next', `Previous', or `Up' node reference is a reference to a -node in the current file and is not an external reference such as to -@file{(dir)}, then the referenced node must exist.@refill - -@item -In every node, if the `Previous' node is different from the `Up' node, -then the `Previous' node must also be pointed to by a `Next' node.@refill - -@item -Every node except the `Top' node must have an `Up' pointer.@refill - -@item -The node referenced by an `Up' pointer must contain a reference to the -current node in some manner other than through a `Next' reference. -This includes menu entries and cross references.@refill - -@item -If the `Next' reference of a node is not the same as the `Next' reference -of the `Up' reference, then the node referenced by the `Next' pointer -must have a `Previous' pointer that points back to the current node. -This rule allows the last node in a section to point to the first node -of the next chapter.@refill -@end enumerate - -@bye diff --git a/gnu/usr.bin/texinfo/info-files/texi-files/texi.texi b/gnu/usr.bin/texinfo/info-files/texi-files/texi.texi deleted file mode 100644 index f77f66245a3b..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi-files/texi.texi +++ /dev/null @@ -1,15626 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@comment %**start of header -@setfilename texi.info -@settitle Texinfo @value{edition} -@syncodeindex vr fn -@c footnotestyle separate -@c paragraphindent 2 -@smallbook -@comment %**end of header - -@ignore -@ifinfo -@format -START-INFO-DIR-ENTRY -* Texinfo: (texi.info). The documentation format for the GNU Project. -END-INFO-DIR-ENTRY -@end format -@end ifinfo -@end ignore - -@c Set smallbook if printing in smallbook format so the example of the -@c smallbook font is actually written using smallbook; in bigbook, a kludge -@c is used for TeX output. -@c set smallbook -@clear smallbook - -@set edition 2.18 -@set update-date 26 March 1993 -@set update-month March 1993 - -@c Experiment with smaller amounts of whitespace between chapters -@c and sections. -@tex -\global\chapheadingskip = 15pt plus 4pt minus 2pt -\global\secheadingskip = 12pt plus 3pt minus 2pt -\global\subsecheadingskip = 9pt plus 2pt minus 2pt -@end tex - -@c Experiment with smaller amounts of whitespace between paragraphs in -@c the 8.5 by 11 inch format. -@ifclear smallbook -@tex -\global\parskip 6pt plus 1pt -@end tex -@end ifclear - -@finalout - -@c Currently undocumented commands, 24 March 1993: -@c See documentation in `texinfmt.el' file. -@c -@c raisesections (Two useful commands.) -@c lowersections -@c nwnode (Same as node, but no warnings; for `makeinfo'.) -@c math (Unsatisfactory TeX definition; no processing for Info.) -@c definfoenclose (For ifinfo text only; not supported by `makeinfo'; -@c each instance requires a corresponding TeX definition.) - -@ifinfo -This file documents Texinfo, a documentation system that uses a single -source file to produce both on-line information and a printed manual. - -Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - -This is the second edition of the Texinfo documentation,@* -and is consistent with version 2 of @file{texinfo.tex}. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Free Software Foundation. -@end ifinfo - -@setchapternewpage odd -@titlepage -@c use the new format for titles -@title Texinfo -@subtitle The GNU Documentation Format -@subtitle Edition @value{edition}, for Texinfo Version Two -@subtitle @value{update-month} - -@author by Robert J. Chassell and Richard M. Stallman - -@comment Include the Distribution inside the titlepage so -@c that headings are turned off. - -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1988, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. - -@sp 2 -This is the second edition of the Texinfo documentation,@* -and is consistent with version 2 of @file{texinfo.tex}. -@sp 2 - -Published by the Free Software Foundation @* -675 Massachusetts Avenue, @* -Cambridge, MA 02139 USA @* -Printed copies are available for $15 each.@* -ISBN-1882114-12-4 - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Free Software Foundation. -@sp 2 -Cover art by Etienne Suvasa. -@end titlepage - -@ifinfo -@node Top, Copying, (dir), (dir) -@top Texinfo - -Texinfo is a documentation system that uses a single source file to -produce both on-line information and printed output.@refill - -The first part of this master menu lists the major nodes in this Info -document, including the @@-command and concept indices. The rest of -the menu lists all the lower level nodes in the document.@refill - -This is Edition @value{edition} of the Texinfo documentation, -@w{@value{update-date},} for Texinfo Version 2. -@end ifinfo - -@c Here is a spare copy of the chapter menu entry descriptions, -@c in case they are accidently deleted -@ignore -Your rights. -Texinfo in brief. -How to use Texinfo mode. -What is at the beginning of a Texinfo file? -What is at the end of a Texinfo file? -How to create chapters, sections, subsections, - appendices, and other parts. -How to provide structure for a document. -How to write nodes. -How to write menus. -How to write cross references. -How to mark words and phrases as code, - keyboard input, meta-syntactic - variables, and the like. -How to write quotations, examples, etc. -How to write lists and tables. -How to create indices. -How to insert @@-signs, braces, etc. -How to indicate results of evaluation, - expansion of macros, errors, etc. -How to force and prevent line and page breaks. -How to describe functions and the like in a uniform manner. -How to write footnotes. -How to specify text for either @TeX{} or Info. -How to print hardcopy. -How to create an Info file. -How to install an Info file -A list of all the Texinfo @@-commands. -Hints on how to write a Texinfo document. -A sample Texinfo file to look at. -Tell readers they have the right to copy - and distribute. -How to incorporate other Texinfo files. -How to write page headings and footings. -How to find formatting mistakes. -All about paragraph refilling. -A description of @@-Command syntax. -Texinfo second edition features. -A menu containing commands and variables. -A menu covering many topics. -@end ignore - -@menu -* Copying:: Your rights. -* Overview:: Texinfo in brief. -* Texinfo Mode:: How to use Texinfo mode. -* Beginning a File:: What is at the beginning of a Texinfo file? -* Ending a File:: What is at the end of a Texinfo file? -* Structuring:: How to create chapters, sections, subsections, - appendices, and other parts. -* Nodes:: How to write nodes. -* Menus:: How to write menus. -* Cross References:: How to write cross references. -* Marking Text:: How to mark words and phrases as code, - keyboard input, meta-syntactic - variables, and the like. -* Quotations and Examples:: How to write quotations, examples, etc. -* Lists and Tables:: How to write lists and tables. -* Indices:: How to create indices. -* Insertions:: How to insert @@-signs, braces, etc. -* Glyphs:: How to indicate results of evaluation, - expansion of macros, errors, etc. -* Breaks:: How to force and prevent line and page breaks. -* Definition Commands:: How to describe functions and the like - in a uniform manner. -* Footnotes:: How to write footnotes. -* Conditionals:: How to specify text for either @TeX{} or Info. -* Format/Print Hardcopy:: How to convert a Texinfo file to a file - for printing and how to print that file. -* Create an Info File:: Convert a Texinfo file into an Info file. -* Install an Info File:: Make an Info file accessible to users. -* Command List:: All the Texinfo @@-commands. -* Tips:: Hints on how to write a Texinfo document. -* Sample Texinfo File:: A sample Texinfo file to look at. -* Sample Permissions:: Tell readers they have the right to copy - and distribute. -* Include Files:: How to incorporate other Texinfo files. -* Headings:: How to write page headings and footings. -* Catching Mistakes:: How to find formatting mistakes. -* Refilling Paragraphs:: All about paragraph refilling. -* Command Syntax:: A description of @@-Command syntax. -* Obtaining TeX:: How to Obtain @TeX{}. -* New Features:: Texinfo second edition features. -* Command and Variable Index:: A menu containing commands and variables. -* Concept Index:: A menu covering many topics. - - --- The Detailed Node Listing --- - -Overview of Texinfo - -* Using Texinfo:: Create a conventional printed book - or an Info file. -* Info Files:: What is an Info file? -* Printed Books:: Characteristics of a printed book or manual. -* Formatting Commands:: @@-commands are used for formatting. -* Conventions:: General rules for writing a Texinfo file. -* Comments:: How to write comments and mark regions that - the formatting commands will ignore. -* Minimum:: What a Texinfo file must have. -* Six Parts:: Usually, a Texinfo file has six parts. -* Short Sample:: A short sample Texinfo file. -* Acknowledgements:: - -Using Texinfo Mode - -* Texinfo Mode Overview:: How Texinfo mode can help you. -* Emacs Editing:: Texinfo mode adds to GNU Emacs' general - purpose editing features. -* Inserting:: How to insert frequently used @@-commands. -* Showing the Structure:: How to show the structure of a file. -* Updating Nodes and Menus:: How to update or create new nodes and menus. -* Info Formatting:: How to format for Info. -* Printing:: How to format and print part or all of a file. -* Texinfo Mode Summary:: Summary of all the Texinfo mode commands. - -Updating Nodes and Menus - -* Updating Commands:: Five major updating commands. -* Updating Requirements:: How to structure a Texinfo file for - using the updating command. -* Other Updating Commands:: How to indent descriptions, insert - missing nodes lines, and update - nodes in sequence. - -Beginning a Texinfo File - -* Four Parts:: Four parts begin a Texinfo file. -* Sample Beginning:: Here is a sample beginning for a Texinfo file. -* Header:: The very beginning of a Texinfo file. -* Info Summary and Permissions:: Summary and copying permissions for Info. -* Titlepage & Copyright Page:: Creating the title and copyright pages. -* The Top Node:: Creating the `Top' node and master menu. -* Software Copying Permissions:: Ensure that you and others continue to - have the right to use and share software. - -The Texinfo File Header - -* First Line:: The first line of a Texinfo file. -* Start of Header:: Formatting a region requires this. -* setfilename:: Tell Info the name of the Info file. -* settitle:: Create a title for the printed work. -* setchapternewpage:: Start chapters on right-hand pages. -* paragraphindent:: An option to specify paragraph indentation. -* End of Header:: Formatting a region requires this. - -The Title and Copyright Pages - -* titlepage:: Create a title for the printed document. -* titlefont center sp:: The @code{@@titlefont}, @code{@@center}, - and @code{@@sp} commands. -* title subtitle author:: The @code{@@title}, @code{@@subtitle}, - and @code{@@author} commands. -* Copyright & Permissions:: How to write the copyright notice and - include copying permissions. -* end titlepage:: Turn on page headings after the title and - copyright pages. -* headings on off:: An option for turning headings on and off - and double or single sided printing. - -The `Top' Node and Master Menu - -* Title of Top Node:: Sketch what the file is about. -* Master Menu Parts:: A master menu has three or more parts. - -Ending a Texinfo File - -* Printing Indices & Menus:: How to print an index in hardcopy and - generate index menus in Info. -* Contents:: How to create a table of contents. -* File End:: How to mark the end of a file. - -Chapter Structuring - -* Tree Structuring:: A manual is like an upside down tree @dots{} -* Structuring Command Types:: How to divide a manual into parts. -* makeinfo top:: The @code{@@top} command, part of the `Top' node. -* chapter:: -* unnumbered & appendix:: -* majorheading & chapheading:: -* section:: -* unnumberedsec appendixsec heading:: -* subsection:: -* unnumberedsubsec appendixsubsec subheading:: -* subsubsection:: Commands for the lowest level sections. - -Nodes - -* Two Paths:: Different commands to structure - Info output and printed output. -* Node Menu Illustration:: A diagram, and sample nodes and menus. -* node:: How to write a node, in detail. -* makeinfo Pointer Creation:: How to create node pointers with @code{makeinfo}. - -The @code{@@node} Command - -* Node Names:: How to choose node and pointer names. -* Writing a Node:: How to write an @code{@@node} line. -* Node Line Tips:: Keep names short. -* Node Line Requirements:: Keep names unique, without @@-commands. -* First Node:: How to write a `Top' node. -* makeinfo top command:: How to use the @code{@@top} command. -* Top Node Summary:: Write a brief description for readers. - -Menus - -* Menu Location:: Put a menu in a short node. -* Writing a Menu:: What is a menu? -* Menu Parts:: A menu entry has three parts. -* Less Cluttered Menu Entry:: Two part menu entry. -* Menu Example:: Two and three part menu entries. -* Other Info Files:: How to refer to a different Info file. - -Cross References - -* References:: What cross references are for. -* Cross Reference Commands:: A summary of the different commands. -* Cross Reference Parts:: A cross reference has several parts. -* xref:: Begin a reference with `See' @dots{} -* Top Node Naming:: How to refer to the beginning of another file. -* ref:: A reference for the last part of a sentence. -* pxref:: How to write a parenthetical cross reference. -* inforef:: How to refer to an Info-only file. - -@code{@@xref} - -* Reference Syntax:: What a reference looks like and requires. -* One Argument:: @code{@@xref} with one argument. -* Two Arguments:: @code{@@xref} with two arguments. -* Three Arguments:: @code{@@xref} with three arguments. -* Four and Five Arguments:: @code{@@xref} with four and five arguments. - -Marking Words and Phrases - -* Indicating:: How to indicate definitions, files, etc. -* Emphasis:: How to emphasize text. - -Indicating Definitions, Commands, etc. - -* Useful Highlighting:: Highlighting provides useful information. -* code:: How to indicate code. -* kbd:: How to show keyboard input. -* key:: How to specify keys. -* samp:: How to show a literal sequence of characters. -* var:: How to indicate a metasyntactic variable. -* file:: How to indicate the name of a file. -* dfn:: How to specify a definition. -* cite:: How to refer to a book that is not in Info. - -Emphasizing Text - -* emph & strong:: How to emphasize text in Texinfo. -* Smallcaps:: How to use the small caps font. -* Fonts:: Various font commands for printed output. - -Quotations and Examples - -* Block Enclosing Commands:: Use different constructs for - different purposes. -* quotation:: How to write a quotation. -* example:: How to write an example in a fixed-width font. -* noindent:: How to prevent paragraph indentation. -* Lisp Example:: How to illustrate Lisp code. -* smallexample & smalllisp:: Forms for the @code{@@smallbook} option. -* display:: How to write an example in the current font. -* format:: How to write an example that does not narrow - the margins. -* exdent:: How to undo the indentation of a line. -* flushleft & flushright:: How to push text flushleft or flushright. -* cartouche:: How to draw cartouches around examples. - -Making Lists and Tables - -* Introducing Lists:: Texinfo formats lists for you. -* itemize:: How to construct a simple list. -* enumerate:: How to construct a numbered list. -* Two-column Tables:: How to construct a two-column table. - -Making a Two-column Table - -* table:: How to construct a two-column table. -* ftable vtable:: How to construct a two-column table - with automatic indexing. -* itemx:: How to put more entries in the first column. - -Creating Indices - -* Index Entries:: Choose different words for index entries. -* Predefined Indices:: Use different indices for different kinds - of entry. -* Indexing Commands:: How to make an index entry. -* Combining Indices:: How to combine indices. -* New Indices:: How to define your own indices. - -Combining Indices - -* syncodeindex:: How to merge two indices, using @code{@@code} - font for the merged-from index. -* synindex:: How to merge two indices, using the - default font of the merged-to index. - -Special Insertions - -* Braces Atsigns Periods:: How to insert braces, @samp{@@} and periods. -* dmn:: How to format a dimension. -* Dots Bullets:: How to insert dots and bullets. -* TeX and copyright:: How to insert the @TeX{} logo - and the copyright symbol. -* minus:: How to insert a minus sign. - -Inserting @samp{@@}, Braces, and Periods - -* Inserting An Atsign:: -* Inserting Braces:: How to insert @samp{@{} and @samp{@}} -* Controlling Spacing:: How to insert the right amount of space - after punctuation within a sentence. - -Inserting Ellipsis, Dots, and Bullets - -* dots:: How to insert dots @dots{} -* bullet:: How to insert a bullet. - -Inserting @TeX{} and the Copyright Symbol - -* tex:: How to insert the @TeX{} logo. -* copyright symbol:: How to use @code{@@copyright}@{@}. - -Glyphs for Examples - -* Glyphs Summary:: -* result:: How to show the result of expression. -* expansion:: How to indicate an expansion. -* Print Glyph:: How to indicate printed output. -* Error Glyph:: How to indicate an error message. -* Equivalence:: How to indicate equivalence. -* Point Glyph:: How to indicate the location of point. - -Making and Preventing Breaks - -* Break Commands:: Cause and prevent splits. -* Line Breaks:: How to force a single line to use two lines. -* w:: How to prevent unwanted line breaks. -* sp:: How to insert blank lines. -* page:: How to force the start of a new page. -* group:: How to prevent unwanted page breaks. -* need:: Another way to prevent unwanted page breaks. - -Definition Commands - -* Def Cmd Template:: How to structure a description using a - definition command. -* Optional Arguments:: How to handle optional and repeated arguments. -* deffnx:: How to group two or more `first' lines. -* Def Cmds in Detail:: All the definition commands. -* Def Cmd Conventions:: Conventions for writing definitions. -* Sample Function Definition:: - -The Definition Commands - -* Functions Commands:: Commands for functions and similar entities. -* Variables Commands:: Commands for variables and similar entities. -* Typed Functions:: Commands for functions in typed languages. -* Typed Variables:: Commands for variables in typed languages. -* Abstract Objects:: Commands for object-oriented programming. -* Data Types:: The definition command for data types. - -Conditionally Visible Text - -* Conditional Commands:: How to specify text for Info or @TeX{}. -* Using Ordinary TeX Commands:: You can use any and all @TeX{} commands. -* set clear value:: How to designate which text to format (for - both Info and @TeX{}); and how to set a - flag to a string that you can insert. - -@code{@@set}, @code{@@clear}, and @code{@@value} - -* ifset ifclear:: Format a region if a flag is set. -* value:: Replace a flag with a string. -* value Example:: An easy way to update edition information. - -Format and Print Hardcopy - -* Use TeX:: Use @TeX{} to format for hardcopy. -* Shell Format & Print:: How to format and print a hardcopy manual - with shell commands. -* Within Emacs:: How to format and print from an Emacs shell. -* Texinfo Mode Printing:: How to format and print in Texinfo mode. -* Compile-Command:: How to print using Emacs's compile command. -* Requirements Summary:: @TeX{} formatting requirements summary. -* Preparing for TeX:: What you need to do to use @TeX{}. -* Overfull hboxes:: What are and what to do with overfull hboxes. -* smallbook:: How to print small format books and manuals. -* A4 Paper:: How to print on European A4 paper. -* Cropmarks and Magnification:: How to print marks to indicate the size - of pages and how to print scaled up output. - -Creating an Info File - -* makeinfo advantages:: @code{makeinfo} provides better error checking. -* Invoking makeinfo:: How to run @code{makeinfo} from a shell. -* makeinfo options:: Specify fill-column and other options. -* Pointer Validation:: How to check that pointers point somewhere. -* makeinfo in Emacs:: How to run @code{makeinfo} from Emacs. -* texinfo-format commands:: Two Info formatting commands written - in Emacs Lisp are an alternative - to @code{makeinfo}. -* Batch Formatting:: How to format for Info in Emacs Batch mode. -* Tag and Split Files:: How tagged and split files help Info - to run better. - -Installing an Info File - -* Directory file:: The top level menu for all Info files. -* New Info File:: Listing a new info file. -* Other Info Directories:: How to specify Info files that are - located in other directories. - -Sample Permissions - -* Inserting Permissions:: How to put permissions in your document. -* ifinfo Permissions:: Sample @samp{ifinfo} copying permissions. -* Titlepage Permissions:: Sample Titlepage copying permissions. - -Include Files - -* Using Include Files:: How to use the @code{@@include} command. -* texinfo-multiple-files-update:: How to create and update nodes and - menus when using included files. -* Include File Requirements:: What @code{texinfo-multiple-files-update} expects. -* Sample Include File:: A sample outer file with included files - within it; and a sample included file. -* Include Files Evolution:: How use of the @code{@@include} command - has changed over time. - -Page Headings - -* Headings Introduced:: Conventions for using page headings. -* Heading Format:: Standard page heading formats. -* Heading Choice:: How to specify the type of page heading. -* Custom Headings:: How to create your own headings and footings. - -Formatting Mistakes - -* makeinfo preferred:: @code{makeinfo} finds errors. -* Debugging with Info:: How to catch errors with Info formatting. -* Debugging with TeX:: How to catch errors with @TeX{} formatting. -* Using texinfo-show-structure:: How to use @code{texinfo-show-structure}. -* Using occur:: How to list all lines containing a pattern. -* Running Info-Validate:: How to find badly referenced nodes. - -Finding Badly Referenced Nodes - -* Using Info-validate:: How to run @code{Info-validate}. -* Unsplit:: How to create an unsplit file. -* Tagifying:: How to tagify a file. -* Splitting:: How to split a file manually. - -Second Edition Features - -* New Texinfo Mode Commands:: The updating commands are especially useful. -* New Commands:: Many newly described @@-commands. -@end menu - -@node Copying, Overview, Top, Top -@comment node-name, next, previous, up -@unnumbered Texinfo Copying Conditions -@cindex Copying conditions -@cindex Conditions for copying Texinfo - -The programs currently being distributed that relate to Texinfo include -portions of GNU Emacs, plus other separate programs (including -@code{makeinfo}, @code{info}, @code{texindex}, and @file{texinfo.tex}). -These programs are @dfn{free}; this means that everyone is free to use -them and free to redistribute them on a free basis. The Texinfo-related -programs are not in the public domain; they are copyrighted and there -are restrictions on their distribution, but these restrictions are -designed to permit everything that a good cooperating citizen would want -to do. What is not allowed is to try to prevent others from further -sharing any version of these programs that they might get from -you.@refill - - Specifically, we want to make sure that you have the right to give -away copies of the programs that relate to Texinfo, that you receive -source code or else can get it if you want it, that you can change these -programs or use pieces of them in new free programs, and that you know -you can do these things.@refill - - To make sure that everyone has such rights, we have to forbid you to -deprive anyone else of these rights. For example, if you distribute -copies of the Texinfo related programs, you must give the recipients all -the rights that you have. You must make sure that they, too, receive or -can get the source code. And you must tell them their rights.@refill - - Also, for our own protection, we must make certain that everyone finds -out that there is no warranty for the programs that relate to Texinfo. -If these programs are modified by someone else and passed on, we want -their recipients to know that what they have is not what we distributed, -so that any problems introduced by others will not reflect on our -reputation.@refill - - The precise conditions of the licenses for the programs currently -being distributed that relate to Texinfo are found in the General Public -Licenses that accompany them.@refill - -@node Overview, Texinfo Mode, Copying, Top -@comment node-name, next, previous, up -@chapter Overview of Texinfo -@cindex Overview of Texinfo -@cindex Texinfo overview - -@dfn{Texinfo}@footnote{Note that the first syllable of ``Texinfo'' is -pronounced like ``speck'', not ``hex''. This odd pronunciation is -derived from, but is not the same as, the pronunciation of @TeX{}. In -the word @TeX{}, the @samp{X} is actually the Greek letter ``chi'' -rather than the English letter ``ex''. Pronounce @TeX{} as if the -@samp{X} were the last sound in the name `Bach'; but pronounce Texinfo -as if the @samp{x} were a `k'. Spell ``Texinfo'' with a capital ``T'' -and write the other letters in lower case.} -is a documentation system that uses a single source file to produce both -on-line information and printed output. This means that instead of -writing two different documents, one for the on-line help or other on-line -information and the other for a typeset manual or other printed work, you -need write only one document. When the work is revised, you need revise -only one document. (You can read the on-line information, known as an -@dfn{Info file}, with an Info documentation-reading program.)@refill - -@menu -* Using Texinfo:: Create a conventional printed book - or an Info file. -* Info Files:: What is an Info file? -* Printed Books:: Characteristics of a printed book or manual. -* Formatting Commands:: @@-commands are used for formatting. -* Conventions:: General rules for writing a Texinfo file. -* Comments:: How to write comments and mark regions that - the formatting commands will ignore. -* Minimum:: What a Texinfo file must have. -* Six Parts:: Usually, a Texinfo file has six parts. -* Short Sample:: A short sample Texinfo file. -* Acknowledgements:: -@end menu - -@node Using Texinfo, Info Files, , Overview -@ifinfo -@heading Using Texinfo -@end ifinfo - -Using Texinfo, you can create a printed document with the normal -features of a book, including chapters, sections, cross references, -and indices. From the same Texinfo source file, you can create a -menu-driven, on-line Info file with nodes, menus, cross references, -and indices. You can, if you wish, make the chapters and sections of -the printed document correspond to the nodes of the on-line -information; and you use the same cross references and indices for -both the Info file and the printed work. @cite{The GNU -Emacs Manual} is a good example of a Texinfo file, as is this manual.@refill - -To make a printed document, you process a Texinfo source file with the -@TeX{} typesetting program. This creates a @sc{dvi} file that you can -typeset and print as a book or report. (Note that the Texinfo language is -completely different from @TeX{}'s usual language, Plain@TeX{}, which -Texinfo replaces.) If you do not have @TeX{}, but do have -@code{troff} or @code{nroff}, you can use the @code{texi2roff} program -instead.@refill - -To make an Info file, you process a Texinfo source file with the -@code{makeinfo} utility or Emacs's @code{texinfo-format-buffer} command; -this creates an Info file that you can install on-line.@refill - -@TeX{} and @code{texi2roff} work with many types of printer; similarly, -Info works with almost every type of computer terminal. This power -makes Texinfo a general purpose system, but brings with it a constraint, -which is that a Texinfo file may contain only the customary -``typewriter'' characters (letters, numbers, spaces, and punctuation -marks) but no special graphics.@refill - -A Texinfo file is a plain @sc{ascii} file containing text and -@dfn{@@-commands} (words preceded by an @samp{@@}) that tell the -typesetting and formatting programs what to do. You may edit a -Texinfo file with any text editor; but it is especially convenient to -use GNU Emacs since that editor has a special mode, called Texinfo -mode, that provides various Texinfo-related features. (@xref{Texinfo -Mode}.)@refill - -Before writing a Texinfo source file, you should become familiar with -the Info documentation reading program and learn about nodes, -menus, cross references, and the rest. (@inforef{Top, info, info}, -for more information.)@refill - -You can use Texinfo to create both on-line help and printed manuals; -moreover, Texinfo is freely redistributable. For these reasons, Texinfo -is the format in which documentation for GNU utilities and libraries is -written.@refill - -@node Info Files, Printed Books, Using Texinfo, Overview -@comment node-name, next, previous, up -@section Info files -@cindex Info files - -An Info file is a Texinfo file formatted so that the Info documentation -reading program can operate on it. (@code{makeinfo} -and @code{texinfo-format-buffer} are two commands that convert a Texinfo file -into an Info file.)@refill - -Info files are divided into pieces called @dfn{nodes}, each of which -contains the discussion of one topic. Each node has a name, and -contains both text for the user to read and pointers to other nodes, -which are identified by their names. The Info program displays one node -at a time, and provides commands with which the user can move to other -related nodes.@refill - -@ifinfo -@inforef{Top, info, info}, for more information about using Info.@refill -@end ifinfo - -Each node of an Info file may have any number of child nodes that -describe subtopics of the node's topic. The names of child -nodes are listed in a @dfn{menu} within the parent node; this -allows you to use certain Info commands to move to one of the child -nodes. Generally, an Info file is organized like a book. If a node -is at the logical level of a chapter, its child nodes are at the level -of sections; likewise, the child nodes of sections are at the level -of subsections.@refill - -All the children of any one parent are linked together in a -bidirectional chain of `Next' and `Previous' pointers. The `Next' -pointer provides a link to the next section, and the `Previous' pointer -provides a link to the previous section. This means that all the nodes -that are at the level of sections within a chapter are linked together. -Normally the order in this chain is the same as the order of the -children in the parent's menu. Each child node records the parent node -name as its `Up' pointer. The last child has no `Next' pointer, and the -first child has the parent both as its `Previous' and as its `Up' -pointer.@footnote{In some documents, the first child has no `Previous' -pointer. Occasionally, the last child has the node name of the next -following higher level node as its `Next' pointer.}@refill - -The book-like structuring of an Info file into nodes that correspond -to chapters, sections, and the like is a matter of convention, not a -requirement. The `Up', `Previous', and `Next' pointers of a node can -point to any other nodes, and a menu can contain any other nodes. -Thus, the node structure can be any directed graph. But it is usually -more comprehensible to follow a structure that corresponds to the -structure of chapters and sections in a printed book or report.@refill - -In addition to menus and to `Next', `Previous', and `Up' pointers, Info -provides pointers of another kind, called references, that can be -sprinkled throughout the text. This is usually the best way to -represent links that do not fit a hierarchical structure.@refill - -Usually, you will design a document so that its nodes match the -structure of chapters and sections in the printed output. But there -are times when this is not right for the material being discussed. -Therefore, Texinfo uses separate commands to specify the node -structure for the Info file and the section structure for the printed -output.@refill - -Generally, you enter an Info file through a node that by convention is -called @samp{Top}. This node normally contains just a brief summary -of the file's purpose, and a large menu through which the rest of the -file is reached. From this node, you can either traverse the file -systematically by going from node to node, or you can go to a specific -node listed in the main menu, or you can search the index menus and -then go directly to the node that has the information you want.@refill -@c !!! With the standalone Info system you may go to specific nodes -@c directly.. - -If you want to read through an Info file in sequence, as if it were a -printed manual, you can get the whole file with the advanced Info -command @kbd{g* @key{RET}}. (@inforef{Expert, Advanced Info commands, -info}.)@refill - -@c !!! dir file may be located in one of many places: -@c /usr/local/emacs/info mentioned in info.c DEFAULT_INFOPATH -@c /usr/local/lib/emacs/info mentioned in info.c DEFAULT_INFOPATH -@c /usr/gnu/info mentioned in info.c DEFAULT_INFOPATH -@c /usr/local/info -@c /usr/local/lib/info -The @file{dir} file in the @file{info} directory serves as the -departure point for the whole Info system. From it, you can reach the -`Top' nodes of each of the documents in a complete Info system.@refill - -@node Printed Books, Formatting Commands, Info Files, Overview -@comment node-name, next, previous, up -@section Printed Books -@cindex Printed book and manual characteristics -@cindex Manual characteristics, printed -@cindex Book characteristics, printed -@cindex Texinfo printed book characteristics -@cindex Characteristics, printed books or manuals - -A Texinfo file can be formatted and typeset as a printed book or manual. -To do this, you need @TeX{}, a powerful, sophisticated typesetting -program written by Donald Knuth.@footnote{You can also use the -@code{texi2roff} program if you do not have @TeX{}; since Texinfo is -designed for use with @TeX{}, @code{texi2roff} is not described here. -@code{texi2roff} is part of the standard GNU distribution.}@refill - -A Texinfo-based book is similar to any other typeset, printed work: it -can have a title page, copyright page, table of contents, and preface, -as well as chapters, numbered or unnumbered sections and subsections, -page headers, cross references, footnotes, and indices.@refill - -You can use Texinfo to write a book without ever having the intention -of converting it into on-line information. You can use Texinfo for -writing a printed novel, and even to write a printed memo, although -this latter application is not recommended since electronic mail is so -much easier.@refill - -@TeX{} is a general purpose typesetting program. Texinfo provides a -file called @file{texinfo.tex} that contains information (definitions or -@dfn{macros}) that @TeX{} uses when it typesets a Texinfo file. -(@file{texinfo.tex} tells @TeX{} how to convert the Texinfo @@-commands -to @TeX{} commands, which @TeX{} can then process to create the typeset -document.) @file{texinfo.tex} contains the specifications for printing -a document.@refill - -Most often, documents are printed on 8.5 inch by 11 inch -pages (216@dmn{mm} by 280@dmn{mm}; this is the default size), but you -can also print for 7 inch by 9.25 inch pages (178@dmn{mm} by -235@dmn{mm}; the @code{@@smallbook} size) or on European A4 size paper -(@code{@@afourpaper}). (@xref{smallbook, , Printing ``Small'' Books}. -Also, see @ref{A4 Paper, ,Printing on A4 Paper}.)@refill - -By changing the parameters in @file{texinfo.tex}, you can change the -size of the printed document. In addition, you can change the style in -which the printed document is formatted; for example, you can change the -sizes and fonts used, the amount of indentation for each paragraph, the -degree to which words are hyphenated, and the like. By changing the -specifications, you can make a book look dignified, old and serious, or -light-hearted, young and cheery.@refill - -@TeX{} is freely distributable. It is written in a dialect of Pascal -called WEB and can be compiled either in Pascal or (by using a -conversion program that comes with the @TeX{} distribution) in C. -(@xref{TeX Mode, ,@TeX{} Mode, emacs, The GNU Emacs Manual}, for information -about @TeX{}.)@refill - -@TeX{} is very powerful and has a great many features. Because a -Texinfo file must be able to present information both on a -character-only terminal in Info form and in a typeset book, the -formatting commands that Texinfo supports are necessarily -limited.@refill - -@xref{Obtaining TeX, , How to Obtain @TeX{}}. - - -@node Formatting Commands, Conventions, Printed Books, Overview -@comment node-name, next, previous, up -@section @@-commands -@cindex @@-commands -@cindex Formatting commands - -In a Texinfo file, the commands that tell @TeX{} how to typeset the -printed manual and tell @code{makeinfo} and -@code{texinfo-format-buffer} how to create an Info file are preceded -by @samp{@@}; they are called @dfn{@@-commands}. For example, -@code{@@node} is the command to indicate a node and @code{@@chapter} -is the command to indicate the start of a chapter.@refill - -@quotation -@strong{Please note:} All the @@-commands, with the exception of the -@code{@@TeX@{@}} command, must be written entirely in lower -case.@refill -@end quotation - -The Texinfo @@-commands are a strictly limited set of constructs. The -strict limits make it possible for Texinfo files to be understood both -by @TeX{} and by the code that converts them into Info files. You can -display Info files on any terminal that displays alphabetic and -numeric characters. Similarly, you can print the output generated by -@TeX{} on a wide variety of printers.@refill - -Depending on what they do or what arguments@footnote{The word -@dfn{argument} comes from the way it is used in mathematics and does -not refer to a disputation between two people; it refers to the -information presented to the command. According to the @cite{Oxford -English Dictionary}, the word derives from the Latin for @dfn{to make -clear, prove}; thus it came to mean `the evidence offered as proof', -which is to say, `the information offered', which led to its -mathematical meaning. In its other thread of derivation, the word -came to mean `to assert in a manner against which others may make -counter assertions', which led to the meaning of `argument' as a -disputation.} they take, you need to write @@-commands on lines of -their own or as part of sentences:@refill - -@itemize @bullet -@item -Write a command such as @code{@@noindent} at the beginning of a line as -the only text on the line. (@code{@@noindent} prevents the beginning of -the next line from being indented as the beginning of a -paragraph.)@refill - -@item -Write a command such as @code{@@chapter} at the beginning of a line -followed by the command's arguments, in this case the chapter title, on -the rest of the line. (@code{@@chapter} creates chapter titles.)@refill - -@item -Write a command such as @code{@@dots@{@}} wherever you wish but usually -within a sentence. (@code{@@dots@{@}} creates dots @dots{})@refill - -@item -Write a command such as @code{@@code@{@var{sample-code}@}} wherever you -wish (but usually within a sentence) with its argument, -@var{sample-code} in this example, between the braces. (@code{@@code} -marks text as being code.)@refill - -@item -Write a command such as @code{@@example} at the beginning of a line of -its own; write the body-text on following lines; and write the matching -@code{@@end} command, @code{@@end example} in this case, at the -beginning of a line of its own after the body-text. (@code{@@example} -@dots{} @code{@@end example} indents and typesets body-text as an -example.)@refill -@end itemize - -@noindent -@cindex Braces, when to use -As a general rule, a command requires braces if it mingles among other -text; but it does not need braces if it starts a line of its own. The -non-alphabetic commands, such as @code{@@:}, are exceptions to the rule; -they do not need braces.@refill - -As you gain experience with Texinfo, you will rapidly learn how to -write the different commands: the different ways to write commands -make it easier to write and read Texinfo files than if all commands -followed exactly the same syntax. (For details about @@-command -syntax, see @ref{Command Syntax, , @@-Command Syntax}.)@refill - -@node Conventions, Comments, Formatting Commands, Overview -@comment node-name, next, previous, up -@section General Syntactic Conventions -@cindex General syntactic conventions -@cindex Syntactic conventions -@cindex Conventions, syntactic - -All @sc{ascii} printing characters except @samp{@@}, @samp{@{} and -@samp{@}} can appear in a Texinfo file and stand for themselves. -@samp{@@} is the escape character which introduces commands. -@samp{@{} and @samp{@}} should be used only to surround arguments to -certain commands. To put one of these special characters into the -document, put an @samp{@@} character in front of it, like this: -@samp{@@@@}, @samp{@@@{}, and @samp{@@@}}.@refill - -@ifinfo -It is customary in @TeX{} to use doubled single-quote characters to -begin and end quotations: ` ` and ' ' (but without a space between the -two single-quote characters). This convention should be followed in -Texinfo files. @TeX{} converts doubled single-quote characters to -left- and right-hand doubled quotation marks and Info converts doubled -single-quote characters to @sc{ascii} double-quotes: ` ` and ' ' to " .@refill -@end ifinfo -@iftex -It is customary in @TeX{} to use doubled single-quote characters to -begin and end quotations: @w{@tt{ `` }} and @w{@tt{ '' }}. This -convention should be followed in Texinfo files. @TeX{} converts -doubled single-quote characters to left- and right-hand doubled -quotation marks, ``like this'', and Info converts doubled single-quote -characters to @sc{ascii} double-quotes: @w{@tt{ `` }} and -@w{@tt{ '' }} to @w{@tt{ " }}.@refill -@end iftex - -Use three hyphens in a row, @samp{---}, for a dash---like this. In -@TeX{}, a single or even a double hyphen produces a printed dash that -is shorter than the usual typeset dash. Info reduces three hyphens to two for -display on the screen.@refill - -To prevent a paragraph from being indented in the printed manual, put -the command @code{@@noindent} on a line by itself before the -paragraph.@refill - -If you mark off a region of the Texinfo file with the @code{@@iftex} -and @w{@code{@@end iftex}} commands, that region will appear only in -the printed copy; in that region, you can use certain commands -borrowed from Plain@TeX{} that you cannot use in Info. Likewise, if -you mark off a region with the @code{@@ifinfo} and @code{@@end ifinfo} -commands, that region will appear only in the Info file; in that -region, you can use Info commands that you cannot use in @TeX{}. -(@xref{Conditionals}.) - -@cindex Tabs; don't use! -@quotation -@strong{Caution:} Do not use tabs in a Texinfo file! @TeX{} uses -variable-width fonts, which means that it cannot predefine a tab to work -in all circumstances. Consequently, @TeX{} treats tabs like single -spaces, and that is not what they look like.@refill - -@noindent -To avoid this problem, Texinfo mode causes GNU Emacs to insert multiple -spaces when you press the @key{TAB} key.@refill - -@noindent -Also, you can run @code{untabify} in Emacs to convert tabs in a region -to multiple spaces.@refill -@end quotation - -@node Comments, Minimum, Conventions, Overview -@comment node-name, next, previous, up -@section Comments - -You can write comments in a Texinfo file that will not appear in -either the Info file or the printed manual by using the -@code{@@comment} command (which may be abbreviated to @code{@@c}). -Such comments are for the person who reads the Texinfo file. All the -text on a line that follows either @code{@@comment} or @code{@@c} is a -comment; the rest of the line does not appear in either the Info file -or the printed manual. (Often, you can write the @code{@@comment} or -@code{@@c} in the middle of a line, and only the text that follows after -the @code{@@comment} or @code{@@c} command does not appear; but some -commands, such as @code{@@settitle} and @code{@@setfilename}, work on a -whole line. You cannot use @code{@@comment} or @code{@@c} in a line -beginning with such a command.)@refill -@cindex Comments -@findex comment -@findex c @r{(comment)} - -You can write long stretches of text that will not appear in either -the Info file or the printed manual by using the @code{@@ignore} and -@code{@@end ignore} commands. Write each of these commands on a line -of its own, starting each command at the beginning of the line. Text -between these two commands does not appear in the processed output. -You can use @code{@@ignore} and @code{@@end ignore} for writing -comments. Often, @code{@@ignore} and @code{@@end ignore} is used -to enclose a part of the copying permissions that applies to the -Texinfo source file of a document, but not to the Info or printed -version of the document.@refill -@cindex Ignored text -@cindex Unprocessed text -@findex ignore -@c !!! Perhaps include this comment about ignore and ifset: -@ignore -Text enclosed by @code{@@ignore} or by failing @code{@@ifset} or -@code{@@ifclear} conditions is ignored in the sense that it will not -contribute to the formatted output. However, TeX and makeinfo must -still parse the ignored text, in order to understand when to -@emph{stop} ignoring text from the source file; that means that you -will still get error messages if you have invalid Texinfo markup -within ignored text. -@end ignore - -@node Minimum, Six Parts, Comments, Overview -@comment node-name, next, previous, up -@section What a Texinfo File Must Have -@cindex Minimal Texinfo file (requirements) -@cindex Must have in Texinfo file -@cindex Required in Texinfo file -@cindex Texinfo file minimum - -By convention, the names of Texinfo files end with one of the -extensions @file{.texinfo}, @file{.texi}, or @file{.tex}. The longer -extension is preferred since it describes more clearly to a human -reader the nature of the file. The shorter extensions are for -operating systems that cannot handle long file names.@refill - -In order to be made into a printed manual and an Info file, a -Texinfo file @strong{must} begin with lines like this:@refill - -@example -@group -\input texinfo -@@setfilename @var{info-file-name} -@@settitle @var{name-of-manual} -@end group -@end example - -@noindent -The contents of the file follow this beginning, and then you @strong{must} end -a Texinfo file with a line like this:@refill - -@example -@@bye -@end example - -@findex input @r{(@TeX{} command)} -@noindent -The @samp{\input texinfo} line tells @TeX{} to use the -@file{texinfo.tex} file, which tells @TeX{} how to translate the Texinfo -@@-commands into @TeX{} typesetting commands. (Note the use of the -backslash, @samp{\}; this is correct for @TeX{}.) The -@samp{@@setfilename} line provides a name for the Info file and the -@samp{@@settitle} line specifies a title for the page headers (or -footers) of the printed manual.@refill - -The @code{@@bye} line at the end of the file on a line of its own tells -the formatters that the file is ended and to stop formatting.@refill - -Usually, you will not use quite such a spare format, but will include -mode setting and start-of-header and end-of-header lines at the -beginning of a Texinfo file, like this:@refill - -@example -@group -\input texinfo @@c -*-texinfo-*- -@@c %**start of header -@@setfilename @var{info-file-name} -@@settitle @var{name-of-manual} -@@c %**end of header -@end group -@end example - -@noindent -In the first line, @samp{-*-texinfo-*-} causes Emacs to switch into -Texinfo mode when you edit the file. - -The @code{@@c} lines which surround the @samp{@@setfilename} and -@samp{@@settitle} lines are optional, but you need them in order to -run @TeX{} or Info on just part of the file. (@xref{Start of Header}, -for more information.)@refill - -Furthermore, you will usually provide a Texinfo file with a title -page, indices, and the like. But the minimum, which can be useful -for short documents, is just the three lines at the beginning and the -one line at the end.@refill - -@node Six Parts, Short Sample, Minimum, Overview -@comment node-name, next, previous, up -@section Six Parts of a Texinfo File - -Generally, a Texinfo file contains more than the minimal -beginning and end---it usually contains six parts:@refill - -@table @r -@item 1. Header -The @dfn{Header} names the file, tells @TeX{} which definitions' file to -use, and performs other ``housekeeping'' tasks.@refill - -@item 2. Summary Description and Copyright -The @dfn{Summary Description and Copyright} segment describes the document -and contains the copyright notice and copying permissions for the Info -file. The segment must be enclosed between @code{@@ifinfo} and -@code{@@end ifinfo} commands so that the formatters place it only in the Info -file.@refill - -@item 3. Title and Copyright -The @dfn{Title and Copyright} segment contains the title and copyright pages -and copying permissions for the printed manual. The segment must be -enclosed between @code{@@titlepage} and @code{@@end titlepage} commands. -The title and copyright page appear only in the printed @w{manual}.@refill - -@item 4. `Top' Node and Master Menu -The @dfn{Master Menu} contains a complete menu of all the nodes in the whole -Info file. It appears only in the Info file, in the `Top' node.@refill - -@item 5. Body -The @dfn{Body} of the document may be structured like a traditional book or -encyclopedia or it may be free form.@refill - -@item 6. End -The @dfn{End} contains commands for printing indices and generating -the table of contents, and the @code{@@bye} command on a line of its -own.@refill -@end table - -@node Short Sample, Acknowledgements, Six Parts, Overview -@comment node-name, next, previous, up -@section A Short Sample Texinfo File -@cindex Sample Texinfo file - -Here is a complete but very short Texinfo file, in 6 parts. The first -three parts of the file, from @samp{\input texinfo} through to -@samp{@@end titlepage}, look more intimidating than they are. Most of -the material is standard boilerplate; when you write a manual, simply -insert the names for your own manual in this segment. (@xref{Beginning a -File}.)@refill - -@noindent -In the following, the sample text is @emph{indented}; comments on it are -not. The complete file, without any comments, is shown in -@ref{Sample Texinfo File}. - -@subheading Part 1: Header - -@noindent -The header does not appear in either the Info file or the@* -printed output. It sets various parameters, including the@* -name of the Info file and the title used in the header. - -@example -@group -\input texinfo @@c -*-texinfo-*- -@@c %**start of header -@@setfilename sample.info -@@settitle Sample Document -@@c %**end of header - -@@setchapternewpage odd -@end group -@end example - -@subheading Part 2: Summary Description and Copyright - -@noindent -The summary description and copyright segment does not@* -appear in the printed document. - -@example -@group -@@ifinfo -This is a short example of a complete Texinfo file. - -Copyright @@copyright@{@} 1990 Free Software Foundation, Inc. -@@end ifinfo -@end group -@end example - -@subheading Part 3: Titlepage and Copyright - -@noindent -The titlepage segment does not appear in the Info file. - -@example -@group -@@titlepage -@@sp 10 -@@comment The title is printed in a large font. -@@center @@titlefont@{Sample Title@} -@end group - -@group -@@c The following two commands start the copyright page. -@@page -@@vskip 0pt plus 1filll -Copyright @@copyright@{@} 1990 Free Software Foundation, Inc. -@@end titlepage -@end group -@end example - -@subheading Part 4: `Top' Node and Master Menu - -@noindent -The `Top' node contains the master menu for the Info file.@* -Since a printed manual uses a table of contents rather than@* -a menu, the master menu appears only in the Info file. - -@example -@group -@@node Top, First Chapter, (dir), (dir) -@@comment node-name, next, previous, up -@end group -@end example - -@example -@group -@@menu -* First Chapter:: The first chapter is the - only chapter in this sample. -* Concept Index:: This index has two entries. -@@end menu -@end group -@end example - -@subheading Part 5: The Body of the Document - -@noindent -The body segment contains all the text of the document, but not the -indices or table of contents. This example illustrates a node and a -chapter containing an enumerated list.@refill - -@example -@group -@@node First Chapter, Concept Index, Top, Top -@@comment node-name, next, previous, up -@@chapter First Chapter -@@cindex Sample index entry -@end group - -@group -This is the contents of the first chapter. -@@cindex Another sample index entry -@end group - -@group -Here is a numbered list. - -@@enumerate -@@item -This is the first item. - -@@item -This is the second item. -@@end enumerate -@end group - -@group -The @@code@{makeinfo@} and @@code@{texinfo-format-buffer@} -commands transform a Texinfo file such as this into -an Info file; and @@TeX@{@} typesets it for a printed -manual. -@end group -@end example - -@subheading Part 6: The End of the Document - -@noindent -The end segment contains commands both for generating an index in a node -and unnumbered chapter of its own and for generating the table of -contents; and it contains the @code{@@bye} command that marks the end of -the document.@refill - -@example -@group -@@node Concept Index, , First Chapter, Top -@@comment node-name, next, previous, up -@@unnumbered Concept Index -@end group - -@group -@@printindex cp - -@@contents -@@bye -@end group -@end example - -@subheading The Results - -Here is what the contents of the first chapter of the sample look like: - -@sp 1 -@need 700 -@quotation -This is the contents of the first chapter. - -Here is a numbered list. - -@enumerate -@item -This is the first item. - -@item -This is the second item. -@end enumerate - -The @code{makeinfo} and @code{texinfo-format-buffer} -commands transform a Texinfo file such as this into -an Info file; and @TeX{} typesets it for a printed -manual. -@end quotation - -@node Acknowledgements, , Short Sample, Overview -@comment node-name, next, previous, up -@section Acknowledgements - -Richard M.@: Stallman wrote Edition 1.0 of this manual. -@w{Robert J.@: Chassell} revised and extended it, -starting with Edition 1.1. - -Our thanks go out to all who helped improve this work, particularly to -@w{Francois Pinard} and @w{David D.@: Zuhn}, who tirelessly recorded -and reported mistakes and obscurities; our special thanks go to -@w{Melissa Weisshaus} for her frequent and often tedious reviews of -nearly similar editions. Our mistakes are our own. - -@c ignore until mailing lists set up -@ignore -Please send suggestions and corrections to: - -@example -@group -@r{Internet address:} - bug-gnu-texinfo@@prep.ai.mit.edu - -@r{UUCP path:} - mit-eddie!prep.ai.mit.edu!bug-gnu-texinfo -@end group -@end example - -@noindent -Please include the manual's edition number in your messages. -@end ignore - -@node Texinfo Mode, Beginning a File, Overview, Top -@comment node-name, next, previous, up -@chapter Using Texinfo Mode -@cindex Texinfo mode -@cindex Mode, using Texinfo -@cindex GNU Emacs -@cindex Emacs - -You may edit a Texinfo file with any text editor you choose. A Texinfo -file is no different from any other @sc{ascii} file. However, GNU Emacs -comes with a special mode, called Texinfo -mode, that provides Emacs commands and tools to help ease your work.@refill - -This chapter describes features of GNU Emacs' Texinfo mode but not any -features of the Texinfo formatting language. If you are reading this -manual straight through from the beginning, you may want to skim through -this chapter briefly and come back to it after reading succeeding -chapters which describe the Texinfo formatting language in -detail.@refill - -@menu -* Texinfo Mode Overview:: How Texinfo mode can help you. -* Emacs Editing:: Texinfo mode adds to GNU Emacs' general - purpose editing features. -* Inserting:: How to insert frequently used @@-commands. -* Showing the Structure:: How to show the structure of a file. -* Updating Nodes and Menus:: How to update or create new nodes and menus. -* Info Formatting:: How to format for Info. -* Printing:: How to format and print part or all of a file. -* Texinfo Mode Summary:: Summary of all the Texinfo mode commands. -@end menu - -@node Texinfo Mode Overview, Emacs Editing, , Texinfo Mode -@ifinfo -@heading Texinfo Mode Overview -@end ifinfo - -Texinfo mode provides special features for working with Texinfo -files:@refill - -@itemize @bullet -@item -Insert frequently used @@commands. @refill - -@item -Automatically create @code{@@node} lines. - -@item -Show the structure of a Texinfo source file.@refill - -@item -Automatically create or update the `Next',@* -`Previous', and `Up' pointers of a node. - -@item -Automatically create or update menus.@refill - -@item -Automatically create a master menu.@refill - -@item -Format a part or all of a file for Info.@refill - -@item -Typeset and print part or all of a file.@refill -@end itemize - -Perhaps the two most helpful features are those for inserting frequently -used @@-commands and for creating node pointers and menus.@refill - -@node Emacs Editing, Inserting, Texinfo Mode Overview, Texinfo Mode -@section The Usual GNU Emacs Editing Commands - -In most cases, the usual Text mode commands work the same in Texinfo -mode as they do in Text mode. Texinfo mode adds new editing commands -and tools to GNU Emacs' general purpose editing features. The major -difference concerns filling. In Texinfo mode, the paragraph -separation variable and syntax table are redefined so that Texinfo -commands that should be on lines of their own are not inadvertently -included in paragraphs. Thus, the @kbd{M-q} (@code{fill-paragraph}) -command will refill a paragraph but not mix an indexing command on a -line adjacent to it into the paragraph.@refill - -In addition, Texinfo mode sets the @code{page-delimiter} variable to -the value of @code{texinfo-chapter-level-regexp}; by default, this is -a regular expression matching the commands for chapters and their -equivalents, such as appendices. With this value for the page -delimiter, you can jump from chapter title to chapter title with the -@kbd{C-x ]} (@code{forward-page}) and @kbd{C-x [} -(@code{backward-page}) commands and narrow to a chapter with the -@kbd{C-x p} (@code{narrow-to-page}) command. (@xref{Pages, , ,emacs, -The GNU Emacs Manual}, for details about the page commands.)@refill - -You may name a Texinfo file however you wish, but the convention is to -end a Texinfo file name with one of the three extensions -@file{.texinfo}, @file{.texi}, or @file{.tex}. A longer extension is -preferred, since it is explicit, but a shorter extension may be -necessary for operating systems that limit the length of file names. -GNU Emacs automatically enters Texinfo mode when you visit a file with -a @file{.texinfo} or @file{.texi} -extension. Also, Emacs switches to Texinfo mode -when you visit a -file that has @samp{-*-texinfo-*-} in its first line. If ever you are -in another mode and wish to switch to Texinfo mode, type @code{M-x -texinfo-mode}.@refill - -Like all other Emacs features, you can customize or enhance Texinfo -mode as you wish. In particular, the keybindings are very easy to -change. The keybindings described here are the default or standard -ones.@refill - -@node Inserting, Showing the Structure, Emacs Editing, Texinfo Mode -@comment node-name, next, previous, up -@section Inserting Frequently Used Commands -@cindex Inserting frequently used commands -@cindex Frequently used commands, inserting -@cindex Commands, inserting them - -Texinfo mode provides commands to insert various frequently used -@@-commands into the buffer. You can use these commands to save -keystrokes.@refill - -The insert commands are invoked by typing @kbd{C-c} twice and then the -first letter of the @@-command:@refill - -@table @kbd -@item C-c C-c c -@itemx M-x texinfo-insert-@@code -@findex texinfo-insert-@@code -Insert @code{@@code@{@}} and put the -cursor between the braces.@refill - -@item C-c C-c d -@itemx M-x texinfo-insert-@@dfn -@findex texinfo-insert-@@dfn -Insert @code{@@dfn@{@}} and put the -cursor between the braces.@refill - -@item C-c C-c e -@itemx M-x texinfo-insert-@@end -@findex texinfo-insert-@@end -Insert @code{@@end} and attempt to insert the correct following word, -such as @samp{example} or @samp{table}. (This command does not handle -nested lists correctly, but inserts the word appropriate to the -immediately preceding list.)@refill - -@item C-c C-c i -@itemx M-x texinfo-insert-@@item -@findex texinfo-insert-@@item -Insert @code{@@item} and put the -cursor at the beginning of the next line.@refill - -@item C-c C-c k -@itemx M-x texinfo-insert-@@kbd -@findex texinfo-insert-@@kbd -Insert @code{@@kbd@{@}} and put the -cursor between the braces.@refill - -@item C-c C-c n -@itemx M-x texinfo-insert-@@node -@findex texinfo-insert-@@node -Insert @code{@@node} and a comment line -listing the sequence for the `Next', -`Previous', and `Up' nodes. -Leave point after the @code{@@node}.@refill - -@item C-c C-c o -@itemx M-x texinfo-insert-@@noindent -@findex texinfo-insert-@@noindent -Insert @code{@@noindent} and put the -cursor at the beginning of the next line.@refill - -@item C-c C-c s -@itemx M-x texinfo-insert-@@samp -@findex texinfo-insert-@@samp -Insert @code{@@samp@{@}} and put the -cursor between the braces.@refill - -@item C-c C-c t -@itemx M-x texinfo-insert-@@table -@findex texinfo-insert-@@table -Insert @code{@@table} followed by a @key{SPC} -and leave the cursor after the @key{SPC}.@refill - -@item C-c C-c v -@itemx M-x texinfo-insert-@@var -@findex texinfo-insert-@@var -Insert @code{@@var@{@}} and put the -cursor between the braces.@refill - -@item C-c C-c x -@itemx M-x texinfo-insert-@@example -@findex texinfo-insert-@@example -Insert @code{@@example} and put the -cursor at the beginning of the next line.@refill - -@c M-@{ was the binding for texinfo-insert-braces; -@c in Emacs 19, backward-paragraph will take this binding. -@item C-c C-c @{ -@itemx M-x texinfo-insert-braces -@findex texinfo-insert-braces -Insert @code{@{@}} and put the cursor between the braces.@refill - -@item C-c C-c @} -@itemx C-c C-c ] -@itemx M-x up-list -@findex up-list -Move from between a pair of braces forward past the closing brace. -Typing @kbd{C-c C-c ]} is easier than typing @kbd{C-c C-c @}}, which -is, however, more mnemonic; hence the two keybindings. (Also, you can -move out from between braces by typing @kbd{C-f}.)@refill -@end table - -To put a command such as @w{@code{@@code@{@dots{}@}}} around an -@emph{existing} word, position the cursor in front of the word and type -@kbd{C-u 1 C-c C-c c}. This makes it easy to edit existing plain text. -The value of the prefix argument tells Emacs how many words following -point to include between braces---1 for one word, 2 for two words, and -so on. Use a negative argument to enclose the previous word or words. -If you do not specify a prefix argument, Emacs inserts the @@-command -string and positions the cursor between the braces. This feature works -only for those @@-commands that operate on a word or words within one -line, such as @code{@@kbd} and @code{@@var}.@refill - -This set of insert commands was created after analyzing the frequency -with which different @@-commands are used in the @cite{GNU Emacs -Manual} and the @cite{GDB Manual}. If you wish to add your own insert -commands, you can bind a keyboard macro to a key, use abbreviations, -or extend the code in @file{texinfo.el}.@refill - -@findex texinfo-start-menu-description -@cindex Menu description, start -@cindex Description for menu, start -@kbd{C-c C-c C-d} (@code{texinfo-start-menu-description}) is an insert -command that works differently from the other insert commands. It -inserts a node's section or chapter title in the space for the -description in a menu entry line. (A menu entry has three parts, the -entry name, the node name, and the description. Only the node name is -required, but a description helps explain what the node is about. -@xref{Menu Parts, , The Parts of a Menu}.)@refill - -To use @code{texinfo-start-menu-description}, position point in a menu -entry line and type @kbd{C-c C-c C-d}. The command looks for and copies -the title that goes with the node name, and inserts the title as a -description; it positions point at beginning of the inserted text so you -can edit it. The function does not insert the title if the menu entry -line already contains a description.@refill - -This command is only an aid to writing descriptions; it does not do the -whole job. You must edit the inserted text since a title tends to use -the same words as a node name but a useful description uses different -words.@refill - -@node Showing the Structure, Updating Nodes and Menus, Inserting, Texinfo Mode -@comment node-name, next, previous, up -@section Showing the Section Structure of a File -@cindex Showing the section structure of a file -@cindex Section structure of a file, showing it -@cindex Structure of a file, showing it -@cindex Outline of file structure, showing it -@cindex Contents-like outline of file structure -@cindex File section structure, showing it -@cindex Texinfo file section structure, showing it - -You can show the section structure of a Texinfo file by using the -@kbd{C-c C-s} command (@code{texinfo-show-structure}). This command -shows the section structure of a Texinfo file by listing the lines -that begin with the @@-commands for @code{@@chapter}, -@code{@@section}, and the like. It constructs what amounts -to a table of contents. These lines are displayed in another buffer -called the @samp{*Occur*} buffer. In that buffer, you can position -the cursor over one of the lines and use the @kbd{C-c C-c} command -(@code{occur-mode-goto-occurrence}), to jump to the corresponding spot -in the Texinfo file.@refill - -@table @kbd -@item C-c C-s -@itemx M-x texinfo-show-structure -@findex texinfo-show-structure -Show the @code{@@chapter}, @code{@@section}, and such lines of a -Texinfo file.@refill - -@item C-c C-c -@itemx M-x occur-mode-goto-occurrence -@findex occur-mode-goto-occurrence -Go to the line in the Texinfo file corresponding to the line under the -cursor in the @file{*Occur*} buffer.@refill -@end table - -If you call @code{texinfo-show-structure} with a prefix argument by -typing @w{@kbd{C-u C-c C-s}}, it will list not only those lines with the -@@-commands for @code{@@chapter}, @code{@@section}, and the like, -but also the @code{@@node} lines. (This is how the -@code{texinfo-show-structure} command worked without an argument in -the first version of Texinfo. It was changed because @code{@@node} -lines clutter up the @samp{*Occur*} buffer and are usually not -needed.) You can use @code{texinfo-show-structure} with a prefix -argument to check whether the `Next', `Previous', and `Up' pointers of -an @code{@@node} line are correct.@refill - -Often, when you are working on a manual, you will be interested only -in the structure of the current chapter. In this case, you can mark -off the region of the buffer that you are interested in with the -@kbd{C-x n} (@code{narrow-to-region}) command and -@code{texinfo-show-structure} will work on only that region. To see -the whole buffer again, use @w{@kbd{C-x w}} (@code{widen}). -(@xref{Narrowing, , , emacs, The GNU Emacs Manual}, for more -information about the narrowing commands.)@refill - -@vindex page-delimiter -@cindex Page delimiter in Texinfo mode -In addition to providing the @code{texinfo-show-structure} command, -Texinfo mode sets the value of the page delimiter variable to match -the chapter-level @@-commands. This enables you to use the @kbd{C-x -]} (@code{forward-page}) and @kbd{C-x [} (@code{backward-page}) -commands to move forward and backward by chapter, and to use the -@kbd{C-x p} (@code{narrow-to-page}) command to narrow to a chapter. -@xref{Pages, , , emacs, The GNU Emacs Manual}, for more information -about the page commands.@refill - -@node Updating Nodes and Menus, Info Formatting, Showing the Structure, Texinfo Mode -@comment node-name, next, previous, up -@section Updating Nodes and Menus -@cindex Updating nodes and menus -@cindex Create nodes, menus automatically -@cindex Insert nodes, menus automatically -@cindex Automatically insert nodes, menus - -Texinfo mode provides commands for automatically creating or updating -menus and node pointers. The commands are called ``update'' commands -because their most frequent use is for updating a Texinfo file after -you have worked on it; but you can use them to insert the `Next', -`Previous', and `Up' pointers into an @code{@@node} line that has none and to -create menus in a file that has none.@refill - -If you do not use the updating commands, you need to write menus and -node pointers by hand, which is a tedious task.@refill - -@menu -* Updating Commands:: Five major updating commands. -* Updating Requirements:: How to structure a Texinfo file for - using the updating command. -* Other Updating Commands:: How to indent descriptions, insert - missing nodes lines, and update - nodes in sequence. -@end menu - -@node Updating Commands, Updating Requirements, , Updating Nodes and Menus -@ifinfo -@subheading The Updating Commands -@end ifinfo - -You can use the updating commands@refill - -@itemize @bullet -@item -to insert or update the `Next', `Previous', and `Up' pointers of a -node,@refill - -@item -to insert or update the menu for a section, and@refill - -@item -to create a master menu for a Texinfo source file.@refill -@end itemize - -You can also use the commands to update all the nodes and menus in a -region or in a whole Texinfo file.@refill - -The updating commands work only with conventional Texinfo files, which -are structured hierarchically like books. In such files, a structuring -command line must follow closely after each @code{@@node} line, except -for the `Top' @code{@@node} line. (A @dfn{structuring command line} is -a line beginning with @code{@@chapter}, @code{@@section}, or other -similar command.) - -You can write the structuring command line on the line that follows -immediately after an @code{@@node} line or else on the line that -follows after a single @code{@@comment} line or a single -@code{@@ifinfo} line. You cannot interpose more than one line between -the @code{@@node} line and the structuring command line; and you may -interpose only an @code{@@comment} line or an @code{@@ifinfo} line. - -Commands which work on a whole buffer require that the `Top' node be -followed by a node with an @code{@@chapter} or equivalent-level command. -Note that the menu updating commands will not create a main or master -menu for a Texinfo file that has only @code{@@chapter}-level nodes! The -menu updating commands only create menus @emph{within} nodes for lower level -nodes. To create a menu of chapters, you must provide a `Top' -node.@refill - -The menu updating commands remove menu entries that refer to other Info -files since they do not refer to nodes within the current buffer. This -is a deficiency. Rather than use menu entries, you can use cross -references to refer to other Info files. None of the updating commands -affect cross references.@refill - -Texinfo mode has five updating commands that are used most often: two -are for updating the node pointers or menu of a single node (or a -region); two are for updating every node pointer and menu in a file; -and one, the @code{texinfo-master-menu} command, is for creating a -master menu for a complete file, and optionally, for updating every -node and menu in the whole Texinfo file.@refill - -The @code{texinfo-master-menu} command is the primary command:@refill - -@table @kbd -@item C-c C-u m -@itemx M-x texinfo-master-menu -@findex texinfo-master-menu -Create or update a master menu that includes all the other menus -(incorporating the descriptions from pre-existing menus, if -any).@refill - -With an argument (prefix argument, @kbd{C-u,} if interactive), first create or -update all the nodes and all the regular menus in the buffer before -constructing the master menu. (@xref{The Top Node, , The Top Node and -Master Menu}, for more about a master menu.)@refill - -For @code{texinfo-master-menu} to work, the Texinfo file must have a -`Top' node and at least one subsequent node.@refill - -After extensively editing a Texinfo file, you can type the following: - -@example -C-u M-x texinfo-master-menu -@exdent or -C-u C-c C-u m -@end example - -@noindent -This updates all the nodes and menus completely and all at once.@refill -@end table - -The other major updating commands do smaller jobs and are designed for -the person who updates nodes and menus as he or she writes a Texinfo -file.@refill - -@need 1000 -The commands are:@refill - -@table @kbd -@item C-c C-u C-n -@itemx M-x texinfo-update-node -@findex texinfo-update-node -Insert the `Next', `Previous', and `Up' pointers for the node that point is -within (i.e., for the @code{@@node} line preceding point). If the -@code{@@node} line has pre-existing `Next', `Previous', or `Up' -pointers in it, the old pointers are removed and new ones inserted. -With an argument (prefix argument, @kbd{C-u}, if interactive), this command -updates all @code{@@node} lines in the region (which is the text -between point and mark).@refill - -@item C-c C-u C-m -@itemx M-x texinfo-make-menu -@findex texinfo-make-menu -Create or update the menu in the node that point is within. -With an argument (@kbd{C-u} as prefix argument, if -interactive), the command makes or updates menus for the -nodes which are either within or a part of the -region.@refill - -Whenever @code{texinfo-make-menu} updates an existing menu, the -descriptions from that menu are incorporated into the new menu. This -is done by copying descriptions from the existing menu to the entries -in the new menu that have the same node names. If the node names are -different, the descriptions are not copied to the new menu.@refill - -@item C-c C-u C-e -@itemx M-x texinfo-every-node-update -@findex texinfo-every-node-update -Insert or update the `Next', `Previous', and `Up' pointers for every -node in the buffer.@refill - -@item C-c C-u C-a -@itemx M-x texinfo-all-menus-update -@findex texinfo-all-menus-update -Create or update all the menus in the buffer. With an argument -(@kbd{C-u} as prefix argument, if interactive), first insert -or update all the node -pointers before working on the menus.@refill - -If a master menu exists, the @code{texinfo-all-menus-update} command -updates it; but the command does not create a new master menu if none -already exists. (Use the @code{texinfo-master-menu} command for -that.)@refill - -When working on a document that does not merit a master menu, you can -type the following: - -@example -C-u C-c C-u C-a -@exdent or -C-u M-x texinfo-all-menus-update -@end example - -@noindent -This updates all the nodes and menus.@refill -@end table - -The @code{texinfo-column-for-description} variable specifies the -column to which menu descriptions are indented. By default, the value -is 32 although it is often useful to reduce it to as low as 24. You -can set the variable with the @kbd{M-x edit-options} command -(@pxref{Edit Options, , Editing Variable Values, emacs, The GNU Emacs -Manual}) or with the @kbd{M-x set-variable} command (@pxref{Examining, -, Examining and Setting Variables, emacs, The GNU Emacs -Manual}).@refill - -Also, the @code{texinfo-indent-menu-description} command may be used to -indent existing menu descriptions to a specified column. Finally, if -you wish, you can use the @code{texinfo-insert-node-lines} command to -insert missing @code{@@node} lines into a file. (@xref{Other Updating -Commands}, for more information.)@refill - -@node Updating Requirements, Other Updating Commands, Updating Commands, Updating Nodes and Menus -@comment node-name, next, previous, up -@subsection Updating Requirements -@cindex Updating requirements -@cindex Requirements for updating commands - -To use the updating commands, you must organize the Texinfo file -hierarchically with chapters, sections, subsections, and the like. -When you construct the hierarchy of the manual, do not `jump down' -more than one level at a time: you can follow the `Top' node with a -chapter, but not with a section; you can follow a chapter with a -section, but not with a subsection. However, you may `jump up' any -number of levels at one time---for example, from a subsection to a -chapter.@refill - -Each @code{@@node} line, with the exception of the line for the `Top' -node, must be followed by a line with a structuring command such as -@code{@@chapter}, @code{@@section}, or -@code{@@unnumberedsubsec}.@refill - -Each @code{@@node} line/structuring-command line combination -must look either like this:@refill - -@example -@group -@@node Comments, Minimum, Conventions, Overview -@@comment node-name, next, previous, up -@@section Comments -@end group -@end example - -or like this (without the @code{@@comment} line): - -@example -@group -@@node Comments, Minimum, Conventions, Overview -@@section Comments -@end group -@end example - -@noindent -In this example, `Comments' is the name of both the node and the -section. The next node is called `Minimum' and the previous node is -called `Conventions'. The `Comments' section is within the `Overview' -node, which is specified by the `Up' pointer. (Instead of an -@code{@@comment} line, you can write an @code{@@ifinfo} line.)@refill - -If a file has a `Top' node, it must be called @samp{top} or @samp{Top} -and be the first node in the file.@refill - -The menu updating commands create a menu of sections within a chapter, -a menu of subsections within a section, and so on. This means that -you must have a `Top' node if you want a menu of chapters.@refill - -Incidentally, the @code{makeinfo} command will create an Info file for -a hierarchically organized Texinfo file that lacks `Next', `Previous' -and `Up' pointers. Thus, if you can be sure that your Texinfo file -will be formatted with @code{makeinfo}, you have no need for the -`update node' commands. (@xref{Create an Info File, , Creating an -Info File}, for more information about @code{makeinfo}.) However, -both @code{makeinfo} and the @code{texinfo-format-@dots{}} commands -require that you insert menus in the file.@refill - -@node Other Updating Commands, , Updating Requirements, Updating Nodes and Menus -@comment node-name, next, previous, up -@subsection Other Updating Commands - -In addition to the five major updating commands, Texinfo mode -possesses several less frequently used updating commands:@refill - -@table @kbd -@item M-x texinfo-insert-node-lines -@findex texinfo-insert-node-lines -Insert @code{@@node} lines before the @code{@@chapter}, -@code{@@section}, and other sectioning commands wherever they are -missing throughout a region in a Texinfo file.@refill - -With an argument (@kbd{C-u} as prefix argument, if interactive), the -@code{texinfo-insert-node-lines} command not only inserts -@code{@@node} lines but also inserts the chapter or section titles as -the names of the corresponding nodes. In addition, it inserts the -titles as node names in pre-existing @code{@@node} lines that lack -names. Since node names should be more concise than section or -chapter titles, you must manually edit node names so inserted.@refill - -For example, the following marks a whole buffer as a region and inserts -@code{@@node} lines and titles throughout:@refill - -@example -C-x h C-u M-x texinfo-insert-node-lines -@end example - -(Note that this command inserts titles as node names in @code{@@node} -lines; the @code{texinfo-start-menu-description} command -(@pxref{Inserting, Inserting Frequently Used Commands}) inserts titles -as descriptions in menu entries, a different action. However, in both -cases, you need to edit the inserted text.)@refill - -@item M-x texinfo-multiple-files-update -@findex texinfo-multiple-files-update @r{(in brief)} -Update nodes and menus in a document built from several separate files. -With @kbd{C-u} as a prefix argument, create and insert a master menu in -the outer file. With a numeric prefix argument, such as @kbd{C-u 2}, first -update all the menus and all the `Next', `Previous', and `Up' pointers -of all the included files before creating and inserting a master menu in -the outer file. The @code{texinfo-multiple-files-update} command is -described in the appendix on @code{@@include} files. -@ifinfo -@xref{texinfo-multiple-files-update}.@refill -@end ifinfo -@iftex -@xref{texinfo-multiple-files-update, , -@code{texinfo-multiple-files-update}}.@refill -@end iftex - -@item M-x texinfo-indent-menu-description -@findex texinfo-indent-menu-description -Indent every description in the menu following point to the specified -column. You can use this command to give yourself more space for -descriptions. With an argument (@kbd{C-u} as prefix argument, if -interactive), the @code{texinfo-indent-menu-description} command indents -every description in every menu in the region. However, this command -does not indent the second and subsequent lines of a multi-line -description.@refill - -@item M-x texinfo-sequential-node-update -@findex texinfo-sequential-node-update -Insert the names of the nodes immediately following and preceding the -current node as the `Next' or `Previous' pointers regardless of those -nodes' hierarchical level. This means that the `Next' node of a -subsection may well be the next chapter. Sequentially ordered nodes are -useful for novels and other documents that you read through -sequentially. (However, in Info, the @code{g* @key{RET}} command lets -you look through the file sequentially, so sequentially ordered nodes -are not strictly necessary.) With an argument (prefix argument, if -interactive), the @code{texinfo-sequential-node-update} command -sequentially updates all the nodes in the region.@refill -@end table - -@node Info Formatting, Printing, Updating Nodes and Menus, Texinfo Mode -@comment node-name, next, previous, up -@section Formatting for Info -@cindex Formatting for Info -@cindex Running an Info formatter -@cindex Info formatting - -Texinfo mode provides several commands for formatting part or all of a -Texinfo file for Info. Often, when you are writing a document, you -want to format only part of a file---that is, a region.@refill - -You can use either the @code{texinfo-format-region} or the -@code{makeinfo-region} command to format a region:@refill - -@table @kbd -@findex texinfo-format-region -@item C-c C-e C-r -@itemx M-x texinfo-format-region -@itemx C-c C-m C-r -@itemx M-x makeinfo-region -Format the current region for Info.@refill -@end table - -You can use either the @code{texinfo-format-buffer} or the -@code{makeinfo-buffer} command to format a whole buffer:@refill - -@table @kbd -@findex texinfo-format-buffer -@item C-c C-e C-b -@itemx M-x texinfo-format-buffer -@itemx C-c C-m C-b -@itemx M-x makeinfo-buffer -Format the current buffer for Info.@refill -@end table - -@need 1000 -For example, after writing a Texinfo file, you can type the following: - -@example -C-u C-c C-u m -@exdent or -C-u M-x texinfo-master-menu -@end example - -@noindent -This updates all the nodes and menus. Then type the following to create -an Info file: - -@example -C-c C-m C-b -@exdent or -M-x makeinfo-buffer -@end example - -For the Info formatting commands to work, the file @emph{must} include -a line that has @code{@@setfilename} in its header.@refill - -Not all systems support the @code{makeinfo}-based formatting commands.@refill - -@xref{Create an Info File}, for details about Info formatting.@refill - -@node Printing, Texinfo Mode Summary, Info Formatting, Texinfo Mode -@comment node-name, next, previous, up -@section Formatting and Printing -@cindex Formatting for printing -@cindex Printing a region or buffer -@cindex Region formatting and printing -@cindex Buffer formatting and printing -@cindex Part of file formatting and printing - -Typesetting and printing a Texinfo file is a multi-step process in which -you first create a file for printing (called a @sc{dvi} file), and then -print the file. Optionally, you may also create indices. To do this, -you must run the @code{texindex} command after first running the -@code{tex} typesetting command; and then you must run the @code{tex} -command again. @refill - -Often, when you are writing a document, you want to typeset and print -only part of a file to see what it will look like. You can use the -@code{texinfo-tex-region} and related commands for this purpose. Use -the @code{texinfo-tex-buffer} command to format all of a -buffer.@refill - -@table @kbd -@item C-c C-t C-r -@itemx M-x texinfo-tex-region -@findex texinfo-tex-region -Run @TeX{} on the region.@refill - -@item C-c C-t C-b -@itemx M-x texinfo-tex-buffer -@findex texinfo-tex-buffer -Run @TeX{} on the buffer.@refill - -@item C-c C-t C-i -@itemx M-x texinfo-texindex -Run @code{texindex} to sort the indices of a Texinfo file formatted with -@code{texinfo-tex-region} or @code{texinfo-tex-buffer}. You must run -the @code{tex} command a second time after sorting the raw index -files.@refill - -@item C-c C-t C-p -@itemx M-x texinfo-tex-print -@findex texinfo-tex-print -Print the file (or the part of the file) previously formatted with -@code{texinfo-tex-buffer} or @code{texinfo-tex-region}.@refill -@end table - -For @code{texinfo-tex-region} or @code{texinfo-tex-buffer} to work, the -file @emph{must} start with a @samp{\input texinfo} line and must -include an @code{@@settitle} line. The file must end with @code{@@bye} -on a line by itself. (When you use @code{texinfo-tex-region}, you must -surround the @code{@@settitle} line with start-of-header and -end-of-header lines.)@refill - -@xref{Format/Print Hardcopy}, for a description of the other @TeX{} related -commands, such as @code{tex-show-print-queue}.@refill - -@node Texinfo Mode Summary, , Printing, Texinfo Mode -@comment node-name, next, previous, up -@section Texinfo Mode Summary - -In Texinfo mode, each set of commands has default keybindings that -begin with the same keys. All the commands that are custom-created -for Texinfo mode begin with @kbd{C-c}. The keys are somewhat -mnemonic.@refill - -@subheading Insert Commands - -The insert commands are invoked by typing @kbd{C-c} twice and then the -first letter of the @@-command to be inserted. (It might make more -sense mnemonically to use @kbd{C-c C-i}, for `custom insert', but -@kbd{C-c C-c} is quick to type.)@refill - -@example -C-c C-c c @r{Insert} @samp{@@code}. -C-c C-c d @r{Insert} @samp{@@dfn}. -C-c C-c e @r{Insert} @samp{@@end}. -C-c C-c i @r{Insert} @samp{@@item}. -C-c C-c n @r{Insert} @samp{@@node}. -C-c C-c s @r{Insert} @samp{@@samp}. -C-c C-c v @r{Insert} @samp{@@var}. -C-c C-c @{ @r{Insert braces.} -C-c C-c ] -C-c C-c @} @r{Move out of enclosing braces.} - -@group -C-c C-c C-d @r{Insert a node's section title} - @r{in the space for the description} - @r{in a menu entry line.} -@end group -@end example - -@subheading Show Structure - -The @code{texinfo-show-structure} command is often used within a -narrowed region.@refill - -@example -C-c C-s @r{List all the headings.} -@end example - -@subheading The Master Update Command - -The @code{texinfo-master-menu} command creates a master menu; and can -be used to update every node and menu in a file as well.@refill - -@example -@group -C-c C-u m -M-x texinfo-master-menu - @r{Create or update a master menu.} -@end group - -@group -C-u C-c C-u m @r{With @kbd{C-u} as a prefix argument, first} - @r{create or update all nodes and regular} - @r{menus, and then create a master menu.} -@end group -@end example - -@subheading Update Pointers - -@c !!! added verbiage to prevent overfull hbox --bob 26 Mar 93 -The update pointer commands are invoked by typing @kbd{C-c C-u} and -then either typing @kbd{C-n} for @code{texinfo-update-node} or typing -@kbd{C-e} for @code{texinfo-every-node-update}.@refill - -@example -C-c C-u C-n @r{Update a node.} -C-c C-u C-e @r{Update every node in the buffer.} -@end example - -@subheading Update Menus - -Invoke the update menu commands by typing @kbd{C-c C-u} -and then either @kbd{C-m} for @code{texinfo-make-menu} or -@kbd{C-a} for @code{texinfo-all-menus-update}. To update -both nodes and menus at the same time, precede @kbd{C-c C-u -C-a} with @kbd{C-u}.@refill - -@example -C-c C-u C-m @r{Make or update a menu.} - -@group -C-c C-u C-a @r{Make or update all} - @r{menus in a buffer.} -@end group - -@group -C-u C-c C-u C-a @r{With @kbd{C-u} as a prefix argument,} - @r{first create or update all nodes and} - @r{then create or update all menus.} -@end group -@end example - -@subheading Format for Info - -The Info formatting commands that are written in Emacs Lisp are -invoked by typing @kbd{C-c C-e} and then either @kbd{C-r} for a region -or @kbd{C-b} for the whole buffer.@refill - -The Info formatting commands that are written in C and based on the -@code{makeinfo} program are invoked by typing @kbd{C-c C-m} and then -either @kbd{C-r} for a region or @kbd{C-b} for the whole buffer.@refill - -@need 800 -@noindent -Use the @code{texinfo-format@dots{}} commands: - -@example -@group -C-c C-e C-r @r{Format the region.} -C-c C-e C-b @r{Format the buffer.} -@end group -@end example - -@need 750 -@noindent -Use @code{makeinfo}: - -@example -C-c C-m C-r @r{Format the region.} -C-c C-m C-b @r{Format the buffer.} -C-c C-m C-l @r{Recenter the @code{makeinfo} output buffer.} -C-c C-m C-k @r{Kill the @code{makeinfo} formatting job.} -@end example - -@subheading Typeset and Print - -The @TeX{} typesetting and printing commands are invoked by typing -@kbd{C-c C-t} and then another control command: @kbd{C-r} for -@code{texinfo-tex-region}, @kbd{C-b} for @code{texinfo-tex-buffer}, -and so on.@refill - -@example -C-c C-t C-r @r{Run @TeX{} on the region.} -C-c C-t C-b @r{Run @TeX{} on the buffer.} -C-c C-t C-i @r{Run} @code{texindex}. -C-c C-t C-p @r{Print the @sc{dvi} file.} -C-c C-t C-q @r{Show the print queue.} -C-c C-t C-d @r{Delete a job from the print queue.} -C-c C-t C-k @r{Kill the current @TeX{} formatting job.} -C-c C-t C-x @r{Quit a currently stopped @TeX{} formatting job.} -C-c C-t C-l @r{Recenter the output buffer.} -@end example - -@subheading Other Updating Commands - -The `other updating commands' do not have standard keybindings because -they are rarely used. - -@example -@group -M-x texinfo-insert-node-lines - @r{Insert missing @code{@@node} lines in region.} - @r{With @kbd{C-u} as a prefix argument,} - @r{use section titles as node names.} -@end group - -@group -M-x texinfo-multiple-files-update - @r{Update a multi-file document.} - @r{With @kbd{C-u 2} as a prefix argument,} - @r{create or update all nodes and menus} - @r{in all included files first.} -@end group - -@group -M-x texinfo-indent-menu-description - @r{Indent descriptions.} -@end group - -@group -M-x texinfo-sequential-node-update - @r{Insert node pointers in strict sequence.} -@end group -@end example - -@node Beginning a File, Ending a File, Texinfo Mode, Top -@comment node-name, next, previous, up -@chapter Beginning a Texinfo File -@cindex Beginning a Texinfo file -@cindex Texinfo file beginning -@cindex File beginning - -Certain pieces of information must be provided at the beginning of a -Texinfo file, such as the name of the file and the title of the -document.@refill - -@menu -* Four Parts:: Four parts begin a Texinfo file. -* Sample Beginning:: Here is a sample beginning for a Texinfo file. -* Header:: The very beginning of a Texinfo file. -* Info Summary and Permissions:: Summary and copying permissions for Info. -* Titlepage & Copyright Page:: Creating the title and copyright pages. -* The Top Node:: Creating the `Top' node and master menu. -* Software Copying Permissions:: Ensure that you and others continue to - have the right to use and share software. -@end menu - -@node Four Parts, Sample Beginning, , Beginning a File -@ifinfo -@heading Four Parts Begin a File -@end ifinfo - -Generally, the beginning of a Texinfo file has four parts:@refill - -@enumerate -@item -The header, delimited by special comment lines, that includes the -commands for naming the Texinfo file and telling @TeX{} what -definitions' file to use when processing the Texinfo file.@refill - -@item -A short statement of what the file is about, with a copyright notice -and copying permissions. This is enclosed in @code{@@ifinfo} and -@code{@@end ifinfo} commands so that the formatters place it only -in the Info file.@refill - -@item -A title page and copyright page, with a copyright notice and copying -permissions. This is enclosed between @code{@@titlepage} and -@code{@@end titlepage} commands. The title and copyright page appear -only in the printed @w{manual}.@refill - -@item -The `Top' node that contains a menu for the whole Info file. The -contents of this node appear only in the Info file.@refill -@end enumerate - -Also, optionally, you may include the copying conditions for a program -and a warranty disclaimer. The copying section will be followed by an -introduction or else by the first chapter of the manual.@refill - -Since the copyright notice and copying permissions for the Texinfo -document (in contrast to the copying permissions for a program) are in -parts that appear only in the Info file or only in the printed manual, -this information must be given twice.@refill - -@node Sample Beginning, Header, Four Parts, Beginning a File -@comment node-name, next, previous, up -@section Sample Texinfo File Beginning - -The following sample shows what is needed.@refill - -@example -\input texinfo @@c -*-texinfo-*- -@@c %**start of header -@@setfilename @var{name-of-info-file} -@@settitle @var{name-of-manual} -@@setchapternewpage odd -@@c %**end of header - -@@ifinfo -This file documents @dots{} - -Copyright @var{year} @var{copyright-owner} - -@group -Permission is granted to @dots{} -@@end ifinfo -@end group - -@group -@@c This title page illustrates only one of the -@@c two methods of forming a title page. -@end group - -@group -@@titlepage -@@title @var{name-of-manual-when-printed} -@@subtitle @var{subtitle-if-any} -@@subtitle @var{second-subtitle} -@@author @var{author} -@end group - -@group -@@c The following two commands -@@c start the copyright page. -@@page -@@vskip 0pt plus 1filll -Copyright @@copyright@{@} @var{year} @var{copyright-owner} -@end group - -Published by @dots{} - -Permission is granted to @dots{} -@@end titlepage - -@@node Top, Overview, (dir), (dir) - -@@ifinfo -This document describes @dots{} - -This document applies to version @dots{} -of the program named @dots{} -@@end ifinfo - -@group -@@menu -* Copying:: Your rights and freedoms. -* First Chapter:: Getting started @dots{} -* Second Chapter:: @dots{} - @dots{} - @dots{} -@@end menu -@end group - -@group -@@node First Chapter, Second Chapter, top, top -@@comment node-name, next, previous, up -@@chapter First Chapter -@@cindex Index entry for First Chapter -@end group -@end example - -@node Header, Info Summary and Permissions, Sample Beginning, Beginning a File -@comment node-name, next, previous, up -@section The Texinfo File Header -@cindex Header for Texinfo files -@cindex Texinfo file header - -Texinfo files start with at least three lines that provide Info and -@TeX{} with necessary information. These are the @code{\input -texinfo} line, the @code{@@settitle} line, and the -@code{@@setfilename} line. If you want to run @TeX{} on just a part -of the Texinfo File, you must write the @code{@@settitle} -and @code{@@setfilename} lines between start-of-header and end-of-header -lines.@refill - -Thus, the beginning of a Texinfo file looks like this: - -@example -@group -\input texinfo @@c -*-texinfo-*- -@@setfilename sample.info -@@settitle Sample Document -@end group -@end example - -@noindent -or else like this: - -@example -@group -\input texinfo @@c -*-texinfo-*- -@@c %**start of header -@@setfilename sample.info -@@settitle Sample Document -@@c %**end of header -@end group -@end example - -@menu -* First Line:: The first line of a Texinfo file. -* Start of Header:: Formatting a region requires this. -* setfilename:: Tell Info the name of the Info file. -* settitle:: Create a title for the printed work. -* setchapternewpage:: Start chapters on right-hand pages. -* paragraphindent:: An option to specify paragraph indentation. -* End of Header:: Formatting a region requires this. -@end menu - -@node First Line, Start of Header, , Header -@comment node-name, next, previous, up -@subsection The First Line of a Texinfo File -@cindex First line of a Texinfo file -@cindex Beginning line of a Texinfo file -@cindex Header of a Texinfo file - -Every Texinfo file that is to be the top-level input to @TeX{} must begin -with a line that looks like this:@refill - -@example -\input texinfo @@c -*-texinfo-*- -@end example - -@noindent -This line serves two functions: - -@enumerate -@item -When the file is processed by @TeX{}, the @code{\input texinfo} command -tells @TeX{} to load the macros needed for processing a Texinfo file. -These are in a file called @file{texinfo.tex}, which is usually located -in the @file{/usr/lib/tex/macros} directory. @TeX{} uses the backslash, -@samp{\}, to mark the beginning of a command, just as Texinfo uses -@code{@@}. The @file{texinfo.tex} file causes the switch from @samp{\} -to @samp{@@}; before the switch occurs, @TeX{} requires @samp{\}, which -is why it appears at the beginning of the file.@refill - -@item -When the file is edited in GNU Emacs, the @samp{-*-texinfo-*-} mode -specification tells Emacs to use Texinfo mode.@refill -@end enumerate - -@node Start of Header, setfilename, First Line, Header -@comment node-name, next, previous, up -@subsection Start of Header -@cindex Start of header line - -Write a start-of-header line on the second line of a Texinfo file. -Follow the start-of-header line with @code{@@setfilename} and -@code{@@settitle} lines and, optionally, with other command lines, such -as @code{@@smallbook} or @code{@@footnotestyle}; and then by an -end-of-header line (@pxref{End of Header}).@refill - -With these lines, you can format part of a Texinfo file for Info or -typeset part for printing.@refill - -A start-of-header line looks like this:@refill - -@example -@@c %**start of header -@end example - -The odd string of characters, @samp{%**}, is to ensure that no other -comment is accidentally taken for a start-of-header line.@refill - -@node setfilename, settitle, Start of Header, Header -@comment node-name, next, previous, up -@subsection @code{@@setfilename} -@cindex Info file requires @code{@@setfilename} -@findex setfilename - -In order to be made into an Info file, a Texinfo file must contain a line -that looks like this:@refill - -@example -@@setfilename @var{info-file-name} -@end example - -Write the @code{@@setfilename} command at the beginning of a line and -follow it on the same line by the Info file name. Do not write -anything else on the line; anything on the line after the command is -considered part of the file name, including a comment.@refill - -The @code{@@setfilename} line specifies the name of the Info file to be -generated. This name should be different from the name of the Texinfo -file. The convention is to write a name with a @samp{.info} extension, -to produce an Info file name such as @file{texinfo.info}.@refill - -Some operating systems cannot handle long file names. You can run into -a problem even when the file name you specify is itself short enough. -This occurs because the Info formatters split a long Info file into -short indirect subfiles, and name them by appending `-1', `-2', @dots{}, -`-10', `-11', and so on, to the original file name. (@xref{Tag and -Split Files, , Tag Files and Split Files}.) The subfile name -@file{texinfo.info-10}, for example, is too long for some systems; so -the Info file name for this document is actually @file{texinfo} rather than -@file{texinfo.info}.@refill - -The Info formatting commands ignore everything written before the -@code{@@setfilename} line, which is why the very first line of -the file (the @code{\input} line) does not need to be commented out. -The @code{@@setfilename} line is ignored when you typeset a printed -manual.@refill - -@node settitle, setchapternewpage, setfilename, Header -@comment node-name, next, previous, up -@subsection @code{@@settitle} -@findex settitle - -In order to be made into a printed manual, a Texinfo file must contain -a line that looks like this:@refill - -@example -@@settitle @var{title} -@end example - -Write the @code{@@settitle} command at the beginning of a line and -follow it on the same line by the title. This tells @TeX{} the title -to use in a header or footer. Do not write anything else on the line; -anything on the line after the command is considered part of the -title, including a comment.@refill - -Conventionally, @TeX{} formats a Texinfo file for double-sided output -so as to print the title in the left-hand (even-numbered) page -headings and the current chapter titles in the right-hand -(odd-numbered) page headings. (@TeX{} learns the title of each -chapter from each @code{@@chapter} command.) Page footers are not -printed.@refill - -Even if you are printing in a single-sided style, @TeX{} looks for an -@code{@@settitle} command line, in case you include the manual title -in the heading. @refill - -The @code{@@settitle} command should precede everything that generates -actual output in @TeX{}.@refill - -Although the title in the @code{@@settitle} command is usually the -same as the title on the title page, it does not affect the title as -it appears on the title page. Thus, the two do not need not match -exactly; and the title in the @code{@@settitle} command can be a -shortened or expanded version of the title as it appears on the title -page. (@xref{titlepage, , @code{@@titlepage}}.)@refill - -@TeX{} prints page headings only for that text that comes after the -@code{@@end titlepage} command in the Texinfo file, or that comes -after an @code{@@headings} command that turns on headings. -(@xref{headings on off, , The @code{@@headings} Command}, for more -information.)@refill - -You may, if you wish, create your own, customized headings and -footings. @xref{Headings, , Page Headings}, for a detailed discussion -of this process.@refill - -@node setchapternewpage, paragraphindent, settitle, Header -@comment node-name, next, previous, up -@subsection @code{@@setchapternewpage} -@cindex Starting chapters -@cindex Pages, starting odd -@findex setchapternewpage - -In a book or a manual, text is usually printed on both sides of the -paper, chapters start on right-hand pages, and right-hand pages have -odd numbers. But in short reports, text often is printed only on one -side of the paper. Also in short reports, chapters sometimes do not -start on new pages, but are printed on the same page as the end of the -preceding chapter, after a small amount of vertical whitespace.@refill - -You can use the @code{@@setchapternewpage} command with various -arguments to specify how @TeX{} should start chapters and whether it -should typeset pages for printing on one or both sides of the paper -(single-sided or double-sided printing).@refill - -Write the @code{@@setchapternewpage} command at the beginning of a -line followed by its argument.@refill - -For example, you would write the following to cause each chapter to -start on a fresh odd-numbered page:@refill - -@example -@@setchapternewpage odd -@end example - -You can specify one of three alternatives with the -@code{@@setchapternewpage} command:@refill - -@table @asis -@ignore -@item No @code{@@setchapternewpage} command -If the Texinfo file does not contain an @code{@@setchapternewpage} -command before the @code{@@titlepage} command, @TeX{} automatically -begins chapters on new pages and prints headings in the standard -format for single-sided printing. This is the conventional format for -single-sided printing.@refill - -The result is exactly the same as when you write -@code{@@setchapternewpage on}.@refill -@end ignore -@item @code{@@setchapternewpage off} -Cause @TeX{} to typeset a new chapter on the same page as the last -chapter, after skipping some vertical whitespace. Also, cause @TeX{} to -format page headers for single-sided printing. (You can override the -headers format with the @code{@@headings double} command; see -@ref{headings on off, , The @code{@@headings} Command}.)@refill - -@item @code{@@setchapternewpage on} -Cause @TeX{} to start new chapters on new pages and to typeset page -headers for single-sided printing. This is the form most often -used for short reports.@refill - -This alternative is the default.@refill - -@item @code{@@setchapternewpage odd} -Cause @TeX{} to start new chapters on new, odd-numbered pages -(right-handed pages) and to typeset for double-sided printing. This is -the form most often used for books and manuals.@refill -@end table - -@noindent -Texinfo does not have an @code{@@setchapternewpage even} command.@refill - -@noindent -(You can countermand or modify an @code{@@setchapternewpage} command -with an @code{@@headings} command. @xref{headings on off, , The -@code{@@headings} Command}.)@refill - -At the beginning of a manual or book, pages are not numbered---for -example, the title and copyright pages of a book are not numbered. -By convention, table of contents pages are numbered with roman -numerals and not in sequence with the rest of the document.@refill - -Since an Info file does not have pages, the @code{@@setchapternewpage} -command has no effect on it.@refill - -Usually, you do not write an @code{@@setchapternewpage} command for -single-sided printing, but accept the default which is to typeset for -single-sided printing and to start new chapters on new pages. Usually, -you write an @code{@@setchapternewpage odd} command for double-sided -printing.@refill - -@node paragraphindent, End of Header, setchapternewpage, Header -@comment node-name, next, previous, up -@subsection Paragraph Indenting -@cindex Indenting paragraphs -@cindex Paragraph indentation -@findex paragraphindent - -The Info formatting commands may insert spaces at the beginning of the -first line of each paragraph, thereby indenting that paragraph. You -can use the @code{@@paragraphindent} command to specify the -indentation. Write an @code{@@paragraphindent} command at the -beginning of a line followed by either @samp{asis} or a number. The -template is:@refill - -@example -@@paragraphindent @var{indent} -@end example - -The Info formatting commands indent according to the value of -@var{indent}:@refill - -@itemize @bullet -@item -If the value of @var{indent} is @samp{asis}, the Info formatting -commands do not change the existing indentation.@refill - -@item -If the value of @var{indent} is 0, the Info formatting commands delete -existing indentation.@refill - -@item -If the value of @var{indent} is greater than 0, the Info formatting -commands indent the paragraph by that number of spaces.@refill -@end itemize - -The default value of @var{indent} is @samp{asis}.@refill - -Write the @code{@@paragraphindent} command before or shortly after the -end-of-header line at the beginning of a Texinfo file. (If you write -the command between the start-of-header and end-of-header lines, the -region formatting commands indent paragraphs as specified.)@refill - -@c !!! added verbiage to prevent overfull hbox --bob 26 Mar 93 -A peculiarity of @code{texinfo-format-buffer} and -@code{texinfo-format-region} is that they do not indent (nor -fill) paragraphs that contain @code{@@w} or @code{@@*} commands. -@xref{Refilling Paragraphs}, for a detailed description of what goes -on.@refill - -@node End of Header, , paragraphindent, Header -@comment node-name, next, previous, up -@subsection End of Header -@cindex End of header line - -Follow the header lines with an @w{end-of-header} line. -An end-of-header line looks like this:@refill - -@example -@@c %**end of header -@end example - -If you include the @code{@@setchapternewpage} command between the -start-of-header and end-of-header lines, @TeX{} will typeset a region as -that command specifies. Similarly, if you include an @code{@@smallbook} -command between the start-of-header and end-of-header lines, @TeX{} will -typeset a region in the ``small'' book format.@refill - -@ifinfo -The reason for the odd string of characters (@samp{%**}) is so that the -@code{texinfo-tex-region} command does not accidentally find -something that it should not when it is looking for the header.@refill - -The start-of-header line and the end-of-header line are Texinfo mode -variables that you can change.@refill -@end ifinfo - -@iftex -@xref{Start of Header}. -@end iftex - -@node Info Summary and Permissions, Titlepage & Copyright Page, Header, Beginning a File -@comment node-name, next, previous, up -@section Summary and Copying Permissions for Info - -The title page and the copyright page appear only in the printed copy of -the manual; therefore, the same information must be inserted in a -section that appears only in the Info file. This section usually -contains a brief description of the contents of the Info file, a -copyright notice, and copying permissions.@refill - -The copyright notice should read:@refill - -@example -Copyright @var{year} @var{copyright-owner} -@end example - -@noindent -and be put on a line by itself.@refill - -Standard text for the copyright permissions is contained in an appendix -to this manual; see @ref{ifinfo Permissions, , @samp{ifinfo} Copying -Permissions}, for the complete text.@refill - -The permissions text appears in an Info file @emph{before} the first -node. This mean that a reader does @emph{not} see this text when -reading the file using Info, except when using the advanced Info command -@kbd{g *}. - -@node Titlepage & Copyright Page, The Top Node, Info Summary and Permissions, Beginning a File -@comment node-name, next, previous, up -@section The Title and Copyright Pages - -A manual's name and author are usually printed on a title page. -Sometimes copyright information is printed on the title page as well; -more often, copyright information is printed on the back of the title -page. - -The title and copyright pages appear in the printed manual, but not in the -Info file. Because of this, it is possible to use several slightly -obscure @TeX{} typesetting commands that cannot be used in an Info file. -In addition, this part of the beginning of a Texinfo file contains the text -of the copying permissions that will appear in the printed manual.@refill - -@xref{Titlepage Permissions, , Titlepage Copying Permissions}, for the -standard text for the copyright permissions.@refill - -@menu -* titlepage:: Create a title for the printed document. -* titlefont center sp:: The @code{@@titlefont}, @code{@@center}, - and @code{@@sp} commands. -* title subtitle author:: The @code{@@title}, @code{@@subtitle}, - and @code{@@author} commands. -* Copyright & Permissions:: How to write the copyright notice and - include copying permissions. -* end titlepage:: Turn on page headings after the title and - copyright pages. -* headings on off:: An option for turning headings on and off - and double or single sided printing. -@end menu - -@node titlepage, titlefont center sp, , Titlepage & Copyright Page -@comment node-name, next, previous, up -@subsection @code{@@titlepage} -@cindex Title page -@findex titlepage - -Start the material for the title page and following copyright page -with @code{@@titlepage} on a line by itself and end it with -@code{@@end titlepage} on a line by itself.@refill - -The @code{@@end titlepage} command starts a new page and turns on page -numbering. (@xref{Headings, , Page Headings}, for details about how to -generate of page headings.) All the material that you want to -appear on unnumbered pages should be put between the -@code{@@titlepage} and @code{@@end titlepage} commands. By using the -@code{@@page} command you can force a page break within the region -delineated by the @code{@@titlepage} and @code{@@end titlepage} -commands and thereby create more than one unnumbered page. This is -how the copyright page is produced. (The @code{@@titlepage} command -might perhaps have been better named the -@code{@@titleandadditionalpages} command, but that would have been -rather long!)@refill - -@c !!! append refill to footnote when makeinfo can handle it. -When you write a manual about a computer program, you should write the -version of the program to which the manual applies on the title -page. If the manual changes more frequently than the program or is -independent of it, you should also include an edition -number@footnote{We have found that it is helpful to refer to versions -of manuals as `editions' and versions of programs as `versions'; -otherwise, we find we are liable to confuse each other in conversation -by referring to both the documentation and the software with the same -words.} for the manual. This helps readers keep track of which manual -is for which version of the program. (The `Top' node -should also contain this information; see @ref{makeinfo top, , -@code{@@top}}.)@refill - -Texinfo provides two methods for creating a title page. One method -uses the @code{@@titlefont}, @code{@@sp}, and @code{@@center} commands -to generate a title page in which the words on the page are -centered.@refill - -The second method uses the @code{@@title}, @code{@@subtitle}, and -@code{@@author} commands to create a title page with black rules under -the title and author lines and the subtitle text set flush to the -right hand side of the page. With this method, you do not specify any -of the actual formatting of the title page. You specify the text -you want, and Texinfo does the formatting. You may use either -method.@refill - -@node titlefont center sp, title subtitle author, titlepage, Titlepage & Copyright Page -@comment node-name, next, previous, up -@subsection @code{@@titlefont}, @code{@@center}, and @code{@@sp} -@findex titlefont -@findex center -@findex sp @r{(titlepage line spacing)} - -You can use the @code{@@titlefont}, @code{@@sp}, and @code{@@center} -commands to create a title page for a printed document. (This is the -first of the two methods for creating a title page in Texinfo.)@refill - -Use the @code{@@titlefont} command to select a large font suitable for -the title itself.@refill - -@need 700 -For example: - -@example -@@titlefont@{Texinfo@} -@end example - -Use the @code{@@center} command at the beginning of a line to center -the remaining text on that line. Thus,@refill - -@example -@@center @@titlefont@{Texinfo@} -@end example - -@noindent -centers the title, which in this example is ``Texinfo'' printed -in the title font.@refill - -Use the @code{@@sp} command to insert vertical space. For example:@refill - -@example -@@sp 2 -@end example - -@noindent -This inserts two blank lines on the printed page. (@xref{sp, , -@code{@@sp}}, for more information about the @code{@@sp} -command.)@refill - -A template for this method looks like this:@refill - -@example -@group -@@titlepage -@@sp 10 -@@center @@titlefont@{@var{name-of-manual-when-printed}@} -@@sp 2 -@@center @var{subtitle-if-any} -@@sp 2 -@@center @var{author} -@dots{} -@@end titlepage -@end group -@end example - -The spacing of the example fits an 8 1/2 by 11 inch manual.@refill - -@node title subtitle author, Copyright & Permissions, titlefont center sp, Titlepage & Copyright Page -@comment node-name, next, previous, up -@subsection @code{@@title}, @code{@@subtitle}, and @code{@@author} -@findex title -@findex subtitle -@findex author - -You can use the @code{@@title}, @code{@@subtitle}, and @code{@@author} -commands to create a title page in which the vertical and horizontal -spacing is done for you automatically. This contrasts with the method -described in -the previous section, in which the @code{@@sp} command is needed to -adjust vertical spacing.@refill - -Write the @code{@@title}, @code{@@subtitle}, or @code{@@author} -commands at the beginning of a line followed by the title, subtitle, -or author.@refill - -The @code{@@title} command produces a line in which the title is set -flush to the left-hand side of the page in a larger than normal font. -The title is underlined with a black rule.@refill - -The @code{@@subtitle} command sets subtitles in a normal-sized font -flush to the right-hand side of the page.@refill - -The @code{@@author} command sets the names of the author or authors in -a middle-sized font flush to the left-hand side of the page on a line -near the bottom of the title page. The names are underlined with a -black rule that is thinner than the rule that underlines the title. -(The black rule only occurs if the @code{@@author} command line is -followed by an @code{@@page} command line.)@refill - -There are two ways to use the @code{@@author} command: you can write -the name or names on the remaining part of the line that starts with -an @code{@@author} command:@refill - -@example -@@author by Jane Smith and John Doe -@end example - -@noindent -or you can write the names one above each other by using two (or more) -@code{@@author} commands:@refill - -@example -@group -@@author Jane Smith -@@author John Doe -@end group -@end example - -@noindent -(Only the bottom name is underlined with a black rule.)@refill - -@need 950 -A template for this method looks like this:@refill - -@example -@group -@@titlepage -@@title @var{name-of-manual-when-printed} -@@subtitle @var{subtitle-if-any} -@@subtitle @var{second-subtitle} -@@author @var{author} -@@page -@dots{} -@@end titlepage -@end group -@end example - -@ifinfo -@noindent -Contrast this form with the form of a title page written using the -@code{@@sp}, @code{@@center}, and @code{@@titlefont} commands:@refill - -@example -@@titlepage -@@sp 10 -@@center @@titlefont@{Name of Manual When Printed@} -@@sp 2 -@@center Subtitle, If Any -@@sp 1 -@@center Second subtitle -@@sp 2 -@@center Author -@@page -@dots{} -@@end titlepage -@end example -@end ifinfo - -@node Copyright & Permissions, end titlepage, title subtitle author, Titlepage & Copyright Page -@comment node-name, next, previous, up -@subsection Copyright Page and Permissions -@cindex Copyright page -@cindex Printed permissions -@cindex Permissions, printed - -By international treaty, the copyright notice for a book should be -either on the title page or on the back of the title page. The -copyright notice should include the year followed by the name of the -organization or person who owns the copyright.@refill - -When the copyright notice is on the back of the title page, that page -is customarily not numbered. Therefore, in Texinfo, the information -on the copyright page should be within @code{@@titlepage} and -@code{@@end titlepage} commands.@refill - -@findex vskip -@findex filll -@cindex Vertical whitespace (@samp{vskip}) -Use the @code{@@page} command to cause a page break. To push the -copyright notice and the other text on the copyright page towards the -bottom of the page, you can write a somewhat mysterious line after the -@code{@@page} command that reads like this:@refill - -@example -@@vskip 0pt plus 1filll -@end example - -@noindent -This is a @TeX{} command that is not supported by the Info formatting -commands. The @code{@@vskip} command inserts whitespace. The -@samp{0pt plus 1filll} means to put in zero points of mandatory whitespace, -and as much optional whitespace as needed to push the -following text to the bottom of the page. Note the use of three -@samp{l}s in the word @samp{filll}; this is the correct usage in -@TeX{}.@refill - -@findex copyright -In a printed manual, the @code{@@copyright@{@}} command generates a -@samp{c} inside a circle. (In Info, it generates @samp{(C)}.) The -copyright notice itself has the following legally defined sequence:@refill - -@example -Copyright @copyright{} @var{year} @var{copyright-owner} -@end example - -It is customary to put information on how to get a manual after the -copyright notice, followed by the copying permissions for the -manual.@refill - -Note that permissions must be given here as well as in the summary -segment within @code{@@ifinfo} and @code{@@end ifinfo} that -immediately follows the header since this text appears only in the -printed manual and the @samp{ifinfo} text appears only in the Info -file.@refill - -@xref{Sample Permissions}, for the standard text.@refill - -@node end titlepage, headings on off, Copyright & Permissions, Titlepage & Copyright Page -@comment node-name, next, previous, up -@subsection Heading Generation -@findex end titlepage -@cindex Headings, page, begin to appear -@cindex Titlepage end starts headings -@cindex End titlepage starts headings - -An @code{@@end titlepage} command on a line by itself not only marks -the end of the title and copyright pages, but also causes @TeX{} to start -generating page headings and page numbers. - -To repeat what is said elsewhere, Texinfo has two standard page heading -formats, one for documents which are printed on one side of each sheet of paper -(single-sided printing), and the other for documents which are printed on both -sides of each sheet (double-sided printing). -(@xref{setchapternewpage, ,@code{@@setchapternewpage}}.) -You can specify these formats in different ways:@refill - -@itemize @bullet -@item -The conventional way is to write an @code{@@setchapternewpage} command -before the title page commands, and then have the @code{@@end -titlepage} command start generating page headings in the manner desired. -(@xref{setchapternewpage, , @code{@@setchapternewpage}}.)@refill - -@item -Alternatively, you can use the @code{@@headings} command to prevent page -headings from being generated or to start them for either single or -double-sided printing. (Write an @code{@@headings} command immediately -after the @code{@@end titlepage} command. @xref{headings on off, , The -@code{@@headings} Command}, for more information.)@refill - -@item -Or, you may specify your own page heading and footing format. -@xref{Headings, , Page Headings}, for detailed -information about page headings and footings.@refill -@end itemize - -Most documents are formatted with the standard single-sided or -double-sided format, using @code{@@setchapternewpage odd} for -double-sided printing and no @code{@@setchapternewpage} command for -single-sided printing.@refill - -@node headings on off, , end titlepage, Titlepage & Copyright Page -@comment node-name, next, previous, up -@subsection The @code{@@headings} Command -@findex headings - -The @code{@@headings} command is rarely used. It specifies what kind of -page headings and footings to print on each page. Usually, this is -controlled by the @code{@@setchapternewpage} command. You need the -@code{@@headings} command only if the @code{@@setchapternewpage} command -does not do what you want, or if you want to turn off pre-defined page -headings prior to defining your own. Write an @code{@@headings} command -immediately after the @code{@@end titlepage} command.@refill - -There are four ways to use the @code{@@headings} command:@refill - -@table @code -@item @@headings off -Turn off printing of page headings.@refill - -@item @@headings single -Turn on page headings appropriate for single-sided printing. -@refill - -@item @@headings double -@itemx @@headings on -Turn on page headings appropriate for double-sided printing. The two -commands, @code{@@headings on} and @code{@@headings double}, are -synonymous.@refill -@end table - -For example, suppose you write @code{@@setchapternewpage off} before the -@code{@@titlepage} command to tell @TeX{} to start a new chapter on the -same page as the end of the last chapter. This command also causes -@TeX{} to typeset page headers for single-sided printing. To cause -@TeX{} to typeset for double sided printing, write @code{@@headings -double} after the @code{@@end titlepage} command. - -You can stop @TeX{} from generating any page headings at all by -writing @code{@@headings off} on a line of its own immediately after the -line containing the @code{@@end titlepage} command, like this:@refill - -@example -@@end titlepage -@@headings off -@end example - -@noindent -The @code{@@headings off} command overrides the @code{@@end titlepage} -command, which would otherwise cause @TeX{} to print page -headings.@refill - -You can also specify your own style of page heading and footing. -@xref{Headings, , Page Headings}, for more information.@refill - -@node The Top Node, Software Copying Permissions, Titlepage & Copyright Page, Beginning a File -@comment node-name, next, previous, up -@section The `Top' Node and Master Menu -@cindex @samp{@r{Top}} node -@cindex Master menu -@cindex Node, `Top' - -The `Top' node is the node from which you enter an Info file.@refill - -A `Top' node should contain a brief description of the Info file and an -extensive, master menu for the whole Info file. -This helps the reader understand what the Info file is -about. Also, you should write the version number of the program to -which the Info file applies; or, at least, the edition number.@refill - -The contents of the `Top' node should appear only in the Info file; none -of it should appear in printed output, so enclose it between -@code{@@ifinfo} and @code{@@end ifinfo} commands. (@TeX{} does not -print either an @code{@@node} line or a menu; they appear only in Info; -strictly speaking, you are not required to enclose these parts between -@code{@@ifinfo} and @code{@@end ifinfo}, but it is simplest to do so. -@xref{Conditionals, , Conditionally Visible Text}.)@refill - -@menu -* Title of Top Node:: Sketch what the file is about. -* Master Menu Parts:: A master menu has three or more parts. -@end menu - -@node Title of Top Node, Master Menu Parts, , The Top Node -@ifinfo -@subheading `Top' Node Title -@end ifinfo - -Sometimes, you will want to place an @code{@@top} sectioning command -line containing the title of the document immediately after the -@code{@@node Top} line (@pxref{makeinfo top command, , The @code{@@top} -Sectioning Command}, for more information).@refill - -For example, the beginning of the Top node of this manual contains an -@code{@@top} sectioning command, a short description, and edition and -version information. It looks like this:@refill - -@example -@group -@dots{} -@@end titlepage - -@@ifinfo -@@node Top, Copying, (dir), (dir) -@@top Texinfo - -Texinfo is a documentation system@dots{} -@end group - -@group -This is edition@dots{} -@dots{} -@@end ifinfo -@end group - -@group -@@menu -* Copying:: Texinfo is freely - redistributable. -* Overview:: What is Texinfo? -@dots{} -@end group -@@end menu -@end example - -In a `Top' node, the `Previous', and `Up' nodes usually refer to the top -level directory of the whole Info system, which is called @samp{(dir)}. -The `Next' node refers to the first node that follows the main or master -menu, which is usually the copying permissions, introduction, or first -chapter.@refill - -@node Master Menu Parts, , Title of Top Node, The Top Node -@subsection Parts of a Master Menu -@cindex Master menu parts -@cindex Parts of a master menu - -A @dfn{master menu} is a detailed main menu listing all the nodes in a -file. - -A master menu is enclosed in @code{@@menu} and @code{@@end menu} -commands and does not appear in the printed document.@refill - -Generally, a master menu is divided into parts.@refill - -@itemize @bullet -@item -The first part contains the major nodes in the Texinfo file: the nodes -for the chapters, chapter-like sections, and the appendices.@refill - -@item -The second part contains nodes for the indices.@refill - -@item -The third and subsequent parts contain a listing of the other, lower -level nodes, often ordered by chapter. This way, rather than go -through an intermediary menu, an inquirer can go directly to a -particular node when searching for specific information. These menu -items are not required; add them if you think they are a -convenience.@refill -@end itemize - -Each section in the menu can be introduced by a descriptive line. So -long as the line does not begin with an asterisk, it will not be -treated as a menu entry. (@xref{Writing a Menu}, for more -information.)@refill - -For example, the master menu for this manual looks like the following -(but has many more entries):@refill - -@example -@group -@@menu -* Copying:: Texinfo is freely - redistributable. -* Overview:: What is Texinfo? -* Texinfo Mode:: Special features in GNU Emacs. -@dots{} -@dots{} -@end group -@group -* Command and Variable Index:: - An entry for each @@-command. -* Concept Index:: An entry for each concept. -@end group - -@group - --- The Detailed Node Listing --- - -Overview of Texinfo - -* Info Files:: What is an Info file? -* Printed Manuals:: Characteristics of - a printed manual. -@dots{} -@dots{} -@end group - -@group -Using Texinfo Mode - -* Info on a Region:: Formatting part of a file - for Info. -@dots{} -@dots{} -@@end menu -@end group -@end example - -@node Software Copying Permissions, , The Top Node, Beginning a File -@comment node-name, next, previous, up -@section Software Copying Permissions -@cindex Software copying permissions -@cindex Copying software -@cindex Distribution -@cindex License agreement - -If the Texinfo file has a section containing the ``General Public -License'' and the distribution information and a warranty disclaimer -for the software that is documented, this section usually follows the -`Top' node. The General Public License is very important to Project -GNU software. It ensures that you and others will continue to have a -right to use and share the software.@refill - -The copying and distribution information and the disclaimer are -followed by an introduction or else by the first chapter of the -manual.@refill - -@cindex Introduction, as part of file -Although an introduction is not a required part of a Texinfo file, it -is very helpful. Ideally, it should state clearly and concisely what -the file is about and who would be interested in reading it. In -general, an introduction would follow the licensing and distribution -information, although sometimes people put it earlier in the document. -Usually, an introduction is put in an @code{@@unnumbered} section. -(@xref{unnumbered & appendix, , The @code{@@unnumbered} and -@code{@@appendix} Commands}.)@refill - -@node Ending a File, Structuring, Beginning a File, Top -@comment node-name, next, previous, up -@chapter Ending a Texinfo File -@cindex Ending a Texinfo file -@cindex Texinfo file ending -@cindex File ending -@findex bye - -The end of a Texinfo file should include the commands that create -indices and generate detailed and summary tables of contents. -And it must include the @code{@@bye} command that marks the last line -processed by @TeX{}.@refill - -@need 700 -For example: - -@example -@@node Concept Index, , Variables Index, Top -@@c node-name, next, previous, up -@@unnumbered Concept Index - -@@printindex cp - -@@contents -@@bye -@end example - -@menu -* Printing Indices & Menus:: How to print an index in hardcopy and - generate index menus in Info. -* Contents:: How to create a table of contents. -* File End:: How to mark the end of a file. -@end menu - -@node Printing Indices & Menus, Contents, , Ending a File -@comment node-name, next, previous, up -@section Index Menus and Printing an Index -@findex printindex -@cindex Printing an index -@cindex Indices, printing and menus -@cindex Generating menus with indices -@cindex Menus generated with indices - -To print an index means to include it as part of a manual or Info -file. This does not happen automatically just because you use -@code{@@cindex} or other index-entry generating commands in the -Texinfo file; those just cause the raw data for the index to be -accumulated. To generate an index, you must include the -@code{@@printindex} command at the place in the document where you -want the index to appear. Also, as part of the process of creating a -printed manual, you must run a program called @code{texindex} -(@pxref{Format/Print Hardcopy}) to sort the raw data to produce a sorted -index file. The sorted index file is what is actually used to -print the index.@refill - -Texinfo offers six different types of predefined index: the concept -index, the function index, the variables index, the keystroke index, the -program index, and the data type index (@pxref{Predefined Indices}). Each -index type has a two-letter name: @samp{cp}, @samp{fn}, @samp{vr}, -@samp{ky}, @samp{pg}, and @samp{tp}. You may merge indices, or put them -into separate sections (@pxref{Combining Indices}); or you may define -your own indices (@pxref{New Indices, , Defining New Indices}).@refill - -The @code{@@printindex} command takes a two-letter index name, reads -the corresponding sorted index file and formats it appropriately into -an index.@refill - -@ignore -The two-letter index names are: - -@table @samp -@item cp -concept index -@item fn -function index -@item vr -variable index -@item ky -key index -@item pg -program index -@item tp -data type index -@end table -@end ignore -The @code{@@printindex} command does not generate a chapter heading -for the index. Consequently, you should precede the -@code{@@printindex} command with a suitable section or chapter command -(usually @code{@@unnumbered}) to supply the chapter heading and put -the index into the table of contents. Precede the @code{@@unnumbered} -command with an @code{@@node} line.@refill - -@need 1200 -For example: - -@smallexample -@group -@@node Variable Index, Concept Index, Function Index, Top -@@comment node-name, next, previous, up -@@unnumbered Variable Index - -@@printindex vr -@end group - -@group -@@node Concept Index, , Variable Index, Top -@@comment node-name, next, previous, up -@@unnumbered Concept Index - -@@printindex cp -@end group - -@group -@@summarycontents -@@contents -@@bye -@end group -@end smallexample - -@noindent -(Readers often prefer that the concept index come last in a book, -since that makes it easiest to find.)@refill - -@ignore -In @TeX{}, the @code{@@printindex} command needs a sorted index file -to work from. @TeX{} does not know how to do sorting; this is a -deficiency. @TeX{} writes output files of raw index data; use the -@code{texindex} program to convert these files to sorted index files. -(@xref{Format/Print Hardcopy}, for more information.)@refill -@end ignore -@node Contents, File End, Printing Indices & Menus, Ending a File -@comment node-name, next, previous, up -@section Generating a Table of Contents -@cindex Table of contents -@cindex Contents, Table of -@findex contents -@findex summarycontents -@findex shortcontents - -The @code{@@chapter}, @code{@@section}, and other structuring commands -supply the information to make up a table of contents, but they do not -cause an actual table to appear in the manual. To do this, you must -use the @code{@@contents} and @code{@@summarycontents} -commands:@refill - -@table @code -@item @@contents -Generate a table of contents in a printed manual, including all -chapters, sections, subsections, etc., as well as appendices and -unnumbered chapters. (Headings generated by the @code{@@heading} -series of commands do not appear in the table of contents.) The -@code{@@contents} command should be written on a line by -itself.@refill - -@item @@shortcontents -@itemx @@summarycontents -(@code{@@summarycontents} is a synonym for @code{@@shortcontents}; the -two commands are exactly the same.)@refill - -Generate a short or summary table of contents that lists only the -chapters (and appendices and unnumbered chapters). Omit sections, subsections -and subsubsections. Only a long manual needs a short table -of contents in addition to the full table of contents.@refill - -Write the @code{@@shortcontents} command on a line by itself right -@emph{before} the @code{@@contents} command.@refill -@end table - -The table of contents commands automatically generate a chapter-like -heading at the top of the first table of contents page. Write the table -of contents commands at the very end of a Texinfo file, just before the -@code{@@bye} command, following any index sections---anything in the -Texinfo file after the table of contents commands will be omitted from -the table of contents.@refill - -When you print a manual with a table of contents, the table of -contents are printed last and numbered with roman numerals. You need -to place those pages in their proper place, after the title page, -yourself. (This is the only collating you need to do for a printed -manual. The table of contents is printed last because it is generated -after the rest of the manual is typeset.)@refill - -@need 700 -Here is an example of where to write table of contents commands:@refill - -@example -@group -@var{indices}@dots{} -@@shortcontents -@@contents -@@bye -@end group -@end example - -Since an Info file uses menus instead of tables of contents, the Info -formatting commands ignore the @code{@@contents} and -@code{@@shortcontents} commands.@refill - -@node File End, , Contents, Ending a File -@comment node-name, next, previous, up -@section @code{@@bye} File Ending -@findex bye - -An @code{@@bye} command terminates @TeX{} or Info formatting. None of -the formatting commands see any of the file following @code{@@bye}. -The @code{@@bye} command should be on a line by itself.@refill - -If you wish, you may follow the @code{@@bye} line with notes. These notes -will not be formatted and will not appear in either Info or a printed -manual; it is as if text after @code{@@bye} were within @code{@@ignore} -@dots{} @code{@@end ignore}. Also, you may follow the @code{@@bye} line -with a local variables list. @xref{Compile-Command, , Using Local -Variables and the Compile Command}, for more information.@refill - -@node Structuring, Nodes, Ending a File, Top -@comment node-name, next, previous, up -@chapter Chapter Structuring -@cindex Chapter structuring -@cindex Structuring of chapters - -The @dfn{chapter structuring} commands divide a document into a hierarchy of -chapters, sections, subsections, and subsubsections. These commands -generate large headings; they also provide information for the table -of contents of a printed manual (@pxref{Contents, , Generating a Table -of Contents}).@refill - -The chapter structuring commands do not create an Info node structure, -so normally you should put an @code{@@node} command immediately before -each chapter structuring command (@pxref{Nodes}). The only time you -are likely to use the chapter structuring commands without using the -node structuring commands is if you are writing a document that -contains no cross references and will never be transformed into Info -format.@refill - -It is unlikely that you will ever write a Texinfo file that is -intended only as an Info file and not as a printable document. If you -do, you might still use chapter structuring commands to create a -heading at the top of each node---but you don't need to.@refill - -@menu -* Tree Structuring:: A manual is like an upside down tree @dots{} -* Structuring Command Types:: How to divide a manual into parts. -* makeinfo top:: The @code{@@top} command, part of the `Top' node. -* chapter:: -* unnumbered & appendix:: -* majorheading & chapheading:: -* section:: -* unnumberedsec appendixsec heading:: -* subsection:: -* unnumberedsubsec appendixsubsec subheading:: -* subsubsection:: Commands for the lowest level sections. -@end menu - -@node Tree Structuring, Structuring Command Types, , Structuring -@comment node-name, next, previous, up -@section Tree Structure of Sections -@cindex Tree structuring - -A Texinfo file is usually structured like a book with chapters, -sections, subsections, and the like. This structure can be visualized -as a tree (or rather as an upside-down tree) with the root at the top -and the levels corresponding to chapters, sections, subsection, and -subsubsections.@refill - -Here is a diagram that shows a Texinfo file with three chapters, -each of which has two sections.@refill - -@example -@group - Top - | - ------------------------------------- - | | | - Chapter 1 Chapter 2 Chapter 3 - | | | - -------- -------- -------- - | | | | | | - Section Section Section Section Section Section - 1.1 1.2 2.1 2.2 3.1 3.2 - -@end group -@end example - -In a Texinfo file that has this structure, the beginning of Chapter 2 -looks like this:@refill - -@example -@group -@@node Chapter 2, Chapter 3, Chapter 1, top -@@chapter Chapter 2 -@end group -@end example - -The chapter structuring commands are described in the sections that -follow; the @code{@@node} and @code{@@menu} commands are described in -following chapters. (@xref{Nodes}, and see @ref{Menus}.)@refill - -@node Structuring Command Types, makeinfo top, Tree Structuring, Structuring -@comment node-name, next, previous, up -@section Types of Structuring Command - -The chapter structuring commands fall into four groups or series, each -of which contains structuring commands corresponding to the -hierarchical levels of chapters, sections, subsections, and -subsubsections.@refill - -The four groups are the @code{@@chapter} series, the -@code{@@unnumbered} series, the @code{@@appendix} series, and the -@code{@@heading} series.@refill - -Each command produces titles that have a different appearance on the -printed page or Info file; only some of the commands produce -titles that are listed in the table of contents of a printed book or -manual.@refill - -@itemize @bullet -@item -The @code{@@chapter} and @code{@@appendix} series of commands produce -numbered or lettered entries both in the body of a printed work and in -its table of contents.@refill - -@item -The @code{@@unnumbered} series of commands produce unnumbered entries -both in the body of a printed work and in its table of contents. The -@code{@@top} command, which has a special use, is a member of this -series (@pxref{makeinfo top, , @code{@@top}}).@refill - -@item -The @code{@@heading} series of commands produce unnumbered headings -that do not appear in a table of contents. The heading commands never -start a new page.@refill - -@item -The @code{@@majorheading} command produces results similar to using -the @code{@@chapheading} command but generates a larger vertical -whitespace before the heading.@refill - -@item -When an @code{@@setchapternewpage} command says to do so, the -@code{@@chapter}, @code{@@unnumbered}, and @code{@@appendix} commands -start new pages in the printed manual; the @code{@@heading} commands -do not.@refill -@end itemize - -@need 1000 -Here are the four groups of chapter structuring commands:@refill - -@c Slightly different formatting for regular sized books and smallbooks. -@ifset smallbook -@sp 1 -@tex -{\let\rm=\indrm \let\tt=\indtt -\halign{\hskip\itemindent#\hfil& \hskip.5em#\hfil& \hskip.5em#\hfil& -\hskip.5em#\hfil\cr - -& & & \rm No new pages\cr -\rm Numbered& \rm Unnumbered& \rm Lettered and numbered& \rm Unnumbered\cr -\rm In contents& \rm In contents& \rm In contents& \rm Not in contents\cr - -& & & \cr - & \tt @@top& & \tt @@majorheading\cr -\tt @@chapter& \tt @@unnumbered& \tt @@appendix& \tt @@chapheading\cr -\tt @@section& \tt @@unnumberedsec& \tt @@appendixsec& \tt @@heading\cr -\tt @@subsection&\tt @@unnumberedsubsec&\tt @@appendixsubsec& -\tt @@subheading\cr -\tt @@subsubsection& \tt @@unnumberedsubsubsec& \tt @@appendixsubsubsec& -\tt @@subsubheading\cr}} -@end tex -@end ifset -@ifclear smallbook -@sp 1 -@tex -\vbox{ -\halign{\hskip\itemindent\hskip.5em#\hfil& \hskip.5em#\hfil& -\hskip.5em#\hfil& \hskip.5em #\hfil\cr - -& & & \cr -& & & \rm No new pages\cr -\rm Numbered& \rm Unnumbered& \rm Lettered and numbered& \rm Unnumbered\cr -\rm In contents& \rm In contents& \rm In contents& \rm Not in contents\cr - -& & & \cr - & \tt @@top& & \tt @@majorheading\cr -\tt @@chapter& \tt @@unnumbered& \tt @@appendix& \tt @@chapheading\cr -\tt @@section& \tt @@unnumberedsec& \tt @@appendixsec& \tt @@heading\cr -\tt @@subsection&\tt @@unnumberedsubsec&\tt @@appendixsubsec& -\tt @@subheading\cr -\tt @@subsubsection& \tt @@unnumberedsubsubsec& \tt @@appendixsubsubsec& -\tt @@subsubheading\cr}} -@end tex -@end ifclear -@ifinfo -@example -@group - @r{No new pages} -@r{Numbered} @r{Unnumbered} @r{Lettered and numbered} @r{Unnumbered} -@r{In contents} @r{In contents} @r{In contents} @r{Not in contents} - - @@top @@majorheading -@@chapter @@unnumbered @@appendix @@chapheading -@@section @@unnumberedsec @@appendixsec @@heading -@@subsection @@unnumberedsubsec @@appendixsubsec @@subheading -@@subsubsection @@unnumberedsubsubsec @@appendixsubsubsec @@subsubheading -@end group -@end example -@end ifinfo - -@c Cannot line up columns properly inside of an example because of roman -@c proportional fonts. -@ignore -@ifset smallbook -@iftex -@smallexample -@group - @r{No new pages} -@r{Numbered} @r{Unnumbered} @r{Lettered and numbered} @r{Unnumbered} -@r{In contents} @r{In contents} @r{In contents} @r{Not in contents} - - @@top @@majorheading -@@chapter @@unnumbered @@appendix @@chapheading -@@section @@unnumberedsec @@appendixsec @@heading -@@subsection @@unnumberedsubsec @@appendixsubsec @@subheading -@@subsubsection @@unnumberedsubsubsec @@appendixsubsubsec @@subsubheading -@end group -@end smallexample -@end iftex -@end ifset -@ifclear smallbook -@iftex -@smallexample -@group - @r{No new pages} -@r{Numbered} @r{Unnumbered} @r{Lettered and numbered} @r{Unnumbered} -@r{In contents} @r{In contents} @r{In contents} @r{Not in contents} - - @@top @@majorheading -@@chapter @@unnumbered @@appendix @@chapheading -@@section @@unnumberedsec @@appendixsec @@heading -@@subsection @@unnumberedsubsec @@appendixsubsec @@subheading -@@subsubsection @@unnumberedsubsubsec @@appendixsubsubsec @@subsubheading -@end group -@end smallexample -@end iftex -@end ignore - -@node makeinfo top, chapter, Structuring Command Types, Structuring -@comment node-name, next, previous, up -@section @code{@@top} - -The @code{@@top} command is a special sectioning command that you use -only after an @code{@@node Top} line at the beginning of a Texinfo file. -The @code{@@top} command tells the @code{makeinfo} formatter -which node is the `Top' -node. It has the same typesetting effect as @code{@@unnumbered} -(@pxref{unnumbered & appendix, , @code{@@unnumbered}, @code{@@appendix}}). -For detailed information, see -@ref{makeinfo top command, , The @code{@@top} Command}.@refill - -@node chapter, unnumbered & appendix, makeinfo top, Structuring -@comment node-name, next, previous, up -@section @code{@@chapter} -@findex chapter - -@code{@@chapter} identifies a chapter in the document. Write the -command at the beginning of a line and follow it on the same line by -the title of the chapter.@refill - -For example, this chapter in this manual is entitled ``Chapter -Structuring''; the @code{@@chapter} line looks like this:@refill - -@example -@@chapter Chapter Structuring -@end example - -In @TeX{}, the @code{@@chapter} command creates a chapter in the -document, specifying the chapter title. The chapter is numbered -automatically.@refill - -In Info, the @code{@@chapter} command causes the title to appear on a -line by itself, with a line of asterisks inserted underneath. Thus, -in Info, the above example produces the following output:@refill - -@example -Chapter Structuring -******************* -@end example - -@node unnumbered & appendix, majorheading & chapheading, chapter, Structuring -@comment node-name, next, previous, up -@section @code{@@unnumbered}, @code{@@appendix} -@findex unnumbered -@findex appendix - -Use the @code{@@unnumbered} command to create a chapter that appears -in a printed manual without chapter numbers of any kind. Use the -@code{@@appendix} command to create an appendix in a printed manual -that is labelled by letter instead of by number.@refill - -For Info file output, the @code{@@unnumbered} and @code{@@appendix} -commands are equivalent to @code{@@chapter}: the title is printed on a -line by itself with a line of asterisks underneath. (@xref{chapter, , -@code{@@chapter}}.)@refill - -To create an appendix or an unnumbered chapter, write an -@code{@@appendix} or @code{@@unnumbered} command at the beginning of a -line and follow it on the same line by the title, as you would if you -were creating a chapter.@refill - -@node majorheading & chapheading, section, unnumbered & appendix, Structuring -@section @code{@@majorheading}, @code{@@chapheading} -@findex majorheading -@findex chapheading - -The @code{@@majorheading} and @code{@@chapheading} commands put -chapter-like headings in the body of a document.@refill - -However, neither command causes @TeX{} to produce a numbered heading -or an entry in the table of contents; and neither command causes -@TeX{} to start a new page in a printed manual.@refill - -In @TeX{}, an @code{@@majorheading} command generates a larger vertical -whitespace before the heading than an @code{@@chapheading} command but -is otherwise the same.@refill - -In Info, -the @code{@@majorheading} and -@code{@@chapheading} commands are equivalent to -@code{@@chapter}: the title is printed on a line by itself with a line -of asterisks underneath. (@xref{chapter, , @code{@@chapter}}.)@refill - -@node section, unnumberedsec appendixsec heading, majorheading & chapheading, Structuring -@comment node-name, next, previous, up -@section @code{@@section} -@findex section - -In a printed manual, an @code{@@section} command identifies a -numbered section within a chapter. The section title appears in the -table of contents. In Info, an @code{@@section} command provides a -title for a segment of text, underlined with @samp{=}.@refill - -This section is headed with an @code{@@section} command and looks like -this in the Texinfo file:@refill - -@example -@@section @@code@{@@@@section@} -@end example - -To create a section, write the @code{@@section} command at the -beginning of a line and follow it on the same line by the section -title.@refill - -Thus, - -@example -@@section This is a section -@end example - -@noindent -produces - -@example -@group -This is a section -================= -@end group -@end example - -@noindent -in Info. - -@node unnumberedsec appendixsec heading, subsection, section, Structuring -@comment node-name, next, previous, up -@section @code{@@unnumberedsec}, @code{@@appendixsec}, @code{@@heading} -@findex unnumberedsec -@findex appendixsec -@findex heading - -The @code{@@unnumberedsec}, @code{@@appendixsec}, and @code{@@heading} -commands are, respectively, the unnumbered, appendix-like, and -heading-like equivalents of the @code{@@section} command. -(@xref{section, , @code{@@section}}.)@refill - -@table @code -@item @@unnumberedsec -The @code{@@unnumberedsec} command may be used within an -unnumbered chapter or within a regular chapter or appendix to -provide an unnumbered section.@refill - -@item @@appendixsec -@itemx @@appendixsection -@code{@@appendixsection} is a longer spelling of the -@code{@@appendixsec} command; the two are synonymous.@refill -@findex appendixsection - -Conventionally, the @code{@@appendixsec} or @code{@@appendixsection} -command is used only within appendices.@refill - -@item @@heading -You may use the @code{@@heading} command anywhere you wish for a -section-style heading that will not appear in the table of contents.@refill -@end table - -@node subsection, unnumberedsubsec appendixsubsec subheading, unnumberedsec appendixsec heading, Structuring -@comment node-name, next, previous, up -@section The @code{@@subsection} Command -@findex subsection - -Subsections are to sections as sections are to chapters. -(@xref{section, , @code{@@section}}.) In Info, subsection titles are -underlined with @samp{-}. For example,@refill - -@example -@@subsection This is a subsection -@end example - -@noindent -produces - -@example -@group -This is a subsection --------------------- -@end group -@end example - -In a printed manual, subsections are listed in the table of contents -and are numbered three levels deep.@refill - -@node unnumberedsubsec appendixsubsec subheading, subsubsection, subsection, Structuring -@comment node-name, next, previous, up -@section The @code{@@subsection}-like Commands -@cindex Subsection-like commands -@findex unnumberedsubsec -@findex appendixsubsec -@findex subheading - -The @code{@@unnumberedsubsec}, @code{@@appendixsubsec}, and -@code{@@subheading} commands are, respectively, the unnumbered, -appendix-like, and heading-like equivalents of the @code{@@subsection} -command. (@xref{subsection, , @code{@@subsection}}.)@refill - -In Info, the @code{@@subsection}-like commands generate a title -underlined with hyphens. In a printed manual, an @code{@@subheading} -command produces a heading like that of a subsection except that it is -not numbered and does not appear in the table of contents. Similarly, -an @code{@@unnumberedsubsec} command produces an unnumbered heading like -that of a subsection and an @code{@@appendixsubsec} command produces a -subsection-like heading labelled with a letter and numbers; both of -these commands produce headings that appear in the table of -contents.@refill - -@node subsubsection, , unnumberedsubsec appendixsubsec subheading, Structuring -@comment node-name, next, previous, up -@section The `subsub' Commands -@cindex Subsub commands -@findex subsubsection -@findex unnumberedsubsubsec -@findex appendixsubsubsec -@findex subsubheading - -The fourth and lowest level sectioning commands in Texinfo are the -`subsub' commands. They are:@refill - -@table @code -@item @@subsubsection -Subsubsections are to subsections as subsections are to sections. -(@xref{subsection, , @code{@@subsection}}.) In a printed manual, -subsubsection titles appear in the table of contents and are numbered -four levels deep.@refill - -@item @@unnumberedsubsubsec -Unnumbered subsubsection titles appear in the table of contents of a -printed manual, but lack numbers. Otherwise, unnumbered -subsubsections are the same as subsubsections. In Info, unnumbered -subsubsections look exactly like ordinary subsubsections.@refill - -@item @@appendixsubsubsec -Conventionally, appendix commands are used only for appendices and are -lettered and numbered appropriately in a printed manual. They also -appear in the table of contents. In Info, appendix subsubsections look -exactly like ordinary subsubsections.@refill - -@item @@subsubheading -The @code{@@subsubheading} command may be used anywhere that you need -a small heading that will not appear in the table of contents. In -Info, subsubheadings look exactly like ordinary subsubsection -headings.@refill -@end table - -In Info, `subsub' titles are underlined with periods. -For example,@refill - -@example -@@subsubsection This is a subsubsection -@end example - -@noindent -produces - -@example -@group -This is a subsubsection -....................... -@end group -@end example - -@node Nodes, Menus, Structuring, Top -@comment node-name, next, previous, up -@chapter Nodes - -@dfn{Nodes} are the primary segments of a Texinfo file. They do not -themselves impose a hierarchic or any other kind of structure on a file. -Nodes contain @dfn{node pointers} that name other nodes, and can contain -@dfn{menus} which are lists of nodes. In Info, the movement commands -can carry you to a pointed-to node or to a node listed in a menu. Node -pointers and menus provide structure for Info files just as chapters, -sections, subsections, and the like, provide structure for printed -books.@refill - -@menu -* Two Paths:: Different commands to structure - Info output and printed output. -* Node Menu Illustration:: A diagram, and sample nodes and menus. -* node:: How to write a node, in detail. -* makeinfo Pointer Creation:: How to create node pointers with @code{makeinfo}. -@end menu - -@node Two Paths, Node Menu Illustration, , Nodes -@ifinfo -@heading Two Paths -@end ifinfo - -The node and menu commands and the chapter structuring commands are -independent of each other: - -@itemize @bullet -@item -In Info, node and menu commands provide structure. The chapter -structuring commands generate headings with different kinds of -underlining---asterisks for chapters, hyphens for sections, and so on; -they do nothing else.@refill - -@item -In @TeX{}, the chapter structuring commands generate chapter and section -numbers and tables of contents. The node and menu commands provide -information for cross references; they do nothing else.@refill -@end itemize - -You can use node pointers and menus to structure an Info file any way -you want; and you can write a Texinfo file so that its Info output has a -different structure than its printed output. However, most Texinfo -files are written such that the structure for the Info output -corresponds to the structure for the printed output. It is not -convenient to do otherwise.@refill - -Generally, printed output is structured in a tree-like hierarchy in -which the chapters are the major limbs from which the sections branch -out. Similarly, node pointers and menus are organized to create a -matching structure in the Info output.@refill - -@node Node Menu Illustration, node, Two Paths, Nodes -@comment node-name, next, previous, up -@section Node and Menu Illustration - -Here is a copy of the diagram shown earlier that illustrates a Texinfo -file with three chapters, each of which contains two sections.@refill - -Note that the ``root'' is at the top of the diagram and the ``leaves'' -are at the bottom. This is how such a diagram is drawn conventionally; -it illustrates an upside-down tree. For this reason, the root node is -called the `Top' node, and `Up' node pointers carry you closer to the -root.@refill - -@example -@group - Top - | - ------------------------------------- - | | | - Chapter 1 Chapter 2 Chapter 3 - | | | - -------- -------- -------- - | | | | | | - Section Section Section Section Section Section - 1.1 1.2 2.1 2.2 3.1 3.2 - -@end group -@end example - -Write the beginning of the node for Chapter 2 like this:@refill - -@example -@group -@@node Chapter 2, Chapter 3, Chapter 1, top -@@comment node-name, next, previous, up -@end group -@end example - -@noindent -This @code{@@node} line says that the name of this node is ``Chapter 2'', the -name of the `Next' node is ``Chapter 3'', the name of the `Previous' -node is ``Chapter 1'', and the name of the `Up' node is ``Top''. - -@quotation -@strong{Please Note:} `Next' refers to the next node at the same -hierarchical level in the manual, not necessarily to the next node -within the Texinfo file. In the Texinfo file, the subsequent node may -be at a lower level---a section-level node may follow a chapter-level -node, and a subsection-level node may follow a section-level node. -`Next' and `Previous' refer to nodes at the @emph{same} hierarchical -level. (The `Top' node contains the exception to this rule. Since the -`Top' node is the only node at that level, `Next' refers to the first -following node, which is almost always a chapter or chapter-level -node.)@refill -@end quotation - -To go to Sections 2.1 and 2.2 using Info, you need a menu inside Chapter -2. (@xref{Menus}.) You would write the menu just -before the beginning of Section 2.1, like this:@refill - -@example -@group - @@menu - * Sect. 2.1:: Description of this section. - * Sect. 2.2:: - @@end menu -@end group -@end example - -Write the node for Sect. 2.1 like this:@refill - -@example -@group - @@node Sect. 2.1, Sect. 2.2, Chapter 2, Chapter 2 - @@comment node-name, next, previous, up -@end group -@end example - -In Info format, the `Next' and `Previous' pointers of a node usually -lead to other nodes at the same level---from chapter to chapter or from -section to section (sometimes, as shown, the `Previous' pointer points -up); an `Up' pointer usually leads to a node at the level above (closer -to the `Top' node); and a `Menu' leads to nodes at a level below (closer -to `leaves'). (A cross reference can point to a node at any level; -see @ref{Cross References}.)@refill - -Usually, an @code{@@node} command and a chapter structuring command are -used in sequence, along with indexing commands. (You may follow the -@code{@@node} line with a comment line that reminds you which pointer is -which.)@refill - -Here is the beginning of the chapter in this manual called ``Ending a -Texinfo File''. This shows an @code{@@node} line followed by a comment -line, an @code{@@chapter} line, and then by indexing lines.@refill - -@example -@group -@@node Ending a File, Structuring, Beginning a File, Top -@@comment node-name, next, previous, up -@@chapter Ending a Texinfo File -@@cindex Ending a Texinfo file -@@cindex Texinfo file ending -@@cindex File ending -@end group -@end example - -@node node, makeinfo Pointer Creation, Node Menu Illustration, Nodes -@comment node-name, next, previous, up -@section The @code{@@node} Command - -@cindex Node, defined -A @dfn{node} is a segment of text that begins at an @code{@@node} -command and continues until the next @code{@@node} command. The -definition of node is different from that for chapter or section. A -chapter may contain sections and a section may contain subsections; -but a node cannot contain subnodes; the text of a node continues only -until the next @code{@@node} command in the file. A node usually -contains only one chapter structuring command, the one that follows -the @code{@@node} line. On the other hand, in printed output nodes -are used only for cross references, so a chapter or section may -contain any number of nodes. Indeed, a chapter usually contains -several nodes, one for each section, subsection, and -subsubsection.@refill - -To create a node, write an @code{@@node} command at the beginning of a -line, and follow it with four arguments, separated by commas, on the -rest of the same line. These arguments are the name of the node, and -the names of the `Next', `Previous', and `Up' pointers, in that order. -You may insert spaces before each pointer if you wish; the spaces are -ignored. You must write the name of the node, and the names of the -`Next', `Previous', and `Up' pointers, all on the same line. Otherwise, -the formatters fail. (@inforef{Top, info, info}, for more information -about nodes in Info.)@refill - -Usually, you write one of the chapter-structuring command lines -immediately after an @code{@@node} line---for example, an -@code{@@section} or @code{@@subsection} line. (@xref{Structuring -Command Types, , Types of Structuring Command}.)@refill - -@quotation -@strong{Please note:} The GNU Emacs Texinfo mode updating commands work -only with Texinfo files in which @code{@@node} lines are followed by chapter -structuring lines. @xref{Updating Requirements}.@refill -@end quotation - -@TeX{} uses @code{@@node} lines to identify the names to use for cross -references. For this reason, you must write @code{@@node} lines in a -Texinfo file that you intend to format for printing, even if you do not -intend to format it for Info. (Cross references, such as the one at the -end of this sentence, are made with @code{@@xref} and its related -commands; see @ref{Cross References}.)@refill - -@menu -* Node Names:: How to choose node and pointer names. -* Writing a Node:: How to write an @code{@@node} line. -* Node Line Tips:: Keep names short. -* Node Line Requirements:: Keep names unique, without @@-commands. -* First Node:: How to write a `Top' node. -* makeinfo top command:: How to use the @code{@@top} command. -* Top Node Summary:: Write a brief description for readers. -@end menu - -@node Node Names, Writing a Node, , node -@ifinfo -@subheading Choosing Node and Pointer Names -@end ifinfo - -The name of a node identifies the node. The pointers enable -you to reach other nodes and consist of the names of those nodes.@refill - -Normally, a node's `Up' pointer contains the name of the node whose menu -mentions that node. The node's `Next' pointer contains the name of the -node that follows that node in that menu and its `Previous' pointer -contains the name of the node that precedes it in that menu. When a -node's `Previous' node is the same as its `Up' node, both node pointers -name the same node.@refill - -Usually, the first node of a Texinfo file is the `Top' node, and its -`Up' and `Previous' pointers point to the @file{dir} file, which -contains the main menu for all of Info.@refill - -The `Top' node itself contains the main or master menu for the manual. -Also, it is helpful to include a brief description of the manual in the -`Top' node. @xref{First Node}, for information on how to write the -first node of a Texinfo file.@refill - -@node Writing a Node, Node Line Tips, Node Names, node -@comment node-name, next, previous, up -@subsection How to Write an @code{@@node} Line -@cindex Writing an @code{@@node} line -@cindex @code{@@node} line writing -@cindex Node line writing - -The easiest way to write an @code{@@node} line is to write @code{@@node} -at the beginning of a line and then the name of the node, like -this:@refill - -@example -@@node @var{node-name} -@end example - -If you are using GNU Emacs, you can use the update node commands -provided by Texinfo mode to insert the names of the pointers; or you -can leave the pointers out of the Texinfo file and let @code{makeinfo} -insert node pointers into the Info file it creates. (@xref{Texinfo -Mode}, and @ref{makeinfo Pointer Creation}.)@refill - -Alternatively, you can insert the `Next', `Previous', and `Up' -pointers yourself. If you do this, you may find it helpful to use the -Texinfo mode keyboard command @kbd{C-c C-c n}. This command inserts -@samp{@@node} and a comment line listing the names of the pointers in -their proper order. The comment line helps you keep track of which -arguments are for which pointers. This comment line is especially useful -if you are not familiar with Texinfo.@refill - -The template for a node line with `Next', `Previous', and `Up' pointers -looks like this:@refill - -@example -@@node @var{node-name}, @var{next}, @var{previous}, @var{up} -@end example - -If you wish, you can ignore @code{@@node} lines altogether in your first -draft and then use the @code{texinfo-insert-node-lines} command to -create @code{@@node} lines for you. However, we do not -recommend this practice. It is better to name the node itself -at the same time that you -write a segment so you can easily make cross references. A large number -of cross references are an especially important feature of a good Info -file.@refill - -After you have inserted an @code{@@node} line, you should immediately -write an @@-command for the chapter or section and insert its name. -Next (and this is important!), put in several index entries. Usually, -you will find at least two and often as many as four or five ways of -referring to the node in the index. Use them all. This will make it -much easier for people to find the node.@refill - -@node Node Line Tips, Node Line Requirements, Writing a Node, node -@comment node-name, next, previous, up -@subsection @code{@@node} Line Tips - -Here are three suggestions: - -@itemize @bullet -@item -Try to pick node names that are informative but short.@refill - -In the Info file, the file name, node name, and pointer names are all -inserted on one line, which may run into the right edge of the window. -(This does not cause a problem with Info, but is ugly.)@refill - -@item -Try to pick node names that differ from each other near the beginnings -of their names. This way, it is easy to use automatic name completion in -Info.@refill - -@item -By convention, node names are capitalized just as they would be for -section or chapter titles---initial and significant words are -capitalized; others are not.@refill -@end itemize - -@node Node Line Requirements, First Node, Node Line Tips, node -@comment node-name, next, previous, up -@subsection @code{@@node} Line Requirements - -@cindex Node line requirements -Here are several requirements for @code{@@node} lines: - -@itemize @bullet -@cindex Unique nodename requirement -@cindex Nodename must be unique -@item -All the node names for a single Info file must be unique.@refill - -Duplicates confuse the Info movement commands. This means, for -example, that if you end every chapter with a summary, you must name -each summary node differently. You cannot just call each one -``Summary''. You may, however, duplicate the titles of chapters, sections, -and the like. Thus you can end each chapter in a book with a section -called ``Summary'', so long as the node names for those sections are all -different.@refill - -@item -A pointer name must be the name of a node.@refill - -The node to which a pointer points may come before or after the -node containing the pointer.@refill - -@cindex @@-command in nodename -@cindex Nodename, cannot contain -@item -You cannot use any of the Texinfo @@-commands in a node name; -@w{@@-commands} confuse Info.@refill - -@need 750 -Thus, the beginning of the section called @code{@@chapter} looks like -this:@refill - -@smallexample -@group -@@node chapter, unnumbered & appendix, makeinfo top, Structuring -@@comment node-name, next, previous, up -@@section @@code@{@@@@chapter@} -@@findex chapter -@end group -@end smallexample - -@cindex Comma in nodename -@cindex Colon in nodename -@cindex Apostrophe in nodename -@item -You cannot use commas, colons, or apostrophes within a node name; these -confuse @TeX{} or the Info formatters.@refill - -@need 700 -For example, the following is a section title: - -@smallexample -@@code@{@@@@unnumberedsec@}, @@code@{@@@@appendixsec@}, @@code@{@@@@heading@} -@end smallexample - -@noindent -The corresponding node name is: - -@smallexample -unnumberedsec appendixsec heading -@end smallexample - -@cindex Case in nodename -@item -Case is significant. -@end itemize - -@node First Node, makeinfo top command, Node Line Requirements, node -@comment node-name, next, previous, up -@subsection The First Node -@cindex @samp{@r{Top}} node is first -@cindex First node - -The first node of a Texinfo file is the `Top' node, except in an -included file (@pxref{Include Files}). - -The `Top' node (which must be named @samp{top} or @samp{Top}) should -have as its `Up' and `Previous' nodes the name of a node in another -file, where there is a menu that leads to this file. Specify the file -name in parentheses. If the file is to be installed directly in the -Info directory file, use @samp{(dir)} as the parent of the `Top' node; -this is short for @samp{(dir)top}, and specifies the `Top' node in the -@file{dir} file, which contains the main menu for Info. For example, -the @code{@@node Top} line of this manual looks like this:@refill - -@example -@@node Top, Overview, (dir), (dir) -@end example - -@noindent -(You may use the Texinfo updating commands or the @code{makeinfo} -utility to insert these `Next' and @samp{(dir)} pointers -automatically.)@refill - -@xref{Install an Info File}, for more information about installing -an Info file in the @file{info} directory.@refill - -The `Top' node contains the main or master menu for the document. - -@node makeinfo top command, Top Node Summary, First Node, node -@comment node-name, next, previous, up -@subsection The @code{@@top} Sectioning Command -@findex top @r{(@@-command)} - -A special sectioning command, @code{@@top}, has been created for use -with the @code{@@node Top} line. The @code{@@top} sectioning command tells -@code{makeinfo} that it marks the `Top' node in the file. It provides -the information that @code{makeinfo} needs to insert node -pointers automatically. Write the @code{@@top} command at the -beginning of the line immediately following the @code{@@node Top} -line. Write the title on the remaining part of the same line as the -@code{@@top} command.@refill - -In Info, the @code{@@top} sectioning command causes the title to appear on a -line by itself, with a line of asterisks inserted underneath.@refill - -In @TeX{} and @code{texinfo-format-buffer}, the @code{@@top} -sectioning command is merely a synonym for @code{@@unnumbered}. -Neither of these formatters require an @code{@@top} command, and do -nothing special with it. You can use @code{@@chapter} or -@code{@@unnumbered} after the @code{@@node Top} line when you use -these formatters. Also, you can use @code{@@chapter} or -@code{@@unnumbered} when you use the Texinfo updating commands to -create or update pointers and menus.@refill - -Whatever sectioning command follows an @code{@@node Top} line, whether -it be @code{@@top} or @code{@@chapter}, the @code{@@node Top} line and -the immediately following line and any additional text must be -enclosed between @code{@@ifinfo} and @code{@@end ifinfo} commands. -(@xref{Conditionals}.) This prevents the title and the accompanying -text from appearing in printed output. Write the @code{@@ifinfo} -command before the @code{@@node} line and write the @code{@@end ifinfo} command -after the @code{@@top} or other sectioning command and after any -additional text. (You can write the @code{@@end ifinfo} command after -the @code{@@end menu} command if you like.)@refill - -@node Top Node Summary, , makeinfo top command, node -@subsection The `Top' Node Summary -@cindex @samp{@r{Top}} node summary - -You can help readers by writing a summary in the `Top' node, after the -@code{@@top} line, before the main or master menu. The summary should -briefly describe the Info file. You should also write the version -number of the program to which the manual applies in this section. This -helps the reader keep track of which manual is for which version of the -program. If the manual changes more frequently than the program or is -independent of it, you should also include an edition number for the -manual. (The title page should also contain this information: -see @ref{titlepage, , @code{@@titlepage}}.)@refill - -Put the whole of the `Top' node, including the @code{@@top} sectioning -command line if you -have one, between @code{@@ifinfo} and @code{@@end -ifinfo} so none of the text appears in the printed output -(@pxref{Conditionals, , Conditionally Visible Text}). (You may want to -repeat the brief description from the `Top' node within @code{@@iftex} -@dots{} @code{@@end iftex} at the beginning of the first chapter, for -those who read the printed manual.) - -@node makeinfo Pointer Creation, , node, Nodes -@section Creating Pointers with @code{makeinfo} -@cindex Creating pointers with @code{makeinfo} -@cindex Pointer creation with @code{makeinfo} -@cindex Automatic pointer creation with @code{makeinfo} - -The @code{makeinfo} program has a feature for automatically creating -node pointers for a hierarchically organized file that lacks -them.@refill - -When you take advantage of this feature, you do not need to write the -`Next', `Previous', and `Up' pointers after the name of a node. -However, you must write a sectioning command, such as @code{@@chapter} -or @code{@@section}, on the line immediately following each truncated -@code{@@node} line. You cannot write a comment line after a node -line; the section line must follow it immediately.@refill - -In addition, you must follow the `Top' @code{@@node} line with a line beginning -with @code{@@top} to mark the `Top' node in the file. @xref{makeinfo -top, , @code{@@top}}. - -Finally, you must write the name of each node (except for the `Top' -node) in a menu that is one or more hierarchical levels above the -node's hierarchical level.@refill - -This node pointer insertion feature in @code{makeinfo} is an -alternative to the menu and pointer creation and update commands in -Texinfo mode. (@xref{Updating Nodes and Menus}.) It is especially -helpful to people who do not use GNU Emacs for writing Texinfo -documents.@refill - -@node Menus, Cross References, Nodes, Top -@comment node-name, next, previous, up -@chapter Menus -@cindex Menus -@findex menu - -@dfn{Menus} contain pointers to subordinate -nodes.@footnote{Menus can carry you to any node, regardless -of the hierarchical structure; even to nodes in a different -Info file. However, the GNU Emacs Texinfo mode updating -commands work only to create menus of subordinate nodes. -Conventionally, cross references are used to refer to other -nodes.} In Info, you use menus to go to such nodes. Menus -have no effect in printed manuals and do not appear in -them.@refill - -By convention, a menu is put at the end of a node since a reader who -uses the menu may not see text that follows it.@refill - -@ifinfo -A node that has a menu should @emph{not} contain much text. If you -have a lot of text and a menu, move most of the text into a new -subnode---all but a few lines.@refill -@end ifinfo -@iftex -@emph{A node that has a menu should not contain much text.} If you -have a lot of text and a menu, move most of the text into a new -subnode---all but a few lines. Otherwise, a reader with a terminal -that displays only a few lines may miss the menu and its associated -text. As a practical matter, you should locate a menu within 20 lines -of the beginning of the node.@refill -@end iftex - -@menu -* Menu Location:: Put a menu in a short node. -* Writing a Menu:: What is a menu? -* Menu Parts:: A menu entry has three parts. -* Less Cluttered Menu Entry:: Two part menu entry. -* Menu Example:: Two and three part menu entries. -* Other Info Files:: How to refer to a different Info file. -@end menu - -@node Menu Location, Writing a Menu, , Menus -@ifinfo -@heading Menus Need Short Nodes -@end ifinfo -@cindex Menu location -@cindex Location of menus -@cindex Nodes for menus are short -@cindex Short nodes for menus - -@ifinfo -A reader can easily see a menu that is close to the beginning of the -node. The node should be short. As a practical matter, you should -locate a menu within 20 lines of the beginning of the node. -Otherwise, a reader with a terminal that displays only a few lines may -miss the menu and its associated text.@refill -@end ifinfo - -The short text before a menu may look awkward in a printed manual. To -avoid this, you can write a menu near the beginning of its node and -follow the menu by an @code{@@node} line, and then an @code{@@heading} -line located within @code{@@ifinfo} and @code{@@end ifinfo}. This way, -the menu, @code{@@node} line, and title appear only in the Info file, -not the printed document.@refill - -For example, the preceding two paragraphs follow an Info-only menu, -@code{@@node} line, and heading, and look like this:@refill - -@example -@group -@@menu -* Menu Location:: Put a menu in a short node. -* Writing a Menu:: What is a menu? -* Menu Parts:: A menu entry has three parts. -* Less Cluttered Menu Entry:: Two part menu entry. -* Menu Example:: Two and three part entries. -* Other Info Files:: How to refer to a different - Info file. -@@end menu - -@@node Menu Location, Writing a Menu, , Menus -@@ifinfo -@@heading Menus Need Short Nodes -@@end ifinfo -@end group -@end example - -The Texinfo file for this document contains more than a dozen -examples of this procedure. One is at the beginning of this chapter; -another is at the beginning of the ``Cross References'' chapter.@refill - -@node Writing a Menu, Menu Parts, Menu Location, Menus -@section Writing a Menu -@cindex Writing a menu -@cindex Menu writing - -A menu consists of an @code{@@menu} command on a line by -itself followed by menu entry lines or menu comment lines -and then by an @code{@@end menu} command on a line by -itself.@refill - -A menu looks like this:@refill - -@example -@group -@@menu -Larger Units of Text - -* Files:: All about handling files. -* Multiples: Buffers. Multiple buffers; editing - several files at once. -@@end menu -@end group -@end example - -In a menu, every line that begins with an @w{@samp{* }} is a -@dfn{menu entry}. (Note the space after the asterisk.) A -line that does not start with an @w{@samp{* }} may also -appear in a menu. Such a line is not a menu entry but is a -menu comment line that appears in the Info file. In -the example above, the line @samp{Larger Units of Text} is a -menu comment line; the two lines starting with @w{@samp{* }} -are menu entries. - -@node Menu Parts, Less Cluttered Menu Entry, Writing a Menu, Menus -@section The Parts of a Menu -@cindex Parts of a menu -@cindex Menu parts -@cindex @code{@@menu} parts - -A menu entry has three parts, only the second of which is -required:@refill - -@enumerate -@item -The menu entry name. - -@item -The name of the node (required). - -@item -A description of the item. -@end enumerate - -The template for a menu entry looks like this:@refill - -@example -* @var{menu-entry-name}: @var{node-name}. @var{description} -@end example - -Follow the menu entry name with a single colon and follow the node name -with tab, comma, period, or newline.@refill - -In Info, a user selects a node with the @kbd{m} (@code{Info-menu}) -command. The menu entry name is what the user types after the @kbd{m} -command.@refill - -The third part of a menu entry is a descriptive phrase or -sentence. Menu entry names and node names are often short; the -description explains to the reader what the node is about. The -description, which is optional, can spread over two or more lines. A -useful description complements the node name rather than repeats -it.@refill - -@node Less Cluttered Menu Entry, Menu Example, Menu Parts, Menus -@comment node-name, next, previous, up -@section Less Cluttered Menu Entry -@cindex Two part menu entry -@cindex Double-colon menu entries -@cindex Menu entries with two colons -@cindex Less cluttered menu entry -@cindex Uncluttered menu entry - -When the menu entry name and node name are the same, you can write -the name immediately after the asterisk and space at the beginning of -the line and follow the name with two colons.@refill - -@need 800 -For example, write - -@example -* Name:: @var{description} -@end example - -@need 800 -@noindent -instead of - -@example -* Name: Name. @var{description} -@end example - -You should use the node name for the menu entry name whenever possible, -since it reduces visual clutter in the menu.@refill - -@node Menu Example, Other Info Files, Less Cluttered Menu Entry, Menus -@comment node-name, next, previous, up -@section A Menu Example -@cindex Menu example -@cindex Example menu - -A menu looks like this in Texinfo:@refill - -@example -@group -@@menu -* menu entry name: Node name. A short description. -* Node name:: This form is preferred. -@@end menu -@end group -@end example - -@need 800 -@noindent -This produces: - -@example -@group -* menu: - -* menu entry name: Node name. A short description. -* Node name:: This form is preferred. -@end group -@end example - -@need 700 -Here is an example as you might see it in a Texinfo file:@refill - -@example -@group -@@menu -Larger Units of Text - -* Files:: All about handling files. -* Multiples: Buffers. Multiple buffers; editing - several files at once. -@@end menu -@end group -@end example - -@need 800 -@noindent -This produces: - -@example -@group -* menu: -Larger Units of Text - -* Files:: All about handling files. -* Multiples: Buffers. Multiple buffers; editing - several files at once. -@end group -@end example - -In this example, the menu has two entries. @samp{Files} is both a menu -entry name and the name of the node referred to by that name. -@samp{Multiples} is the menu entry name; it refers to the node named -@samp{Buffers}. The line @samp{Larger Units of Text} is a comment; it -appears in the menu, but is not an entry.@refill - -Since no file name is specified with either @samp{Files} or -@samp{Buffers}, they must be the names of nodes in the same Info file -(@pxref{Other Info Files, , Referring to Other Info Files}).@refill - -@node Other Info Files, , Menu Example, Menus -@comment node-name, next, previous, up -@section Referring to Other Info Files -@cindex Referring to other Info files -@cindex Nodes in other Info files -@cindex Other Info files' nodes -@cindex Going to other Info files' nodes -@cindex Info; other files' nodes - -You can create a menu entry that enables a reader in Info to go to a -node in another Info file by writing the file name in parentheses just -before the node name. In this case, you should use the three-part menu -entry format, which saves the reader from having to type the file -name.@refill - -@need 800 -The format looks like this:@refill - -@example -@group -@@menu -* @var{first-entry-name}:(@var{filename})@var{nodename}. @var{description} -* @var{second-entry-name}:(@var{filename})@var{second-node}. @var{description} -@@end menu -@end group -@end example - -For example, to refer directly to the @samp{Outlining} and -@samp{Rebinding} nodes in the @cite{Emacs Manual}, you would write a -menu like this:@refill - -@example -@group -@@menu -* Outlining: (emacs)Outline Mode. The major mode for - editing outlines. -* Rebinding: (emacs)Rebinding. How to redefine the - meaning of a key. -@@end menu -@end group -@end example - -If you do not list the node name, but only name the file, then Info -presumes that you are referring to the `Top' node.@refill - -The @file{dir} file that contains the main menu for Info has menu -entries that list only file names. These take you directly to the `Top' -nodes of each Info document. (@xref{Install an Info File}.)@refill - -@need 700 -For example: - -@example -@group -* Info: (info). Documentation browsing system. -* Emacs: (emacs). The extensible, self-documenting - text editor. -@end group -@end example - -@noindent -(The @file{dir} top level directory for the Info system is an Info file, -not a Texinfo file, but a menu entry looks the same in both types of -file.)@refill - -Note that the GNU Emacs Texinfo mode menu updating commands only work -with nodes within the current buffer, so you cannot use them to create -menus that refer to other files. You must write such menus by hand.@refill - -@node Cross References, Marking Text, Menus, Top -@comment node-name, next, previous, up -@chapter Cross References -@cindex Making cross references -@cindex Cross references -@cindex References - -@dfn{Cross references} are used to refer the reader to other parts of the -same or different Texinfo files. In Texinfo, nodes are the -places to which cross references can refer.@refill - -@menu -* References:: What cross references are for. -* Cross Reference Commands:: A summary of the different commands. -* Cross Reference Parts:: A cross reference has several parts. -* xref:: Begin a reference with `See' @dots{} -* Top Node Naming:: How to refer to the beginning of another file. -* ref:: A reference for the last part of a sentence. -* pxref:: How to write a parenthetical cross reference. -* inforef:: How to refer to an Info-only file. -@end menu - -@node References, Cross Reference Commands, , Cross References -@ifinfo -@heading What References Are For -@end ifinfo - -Often, but not always, a printed document should be designed so that -it can be read sequentially. People tire of flipping back and forth -to find information that should be presented to them as they need -it.@refill - -However, in any document, some information will be too detailed for -the current context, or incidental to it; use cross references to -provide access to such information. Also, an on-line help system or a -reference manual is not like a novel; few read such documents in -sequence from beginning to end. Instead, people look up what they -need. For this reason, such creations should contain many cross -references to help readers find other information that they may not -have read.@refill - -In a printed manual, a cross reference results in a page reference, -unless it is to another manual altogether, in which case the cross -reference names that manual.@refill - -In Info, a cross reference results in an entry that you can follow using -the Info @samp{f} command. (@inforef{Help-Adv, Some advanced Info -commands, info}.)@refill - -The various cross reference commands use nodes to define cross -reference locations. This is evident in Info, in which a cross -reference takes you to the specified node. @TeX{} also uses nodes to -define cross reference locations, but the action is less obvious. When -@TeX{} generates a @sc{dvi} file, it records nodes' page numbers and -uses the page numbers in making references. Thus, if you are writing -a manual that will only be printed, and will not be used on-line, you -must nonetheless write @code{@@node} lines to name the places to which -you make cross references.@refill - -@need 800 -@node Cross Reference Commands, Cross Reference Parts, References, Cross References -@comment node-name, next, previous, up -@section Different Cross Reference Commands -@cindex Different cross reference commands - -There are four different cross reference commands:@refill - -@table @code -@item @@xref -Used to start a sentence in the printed manual saying -@w{`See @dots{}'} or an entry in the Info file saying -@samp{*Note @dots{}}. - -@item @@ref -Used within or, more often, at the end of a sentence; same as -@code{@@xref} for Info; produces just the reference in the printed -manual without a preceding `See'.@refill - -@item @@pxref -Used within parentheses to make a reference that suits both an Info -file and a printed book. Starts with a lower case `see' within the -printed manual. (@samp{p} is for `parenthesis'.)@refill - -@item @@inforef -Used to make a reference to an Info file for which there is no printed -manual.@refill -@end table - -@noindent -(The @code{@@cite} command is used to make references to books and -manuals for which there is no corresponding Info file and, therefore, -no node to which to point. @xref{cite, , @code{@@cite}}.)@refill - -@node Cross Reference Parts, xref, Cross Reference Commands, Cross References -@comment node-name, next, previous, up -@section Parts of a Cross Reference -@cindex Cross reference parts -@cindex Parts of a cross reference - -A cross reference command requires only one argument, which is the -name of the node to which it refers. But a cross reference command -may contain up to four additional arguments. By using these -arguments, you can provide a cross reference name for Info, a topic -description or section title for the printed output, the name of a -different Info file, and the name of a different printed -manual.@refill - -Here is a simple cross reference example:@refill - -@example -@@xref@{Node name@}. -@end example - -@noindent -which produces - -@example -*Note Node name::. -@end example - -@noindent -and - -@quotation -See Section @var{nnn} [Node name], page @var{ppp}. -@end quotation - -@need 700 -Here is an example of a full five-part cross reference:@refill - -@example -@group -@@xref@{Node name, Cross Reference Name, Particular Topic, -info-file-name, A Printed Manual@}, for details. -@end group -@end example - -@noindent -which produces - -@example -*Note Cross Reference Name: (info-file-name)Node name, -for details. -@end example - -@noindent -in Info and - -@quotation -See section ``Particular Topic'' in @i{A Printed Manual}, for details. -@end quotation - -@noindent -in a printed book. - -The five possible arguments for a cross reference are:@refill - -@enumerate -@item -The node name (required). This is the node to which the -cross reference takes you. In a printed document, the location of the -node provides the page reference only for references within the same -document.@refill - -@item -The cross reference name for the Info reference, if it is to be different -from the node name. If you include this argument, it argument becomes -the first part of the cross reference. It is usually omitted.@refill - -@item -A topic description or section name. Often, this is the title of the -section. This is used as the name of the reference in the printed -manual. If omitted, the node name is used.@refill - -@item -The name of the Info file in which the reference is located, if it is -different from the current file.@refill - -@item -The name of a printed manual from a different Texinfo file.@refill -@end enumerate - -The template for a full five argument cross reference looks like -this:@refill - -@example -@group -@@xref@{@var{node-name}, @var{cross-reference-name}, @var{title-or-topic}, -@var{info-file-name}, @var{printed-manual-title}@}. -@end group -@end example - -Cross references with one, two, three, four, and five arguments are -described separately following the description of @code{@@xref}.@refill - -Write a node name in a cross reference in exactly the same way as in -the @code{@@node} line, including the same capitalization; otherwise, the -formatters may not find the reference.@refill - -You can write cross reference commands within a paragraph, but note -how Info and @TeX{} format the output of each of the various commands: -write @code{@@xref} at the beginning of a sentence; write -@code{@@pxref} only within parentheses, and so on.@refill - -@node xref, Top Node Naming, Cross Reference Parts, Cross References -@comment node-name, next, previous, up -@section @code{@@xref} -@findex xref -@cindex Cross references using @code{@@xref} -@cindex References using @code{@@xref} - -The @code{@@xref} command generates a cross reference for the -beginning of a sentence. The Info formatting commands convert it into -an Info cross reference, which the Info @samp{f} command can use to -bring you directly to another node. The @TeX{} typesetting commands -convert it into a page reference, or a reference to another book or -manual.@refill - -@menu -* Reference Syntax:: What a reference looks like and requires. -* One Argument:: @code{@@xref} with one argument. -* Two Arguments:: @code{@@xref} with two arguments. -* Three Arguments:: @code{@@xref} with three arguments. -* Four and Five Arguments:: @code{@@xref} with four and five arguments. -@end menu - -@node Reference Syntax, One Argument, , xref -@ifinfo -@subheading What a Reference Looks Like and Requires -@end ifinfo - -Most often, an Info cross reference looks like this:@refill - -@example -*Note @var{node-name}::. -@end example - -@noindent -or like this - -@example -*Note @var{cross-reference-name}: @var{node-name}. -@end example - -@noindent -In @TeX{}, a cross reference looks like this: - -@example -See Section @var{section-number} [@var{node-name}], page @var{page}. -@end example - -@noindent -or like this - -@example -See Section @var{section-number} [@var{title-or-topic}], page @var{page}. -@end example - -The @code{@@xref} command does not generate a period or comma to end -the cross reference in either the Info file or the printed output. -You must write that period or comma yourself; otherwise, Info will not -recognize the end of the reference. (The @code{@@pxref} command works -differently. @xref{pxref, , @code{@@pxref}}.)@refill - -@quotation -@strong{Please note:} A period or comma @strong{must} follow the closing -brace of an @code{@@xref}. It is required to terminate the cross -reference. This period or comma will appear in the output, both in -the Info file and in the printed manual.@refill -@end quotation - -@code{@@xref} must refer to an Info node by name. Use @code{@@node} -to define the node (@pxref{Writing a Node}).@refill - -@code{@@xref} is followed by several arguments inside braces, separated by -commas. Whitespace before and after these commas is ignored.@refill - -A cross reference requires only the name of a node; but it may contain -up to four additional arguments. Each of these variations produces a -cross reference that looks somewhat different.@refill - -@quotation -@strong{Please note:} Commas separate arguments in a cross reference; -avoid including them in the title or other part lest the formatters -mistake them for separators.@refill -@end quotation - -@node One Argument, Two Arguments, Reference Syntax, xref -@subsection @code{@@xref} with One Argument - -The simplest form of @code{@@xref} takes one argument, the name of -another node in the same Info file. The Info formatters produce -output that the Info readers can use to jump to the reference; @TeX{} -produces output that specifies the page and section number for you.@refill - -@need 700 -@noindent -For example, - -@example -@@xref@{Tropical Storms@}. -@end example - -@noindent -produces - -@example -*Note Tropical Storms::. -@end example - -@noindent -and - -@quotation -See Section 3.1 [Tropical Storms], page 24. -@end quotation - -@noindent -(Note that in the preceding example the closing brace is followed by a -period.)@refill - -You can write a clause after the cross reference, like this:@refill - -@example -@@xref@{Tropical Storms@}, for more info. -@end example - -@noindent -which produces - -@example -*Note Tropical Storms::, for more info. -@end example - -@quotation -See Section 3.1 [Tropical Storms], page 24, for more info. -@end quotation - -@noindent -(Note that in the preceding example the closing brace is followed by a -comma, and then by the clause, which is followed by a period.)@refill - -@node Two Arguments, Three Arguments, One Argument, xref -@subsection @code{@@xref} with Two Arguments - -With two arguments, the second is used as the name of the Info cross -reference, while the first is still the name of the node to which the -cross reference points.@refill - -@need 750 -@noindent -The template is like this: - -@example -@@xref@{@var{node-name}, @var{cross-reference-name}@}. -@end example - -@need 700 -@noindent -For example, - -@example -@@xref@{Electrical Effects, Lightning@}. -@end example - -@noindent -produces: - -@example -*Note Lightning: Electrical Effects. -@end example - -@noindent -and - -@quotation -See Section 5.2 [Electrical Effects], page 57. -@end quotation - -@noindent -(Note that in the preceding example the closing brace is followed by a -period; and that the node name is printed, not the cross reference name.)@refill - -You can write a clause after the cross reference, like this:@refill - -@example -@@xref@{Electrical Effects, Lightning@}, for more info. -@end example - -@noindent -which produces -@example -*Note Lightning: Electrical Effects, for more info. -@end example - -@noindent -and - -@quotation -See Section 5.2 [Electrical Effects], page 57, for more info. -@end quotation - -@noindent -(Note that in the preceding example the closing brace is followed by a -comma, and then by the clause, which is followed by a period.)@refill - -@node Three Arguments, Four and Five Arguments, Two Arguments, xref -@subsection @code{@@xref} with Three Arguments - -A third argument replaces the node name in the @TeX{} output. The third -argument should be the name of the section in the printed output, or -else state the topic discussed by that section. Often, you will want to -use initial upper case letters so it will be easier to read when the -reference is printed. Use a third argument when the node name is -unsuitable because of syntax or meaning.@refill - -Remember to avoid placing a comma within the title or topic section of -a cross reference, or within any other section. The formatters divide -cross references into arguments according to the commas; a comma -within a title or other section will divide it into two arguments. In -a reference, you need to write a title such as ``Clouds, Mist, and -Fog'' without the commas.@refill - -Also, remember to write a comma or period after the closing brace of a -@code{@@xref} to terminate the cross reference. In the following -examples, a clause follows a terminating comma.@refill - - -@need 750 -@noindent -The template is like this: - -@example -@group -@@xref@{@var{node-name}, @var{cross-reference-name}, @var{title-or-topic}@}. -@end group -@end example - -@need 700 -@noindent -For example, - -@example -@group -@@xref@{Electrical Effects, Lightning, Thunder and Lightning@}, -for details. -@end group -@end example - -@noindent -produces - -@example -*Note Lightning: Electrical Effects, for details. -@end example - -@noindent -and - -@quotation -See Section 5.2 [Thunder and Lightning], page 57, for details. -@end quotation - -If a third argument is given and the second one is empty, then the -third argument serves both. (Note how two commas, side by side, mark -the empty second argument.)@refill - -@example -@group -@@xref@{Electrical Effects, , Thunder and Lightning@}, -for details. -@end group -@end example - -@noindent -produces - -@example -*Note Thunder and Lightning: Electrical Effects, for details. -@end example - -@noindent -and - -@quotation -See Section 5.2 [Thunder and Lightning], page 57, for details. -@end quotation - -As a practical matter, it is often best to write cross references with -just the first argument if the node name and the section title are the -same, and with the first and third arguments if the node name and title -are different.@refill - -Here are several examples from @cite{The GAWK Manual}:@refill - -@smallexample -@@xref@{Sample Program@}. -@@xref@{Glossary@}. -@@xref@{Case-sensitivity, ,Case-sensitivity in Matching@}. -@@xref@{Close Output, , Closing Output Files and Pipes@}, - for more information. -@@xref@{Regexp, , Regular Expressions as Patterns@}. -@end smallexample - -@node Four and Five Arguments, , Three Arguments, xref -@subsection @code{@@xref} with Four and Five Arguments - -In a cross reference, a fourth argument specifies the name of another -Info file, different from the file in which the reference appears, and -a fifth argument specifies its title as a printed manual.@refill - -Remember that a comma or period must follow the closing brace of an -@code{@@xref} command to terminate the cross reference. In the -following examples, a clause follows a terminating comma.@refill - -@need 800 -@noindent -The template is: - -@example -@group -@@xref@{@var{node-name}, @var{cross-reference-name}, @var{title-or-topic}, -@var{info-file-name}, @var{printed-manual-title}@}. -@end group -@end example - -@need 700 -@noindent -For example, - -@example -@@xref@{Electrical Effects, Lightning, Thunder and Lightning, -weather, An Introduction to Meteorology@}, for details. -@end example - -@noindent -produces - -@example -*Note Lightning: (weather)Electrical Effects, for details. -@end example - -@noindent -The name of the Info file is enclosed in parentheses and precedes -the name of the node. - -@noindent -In a printed manual, the reference looks like this:@refill - -@quotation -See section ``Thunder and Lightning'' in @i{An Introduction to -Meteorology}, for details. -@end quotation - -@noindent -The title of the printed manual is typeset in italics; and the -reference lacks a page number since @TeX{} cannot know to which page a -reference refers when that reference is to another manual.@refill - -Often, you will leave out the second argument when you use the long -version of @code{@@xref}. In this case, the third argument, the topic -description, will be used as the cross reference name in Info.@refill - -@noindent -The template looks like this: - -@example -@@xref@{@var{node-name}, , @var{title-or-topic}, @var{info-file-name}, -@var{printed-manual-title}@}, for details. -@end example - -@noindent -which produces - -@example -*Note @var{title-or-topic}: (@var{info-file-name})@var{node-name}, for details. -@end example - -@noindent -and - -@quotation -See section @var{title-or-topic} in @var{printed-manual-title}, for details. -@end quotation - -@need 700 -@noindent -For example, - -@example -@@xref@{Electrical Effects, , Thunder and Lightning, -weather, An Introduction to Meteorology@}, for details. -@end example - -@noindent -produces - -@example -@group -*Note Thunder and Lightning: (weather)Electrical Effects, -for details. -@end group -@end example - -@noindent -and - -@quotation -See section ``Thunder and Lightning'' in @i{An Introduction to -Meteorology}, for details. -@end quotation - -On rare occasions, you may want to refer to another Info file that -is within a single printed manual---when multiple Texinfo files are -incorporated into the same @TeX{} run but make separate Info files. -In this case, you need to specify only the fourth argument, and not -the fifth.@refill - -@node Top Node Naming, ref, xref, Cross References -@section Naming a `Top' Node -@cindex Naming a `Top' Node in references -@cindex @samp{@r{Top}} node naming for references - -In a cross reference, you must always name a node. This means that in -order to refer to a whole manual, you must identify the `Top' node by -writing it as the first argument to the @code{@@xref} command. (This -is different from the way you write a menu entry; see @ref{Other Info -Files, , Referring to Other Info Files}.) At the same time, to -provide a meaningful section topic or title in the printed cross -reference (instead of the word `Top'), you must write an appropriate -entry for the third argument to the @code{@@xref} command. -@refill - -@noindent -Thus, to make a cross reference to @cite{The GNU Make Manual}, -write:@refill - -@example -@@xref@{Top, , Overview, make, The GNU Make Manual@}. -@end example - -@noindent -which produces - -@example -*Note Overview: (make)Top. -@end example - -@noindent -and - -@quotation -See section ``Overview'' in @i{The GNU Make Manual}. -@end quotation - -@noindent -In this example, @samp{Top} is the name of the first node, and -@samp{Overview} is the name of the first section of the manual.@refill -@node ref, pxref, Top Node Naming, Cross References -@comment node-name, next, previous, up -@section @code{@@ref} -@cindex Cross references using @code{@@ref} -@cindex References using @code{@@ref} -@findex ref - -@code{@@ref} is nearly the same as @code{@@xref} except that it does -not generate a `See' in the printed output, just the reference itself. -This makes it useful as the last part of a sentence.@refill - -@need 700 -@noindent -For example, - -@example -For more information, see @@ref@{Hurricanes@}. -@end example - -@noindent -produces - -@example -For more information, see *Note Hurricanes. -@end example - -@noindent -and - -@quotation -For more information, see Section 8.2 [Hurricanes], page 123. -@end quotation - -The @code{@@ref} command sometimes leads writers to express themselves -in a manner that is suitable for a printed manual but looks awkward -in the Info format. Bear in mind that your audience will be using -both the printed and the Info format.@refill - -@need 800 -@noindent -For example, - -@example -@group -Sea surges are described in @@ref@{Hurricanes@}. -@end group -@end example - -@need 800 -@noindent -produces - -@quotation -Sea surges are described in Section 6.7 [Hurricanes], page 72. -@end quotation - -@need 800 -@noindent -in a printed document, and the following in Info: - -@example -Sea surges are described in *Note Hurricanes::. -@end example - -@quotation -@strong{Caution:} You @emph{must} write a period or comma immediately -after an @code{@@ref} command with two or more arguments. Otherwise, -Info will not find the end of the cross reference entry and its -attempt to follow the cross reference will fail. As a general rule, -you should write a period or comma after every @code{@@ref} command. -This looks best in both the printed and the Info output.@refill -@end quotation - -@node pxref, inforef, ref, Cross References -@comment node-name, next, previous, up -@section @code{@@pxref} -@cindex Cross references using @code{@@pxref} -@cindex References using @code{@@pxref} -@findex pxref - -The parenthetical reference command, @code{@@pxref}, is nearly the -same as @code{@@xref}, but you use it @emph{only} inside parentheses -and you do @emph{not} type a comma or period after the command's -closing brace. The command differs from @code{@@xref} in two -ways:@refill - -@enumerate -@item -@TeX{} typesets the reference for the printed manual with a lower case -`see' rather than an upper case `See'.@refill - -@item -The Info formatting commands automatically end the reference with a -closing colon or period.@refill -@end enumerate - -Because one type of formatting automatically inserts closing -punctuation and the other does not, you should use @code{@@pxref} -@emph{only} inside parentheses as part of another sentence. Also, you -yourself should not insert punctuation after the reference, as you do -with @code{@@xref}.@refill - -@code{@@pxref} is designed so that the output looks right and works -right between parentheses both in printed output and in an Info file. -In a printed manual, a closing comma or period should not follow a -cross reference within parentheses; such punctuation is wrong. But in -an Info file, suitable closing punctuation must follow the cross -reference so Info can recognize its end. @code{@@pxref} spares you -the need to use complicated methods to put a terminator into one form -of the output and not the other.@refill - -@noindent -With one argument, a parenthetical cross reference looks like -this:@refill - -@example -@dots{} storms cause flooding (@@pxref@{Hurricanes@}) @dots{} -@end example - -@need 800 -@noindent -which produces - -@example -@group -@dots{} storms cause flooding (*Note Hurricanes::) @dots{} -@end group -@end example - -@noindent -and - -@quotation -@dots{} storms cause flooding (see Section 6.7 [Hurricanes], page 72) @dots{} -@end quotation - -With two arguments, a parenthetical cross reference has this -template:@refill - -@example -@dots{} (@@pxref@{@var{node-name}, @var{cross-reference-name}@}) @dots{} -@end example - -@noindent -which produces - -@example -@dots{} (*Note @var{cross-reference-name}: @var{node-name}.) @dots{} -@end example - -@noindent -and - -@need 1500 -@quotation -@dots{} (see Section @var{nnn} [@var{node-name}], page @var{ppp}) @dots{} -@end quotation - -@code{@@pxref} can be used with up to five arguments just like -@code{@@xref} (@pxref{xref, , @code{@@xref}}).@refill - -@quotation -@strong{Please note:} Use @code{@@pxref} only as a parenthetical -reference. Do not try to use @code{@@pxref} as a clause in a sentence. -It will look bad in either the Info file, the printed output, or -both.@refill - -Also, parenthetical cross references look best at the ends of sentences. -Although you may write them in the middle of a sentence, that location -breaks up the flow of text.@refill -@end quotation - -@node inforef, , pxref, Cross References -@comment node-name, next, previous, up -@section @code{@@inforef} -@cindex Cross references using @code{@@inforef} -@cindex References using @code{@@inforef} -@findex inforef - -@code{@@inforef} is used for cross references to Info files for which -there are no printed manuals. Even in a printed manual, -@code{@@inforef} generates a reference directing the user to look in -an Info file.@refill - -The command takes either two or three arguments, in the following -order:@refill - -@enumerate -@item -The node name. - -@item -The cross reference name (optional). - -@item -The Info file name. -@end enumerate - -@noindent -Separate the arguments with commas, as with @code{@@xref}. Also, you -must terminate the reference with a comma or period after the -@samp{@}}, as you do with @code{@@xref}.@refill - -@noindent -The template is: - -@example -@@inforef@{@var{node-name}, @var{cross-reference-name}, @var{info-file-name}@}, -@end example - -@need 800 -@noindent -Thus, - -@example -@group -@@inforef@{Expert, Advanced Info commands, info@}, -for more information. -@end group -@end example - -@need 800 -@noindent -produces - -@example -@group -*Note Advanced Info commands: (info)Expert, -for more information. -@end group -@end example - -@need 800 -@noindent -and - -@quotation -See Info file @file{info}, node @samp{Expert}, for more information. -@end quotation - -@need 800 -@noindent -Similarly, - -@example -@group -@@inforef@{Expert, , info@}, for more information. -@end group -@end example - -@need 800 -@noindent -produces - -@example -*Note (info)Expert::, for more information. -@end example - -@need 800 -@noindent -and - -@quotation -See Info file @file{info}, node @samp{Expert}, for more information. -@end quotation - -The converse of @code{@@inforef} is @code{@@cite}, which is used to -refer to printed works for which no Info form exists. @xref{cite, , -@code{@@cite}}.@refill - -@node Marking Text, Quotations and Examples, Cross References, Top -@comment node-name, next, previous, up -@chapter Marking Words and Phrases -@cindex Paragraph, marking text within -@cindex Marking words and phrases -@cindex Words and phrases, marking them -@cindex Marking text within a paragraph - -In Texinfo, you can mark words and phrases in a variety of ways. -The Texinfo formatters use this information to determine how to -highlight the text. -You can specify, for example, whether a word or phrase is a -defining occurrence, a metasyntactic variable, or a symbol used in a -program. Also, you can emphasize text.@refill - -@menu -* Indicating:: How to indicate definitions, files, etc. -* Emphasis:: How to emphasize text. -@end menu - -@node Indicating, Emphasis, , Marking Text -@comment node-name, next, previous, up -@section Indicating Definitions, Commands, etc. -@cindex Highlighting text -@cindex Indicating commands, definitions, etc. - -Texinfo has commands for indicating just what kind of object a piece of -text refers to. For example, metasyntactic variables are marked by -@code{@@var}, and code by @code{@@code}. Since the pieces of text are -labelled by commands that tell what kind of object they are, it is easy -to change the way the Texinfo formatters prepare such text. (Texinfo is -an @emph{intentional} formatting language rather than a @emph{typesetting} -formatting language.)@refill - -For example, in a printed manual, -code is usually illustrated in a typewriter font; -@code{@@code} tells @TeX{} to typeset this text in this font. But it -would be easy to change the way @TeX{} highlights code to use another -font, and this change would not effect how keystroke examples are -highlighted. If straight typesetting commands were used in the body -of the file and you wanted to make a change, you would need to check -every single occurrence to make sure that you were changing code and -not something else that should not be changed.@refill - -@menu -* Useful Highlighting:: Highlighting provides useful information. -* code:: How to indicate code. -* kbd:: How to show keyboard input. -* key:: How to specify keys. -* samp:: How to show a literal sequence of characters. -* var:: How to indicate a metasyntactic variable. -* file:: How to indicate the name of a file. -* dfn:: How to specify a definition. -* cite:: How to refer to a book that is not in Info. -@end menu - -@node Useful Highlighting, code, , Indicating -@ifinfo -@subheading Highlighting Commands are Useful -@end ifinfo - -The highlighting commands can be used to generate useful information -from the file, such as lists of functions or file names. It is -possible, for example, to write a program in Emacs Lisp (or a keyboard -macro) to insert an index entry after every paragraph that contains -words or phrases marked by a specified command. You could do this to -construct an index of functions if you had not already made the -entries.@refill - -The commands serve a variety of purposes:@refill - -@table @code -@item @@code@{@var{sample-code}@} -Indicate text that is a literal example of a piece of a program.@refill - -@item @@kbd@{@var{keyboard-characters}@} -Indicate keyboard input.@refill - -@item @@key@{@var{key-name}@} -Indicate the conventional name for a key on a keyboard.@refill - -@item @@samp@{@var{text}@} -Indicate text that is a literal example of a sequence of characters.@refill - -@item @@var@{@var{metasyntactic-variable}@} -Indicate a metasyntactic variable.@refill - -@item @@file@{@var{file-name}@} -Indicate the name of a file.@refill - -@item @@dfn@{@var{term}@} -Indicate the introductory or defining use of a term.@refill - -@item @@cite@{@var{reference}@} -Indicate the name of a book.@refill - -@ignore -@item @@ctrl@{@var{ctrl-char}@} -Use for an @sc{ascii} control character.@refill -@end ignore -@end table - -@node code, kbd, Useful Highlighting, Indicating -@comment node-name, next, previous, up -@subsection @code{@@code}@{@var{sample-code}@} -@findex code - -Use the @code{@@code} command to indicate text that is a piece of a -program and which consists of entire syntactic tokens. Enclose the -text in braces.@refill - -Thus, you should use @code{@@code} for an expression in a program, for -the name of a variable or function used in a program, or for a -keyword. Also, you should use @code{@@code} for the name of a -program, such as @code{diff}, that is a name used in the machine. (You -should write the name of a program in the ordinary text font if you -regard it as a new English word, such as `Emacs' or `Bison'.)@refill - -Use @code{@@code} for environment variables such as @code{TEXINPUTS}, -and other variables.@refill - -Use @code{@@code} for command names in command languages that -resemble programming languages, such as Texinfo or the shell. -For example, @code{@@code} and @code{@@samp} are produced by writing -@samp{@@code@{@@@@code@}} and @samp{@@code@{@@@@samp@}} in the Texinfo -source, respectively.@refill - -Note, however, that you should not use @code{@@code} for shell options -such as @samp{-c} when such options stand alone. (Use @code{@@samp}.) -Also, an entire shell command often looks better if written using -@code{@@samp} rather than @code{@@code}. In this case, the rule is to -choose the more pleasing format.@refill - -It is incorrect to alter the case of a word inside an @code{@@code} -command when it appears at the beginning of a sentence. Most computer -languages are case sensitive. In C, for example, @code{Printf} is -different from the identifier @code{printf}, and most likely is a -misspelling of it. Even in languages which are not case sensitive, it -is confusing to a human reader to see identifiers spelled in different -ways. Pick one spelling and always use that. If you do not want to -start a sentence with a command written all in lower case, you should -rearrange the sentence.@refill - -Do not use the @code{@@code} command for a string of characters shorter -than a syntactic token. If you are writing about @samp{TEXINPU}, which -is just a part of the name for the @code{TEXINPUTS} environment -variable, you should use @code{@@samp}.@refill - -In particular, you should not use the @code{@@code} command when writing -about the characters used in a token; do not, for example, use -@code{@@code} when you are explaining what letters or printable symbols -can be used in the names of functions. (Use @code{@@samp}.) Also, you -should not use @code{@@code} to mark text that is considered input to -programs unless the input is written in a language that is like a -programming language. For example, you should not use @code{@@code} for -the keystroke commands of GNU Emacs (use @code{@@kbd} instead) although -you may use @code{@@code} for the names of the Emacs Lisp functions that -the keystroke commands invoke.@refill - -In the printed manual, @code{@@code} causes @TeX{} to typeset the -argument in a typewriter face. In the Info file, it causes the Info -formatting commands to use single quotation marks around the text. - -@need 700 -For example, - -@example -Use @@code@{diff@} to compare two files. -@end example - -@noindent -produces this in the printed manual:@refill - -@quotation -Use @code{diff} to compare two files. -@end quotation -@iftex - -@noindent -and this in the Info file:@refill - -@example -Use `diff' to compare two files. -@end example -@end iftex - -@node kbd, key, code, Indicating -@comment node-name, next, previous, up -@subsection @code{@@kbd}@{@var{keyboard-characters}@} -@findex kbd - -Use the @code{@@kbd} command for characters of input to be typed by -users. For example, to refer to the characters @kbd{M-a}, -write@refill - -@example -@@kbd@{M-a@} -@end example - -@noindent -and to refer to the characters @kbd{M-x shell}, write@refill - -@example -@@kbd@{M-x shell@} -@end example - -The @code{@@kbd} command has the same effect as @code{@@code} in Info, -but may produce a different font in a printed manual.@refill - -You can embed another @@-command inside the braces of an @code{@@kbd} -command. Here, for example, is the way to describe a command that -would be described more verbosely as ``press an @samp{r} and then -press the @key{RET} key'':@refill - -@example -@@kbd@{r @@key@{RET@}@} -@end example - -@noindent -This produces: @kbd{r @key{RET}} - -You also use the @code{@@kbd} command if you are spelling out the letters -you type; for example:@refill - -@example -To give the @@code@{logout@} command, -type the characters @@kbd@{l o g o u t @@key@{RET@}@}. -@end example - -@noindent -This produces: - -@quotation -To give the @code{logout} command, -type the characters @kbd{l o g o u t @key{RET}}. -@end quotation - -(Also, this example shows that you can add spaces for clarity. If you -really want to mention a space character as one of the characters of -input, write @kbd{@@key@{SPC@}} for it.)@refill - -@node key, samp, kbd, Indicating -@comment node-name, next, previous, up -@subsection @code{@@key}@{@var{key-name}@} -@findex key - -Use the @code{@@key} command for the conventional name for a key on a -keyboard, as in:@refill - -@example -@@key@{RET@} -@end example - -You can use the @code{@@key} command within the argument of an -@code{@@kbd} command when the sequence of characters to be typed -includes one or more keys that are described by name.@refill - -@need 700 -For example, to produce @kbd{C-x @key{ESC}} you would type:@refill - -@example -@@kbd@{C-x @@key@{ESC@}@} -@end example - -@c bob: this next sentence looks weird, having a semi-colon followed by -@c a colon that ends the "sentence".. --mew -Here is a list of the recommended names for keys; they are all in -upper case:@refill -@cindex Recommended names for keys -@cindex Keys, recommended names -@cindex Names recommended for keys -@cindex Abbreviations for keys - -@quotation -@table @t -@item SPC -Space -@item RET -Return -@item LFD -Linefeed -@item TAB -Tab -@item BS -Backspace -@item ESC -Escape -@item DEL -Delete -@item SFT -Shift -@item CTL -Control -@item META -Meta -@end table -@end quotation - -There are subtleties to handling words like `meta' or `ctl' that are -names of shift keys. When mentioning a character in which the shift -key is used, such as @kbd{Meta-a}, use the @code{@@kbd} command alone; -do not use the @code{@@key} command; but when you are referring to the -shift key in isolation, use the @code{@@key} command. For example, -write @samp{@@kbd@{Meta-a@}} to produce @kbd{Meta-a} and -@samp{@@key@{META@}} to produce @key{META}. This is because -@kbd{Meta-a} refers to keys that you press on a keyboard, but -@key{META} refers to a key without implying that you press it. In -short, use @code{@@kbd} for what you do, and use @code{@@key} for what -you talk about: ``Press @code{@@kbd@{M-a@}} to move point to the -beginning of the sentence. The @code{@@key@{META@}} key is often in the -lower left of the keyboard.''@refill -@cindex META key - -@node samp, var, key, Indicating -@comment node-name, next, previous, up -@subsection @code{@@samp}@{@var{text}@} -@findex samp - -Use the @code{@@samp} command to indicate text that is a literal example -or `sample' of a sequence of characters in a file, string, pattern, etc. -Enclose the text in braces. The argument appears within single -quotation marks in both the Info file and the printed manual; in -addition, it is printed in a fixed-width font.@refill - -@example -To match @@samp@{foo@} at the end of the line, -use the regexp @@samp@{foo$@}. -@end example - -@noindent -produces - -@quotation -To match @samp{foo} at the end of the line, use the regexp -@samp{foo$}.@refill -@end quotation - -Any time you are referring to single characters, you should use -@code{@@samp} unless @code{@@kbd} is more appropriate. Use -@code{@@samp} for the names of command-line options. Also, you may use -@code{@@samp} for entire statements in C and for entire shell -commands---in this case, @code{@@samp} often looks better than -@code{@@code}. Basically, @code{@@samp} is a catchall for whatever is -not covered by @code{@@code}, @code{@@kbd}, or @code{@@key}.@refill - -Only include punctuation marks within braces if they are part of the -string you are specifying. Write punctuation marks outside the braces -if those punctuation marks are part of the English text that surrounds -the string. In the following sentence, for example, the commas and -period are outside of the braces:@refill - -@example -@group -In English, the vowels are @@samp@{a@}, @@samp@{e@}, -@@samp@{i@}, @@samp@{o@}, @@samp@{u@}, and sometimes -@@samp@{y@}. -@end group -@end example - -@noindent -This produces: - -@quotation -In English, the vowels are @samp{a}, @samp{e}, -@samp{i}, @samp{o}, @samp{u}, and sometimes -@samp{y}. -@end quotation - -@node var, file, samp, Indicating -@comment node-name, next, previous, up -@subsection @code{@@var}@{@var{metasyntactic-variable}@} -@findex var - -Use the @code{@@var} command to indicate metasyntactic variables. A -@dfn{metasyntactic variable} is something that stands for another piece of -text. For example, you should use a metasyntactic variable in the -documentation of a function to describe the arguments that are passed -to that function.@refill - -Do not use @code{@@var} for the names of particular variables in -programming languages. These are specific names from a program, so -@code{@@code} is correct for them. For example, the Lisp variable -@code{texinfo-tex-command} is not a metasyntactic variable; it is -properly formatted using @code{@@code}.@refill - -The effect of @code{@@var} in the Info file is to change the case of -the argument to all upper case; in the printed manual, to italicize it. - -@need 700 -For example, - -@example -To delete file @@var@{filename@}, -type @@code@{rm @@var@{filename@}@}. -@end example - -@noindent -produces - -@quotation -To delete file @var{filename}, type @code{rm @var{filename}}. -@end quotation - -@noindent -(Note that @code{@@var} may appear inside @code{@@code}, -@code{@@samp}, @code{@@file}, etc.)@refill - -Write a metasyntactic variable all in lower case without spaces, and -use hyphens to make it more readable. Thus, the Texinfo source for -the illustration of how to begin a Texinfo manual looks like -this:@refill - -@example -@group -\input texinfo -@@@@setfilename @@var@{info-file-name@} -@@@@settitle @@var@{name-of-manual@} -@end group -@end example - -@noindent -This produces: - -@example -@group -\input texinfo -@@setfilename @var{info-file-name} -@@settitle @var{name-of-manual} -@end group -@end example - -In some documentation styles, metasyntactic variables are shown with -angle brackets, for example:@refill - -@example -@dots{}, type rm <filename> -@end example - -@noindent -However, that is not the style that Texinfo uses. (You can, of -course, modify the sources to @TeX{} and the Info formatting commands -to output the @code{<@dots{}>} format if you wish.)@refill - -@node file, dfn, var, Indicating -@comment node-name, next, previous, up -@subsection @code{@@file}@{@var{file-name}@} -@findex file - -Use the @code{@@file} command to indicate text that is the name of a -file, buffer, or directory, or is the name of a node in Info. You can -also use the command for file name suffixes. Do not use @code{@@file} -for symbols in a programming language; use @code{@@code}. - -Currently, @code{@@file} is equivalent to @code{@@samp} in its effects. -For example,@refill - -@example -The @@file@{.el@} files are in -the @@file@{/usr/local/emacs/lisp@} directory. -@end example - -@noindent -produces - -@quotation -The @file{.el} files are in -the @file{/usr/local/emacs/lisp} directory. -@end quotation - -@node dfn, cite, file, Indicating -@comment node-name, next, previous, up -@subsection @code{@@dfn}@{@var{term}@} -@findex dfn - -Use the @code{@@dfn} command to identify the introductory or defining -use of a technical term. Use the command only in passages whose -purpose is to introduce a term which will be used again or which the -reader ought to know. Mere passing mention of a term for the first -time does not deserve @code{@@dfn}. The command generates italics in -the printed manual, and double quotation marks in the Info file. For -example:@refill - -@example -Getting rid of a file is called @@dfn@{deleting@} it. -@end example - -@noindent -produces - -@quotation -Getting rid of a file is called @dfn{deleting} it. -@end quotation - -As a general rule, a sentence containing the defining occurrence of a -term should be a definition of the term. The sentence does not need -to say explicitly that it is a definition, but it should contain the -information of a definition---it should make the meaning clear. - -@node cite, , dfn, Indicating -@comment node-name, next, previous, up -@subsection @code{@@cite}@{@var{reference}@} -@findex cite - -Use the @code{@@cite} command for the name of a book that lacks a -companion Info file. The command produces italics in the printed -manual, and quotation marks in the Info file.@refill - -(If a book is written in Texinfo, it is better to use a cross reference -command since a reader can easily follow such a reference in Info. -@xref{xref, , @code{@@xref}}.)@refill -@ignore - -@c node ctrl, , cite, Indicating -@comment node-name, next, previous, up -@c subsection @code{@@ctrl}@{@var{ctrl-char}@} -@findex ctrl - -The @code{@@ctrl} command is seldom used. It describes an @sc{ascii} -control character by inserting the actual character into the Info -file. - -Usually, in Texinfo, you talk what you type as keyboard entry by -describing it with @code{@@kbd}: thus, @samp{@@kbd@{C-a@}} for -@kbd{C-a}. Use @code{@@kbd} in this way when talking about a control -character that is typed on the keyboard by the user. When talking -about a control character appearing in a file or a string, do not use -@code{@@kbd} since the control character is not typed. Also, do not -use @samp{C-} but spell out @code{control-}, as in @samp{control-a}, -to make it easier for a reader to understand.@refill - -@code{@@ctrl} is an idea from the beginnings of Texinfo which may not -really fit in to the scheme of things. But there may be times when -you want to use the command. The pattern is -@code{@@ctrl@{@var{ch}@}}, where @var{ch} is an @sc{ascii} character -whose control-equivalent is wanted. For example, to specify -@samp{control-f}, you would enter@refill - -@example -@@ctrl@{f@} -@end example - -@noindent -produces - -@quotation -@ctrl{f} -@end quotation - -In the Info file, this generates the specified control character, output -literally into the file. This is done so a user can copy the specified -control character (along with whatever else he or she wants) into another -Emacs buffer and use it. Since the `control-h',`control-i', and -`control-j' characters are formatting characters, they should not be -indicated with @code{@@ctrl}.@refill - -In a printed manual, @code{@@ctrl} generates text to describe or -identify that control character: an uparrow followed by the character -@var{ch}.@refill -@end ignore - -@node Emphasis, , Indicating, Marking Text -@comment node-name, next, previous, up -@section Emphasizing Text -@cindex Emphasizing text - -Usually, Texinfo changes the font to mark words in the text according to -what category the words belong to; an example is the @code{@@code} command. -Most often, this is the best way to mark words. -However, sometimes you will want to emphasize text without indicating a -category. Texinfo has two commands to do this. Also, Texinfo has -several commands that specify the font in which @TeX{} will typeset -text. These commands have no affect on Info and only one of them, -the @code{@@r} command, has any regular use.@refill - -@menu -* emph & strong:: How to emphasize text in Texinfo. -* Smallcaps:: How to use the small caps font. -* Fonts:: Various font commands for printed output. -@end menu - -@node emph & strong, Smallcaps, , Emphasis -@comment node-name, next, previous, up -@subsection @code{@@emph}@{@var{text}@} and @code{@@strong}@{@var{text}@} -@cindex Emphasizing text, font for -@findex emph -@findex strong - -The @code{@@emph} and @code{@@strong} commands are for emphasis; -@code{@@strong} is stronger. In printed output, @code{@@emph} -produces @emph{italics} and @code{@@strong} produces -@strong{bold}.@refill - -@need 800 -For example, - -@example -@group -@@quotation -@@strong@{Caution:@} @@code@{rm * .[^.]*@} removes @@emph@{all@} -files in the directory. -@@end quotation -@end group -@end example - -@iftex -@noindent -produces the following in printed output: - -@quotation -@strong{Caution}: @code{rm * .[^.]*} removes @emph{all} -files in the directory. -@end quotation - -@noindent -and the following in Info: -@end iftex -@ifinfo -@noindent -produces: -@end ifinfo - -@example - *Caution*: `rm * .[^.]*' removes *all* - files in the directory. -@end example - -The @code{@@strong} command is seldom used except to mark what is, in -effect, a typographical element, such as the word `Caution' in the -preceding example. - -In the Info file, both @code{@@emph} and @code{@@strong} put asterisks -around the text.@refill - -@quotation -@strong{Caution:} Do not use @code{@@emph} or @code{@@strong} with the -word @samp{Note}; Info will mistake the combination for a cross -reference. Use a phrase such as @strong{Please note} or -@strong{Caution} instead.@refill -@end quotation - -@node Smallcaps, Fonts, emph & strong, Emphasis -@subsection @code{@@sc}@{@var{text}@}: The Small Caps Font -@cindex Small caps font -@findex sc @r{(small caps font)} - -@iftex -Use the @samp{@@sc} command to set text in the printed output in @sc{a -small caps font} and set text in the Info file in upper case letters.@refill -@end iftex -@ifinfo -Use the @samp{@@sc} command to set text in the printed output in a -small caps font and set text in the Info file in upper case letters.@refill -@end ifinfo - -Write the text between braces in lower case, like this:@refill - -@example -The @@sc@{acm@} and @@sc@{ieee@} are technical societies. -@end example - -@noindent -This produces: - -@display -The @sc{acm} and @sc{ieee} are technical societies. -@end display - -@TeX{} typesets the small caps font in a manner that prevents the -letters from `jumping out at you on the page'. This makes small caps -text easier to read than text in all upper case. The Info formatting -commands set all small caps text in upper case.@refill - -@ifinfo -If the text between the braces of an @code{@@sc} command is upper case, -@TeX{} typesets in full-size capitals. Use full-size capitals -sparingly.@refill -@end ifinfo -@iftex -If the text between the braces of an @code{@@sc} command is upper case, -@TeX{} typesets in @sc{FULL-SIZE CAPITALS}. Use full-size capitals -sparingly.@refill -@end iftex - -You may also use the small caps font for a jargon word such as -@sc{ato} (a @sc{nasa} word meaning `abort to orbit').@refill - -There are subtleties to using the small caps font with a jargon word -such as @sc{cdr}, a word used in Lisp programming. In this case, you -should use the small caps font when the word refers to the second and -subsequent elements of a list (the @sc{cdr} of the list), but you -should use @samp{@@code} when the word refers to the Lisp function of -the same spelling.@refill - -@node Fonts, , Smallcaps, Emphasis -@comment node-name, next, previous, up -@subsection Fonts for Printing, Not Info -@cindex Fonts for printing, not for Info -@findex i @r{(italic font)} -@findex b @r{(bold font)} -@findex t @r{(typewriter font)} -@findex r @r{(Roman font)} - -Texinfo provides four font commands that specify font changes in the -printed manual but have no effect in the Info file. @code{@@i} -requests @i{italic} font (in some versions of @TeX{}, a slanted font -is used), @code{@@b} requests @b{bold} face, @code{@@t} requests the -@t{fixed-width}, typewriter-style font used by @code{@@code}, and @code{@@r} requests a -@r{roman} font, which is the usual font in which text is printed. All -four commands apply to an argument that follows, surrounded by -braces.@refill - -Only the @code{@@r} command has much use: in example programs, you -can use the @code{@@r} command to convert code comments from the -fixed-width font to a roman font. This looks better in printed -output.@refill - -@need 700 -For example, - -@example -@group -@@lisp -(+ 2 2) ; @@r@{Add two plus two.@} -@@end lisp -@end group -@end example - -@noindent -produces - -@lisp -(+ 2 2) ; @r{Add two plus two.} -@end lisp - -If possible, you should avoid using the other three font commands. If -you need to use one, it probably indicates a gap in the Texinfo -language.@refill - -@node Quotations and Examples, Lists and Tables, Marking Text, Top -@comment node-name, next, previous, up -@chapter Quotations and Examples - -Quotations and examples are blocks of text consisting of one or more -whole paragraphs that are set off from the bulk of the text and -treated differently. They are usually indented.@refill - -In Texinfo, you always begin a quotation or example by writing an -@@-command at the beginning of a line by itself, and end it by writing -an @code{@@end} command that is also at the beginning of a line by -itself. For instance, you begin an example by writing @code{@@example} -by itself at the beginning of a line and end the example by writing -@code{@@end example} on a line by itself, at the beginning of that -line.@refill -@findex end - -@menu -* Block Enclosing Commands:: Use different constructs for - different purposes. -* quotation:: How to write a quotation. -* example:: How to write an example in a fixed-width font. -* noindent:: How to prevent paragraph indentation. -* Lisp Example:: How to illustrate Lisp code. -* smallexample & smalllisp:: Forms for the @code{@@smallbook} option. -* display:: How to write an example in the current font. -* format:: How to write an example that does not narrow - the margins. -* exdent:: How to undo the indentation of a line. -* flushleft & flushright:: How to push text flushleft or flushright. -* cartouche:: How to draw cartouches around examples. -@end menu - -@node Block Enclosing Commands, quotation, , Quotations and Examples -@section The Block Enclosing Commands - -Here are commands for quotations and examples:@refill - -@table @code -@item @@quotation -Indicate text that is quoted. The text is filled, indented, and -printed in a roman font by default.@refill - -@item @@example -Illustrate code, commands, and the like. The text is printed -in a fixed-width font, and indented but not filled.@refill - -@item @@lisp -Illustrate Lisp code. The text is printed in a fixed-width font, -and indented but not filled.@refill - -@item @@smallexample -Illustrate code, commands, and the like. Similar to -@code{@@example}, except that in @TeX{} this command typesets text in -a smaller font for the smaller @code{@@smallbook} format than for the -8.5 by 11 inch format.@refill - -@item @@smalllisp -Illustrate Lisp code. Similar to @code{@@lisp}, except that -in @TeX{} this command typesets text in a smaller font for the smaller -@code{@@smallbook} format than for the 8.5 by 11 inch format.@refill - -@item @@display -Display illustrative text. The text is indented but not filled, and -no font is specified (so, by default, the font is roman).@refill - -@item @@format -Print illustrative text. The text is not indented and not filled -and no font is specified (so, by default, the font is roman).@refill -@end table - -The @code{@@exdent} command is used within the above constructs to -undo the indentation of a line. - -The @code{@@flushleft} and @code{@@flushright} commands are used to line -up the left or right margins of unfilled text.@refill - -The @code{@@noindent} command may be used after one of the above -constructs to prevent the following text from being indented as a new -paragraph.@refill - -You can use the @code{@@cartouche} command within one of the above -constructs to highlight the example or quotation by drawing a box with -rounded corners around it. (The @code{@@cartouche} command affects -only the printed manual; it has no effect in the Info file; see -@ref{cartouche, , Drawing Cartouches Around Examples}.)@refill - -@node quotation, example, Block Enclosing Commands, Quotations and Examples -@comment node-name, next, previous, up -@section @code{@@quotation} -@cindex Quotations -@findex quotation - -The text of a quotation is -processed normally except that:@refill - -@itemize @bullet -@item -the margins are closer to the center of the page, so the whole of the -quotation is indented;@refill - -@item -the first lines of paragraphs are indented no more than other -lines;@refill - -@item -in the printed output, interparagraph spacing is reduced.@refill -@end itemize - -@quotation -This is an example of text written between an @code{@@quotation} -command and an @code{@@end quotation} command. An @code{@@quotation} -command is most often used to indicate text that is excerpted from -another (real or hypothetical) printed work.@refill -@end quotation - -Write an @code{@@quotation} command as text on a line by itself. This -line will disappear from the output. Mark the end of the quotation -with a line beginning with and containing only @code{@@end quotation}. -The @code{@@end quotation} line will likewise disappear from the -output. Thus, the following,@refill - -@example -@@quotation -This is -a foo. -@@end quotation -@end example - -@noindent -produces - -@quotation -This is a foo. -@end quotation - -@node example, noindent, quotation, Quotations and Examples -@comment node-name, next, previous, up -@section @code{@@example} -@cindex Examples, formatting them -@cindex Formatting examples -@findex example - -The @code{@@example} command is used to indicate an example that is -not part of the running text, such as computer input or output.@refill - -@example -@group -This is an example of text written between an -@code{@@example} command -and an @code{@@end example} command. -The text is indented but not filled. -@end group - -@group -In the printed manual, the text is typeset in a -fixed-width font, and extra spaces and blank lines are -significant. In the Info file, an analogous result is -obtained by indenting each line with five spaces. -@end group -@end example - -Write an @code{@@example} command at the beginning of a line by itself. -This line will disappear from the output. Mark the end of the example -with an @code{@@end example} command, also written at the beginning of a -line by itself. The @code{@@end example} will disappear from the -output.@refill - -@need 700 -For example, - -@example -@@example -mv foo bar -@@end example -@end example - -@noindent -produces - -@example -mv foo bar -@end example - -Since the lines containing @code{@@example} and @code{@@end example} -will disappear, you should put a blank line before the -@code{@@example} and another blank line after the @code{@@end -example}. (Remember that blank lines between the beginning -@code{@@example} and the ending @code{@@end example} will appear in -the output.)@refill - -@quotation -@strong{Caution:} Do not use tabs in the lines of an example (or anywhere -else in Texinfo, for that matter)! @TeX{} treats tabs as single -spaces, and that is not what they look like. This is a problem with -@TeX{}. (If necessary, in Emacs, you can use @kbd{M-x untabify} to -convert tabs in a region to multiple spaces.)@refill -@end quotation - -Examples are often, logically speaking, ``in the middle'' of a -paragraph, and the text continues after an example should not be -indented. The @code{@@noindent} command prevents a piece of text from -being indented as if it were a new paragraph. -@ifinfo -(@xref{noindent}.) -@end ifinfo - -(The @code{@@code} command is used for examples of code that are -embedded within sentences, not set off from preceding and following -text. @xref{code, , @code{@@code}}.) - -@node noindent, Lisp Example, example, Quotations and Examples -@comment node-name, next, previous, up -@section @code{@@noindent} -@findex noindent - -An example or other inclusion can break a paragraph into segments. -Ordinarily, the formatters indent text that follows an example as a new -paragraph. However, you can prevent this by writing @code{@@noindent} -at the beginning of a line by itself preceding the continuation -text.@refill - -@need 750 -For example: - -@example -@group -@@example -This is an example -@@end example - -@@noindent -This line is not indented. As you can see, the -beginning of the line is fully flush left with the line -that follows after it. (This whole example is between -@@code@{@@@@display@} and @@code@{@@@@end display@}.) -@end group -@end example - -@noindent -produces - -@display -@example -This is an example -@end example -@tex -% Remove extra vskip; this is a kludge to counter the effect of display -\vskip-3.5\baselineskip -@end tex - -@noindent -This line is not indented. As you can see, the -beginning of the line is fully flush left with the line -that follows after it. (This whole example is between -@code{@@display} and @code{@@end display}.) -@end display - -To adjust the number of blank lines properly in the Info file output, -remember that the line containing @code{@@noindent} does not generate a -blank line, and neither does the @code{@@end example} line.@refill - -In the Texinfo source file for this manual, each line that says -`produces' is preceded by a line containing @code{@@noindent}.@refill - -Do not put braces after an @code{@@noindent} command; they are not -necessary, since @code{@@noindent} is a command used outside of -paragraphs (@pxref{Command Syntax}).@refill - -@node Lisp Example, smallexample & smalllisp, noindent, Quotations and Examples -@comment node-name, next, previous, up -@section @code{@@lisp} -@cindex Lisp example -@findex lisp - -The @code{@@lisp} command is used for Lisp code. It is synonymous -with the @code{@@example} command. - -@lisp -This is an example of text written between an -@code{@@lisp} command and an @code{@@end lisp} command. -@end lisp - -Use @code{@@lisp} instead of @code{@@example} so as to preserve -information regarding the nature of the example. This is useful, for -example, if you write a function that evaluates only and all the Lisp -code in a Texinfo file. Then you can use the Texinfo file as a Lisp -library.@footnote{It would be straightforward to extend Texinfo to -work in a similar fashion for C, @sc{fortran}, or other languages.}@refill - -Mark the end of @code{@@lisp} with @code{@@end lisp} on a line by -itself.@refill - -@node smallexample & smalllisp, display, Lisp Example, Quotations and Examples -@comment node-name, next, previous, up -@section @code{@@smallexample} and @code{@@smalllisp} -@cindex Small book example -@cindex Example for a small book -@cindex Lisp example for a small book -@findex smallexample -@findex smalllisp - -In addition to the regular @code{@@example} and @code{@@lisp} commands, -Texinfo has two other ``example-style'' commands. These are the -@code{@@smallexample} and @code{@@smalllisp} commands. Both these -commands are designed for use with the @code{@@smallbook} command that -causes @TeX{} to produce a printed manual in a 7 by 9.25 inch format -rather than the regular 8.5 by 11 inch format.@refill - -In @TeX{}, the @code{@@smallexample} and @code{@@smalllisp} commands -typeset text in a smaller font for the smaller @code{@@smallbook} -format than for the 8.5 by 11 inch format. Consequently, many examples -containing long lines fit in a narrower, @code{@@smallbook} page -without needing to be shortened. Both commands typeset in the normal -font size when you format for the 8.5 by 11 inch size; indeed, -in this situation, the @code{@@smallexample} and @code{@@smalllisp} -commands are defined to be the @code{@@example} and @code{@@lisp} -commands.@refill - -In Info, the @code{@@smallexample} and @code{@@smalllisp} commands are -equivalent to the @code{@@example} and @code{@@lisp} commands, and work -exactly the same.@refill - -Mark the end of @code{@@smallexample} or @code{@@smalllisp} with -@code{@@end smallexample} or @code{@@end smalllisp}, -respectively.@refill - -@iftex -Here is an example written in the small font used by the -@code{@@smallexample} and @code{@@smalllisp} commands: - -@ifclear smallbook -@display -@tex -% Remove extra vskip; this is a kludge to counter the effect of display -\vskip-3\baselineskip -{\ninett -\dots{} to make sure that you have the freedom to -distribute copies of free software (and charge for -this service if you wish), that you receive source -code or can get it if you want it, that you can -change the software or use pieces of it in new free -programs; and that you know you can do these things.} -@end tex -@end display -@end ifclear -@end iftex -@ifset smallbook -@iftex -@smallexample -This is an example of text written between @code{@@smallexample} and -@code{@@end smallexample}. In Info and in an 8.5 by 11 inch manual, -this text appears in its normal size; but in a 7 by 9.25 inch manual, -this text appears in a smaller font. -@end smallexample -@end iftex -@end ifset -@ifinfo -@smallexample -This is an example of text written between @code{@@smallexample} and -@code{@@end smallexample}. In Info and in an 8.5 by 11 inch manual, -this text appears in its normal size; but in a 7 by 9.25 inch manual, -this text appears in a smaller font. -@end smallexample -@end ifinfo - -The @code{@@smallexample} and @code{@@smalllisp} commands make it -easier to prepare smaller format manuals without forcing you to edit -examples by hand to fit them onto narrower pages.@refill - -As a general rule, a printed document looks better if you write all the -examples in a chapter consistently in @code{@@example} or in -@code{@@smallexample}. Only occasionally should you mix the two -formats.@refill - -@xref{smallbook, , Printing ``Small'' Books}, for more information -about the @code{@@smallbook} command.@refill - -@node display, format, smallexample & smalllisp, Quotations and Examples -@comment node-name, next, previous, up -@section @code{@@display} -@cindex Display formatting -@findex display - -The @code{@@display} command begins a kind of example. It is like the -@code{@@example} command -except that, in -a printed manual, @code{@@display} does not select the fixed-width -font. In fact, it does not specify the font at all, so that the text -appears in the same font it would have appeared in without the -@code{@@display} command.@refill - -@display -This is an example of text written between an @code{@@display} command -and an @code{@@end display} command. The @code{@@display} command -indents the text, but does not fill it. -@end display - -@node format, exdent, display, Quotations and Examples -@comment node-name, next, previous, up -@section @code{@@format} -@findex format - -The @code{@@format} command is similar to @code{@@example} except -that, in the printed manual, @code{@@format} does not select the -fixed-width font and does not narrow the margins.@refill - -@format -This is an example of text written between an @code{@@format} command -and an @code{@@end format} command. As you can see -from this example, -the @code{@@format} command does not fill the text. -@end format - -@node exdent, flushleft & flushright, format, Quotations and Examples -@section @code{@@exdent}: Undoing a Line's Indentation -@cindex Indentation undoing -@findex exdent - -The @code{@@exdent} command removes any indentation a line might have. -The command is written at the beginning of a line and applies only to -the text that follows the command that is on the same line. Do not use -braces around the text. In a printed manual, the text on an -@code{@@exdent} line is printed in the roman font.@refill - -@code{@@exdent} is usually used within examples. Thus,@refill - -@example -@group -@@example -This line follows an @@@@example command. -@@exdent This line is exdented. -This line follows the exdented line. -The @@@@end example comes on the next line. -@@end group -@end group -@end example - -@noindent -produces - -@example -@group -This line follows an @@example command. -@exdent This line is exdented. -This line follows the exdented line. -The @@end example comes on the next line. -@end group -@end example - -In practice, the @code{@@exdent} command is rarely used. -Usually, you un-indent text by ending the example and -returning the page to its normal width.@refill - -@node flushleft & flushright, cartouche, exdent, Quotations and Examples -@section @code{@@flushleft} and @code{@@flushright} -@findex flushleft -@findex flushright - -The @code{@@flushleft} and @code{@@flushright} commands line up the -ends of lines on the left and right margins of a page, -but do not fill the text. The commands are written on lines of their -own, without braces. The @code{@@flushleft} and @code{@@flushright} -commands are ended by @code{@@end flushleft} and @code{@@end -flushright} commands on lines of their own.@refill - -@need 800 -For example, - -@example -@group -@@flushleft -This text is -written flushleft. -@@end flushleft -@end group -@end example - -@noindent -produces - -@quotation -@flushleft -This text is -written flushleft. -@end flushleft -@end quotation - - -Flushright produces the type of indentation often used in the return -address of letters.@refill - -@need 800 -@noindent -For example, - -@example -@group -@@flushright -Here is an example of text written -flushright. The @@code@{@@flushright@} command -right justifies every line but leaves the -left end ragged. -@@end flushright -@end group -@end example - -@noindent -produces - -@flushright -Here is an example of text written -flushright. The @code{@@flushright} command -right justifies every line but leaves the -left end ragged. -@end flushright - -@node cartouche, , flushleft & flushright, Quotations and Examples -@section Drawing Cartouches Around Examples -@findex cartouche -@cindex Box with rounded corners - -In a printed manual, the @code{@@cartouche} command draws a box with -rounded corners around its contents. You can use this command to -further highlight an example or quotation. For instance, you could -write a manual in which one type of example is surrounded by a cartouche -for emphasis.@refill - -The @code{@@cartouche} command affects only the printed manual; it has -no effect in the Info file.@refill - -@need 1500 -For example, - -@example -@group -@@example -@@cartouche -% pwd -/usr/local/lib/emacs/info -@@end cartouche -@@end example -@end group -@end example - -@noindent -surrounds the two-line example with a box with rounded corners, in the -printed manual. - -@iftex -In a printed manual, the example looks like this:@refill - -@example -@group -@cartouche -% pwd -/usr/local/lib/emacs/info -@end cartouche -@end group -@end example -@end iftex - -@node Lists and Tables, Indices, Quotations and Examples, Top -@comment node-name, next, previous, up -@chapter Making Lists and Tables -@cindex Making lists and tables -@cindex Lists and tables, making them -@cindex Tables and lists, making them - -Texinfo has several ways of making lists and two-column tables. Lists can -be bulleted or numbered, while two-column tables can highlight the items in -the first column.@refill - -@menu -* Introducing Lists:: Texinfo formats lists for you. -* itemize:: How to construct a simple list. -* enumerate:: How to construct a numbered list. -* Two-column Tables:: How to construct a two-column table. -@end menu - -@ifinfo -@node Introducing Lists, itemize, , Lists and Tables -@heading Introducing Lists -@end ifinfo - -Texinfo automatically indents the text in lists or tables, and numbers -an enumerated list. This last feature is useful if you modify the -list, since you do not need to renumber it yourself.@refill - -Numbered lists and tables begin with the appropriate @@-command at the -beginning of a line, and end with the corresponding @code{@@end} -command on a line by itself. The table and itemized-list commands -also require that you write formatting information on the same line as -the beginning @@-command.@refill - -Begin an enumerated list, for example, with an @code{@@enumerate} -command and end the list with an @code{@@end enumerate} command. -Begin an itemized list with an @code{@@itemize} command, followed on -the same line by a formatting command such as @code{@@bullet}, and end -the list with an @code{@@end itemize} command.@refill -@findex end - -Precede each element of a list with an @code{@@item} or @code{@@itemx} -command.@refill - -@sp 1 -@noindent -Here is an itemized list of the different kinds of table and lists:@refill - -@itemize @bullet -@item -Itemized lists with and without bullets. - -@item -Enumerated lists, using numbers or letters. - -@item -Two-column tables with highlighting. -@end itemize - -@sp 1 -@noindent -Here is an enumerated list with the same items:@refill - -@enumerate -@item -Itemized lists with and without bullets. - -@item -Enumerated lists, using numbers or letters. - -@item -Two-column tables with highlighting. -@end enumerate - -@sp 1 -@noindent -And here is a two-column table with the same items and their -@w{@@-commands}:@refill - -@table @code -@item @@itemize -Itemized lists with and without bullets. - -@item @@enumerate -Enumerated lists, using numbers or letters. - -@item @@table -@itemx @@ftable -@itemx @@vtable -Two-column tables with highlighting. -@end table - -@node itemize, enumerate, Introducing Lists, Lists and Tables -@comment node-name, next, previous, up -@section Making an Itemized List -@cindex Itemization -@findex itemize - -The @code{@@itemize} command produces sequences of indented -paragraphs, with a bullet or other mark inside the left margin -at the beginning of each paragraph for which such a mark is desired.@refill - -Begin an itemized list by writing @code{@@itemize} at the beginning of -a line. Follow the command, on the same line, with a character or a -Texinfo command that generates a mark. Usually, you will write -@code{@@bullet} after @code{@@itemize}, but you can use -@code{@@minus}, or any character or any special symbol that results in -a single character in the Info file. (When you write @code{@@bullet} -or @code{@@minus} after an @code{@@itemize} command, you may omit the -@samp{@{@}}.)@refill - -Write the text of the indented paragraphs themselves after the -@code{@@itemize}, up to another line that says @code{@@end -itemize}.@refill - -Before each paragraph for which a mark in the margin is desired, write -a line that says just @code{@@item}. Do not write any other text on this -line.@refill -@findex item - -Usually, you should put a blank line before an @code{@@item}. This -puts a blank line in the Info file. (@TeX{} inserts the proper -interline whitespace in either case.) Except when the entries are -very brief, these blank lines make the list look better.@refill - -Here is an example of the use of @code{@@itemize}, followed by the -output it produces. Note that @code{@@bullet} produces an @samp{*} in -Info and a round dot in @TeX{}.@refill - -@example -@group -@@itemize @@bullet -@@item -Some text for foo. - -@@item -Some text -for bar. -@@end itemize -@end group -@end example - -@noindent -This produces: - -@quotation -@itemize @bullet -@item -Some text for foo. - -@item -Some text -for bar. -@end itemize -@end quotation - -Itemized lists may be embedded within other itemized lists. Here is a -list marked with dashes embedded in a list marked with bullets:@refill - -@example -@group -@@itemize @@bullet -@@item -First item. - -@@itemize @@minus -@@item -Inner item. - -@@item -Second inner item. -@@end itemize - -@@item -Second outer item. -@@end itemize -@end group -@end example - -@noindent -This produces: - -@quotation -@itemize @bullet -@item -First item. - -@itemize @minus -@item -Inner item. - -@item -Second inner item. -@end itemize - -@item -Second outer item. -@end itemize -@end quotation - -@node enumerate, Two-column Tables, itemize, Lists and Tables -@comment node-name, next, previous, up -@section Making a Numbered or Lettered List -@cindex Enumeration -@findex enumerate - -@code{@@enumerate} is like @code{@@itemize} except that the marks in -the left margin contain successive integers or letters. -(@xref{itemize, , @code{@@itemize}}.)@refill - -Write the @code{@@enumerate} command at the beginning of a line. -The command does not require an argument, but accepts either a number or -a letter as an option. -Without an argument, @code{@@enumerate} starts the list -with the number 1. With a numeric argument, such as 3, -the command starts the list with that number. -With an upper or lower case letter, such as @kbd{a} or @kbd{A}, -the command starts the list with that letter.@refill - -Write the text of the enumerated list in the same way you write an -itemized list: put @code{@@item} on a line of its own before the start of -each paragraph that you want enumerated. Do not write any other text on -the line beginning with @code{@@item}.@refill - -You should put a blank line between entries in the list. -This generally makes it easier to read the Info file.@refill - -@need 1500 -Here is an example of @code{@@enumerate} without an argument:@refill - -@example -@group -@@enumerate -@@item -Underlying causes. - -@@item -Proximate causes. -@@end enumerate -@end group -@end example - -@noindent -This produces: - -@enumerate -@item -Underlying causes. - -@item -Proximate causes. -@end enumerate -@sp 1 -Here is an example with an argument of @kbd{3}:@refill -@sp 1 -@example -@group -@@enumerate 3 -@@item -Predisposing causes. - -@@item -Precipitating causes. - -@@item -Perpetuating causes. -@@end enumerate -@end group -@end example - -@noindent -This produces: - -@enumerate 3 -@item -Predisposing causes. - -@item -Precipitating causes. - -@item -Perpetuating causes. -@end enumerate -@sp 1 -Here is a brief summary of the alternatives. The summary is constructed -using @code{@@enumerate} with an argument of @kbd{a}.@refill -@sp 1 -@enumerate a -@item -@code{@@enumerate} - -Without an argument, produce a numbered list, starting with the number -1.@refill - -@item -@code{@@enumerate @var{positive-integer}} - -With a (positive) numeric argument, start a numbered list with that -number. You can use this to continue a list that you interrupted with -other text.@refill - -@item -@code{@@enumerate @var{upper-case-letter}} - -With an upper case letter as argument, start a list -in which each item is marked -by a letter, beginning with that upper case letter.@refill - -@item -@code{@@enumerate @var{lower-case-letter}} - -With a lower case letter as argument, start a list -in which each item is marked by -a letter, beginning with that lower case letter.@refill -@end enumerate - -You can also nest enumerated lists, as in an outline.@refill - -@node Two-column Tables, , enumerate, Lists and Tables -@comment node-name, next, previous, up -@section Making a Two-column Table -@cindex Tables, making two-column -@findex table - -@code{@@table} is similar to @code{@@itemize}, but the command allows -you to specify a name or heading line for each item. (@xref{itemize, -, @code{@@itemize}}.) The @code{@@table} command is used to produce -two-column tables, and is especially useful for glossaries and -explanatory exhibits.@refill - -@menu -* table:: How to construct a two-column table. -* ftable vtable:: How to construct a two-column table - with automatic indexing. -* itemx:: How to put more entries in the first column. -@end menu - -@ifinfo -@node table, ftable vtable, , Two-column Tables -@subheading Using the @code{@@table} Command - -Use the @code{@@table} command to produce two-column tables.@refill -@end ifinfo - -Write the @code{@@table} command at the beginning of a line and follow -it on the same line with an argument that is a Texinfo command such as -@code{@@code}, @code{@@samp}, @code{@@var}, or @code{@@kbd}. -Although these commands are usually followed by arguments in braces, -in this case you use the command name without an argument because -@code{@@item} will supply the argument. This command will be applied -to the text that goes into the first column of each item and -determines how it will be highlighted. For example, @code{@@samp} -will cause the text in the first column to be highlighted with an -@code{@@samp} command.@refill - -You may also choose to use the @code{@@asis} command as an argument to -@code{@@table}. @code{@@asis} is a command that does nothing; if you use this -command after @code{@@table}, @TeX{} and the Info formatting commands -output the first column entries without added highlighting (`as -is').@refill - -(The @code{@@table} command may work with other commands besides those -listed here. However, you can only use commands -that normally take arguments in braces.)@refill - -Begin each table entry with an @code{@@item} command at the beginning -of a line. Write the first column text on the same line as the -@code{@@item} command. Write the second column text on the line -following the @code{@@item} line and on subsequent lines. (You do not -need to type anything for an empty second column entry.) You may -write as many lines of supporting text as you wish, even several -paragraphs. But only text on the same line as the @code{@@item} will -be placed in the first column.@refill -@findex item - -Normally, you should put a blank line before an @code{@@item} line. -This puts a blank like in the Info file. Except when the entries are -very brief, a blank line looks better.@refill - -@need 1500 -The following table, for example, highlights the text in the first -column with an @code{@@samp} command:@refill - -@example -@group -@@table @@samp -@@item foo -This is the text for -@@samp@{foo@}. - -@@item bar -Text for @@samp@{bar@}. -@@end table -@end group -@end example - -@noindent -This produces: - -@table @samp -@item foo -This is the text for -@samp{foo}. -@item bar -Text for @samp{bar}. -@end table - -If you want to list two or more named items with a single block of -text, use the @code{@@itemx} command. (@xref{itemx, , -@code{@@itemx}}.)@refill - -@node ftable vtable, itemx, table, Two-column Tables -@comment node-name, next, previous, up -@subsection @code{@@ftable} and @code{@@vtable} -@cindex Tables with indexes -@cindex Indexing table entries automatically -@findex ftable -@findex vtable - -The @code{@@ftable} and @code{@@vtable} commands are the same as the -@code{@@table} command except that @code{@@ftable} automatically enters -each of the items in the first column of the table into the index of -functions and @code{@@vtable} automatically enters each of the items in -the first column of the table into the index of variables. This -simplifies the task of creating indices. Only the items on the same -line as the @code{@@item} commands are indexed, and they are indexed in -exactly the form that they appear on that line. @xref{Indices, , -Creating Indices}, for more information about indices.@refill - -Begin a two-column table using @code{@@ftable} or @code{@@vtable} by -writing the @@-command at the beginning of a line, followed on the same -line by an argument that is a Texinfo command such as @code{@@code}, -exactly as you would for an @code{@@table} command; and end the table -with an @code{@@end ftable} or @code{@@end vtable} command on a line by -itself. - -@node itemx, , ftable vtable, Two-column Tables -@comment node-name, next, previous, up -@subsection @code{@@itemx} -@cindex Two named items for @code{@@table} -@findex itemx - -Use the @code{@@itemx} command inside a table when you have two or -more first column entries for the same item, each of which should -appear on a line of its own. Use @code{@@itemx} for all but the first -entry. The @code{@@itemx} command works exactly like @code{@@item} -except that it does not generate extra vertical space above the first -column text.@refill - -@need 1000 -For example, - -@example -@group -@@table @@code -@@item upcase -@@itemx downcase -These two functions accept a character or a string as -argument, and return the corresponding upper case (lower -case) character or string. -@@end table -@end group -@end example - -@noindent -This produces: - -@table @code -@item upcase -@itemx downcase -These two functions accept a character or a string as -argument, and return the corresponding upper case (lower -case) character or string.@refill -@end table - -@noindent -(Note also that this example illustrates multi-line supporting text in -a two-column table.)@refill - -@node Indices, Insertions, Lists and Tables, Top -@comment node-name, next, previous, up -@chapter Creating Indices -@cindex Indices -@cindex Creating indices - -Using Texinfo, you can generate indices without having to sort and -collate entries manually. In an index, the entries are listed in -alphabetical order, together with information on how to find the -discussion of each entry. In a printed manual, this information -consists of page numbers. In an Info file, this information is a menu -entry leading to the first node referenced.@refill - -Texinfo provides several predefined kinds of index: an index -for functions, an index for variables, an index for concepts, and so -on. You can combine indices or use them for other than their -canonical purpose. If you wish, you can define your own indices.@refill - -@menu -* Index Entries:: Choose different words for index entries. -* Predefined Indices:: Use different indices for different kinds - of entry. -* Indexing Commands:: How to make an index entry. -* Combining Indices:: How to combine indices. -* New Indices:: How to define your own indices. -@end menu - -@node Index Entries, Predefined Indices, , Indices -@comment node-name, next, previous, up -@section Making Index Entries -@cindex Index entries, making -@cindex Entries, making index - -When you are making index entries, it is good practice to think of the -different ways people may look for something. Different people -@emph{do not} think of the same words when they look something up. A -helpful index will have items indexed under all the different words -that people may use. For example, one reader may think it obvious that -the two-letter names for indices should be listed under ``Indices, -two-letter names'', since the word ``Index'' is the general concept. -But another reader may remember the specific concept of two-letter -names and search for the entry listed as ``Two letter names for -indices''. A good index will have both entries and will help both -readers.@refill - -Like typesetting, the construction of an index is a highly skilled, -professional art, the subtleties of which are not appreciated until you -need to do it yourself.@refill - -@xref{Printing Indices & Menus}, for information about printing an index -at the end of a book or creating an index menu in an Info file.@refill - -@node Predefined Indices, Indexing Commands, Index Entries, Indices -@comment node-name, next, previous, up -@section Predefined Indices - -Texinfo provides six predefined indices:@refill - -@itemize @bullet -@item -A @dfn{concept index} listing concepts that are discussed.@refill - -@item -A @dfn{function index} listing functions (such as entry points of -libraries).@refill - -@item -A @dfn{variables index} listing variables (such as global variables -of libraries).@refill - -@item -A @dfn{keystroke index} listing keyboard commands.@refill - -@item -A @dfn{program index} listing names of programs.@refill - -@item -A @dfn{data type index} listing data types (such as structures defined in -header files).@refill -@end itemize - -@noindent -Not every manual needs all of these, and most manuals use two or three -of them. This manual has two indices: a -concept index and an @@-command index (that is actually the function -index but is called a command index in the chapter heading). Two or -more indices can be combined into one using the @code{@@synindex} or -@code{@@syncodeindex} commands. @xref{Combining Indices}.@refill - -@node Indexing Commands, Combining Indices, Predefined Indices, Indices -@comment node-name, next, previous, up -@section Defining the Entries of an Index -@cindex Defining indexing entries -@cindex Index entries -@cindex Entries for an index -@cindex Specifying index entries -@cindex Creating index entries - -The data to make an index come from many individual indexing commands -scattered throughout the Texinfo source file. Each command says to add -one entry to a particular index; after formatting, the index will give -the current page number or node name as the reference.@refill - -An index entry consists of an indexing command at the beginning of a -line followed, on the rest of the line, by the entry.@refill - -For example, this section begins with the following five entries for -the concept index:@refill - -@example -@@cindex Defining indexing entries -@@cindex Index entries -@@cindex Entries for an index -@@cindex Specifying index entries -@@cindex Creating index entries -@end example - -Each predefined index has its own indexing command---@code{@@cindex} -for the concept index, @code{@@findex} for the function index, and so -on.@refill - -@cindex Capitalizing index entries -@cindex Index entry capitalization -The usual convention is to capitalize the first word of each index -entry, unless that word is the name of a function, variable, or other -such entity that should not be capitalized. Thus, if you are -documenting Emacs Lisp, you should usually capitalize entries in -the concept index, but not those in the function index. -However, if your -concept index entries are consistently short (one or two words each) -it may look better for each regular entry to start with a lower case -letter. Whichever convention you adapt, please be consistent! - -By default, entries for a concept index are printed in a small roman -font and entries for the other indices are printed in a small -@code{@@code} font. You may change the way part of an entry is -printed with the usual Texinfo commands, such as @code{@@file} for -file names and @code{@@emph} for emphasis (@pxref{Marking -Text}).@refill -@cindex Index font types - -@cindex Predefined indexing commands -@cindex Indexing commands, predefined -The six indexing commands for predefined indices are: - -@table @code -@item @@cindex @var{concept} -@findex cindex -Make an entry in the concept index for @var{concept}.@refill - -@item @@findex @var{function} -@findex findex -Make an entry in the function index for @var{function}.@refill - -@item @@vindex @var{variable} -@findex vindex -Make an entry in the variable index for @var{variable}.@refill - -@item @@kindex @var{keystroke} -@findex kindex -Make an entry in the key index for @var{keystroke}.@refill - -@item @@pindex @var{program} -@findex pindex -Make an entry in the program index for @var{program}.@refill - -@item @@tindex @var{data type} -@findex tindex -Make an entry in the data type index for @var{data type}.@refill -@end table - -@quotation -@strong{Caution:} Do not use a colon in an index entry. In Info, a -colon separates the menu entry name from the node name. An extra -colon confuses Info. -@xref{Menu Parts, , The Parts of a Menu}, -for more information about the structure of a menu entry.@refill -@end quotation - -If you write several identical index entries in different places in a -Texinfo file, the index in the printed manual will list all the pages to -which those entries refer. However, the index in the Info file will -list @strong{only} the node that references the @strong{first} of those -index entries. Therefore, it is best to write indices in which each -entry refers to only one place in the Texinfo file. Fortunately, this -constraint is a feature rather than a loss since it means that the index -will be easy to use. Otherwise, you could create an index that lists -several pages for one entry and your reader would not know to which page -to turn. If you have two identical entries for one topic, change the -topics slightly, or qualify them to indicate the difference.@refill - -You are not actually required to use the predefined indices for their -canonical purposes. For example, suppose you wish to index some C -preprocessor macros. You could put them in the function index along -with actual functions, just by writing @code{@@findex} commands for -them; then, when you print the ``Function Index'' as an unnumbered -chapter, you could give it the title `Function and Macro Index' and -all will be consistent for the reader. Or you could put the macros in -with the data types by writing @code{@@tindex} commands for them, and -give that index a suitable title so the reader will understand. -(@xref{Printing Indices & Menus}.)@refill - -@node Combining Indices, New Indices, Indexing Commands, Indices -@comment node-name, next, previous, up -@section Combining Indices -@cindex Combining indices -@cindex Indices, combining them - -Sometimes you will want to combine two disparate indices such as functions -and concepts, perhaps because you have few enough of one of them that -a separate index for them would look silly.@refill - -You could put functions into the concept index by writing -@code{@@cindex} commands for them instead of @code{@@findex} commands, -and produce a consistent manual by printing the concept index with the -title `Function and Concept Index' and not printing the `Function -Index' at all; but this is not a robust procedure. It works only if -your document is never included as part of another -document that is designed to have a separate function index; if your -document were to be included with such a document, the functions from -your document and those from the other would not end up together. -Also, to make your function names appear in the right font in the -concept index, you would need to enclose every one of them between -the braces of @code{@@code}.@refill - -@menu -* syncodeindex:: How to merge two indices, using @code{@@code} - font for the merged-from index. -* synindex:: How to merge two indices, using the - default font of the merged-to index. -@end menu - -@node syncodeindex, synindex, , Combining Indices -@subsubsection @code{@@syncodeindex} -@findex syncodeindex - -When you want to combine functions and concepts into one index, you -should index the functions with @code{@@findex} and index the concepts -with @code{@@cindex}, and use the @code{@@syncodeindex} command to -redirect the function index entries into the concept index.@refill -@findex syncodeindex - -The @code{@@syncodeindex} command takes two arguments; they are the name -of the index to redirect, and the name of the index to redirect it to. -The template looks like this:@refill - -@example -@@syncodeindex @var{from} @var{to} -@end example - -@cindex Predefined names for indices -@cindex Two letter names for indices -@cindex Indices, two letter names -@cindex Names for indices -For this purpose, the indices are given two-letter names:@refill - -@table @samp -@item cp -concept index -@item fn -function index -@item vr -variable index -@item ky -key index -@item pg -program index -@item tp -data type index -@end table - -Write an @code{@@syncodeindex} command before or shortly after the -end-of-header line at the beginning of a Texinfo file. For example, -to merge a function index with a concept index, write the -following:@refill - -@example -@@syncodeindex fn cp -@end example - -@noindent -This will cause all entries designated for the function index to merge -in with the concept index instead.@refill - -To merge both a variables index and a function index into a concept -index, write the following:@refill - -@example -@group -@@syncodeindex vr cp -@@syncodeindex fn cp -@end group -@end example - -@cindex Fonts for indices -The @code{@@syncodeindex} command puts all the entries from the `from' -index (the redirected index) into the @code{@@code} font, overriding -whatever default font is used by the index to which the entries are -now directed. This way, if you direct function names from a function -index into a concept index, all the function names are printed in the -@code{@@code} font as you would expect.@refill - -@node synindex, , syncodeindex, Combining Indices -@subsubsection @code{@@synindex} -@findex synindex - -The @code{@@synindex} command is nearly the same as the -@code{@@syncodeindex} command, except that it does not put the -`from' index entries into the @code{@@code} font; rather it puts -them in the roman font. Thus, you use @code{@@synindex} when you -merge a concept index into a function index.@refill - -@xref{Printing Indices & Menus}, for information about printing an index -at the end of a book or creating an index menu in an Info file.@refill - -@node New Indices, , Combining Indices, Indices -@section Defining New Indices -@cindex Defining new indices -@cindex Indices, defining new -@cindex New index defining -@findex defindex -@findex defcodeindex - -In addition to the predefined indices, you may use the -@code{@@defindex} and @code{@@defcodeindex} commands to define new -indices. These commands create new indexing @@-commands with which -you mark index entries. The @code{@@defindex }command is used like -this:@refill - -@example -@@defindex @var{name} -@end example - -The name of an index should be a two letter word, such as @samp{au}. -For example:@refill - -@example -@@defindex au -@end example - -This defines a new index, called the @samp{au} index. At the same -time, it creates a new indexing command, @code{@@auindex}, that you -can use to make index entries. Use the new indexing command just as -you would use a predefined indexing command.@refill - -For example, here is a section heading followed by a concept index -entry and two @samp{au} index entries.@refill - -@example -@@section Cognitive Semantics -@@cindex kinesthetic image schemas -@@auindex Johnson, Mark -@@auindex Lakoff, George -@end example - -@noindent -(Evidently, @samp{au} serves here as an abbreviation for ``author''.) -Texinfo constructs the new indexing command by concatenating the name -of the index with @samp{index}; thus, defining an @samp{au} index -leads to the automatic creation of an @code{@@auindex} command.@refill - -Use the @code{@@printindex} command to print the index, as you do with -the predefined indices. For example:@refill - -@example -@group -@@node Author Index, Subject Index, , Top -@@unnumbered Author Index - -@@printindex au -@end group -@end example - -The @code{@@defcodeindex} is like the @code{@@defindex} command, except -that, in the printed output, it prints entries in an @code{@@code} font -instead of a roman font. Thus, it parallels the @code{@@findex} command -rather than the @code{@@cindex} command.@refill - -You should define new indices within or right after the end-of-header -line of a Texinfo file, before any @code{@@synindex} or -@code{@@syncodeindex} commands (@pxref{Header}).@refill - -@node Insertions, Glyphs, Indices, Top -@comment node-name, next, previous, up -@chapter Special Insertions -@cindex Inserting special characters and symbols -@cindex Special insertions - -Texinfo provides several commands for formatting dimensions, for -inserting single characters that have special meaning in Texinfo, such -as braces, and for inserting special graphic symbols that do not -correspond to characters, such as dots and bullets.@refill - -@iftex -These are: - -@itemize @bullet -@item -Braces, @samp{@@} and periods. - -@item -Format a dimension, such as @samp{12@dmn{pt}}. - -@item -Dots and bullets. - -@item -The @TeX{} logo and the copyright symbol. - -@item -A minus sign. -@end itemize -@end iftex - -@menu -* Braces Atsigns Periods:: How to insert braces, @samp{@@} and periods. -* dmn:: How to format a dimension. -* Dots Bullets:: How to insert dots and bullets. -* TeX and copyright:: How to insert the @TeX{} logo - and the copyright symbol. -* minus:: How to insert a minus sign. -@end menu - -@node Braces Atsigns Periods, dmn, , Insertions -@comment node-name, next, previous, up -@section Inserting @samp{@@}, Braces, and Periods -@cindex Inserting @@, braces, and periods -@cindex Braces, inserting -@cindex Periods, inserting -@cindex Single characters, commands to insert -@cindex Commands to insert single characters - -@samp{@@} and curly braces are special characters in Texinfo. To -insert these characters so they appear in text, you must put an @samp{@@} in front -of these characters to prevent Texinfo from misinterpreting them.@refill - -Periods are also special. Depending on whether the period is inside -or at the end of a sentence, less or more space is inserted after a -period in a typeset manual. Since it is not always possible for -Texinfo to determine when a period ends a sentence and when it is used -in an abbreviation, special commands are needed in some circumstances. -(Usually, Texinfo can guess how to handle periods, so you do not need -to use the special commands; you just enter a period as you would if -you were using a typewriter, which means you put two spaces after the -period, question mark, or exclamation mark that ends a -sentence.)@refill - -Do not put braces after any of these commands; they are not -necessary.@refill - -@menu -* Inserting An Atsign:: -* Inserting Braces:: How to insert @samp{@{} and @samp{@}} -* Controlling Spacing:: How to insert the right amount of space - after punctuation within a sentence. -@end menu - -@node Inserting An Atsign, Inserting Braces, , Braces Atsigns Periods -@comment node-name, next, previous, up -@subsection Inserting @samp{@@} with @@@@ -@findex @@ @r{(single @samp{@@})} - -@code{@@@@} stands for a single @samp{@@} in either printed or Info -output.@refill - -Do not put braces after an @code{@@@@} command.@refill - -@node Inserting Braces, Controlling Spacing, Inserting An Atsign, Braces Atsigns Periods -@comment node-name, next, previous, up -@subsection Inserting @samp{@{} and @samp{@}}with @@@{ and @@@} -@findex @{ @r{(single @samp{@{})} -@findex @} @r{(single @samp{@}})} - -@code{@@@{} stands for a single @samp{@{} in either printed or Info -output.@refill - -@code{@@@}} stands for a single @samp{@}} in either printed or Info -output.@refill - -Do not put braces after either an @code{@@@{} or an @code{@@@}} -command.@refill - -@node Controlling Spacing, , Inserting Braces, Braces Atsigns Periods -@comment node-name, next, previous, up -@subsection Spacing After Colons and Periods -@findex : @r{(suppress widening)} - -Use the @code{@@:}@: command after a period, question mark, -exclamation mark, or colon that should not be followed by extra space. -For example, use @code{@@:}@: after periods that end abbreviations -which are not at the ends of sentences. @code{@@:}@: has no effect on -the Info file output.@refill - -@need 700 -For example, - -@example -The s.o.p.@@: has three parts @dots{} -The s.o.p. has three parts @dots{} -@end example - -@noindent -@ifinfo -produces -@end ifinfo -@iftex -produces the following. If you look carefully at this printed output, -you will see a little more whitespace after @samp{s.o.p.} in the second -line.@refill -@end iftex - -@quotation -The s.o.p.@: has three parts @dots{}@* -The s.o.p. has three parts @dots{} -@end quotation - -@noindent -@kbd{@@:} has no effect on the Info output. (@samp{s.o.p} is an acronym -for ``Standard Operating Procedure''.) - -@findex . @r{(true end of sentence)} -Use @code{@@.}@: instead of a period at the end of a sentence that -ends with a single capital letter. Otherwise, @TeX{} will think the -letter is an abbreviation and will not insert the correct -end-of-sentence spacing. Here is an example:@refill - -@example -Give it to M.I.B. and to M.E.W@@. Also, give it to R.J.C@@. -Give it to M.I.B. and to M.E.W. Also, give it to R.J.C. -@end example - -@noindent -@ifinfo -produces -@end ifinfo -@iftex -produces the following. If you look carefully at this printed output, -you will see a little more whitespace after the @samp{W} in the first -line.@refill -@end iftex - -@quotation -Give it to M.I.B. and to M.E.W@. Also, give it to R.J.C@.@* -Give it to M.I.B. and to M.E.W. Also, give it to R.J.C. -@end quotation - -In the Info file output, @code{@@.}@: is equivalent to a simple -@samp{.}.@refill - -The meanings of @code{@@:}@: and @code{@@.}@: in Texinfo are designed -to work well with the Emacs sentence motion commands. This made it -necessary for them to be incompatible with some other formatting -systems that use @@-commands.@refill - -Do not put braces after either an @code{@@:} or an @code{@@.} command.@refill - -@node dmn, Dots Bullets, Braces Atsigns Periods, Insertions -@section @code{@@dmn}@{@var{dimension}@}: Format a Dimension -@cindex Thin space between number, dimension -@cindex Dimension formatting -@cindex Format a dimension -@findex dmn - -At times, you may want to write @samp{12@dmn{pt}} or -@samp{8.5@dmn{in}} with little or no space between the number and the -abbreviation for the dimension. You can use the @code{@@dmn} command -to do this. On seeing the command, @TeX{} inserts just enough space -for proper typesetting; the Info formatting commands insert no space -at all, since the Info file does not require it.@refill - -To use the @code{@@dmn} command, write the number and then follow it -immediately, with no intervening space, by @code{@@dmn}, and then by -the dimension within braces.@refill - -@need 700 -@noindent -For example, - -@example -A4 paper is 8.27@@dmn@{in@} wide. -@end example - -@noindent -produces - -@quotation -A4 paper is 8.27@dmn{in} wide. -@end quotation - -Not everyone uses this style. Instead of writing -@w{@samp{8.27@@dmn@{in@}}} in the Texinfo file, you may write -@w{@samp{8.27 in.}} or @w{@samp{8.27 inches}}. (In these cases, the -formatters may insert a line break between the number and the -dimension. Also, if you write a period after an abbreviation within a -sentence, you should write @samp{@@:} after the period to prevent -@TeX{} from inserting extra whitespace. @xref{Controlling Spacing, , -Spacing After Colons and Periods}.)@refill - -@node Dots Bullets, TeX and copyright, dmn, Insertions -@comment node-name, next, previous, up -@section Inserting Ellipsis, Dots, and Bullets -@cindex Dots, inserting -@cindex Bullets, inserting -@cindex Ellipsis, inserting -@cindex Inserting ellipsis -@cindex Inserting dots -@cindex Special typesetting commands -@cindex Typesetting commands for dots, etc. - -An @dfn{ellipsis} (a line of dots) is not typeset as a string of -periods, so a special command is used for ellipsis in Texinfo. The -@code{@@bullet} command is special, too. Each of these commands is -followed by a pair of braces, @samp{@{@}}, without any whitespace -between the name of the command and the braces. (You need to use braces -with these commands because you can use them next to other text; without -the braces, the formatters would be confused. @xref{Command Syntax, , -@@-Command Syntax}, for further information.)@refill - -@menu -* dots:: How to insert dots @dots{} -* bullet:: How to insert a bullet. -@end menu - -@node dots, bullet, , Dots Bullets -@comment node-name, next, previous, up -@subsection @code{@@dots}@{@} -@findex dots -@cindex Inserting dots -@cindex Dots, inserting - -Use the @code{@@dots@{@}} command to generate an ellipsis, which is -three dots in a row, appropriately spaced, like this: `@dots{}'. Do -not simply write three periods in the input file; that would work for -the Info file output, but would produce the wrong amount of space -between the periods in the printed manual.@refill - -@iftex -Here is an ellipsis: @dots{} - -Here are three periods in a row: ... - -In printed output, the three periods in a row are closer together than -the dots in the ellipsis. -@end iftex - -@node bullet, , dots, Dots Bullets -@comment node-name, next, previous, up -@subsection @code{@@bullet}@{@} -@findex bullet - -Use the @code{@@bullet@{@}} command to generate a large round dot, or -the closest possible thing to one. In Info, an asterisk is used.@refill - -Here is a bullet: @bullet{} - -When you use @code{@@bullet} in @code{@@itemize}, you do not need to -type the braces, because @code{@@itemize} supplies them. @xref{itemize}.@refill - -@node TeX and copyright, minus, Dots Bullets, Insertions -@comment node-name, next, previous, up -@section Inserting @TeX{} and the Copyright Symbol - -The logo `@TeX{}' is typeset in a special fashion and it needs an -@@-command. The copyright symbol, `@copyright{}', is also special. -Each of these commands is followed by a pair of braces, @samp{@{@}}, -without any whitespace between the name of the command and the -braces.@refill - -@menu -* tex:: How to insert the @TeX{} logo. -* copyright symbol:: How to use @code{@@copyright}@{@}. -@end menu - -@node tex, copyright symbol, , TeX and copyright -@comment node-name, next, previous, up -@subsection @code{@@TeX}@{@} -@findex tex (command) - -Use the @code{@@TeX@{@}} command to generate `@TeX{}'. In a printed -manual, this is a special logo that is different from three ordinary -letters. In Info, it just looks like @samp{TeX}. The -@code{@@TeX@{@}} command is unique among Texinfo commands in that the -@key{T} and the @key{X} are in upper case.@refill - -@node copyright symbol, , tex, TeX and copyright -@comment node-name, next, previous, up -@subsection @code{@@copyright}@{@} -@findex copyright - -Use the @code{@@copyright@{@}} command to generate `@copyright{}'. In -a printed manual, this is a @samp{c} inside a circle, and in Info, -this is @samp{(C)}.@refill - -@node minus, , TeX and copyright, Insertions -@section @code{@@minus}@{@}: Inserting a Minus Sign -@findex minus - -Use the @code{@@minus@{@}} command to generate a minus sign. In a -fixed-width font, this is a single hyphen, but in a proportional font, -the symbol is the customary length for a minus sign---a little longer -than a hyphen.@refill - -You can compare the two forms: - -@display -@samp{@minus{}} is a minus sign generated with @samp{@@minus@{@}}, - -`-' is a hyphen generated with the character @samp{-}. -@end display - -@noindent -In the fixed-width font used by Info, @code{@@minus@{@}} is the same -as a hyphen.@refill - -You should not use @code{@@minus@{@}} inside @code{@@code} or -@code{@@example} because the width distinction is not made in the -fixed-width font they use.@refill - -When you use @code{@@minus} to specify the mark beginning each entry in -an itemized list, you do not need to type the braces -(@pxref{itemize}).@refill - -@node Glyphs, Breaks, Insertions, Top -@comment node-name, next, previous, up -@chapter Glyphs for Examples -@cindex Glyphs - -In Texinfo, code is often illustrated in examples that are delimited -by @code{@@example} and @code{@@end example}, or by @code{@@lisp} and -@code{@@end lisp}. In such examples, you can indicate the results of -evaluation or an expansion using @samp{@result{}} or -@samp{@expansion{}}. Likewise, there are commands to insert glyphs -to indicate -printed output, error messages, equivalence of expressions, and the -location of point.@refill - -The glyph-insertion commands do not need to be used within an example, but -most often they are. Every glyph-insertion command is followed by a pair of -left- and right-hand braces.@refill - -@menu -* Glyphs Summary:: -* result:: How to show the result of expression. -* expansion:: How to indicate an expansion. -* Print Glyph:: How to indicate printed output. -* Error Glyph:: How to indicate an error message. -* Equivalence:: How to indicate equivalence. -* Point Glyph:: How to indicate the location of point. -@end menu - -@node Glyphs Summary, result, , Glyphs -@ifinfo -@heading Glyphs Summary - -Here are the different glyph commands:@refill -@end ifinfo - -@table @asis -@item @result{} -@code{@@result@{@}} points to the result of an expression.@refill - -@item @expansion{} -@code{@@expansion@{@}} shows the results of a macro expansion.@refill - -@item @print{} -@code{@@print@{@}} indicates printed output.@refill - -@item @error{} -@code{@@error@{@}} indicates that the following text is an error -message.@refill - -@item @equiv{} -@code{@@equiv@{@}} indicates the exact equivalence of two forms.@refill - -@item @point{} -@code{@@point@{@}} shows the location of point.@refill -@end table - -@node result, expansion, Glyphs Summary, Glyphs -@section @result{}: Indicating Evaluation -@cindex Result of an expression -@cindex Indicating evaluation -@cindex Evaluation glyph -@cindex Value of an expression, indicating - -Use the @code{@@result@{@}} command to indicate the result of -evaluating an expression.@refill - -@iftex -The @code{@@result@{@}} command is displayed as @samp{=>} in Info and -as @samp{@result{}} in the printed output. -@end iftex -@ifinfo -The @code{@@result@{@}} command is displayed as @samp{@result{}} in Info -and as a double stemmed arrow in the printed output.@refill -@end ifinfo - -Thus, the following, - -@lisp -(cdr '(1 2 3)) - @result{} (2 3) -@end lisp - -@noindent -may be read as ``@code{(cdr '(1 2 3))} evaluates to @code{(2 3)}''. - -@node expansion, Print Glyph, result, Glyphs -@section @expansion{}: Indicating an Expansion -@cindex Expansion, indicating it - -When an expression is a macro call, it expands into a new expression. -You can indicate the result of the expansion with the -@code{@@expansion@{@}} command.@refill - -@iftex -The @code{@@expansion@{@}} command is displayed as @samp{==>} in Info and -as @samp{@expansion{}} in the printed output. -@end iftex -@ifinfo -The @code{@@expansion@{@}} command is displayed as @samp{@expansion{}} -in Info and as a long arrow with a flat base in the printed output.@refill -@end ifinfo - -@need 700 -For example, the following - -@example -@group -@@lisp -(third '(a b c)) - @@expansion@{@} (car (cdr (cdr '(a b c)))) - @@result@{@} c -@@end lisp -@end group -@end example - -@noindent -produces - -@lisp -@group -(third '(a b c)) - @expansion{} (car (cdr (cdr '(a b c)))) - @result{} c -@end group -@end lisp - -@noindent -which may be read as: - -@quotation -@code{(third '(a b c))} expands to @code{(car (cdr (cdr '(a b c))))}; -the result of evaluating the expression is @code{c}. -@end quotation - -@noindent -Often, as in this case, an example looks better if the -@code{@@expansion@{@}} and @code{@@result@{@}} commands are indented -five spaces.@refill - -@node Print Glyph, Error Glyph, expansion, Glyphs -@section @print{}: Indicating Printed Output -@cindex Printed output, indicating it - -Sometimes an expression will print output during its execution. You -can indicate the printed output with the @code{@@print@{@}} command.@refill - -@iftex -The @code{@@print@{@}} command is displayed as @samp{-|} in Info and -as @samp{@print{}} in the printed output. -@end iftex -@ifinfo -The @code{@@print@{@}} command is displayed as @samp{@print{}} in Info -and similarly, as a horizontal dash butting against a vertical bar, in -the printed output.@refill -@end ifinfo - -In the following example, the printed text is indicated with -@samp{@print{}}, and the value of the expression follows on the -last line.@refill - -@lisp -@group -(progn (print 'foo) (print 'bar)) - @print{} foo - @print{} bar - @result{} bar -@end group -@end lisp - -@noindent -In a Texinfo source file, this example is written as follows: - -@lisp -@group -@@lisp -(progn (print 'foo) (print 'bar)) - @@print@{@} foo - @@print@{@} bar - @@result@{@} bar -@@end lisp -@end group -@end lisp - -@node Error Glyph, Equivalence, Print Glyph, Glyphs -@section @error{}: Indicating an Error Message -@cindex Error message, indicating it - -A piece of code may cause an error when you evaluate it. You can -designate the error message with the @code{@@error@{@}} command.@refill - -@iftex -The @code{@@error@{@}} command is displayed as @samp{error-->} in Info -and as @samp{@error{}} in the printed output. -@end iftex -@ifinfo -The @code{@@error@{@}} command is displayed as @samp{@error{}} in Info -and as the word `error' in a box in the printed output.@refill -@end ifinfo - -@need 700 -Thus, - -@example -@@lisp -(+ 23 'x) -@@error@{@} Wrong type argument: integer-or-marker-p, x -@@end lisp -@end example - -@noindent -produces - -@lisp -(+ 23 'x) -@error{} Wrong type argument: integer-or-marker-p, x -@end lisp - -@noindent -This indicates that the following error message is printed -when you evaluate the expression: - -@lisp -Wrong type argument: integer-or-marker-p, x -@end lisp - -Note that @samp{@error{}} itself is not part of the error -message. - -@node Equivalence, Point Glyph, Error Glyph, Glyphs -@section @equiv{}: Indicating Equivalence -@cindex Equivalence, indicating it - -Sometimes two expressions produce identical results. You can indicate the -exact equivalence of two forms with the @code{@@equiv@{@}} command.@refill - -@iftex -The @code{@@equiv@{@}} command is displayed as @samp{==} in Info and -as @samp{@equiv{}} in the printed output. -@end iftex -@ifinfo -The @code{@@equiv@{@}} command is displayed as @samp{@equiv{}} in Info -and as a three parallel horizontal lines in the printed output.@refill -@end ifinfo - -Thus, - -@example -@@lisp -(make-sparse-keymap) @@equiv@{@} (list 'keymap) -@@end lisp -@end example - -@noindent -produces - -@lisp -(make-sparse-keymap) @equiv{} (list 'keymap) -@end lisp - -@noindent -This indicates that evaluating @code{(make-sparse-keymap)} produces -identical results to evaluating @code{(list 'keymap)}. - -@c Cannot write point command here because it causes trouble with TOC. -@node Point Glyph, , Equivalence, Glyphs -@section Indicating Point in a Buffer -@cindex Point, indicating it in a buffer - -Sometimes you need to show an example of text in an Emacs buffer. In -such examples, the convention is to include the entire contents of the -buffer in question between two lines of dashes containing the buffer -name.@refill - -You can use the @samp{@@point@{@}} command to show the location of point -in the text in the buffer. (The symbol for point, of course, is not -part of the text in the buffer; it indicates the place @emph{between} -two characters where point is located.)@refill - -@iftex -The @code{@@point@{@}} command is displayed as @samp{-!-} in Info and -as @samp{@point{}} in the printed output. -@end iftex -@ifinfo -The @code{@@point@{@}} command is displayed as @samp{@point{}} in Info -and as a small five pointed star in the printed output.@refill -@end ifinfo - -The following example shows the contents of buffer @file{foo} before -and after evaluating a Lisp command to insert the word @code{changed}.@refill - -@example -@group ----------- Buffer: foo ---------- -This is the @point{}contents of foo. ----------- Buffer: foo ---------- - -@end group -@end example - -@example -@group -(insert "changed ") - @result{} nil ----------- Buffer: foo ---------- -This is the changed @point{}contents of foo. ----------- Buffer: foo ---------- - -@end group -@end example - -In a Texinfo source file, the example is written like this:@refill - -@example -@@example ----------- Buffer: foo ---------- -This is the @@point@{@}contents of foo. ----------- Buffer: foo ---------- - -(insert "changed ") - @@result@{@} nil ----------- Buffer: foo ---------- -This is the changed @@point@{@}contents of foo. ----------- Buffer: foo ---------- -@@end example -@end example - -@node Breaks, Definition Commands, Glyphs, Top -@comment node-name, next, previous, up -@chapter Making and Preventing Breaks -@cindex Making line and page breaks -@cindex Preventing line and page breaks - -Usually, a Texinfo file is processed both by @TeX{} and by one of the -Info formatting commands. Line, paragraph, or page breaks sometimes -occur in the `wrong' place in one or other form of output. You must -ensure that text looks right both in the printed manual and in the -Info file.@refill - -For example, in a printed manual, page breaks may occur awkwardly in -the middle of an example; to prevent this, you can hold text together -using a grouping command that keeps the text from being split across -two pages. Conversely, you may want to force a page break where none -would occur normally. Fortunately, problems like these do not often -arise. When they do, use the break, break prevention, or pagination -commands.@refill - -@menu -* Break Commands:: Cause and prevent splits. -* Line Breaks:: How to force a single line to use two lines. -* w:: How to prevent unwanted line breaks. -* sp:: How to insert blank lines. -* page:: How to force the start of a new page. -* group:: How to prevent unwanted page breaks. -* need:: Another way to prevent unwanted page breaks. -@end menu - -@ifinfo -@node Break Commands, Line Breaks, , Breaks -@heading The Break Commands -@end ifinfo -@iftex -@sp 1 -@end iftex - -The break commands create line and paragraph breaks:@refill - -@table @code -@item @@* -Force a line break. - -@item @@sp @var{n} -Skip @var{n} blank lines.@refill -@end table -@iftex -@sp 1 -@end iftex - -The line-break-prevention command holds text together all on one -line:@refill - -@table @code -@item @@w@{@var{text}@} -Prevent @var{text} from being split and hyphenated across two lines.@refill -@end table -@iftex -@sp 1 -@end iftex - -The pagination commands apply only to printed output, since Info -files do not have pages.@refill - -@table @code -@item @@page -Start a new page in the printed manual.@refill - -@item @@group -Hold text together that must appear on one printed page.@refill - -@item @@need @var{mils} -Start a new printed page if not enough space on this one.@refill -@end table - -@node Line Breaks, w, Break Commands, Breaks -@comment node-name, next, previous, up -@section @code{@@*}: Generate Line Breaks -@findex * @r{(force line break)} -@cindex Line breaks -@cindex Breaks in a line - -The @code{@@*} command forces a line break in both the printed manual and -in Info.@refill - -@need 700 -For example, - -@example -This line @@* is broken @@*in two places. -@end example - -@noindent -produces - -@example -@group -This line - is broken -in two places. -@end group -@end example - -@noindent -(Note that the space after the first @code{@@*} command is faithfully -carried down to the next line.)@refill - -@need 800 -The @code{@@*} command is often used in a file's copyright page:@refill - -@example -@group -This is edition 2.0 of the Texinfo documentation,@@* -and is for @dots{} -@end group -@end example - -@noindent -In this case, the @code{@@*} command keeps @TeX{} from stretching the -line across the whole page in an ugly manner.@refill - -@quotation -@strong{Please note:} Do not write braces after an @code{@@*} command; -they are not needed.@refill - -Do not write an @code{@@refill} command at the end of a paragraph -containing an @code{@@*} command; it will cause the paragraph to be -refilled after the line break occurs, negating the effect of the line -break.@refill -@end quotation - -@node w, sp, Line Breaks, Breaks -@comment node-name, next, previous, up -@section @code{@@w}@{@var{text}@}: Prevent Line Breaks -@findex w @r{(prevent line break)} -@cindex Line breaks, preventing - -@code{@@w@{@var{text}@}} outputs @var{text} and prohibits line breaks -within @var{text}.@refill - -You can use the @code{@@w} command to prevent @TeX{} from automatically -hyphenating a long name or phrase that accidentally falls near the end -of a line.@refill - -@example -You can copy GNU software from @@w@{@@file@{prep.ai.mit.edu@}@}. -@end example - -@noindent -produces - -@quotation -You can copy GNU software from @w{@file{prep.ai.mit.edu}}. -@end quotation - -In the Texinfo file, you must write the @code{@@w} command and its -argument (all the affected text) all on one line.@refill - -@quotation -@strong{Caution:} Do not write an @code{@@refill} command at the end -of a paragraph containing an @code{@@w} command; it will cause the -paragraph to be refilled and may thereby negate the effect of the -@code{@@w} command.@refill -@end quotation - -@node sp, page, w, Breaks -@comment node-name, next, previous, up -@section @code{@@sp} @var{n}: Insert Blank Lines -@findex sp @r{(line spacing)} -@cindex Spaces (blank lines) -@cindex Blank lines -@cindex Line spacing - -A line beginning with and containing only @code{@@sp @var{n}} -generates @var{n} blank lines of space in both the printed manual and -the Info file. @code{@@sp} also forces a paragraph break. For -example,@refill - -@example -@@sp 2 -@end example - -@noindent -generates two blank lines. - -The @code{@@sp} command is most often used in the title page.@refill - -@ignore -@c node br, page, sp, Breaks -@comment node-name, next, previous, up -@c section @code{@@br}: Generate Paragraph Breaks -@findex br @r{(paragraph breaks)} -@cindex Paragraph breaks -@cindex Breaks in a paragraph - -The @code{@@br} command forces a paragraph break. It inserts a blank -line. You can use the command within or at the end of a line. If -used within a line, the @code{@@br@{@}} command must be followed by -left and right braces (as shown here) to mark the end of the -command.@refill - -@need 700 -For example, - -@example -@group -This line @@br@{@}contains and is ended by paragraph breaks@@br -and is followed by another line. -@end group -@end example - -@noindent -produces - -@example -@group -This line - -contains and is ended by paragraph breaks - -and is followed by another line. -@end group -@end example - -The @code{@@br} command is seldom used. -@end ignore - -@node page, group, sp, Breaks -@comment node-name, next, previous, up -@section @code{@@page}: Start a New Page -@cindex Page breaks -@findex page - -A line containing only @code{@@page} starts a new page in a printed -manual. The command has no effect on Info files since they are not -paginated. An @code{@@page} command is often used in the @code{@@titlepage} -section of a Texinfo file to start the copyright page.@refill - -@node group, need, page, Breaks -@comment node-name, next, previous, up -@section @code{@@group}: Prevent Page Breaks -@cindex Group (hold text together vertically) -@cindex Holding text together vertically -@cindex Vertically holding text together -@findex group - -The @code{@@group} command (on a line by itself) is used inside an -@code{@@example} or similar construct to begin an unsplittable vertical -group, which will appear entirely on one page in the printed output. -The group is terminated by a line containing only @code{@@end group}. -These two lines produce no output of their own, and in the Info file -output they have no effect at all.@refill - -@c Once said that these environments -@c turn off vertical spacing between ``paragraphs''. -@c Also, quotation used to work, but doesn't in texinfo-2.72 -Although @code{@@group} would make sense conceptually in a wide -variety of contexts, its current implementation works reliably only -within @code{@@example} and variants, and within @code{@@display}, -@code{@@format}, @code{@@flushleft} and @code{@@flushright}. -@xref{Quotations and Examples}. (What all these commands have in -common is that each line of input produces a line of output.) In -other contexts, @code{@@group} can cause anomalous vertical -spacing.@refill - -@need 750 -This formatting requirement means that you should write: - -@example -@group -@@example -@@group -@dots{} -@@end group -@@end example -@end group -@end example - -@noindent -with the @code{@@group} and @code{@@end group} commands inside the -@code{@@example} and @code{@@end example} commands. - -The @code{@@group} command is most often used to hold an example -together on one page. In this Texinfo manual, more than 100 examples -contain text that is enclosed between @code{@@group} and @code{@@end -group}. - -If you forget to end a group, you may get strange and unfathomable -error messages when you run @TeX{}. This is because @TeX{} keeps -trying to put the rest of the Texinfo file onto the one page and does -not start to generate error messages until it has processed -considerable text. It is a good rule of thumb to look for a missing -@code{@@end group} if you get incomprehensible error messages in -@TeX{}.@refill - -@node need, , group, Breaks -@comment node-name, next, previous, up -@section @code{@@need @var{mils}}: Prevent Page Breaks -@cindex Need space at page bottom -@findex need - -A line containing only @code{@@need @var{n}} starts -a new page in a printed manual if fewer than @var{n} mils (thousandths -of an inch) remain on the current page. Do not use -braces around the argument @var{n}. The @code{@@need} command has no -effect on Info files since they are not paginated.@refill - -@need 800 -This paragraph is preceded by an @code{@@need} command that tells -@TeX{} to start a new page if fewer than 800 mils (eight-tenths -inch) remain on the page. It looks like this:@refill - -@example -@group -@@need 800 -This paragraph is preceded by @dots{} -@end group -@end example - -The @code{@@need} command is useful for preventing orphans (single -lines at the bottoms of printed pages).@refill - -@node Definition Commands, Footnotes, Breaks, Top -@chapter Definition Commands -@cindex Definition commands - -The @code{@@deffn} command and the other @dfn{definition commands} -enable you to describe functions, variables, macros, commands, user -options, special forms and other such artifacts in a uniform -format.@refill - -In the Info file, a definition causes the entity -category---`Function', `Variable', or whatever---to appear at the -beginning of the first line of the definition, followed by the -entity's name and arguments. In the printed manual, the command -causes @TeX{} to print the entity's name and its arguments on the left -margin and print the category next to the right margin. In both -output formats, the body of the definition is indented. Also, the -name of the entity is entered into the appropriate index: -@code{@@deffn} enters the name into the index of functions, -@code{@@defvr} enters it into the index of variables, and so -on.@refill - -A manual need not and should not contain more than one definition for -a given name. An appendix containing a summary should use -@code{@@table} rather than the definition commands.@refill - -@menu -* Def Cmd Template:: How to structure a description using a - definition command. -* Optional Arguments:: How to handle optional and repeated arguments. -* deffnx:: How to group two or more `first' lines. -* Def Cmds in Detail:: All the definition commands. -* Def Cmd Conventions:: Conventions for writing definitions. -* Sample Function Definition:: -@end menu - -@node Def Cmd Template, Optional Arguments, , Definition Commands -@section The Template for a Definition -@cindex Definition template -@cindex Template for a definition - -The @code{@@deffn} command is used for definitions of entities that -resemble functions. To write a definition using the @code{@@deffn} -command, write the @code{@@deffn} command at the beginning of a line -and follow it on the same line by the category of the entity, the name -of the entity itself, and its arguments (if any). Then write the body -of the definition on succeeding lines. (You may embed examples in the -body.) Finally, end the definition with an @code{@@end deffn} command -written on a line of its own. (The other definition commands follow -the same format.)@refill - -The template for a definition looks like this: - -@example -@group -@@deffn @var{category} @var{name} @var{arguments}@dots{} -@var{body-of-definition} -@@end deffn -@end group -@end example - -@need 700 -@noindent -For example, - -@example -@group -@@deffn Command forward-word count -This command moves point forward @@var@{count@} words -(or backward if @@var@{count@} is negative). @dots{} -@@end deffn -@end group -@end example - -@noindent -produces - -@quotation -@deffn Command forward-word count -This function moves point forward @var{count} words -(or backward if @var{count} is negative). @dots{} -@end deffn -@end quotation - -Capitalize the category name like a title. If the name of the -category contains spaces, as in the phrase `Interactive Command', -write braces around it. For example:@refill - -@example -@group -@@deffn @{Interactive Command@} isearch-forward -@dots{} -@@end deffn -@end group -@end example - -@noindent -Otherwise, the second word will be mistaken for the name of the -entity.@refill - -Some of the definition commands are more general than others. The -@code{@@deffn} command, for example, is the general definition command -for functions and the like---for entities that may take arguments. When -you use this command, you specify the category to which the entity -belongs. The @code{@@deffn} command possesses three predefined, -specialized variations, @code{@@defun}, @code{@@defmac}, and -@code{@@defspec}, that specify the category for you: ``Function'', -``Macro'', and ``Special Form'' respectively. The @code{@@defvr} -command also is accompanied by several predefined, specialized -variations for describing particular kinds of variables.@refill - -The template for a specialized definition, such as @code{@@defun}, is -similar to the template for a generalized definition, except that you -do not need to specify the category:@refill - -@example -@group -@@defun @var{name} @var{arguments}@dots{} -@var{body-of-definition} -@@end defun -@end group -@end example - -@noindent -Thus, - -@example -@group -@@defun buffer-end flag -This function returns @@code@{(point-min)@} if @@var@{flag@} -is less than 1, @@code@{(point-max)@} otherwise. -@dots{} -@@end defun -@end group -@end example - -@noindent -produces - -@quotation -@defun buffer-end flag -This function returns @code{(point-min)} if @var{flag} is less than 1, -@code{(point-max)} otherwise. @dots{} -@end defun -@end quotation - -@noindent -@xref{Sample Function Definition, Sample Function Definition, A Sample -Function Definition}, for a more detailed example of a function -definition, including the use of @code{@@example} inside the -definition.@refill - -The other specialized commands work like @code{@@defun}.@refill - -@node Optional Arguments, deffnx, Def Cmd Template, Definition Commands -@section Optional and Repeated Arguments -@cindex Optional and repeated arguments -@cindex Repeated and optional arguments -@cindex Arguments, repeated and optional -@cindex Syntax, optional & repeated arguments -@cindex Meta-syntactic chars for arguments - -Some entities take optional or repeated arguments, which may be -specified by a distinctive glyph that uses square brackets and -ellipses. For @w{example}, a special form often breaks its argument list -into separate arguments in more complicated ways than a -straightforward function.@refill - -@iftex -An argument enclosed within square brackets is optional. -Thus, the phrase -@samp{@code{@r{[}@var{optional-arg}@r{]}}} means that -@var{optional-arg} is optional. -An argument followed by an ellipsis is optional -and may be repeated more than once. -@c This is consistent with Emacs Lisp Reference manual -Thus, @samp{@var{repeated-args}@dots{}} stands for zero or more arguments. -Parentheses are used when several arguments are grouped -into additional levels of list structure in Lisp. -@end iftex -@c The following looks better in Info (no `r', `samp' and `code'): -@ifinfo -An argument enclosed within square brackets is optional. -Thus, [@var{optional-arg}] means that @var{optional-arg} is optional. -An argument followed by an ellipsis is optional -and may be repeated more than once. -@c This is consistent with Emacs Lisp Reference manual -Thus, @var{repeated-args}@dots{} stands for zero or more arguments. -Parentheses are used when several arguments are grouped -into additional levels of list structure in Lisp. -@end ifinfo - -Here is the @code{@@defspec} line of an example of an imaginary -special form:@refill - -@quotation -@defspec foobar (@var{var} [@var{from} @var{to} [@var{inc}]]) @var{body}@dots{} -@end defspec -@tex -\vskip \parskip -@end tex -@end quotation - -@noindent -In this example, the arguments @var{from} and @var{to} are optional, -but must both be present or both absent. If they are present, -@var{inc} may optionally be specified as well. These arguments are -grouped with the argument @var{var} into a list, to distinguish them -from @var{body}, which includes all remaining elements of the -form.@refill - -In a Texinfo source file, this @code{@@defspec} line is written like -this (except it would not be split over two lines, as it is in this -example).@refill - -@example -@group -@@defspec foobar (@@var@{var@} [@@var@{from@} @@var@{to@} - [@@var@{inc@}]]) @@var@{body@}@@dots@{@} -@end group -@end example - -@noindent -The function is listed in the Command and Variable Index under -@samp{foobar}.@refill - -@node deffnx, Def Cmds in Detail, Optional Arguments, Definition Commands -@section Two or More `First' Lines -@cindex Two `First' Lines for @code{@@deffn} -@cindex Grouping two definitions together -@cindex Definitions grouped together -@findex deffnx - -To create two or more `first' or header lines for a definition, follow -the first @code{@@deffn} line by a line beginning with @code{@@deffnx}. -The @code{@@deffnx} command works exactly like @code{@@deffn} -except that it does not generate extra vertical white space between it -and the preceding line.@refill - -@need 1000 -For example, - -@example -@group -@@deffn @{Interactive Command@} isearch-forward -@@deffnx @{Interactive Command@} isearch-backward -These two search commands are similar except @dots{} -@@end deffn -@end group -@end example - -@noindent -produces - -@deffn {Interactive Command} isearch-forward -@deffnx {Interactive Command} isearch-backward -These two search commands are similar except @dots{} -@end deffn - -Each of the other definition commands has an `x' form: @code{@@defunx}, -@code{@@defvrx}, @code{@@deftypefunx}, etc. - -The `x' forms work just like @code{@@itemx}; see @ref{itemx, , @code{@@itemx}}. - -@node Def Cmds in Detail, Def Cmd Conventions, deffnx, Definition Commands -@section The Definition Commands - -Texinfo provides more than a dozen definition commands, all of which -are described in this section.@refill - -The definition commands automatically enter the name of the entity in -the appropriate index: for example, @code{@@deffn}, @code{@@defun}, -and @code{@@defmac} enter function names in the index of functions; -@code{@@defvr} and @code{@@defvar} enter variable names in the index -of variables.@refill - -Although the examples that follow mostly illustrate Lisp, the commands -can be used for other programming languages.@refill - -@menu -* Functions Commands:: Commands for functions and similar entities. -* Variables Commands:: Commands for variables and similar entities. -* Typed Functions:: Commands for functions in typed languages. -* Typed Variables:: Commands for variables in typed languages. -* Abstract Objects:: Commands for object-oriented programming. -* Data Types:: The definition command for data types. -@end menu - -@node Functions Commands, Variables Commands, , Def Cmds in Detail -@subsection Functions and Similar Entities - -This section describes the commands for describing functions and similar -entities:@refill - -@table @code -@findex deffn -@item @@deffn @var{category} @var{name} @var{arguments}@dots{} -The @code{@@deffn} command is the general definition command for -functions, interactive commands, and similar entities that may take -arguments. You must choose a term to describe the category of entity -being defined; for example, ``Function'' could be used if the entity is -a function. The @code{@@deffn} command is written at the beginning of a -line and is followed on the same line by the category of entity being -described, the name of this particular entity, and its arguments, if -any. Terminate the definition with @code{@@end deffn} on a line of its -own.@refill - -@need 750 -For example, here is a definition: - -@example -@group -@@deffn Command forward-char nchars -Move point forward @@var@{nchars@} characters. -@@end deffn -@end group -@end example - -@noindent -This shows a rather terse definition for a ``command'' named -@code{forward-char} with one argument, @var{nchars}. - -@code{@@deffn} prints argument names such as @var{nchars} in italics or -upper case, as if @code{@@var} had been used, because we think of these -names as metasyntactic variables---they stand for the actual argument -values. Within the text of the description, write an argument name -explicitly with @code{@@var} to refer to the value of the argument. In -the example above, we used @samp{@@var@{nchars@}} in this way. - -The template for @code{@@deffn} is: - -@example -@group -@@deffn @var{category} @var{name} @var{arguments}@dots{} -@var{body-of-definition} -@@end deffn -@end group -@end example - -@findex defun -@item @@defun @var{name} @var{arguments}@dots{} -The @code{@@defun} command is the definition command for functions. -@code{@@defun} is equivalent to @samp{@@deffn Function -@dots{}}.@refill - -@need 800 -@noindent -For example, - -@example -@group -@@defun set symbol new-value -Change the value of the symbol @@var@{symbol@} -to @@var@{new-value@}. -@@end defun -@end group -@end example - -@noindent -shows a rather terse definition for a function @code{set} whose -arguments are @var{symbol} and @var{new-value}. The argument names on -the @code{@@defun} line automatically appear in italics or upper case as -if they were enclosed in @code{@@var}. Terminate the definition with -@code{@@end defun} on a line of its own.@refill - -The template is: - -@example -@group -@@defun @var{function-name} @var{arguments}@dots{} -@var{body-of-definition} -@@end defun -@end group -@end example - -@code{@@defun} creates an entry in the index of functions. - -@findex defmac -@item @@defmac @var{name} @var{arguments}@dots{} -The @code{@@defmac} command is the definition command for macros. -@code{@@defmac} is equivalent to @samp{@@deffn Macro @dots{}} and -works like @code{@@defun}.@refill - -@findex defspec -@item @@defspec @var{name} @var{arguments}@dots{} -The @code{@@defspec} command is the definition command for special -forms. (In Lisp, a special form is an entity much like a function.) -@code{@@defspec} is equivalent to @samp{@@deffn @{Special Form@} -@dots{}} and works like @code{@@defun}.@refill -@end table - -@node Variables Commands, Typed Functions, Functions Commands, Def Cmds in Detail -@subsection Variables and Similar Entities - -Here are the commands for defining variables and similar -entities:@refill - -@table @code -@findex defvr -@item @@defvr @var{category} @var{name} -The @code{@@defvr} command is a general definition command for -something like a variable---an entity that records a value. You must -choose a term to describe the category of entity being defined; for -example, ``Variable'' could be used if the entity is a variable. -Write the @code{@@defvr} command at the beginning of a line and -followed it on the same line by the category of the entity and the -name of the entity.@refill - -Capitalize the category name like a title. If the name of the -category contains spaces, as in the name `User Option', write braces -around it. Otherwise, the second word will be mistaken for the name -of the entity, for example: - -@example -@group -@@defvr @{User Option@} fill-column -This buffer-local variable specifies -the maximum width of filled lines. -@dots{} -@@end defvr -@end group -@end example - -Terminate the definition with @code{@@end defvr} on a line of its -own.@refill - -The template is: - -@example -@group -@@defvr @var{category} @var{name} -@var{body-of-definition} -@@end defvr -@end group -@end example - -@code{@@defvr} creates an entry in the index of variables for @var{name}. - -@findex defvar -@item @@defvar @var{name} -The @code{@@defvar} command is the definition command for variables. -@code{@@defvar} is equivalent to @samp{@@defvr Variable -@dots{}}.@refill - -@need 750 -For example: - -@example -@group -@@defvar kill-ring -@dots{} -@@end defvar -@end group -@end example - -The template is: - -@example -@group -@@defvar @var{name} -@var{body-of-definition} -@@end defvar -@end group -@end example - -@code{@@defvar} creates an entry in the index of variables for -@var{name}.@refill - -@findex defopt -@item @@defopt @var{name} -The @code{@@defopt} command is the definition command for user -options. @code{@@defopt} is equivalent to @samp{@@defvr @{User -Option@} @dots{}} and works like @code{@@defvar}.@refill -@end table - -@node Typed Functions, Typed Variables, Variables Commands, Def Cmds in Detail -@subsection Functions in Typed Languages - -The @code{@@deftypefn} command and its variations are for describing -functions in C or any other language in which you must declare types -of variables and functions.@refill - -@table @code -@findex deftypefn -@item @@deftypefn @var{category} @var{data-type} @var{name} @var{arguments}@dots{} -The @code{@@deftypefn} command is the general definition command for -functions and similar entities that may take arguments and that are -typed. The @code{@@deftypefn} command is written at the beginning of -a line and is followed on the same line by the category of entity -being described, the type of the returned value, the name of this -particular entity, and its arguments, if any.@refill - -@need 800 -@noindent -For example, - -@example -@group -@@deftypefn @{Library Function@} int foobar - (int @@var@{foo@}, float @@var@{bar@}) -@dots{} -@@end deftypefn -@end group -@end example - -@need 1000 -@noindent -(where the text before the ``@dots{}'', shown above as two lines, would -actually be a single line in a real Texinfo file) produces the following -in Info: - -@smallexample -@group --- Library Function: int foobar (int FOO, float BAR) -@dots{} -@end group -@end smallexample -@iftex - -In a printed manual, it produces: - -@quotation -@deftypefn {Library Function} int foobar (int @var{foo}, float @var{bar}) -@dots{} -@end deftypefn -@end quotation -@end iftex - -This means that @code{foobar} is a ``library function'' that returns an -@code{int}, and its arguments are @var{foo} (an @code{int}) and -@var{bar} (a @code{float}).@refill - -The argument names that you write in @code{@@deftypefn} are not subject -to an implicit @code{@@var}---since the actual names of the arguments in -@code{@@deftypefn} are typically scattered among data type names and -keywords, Texinfo cannot find them without help. Instead, you must write -@code{@@var} explicitly around the argument names. In the example -above, the argument names are @samp{foo} and @samp{bar}.@refill - -The template for @code{@@deftypefn} is:@refill - -@example -@group -@@deftypefn @var{category} @var{data-type} @var{name} @var{arguments} @dots{} -@var{body-of-description} -@@end deftypefn -@end group -@end example - -@noindent -Note that if the @var{category} or @var{data type} is more than one -word then it must be enclosed in braces to make it a single argument.@refill - -If you are describing a procedure in a language that has packages, -such as Ada, you might consider using @code{@@deftypefn} in a manner -somewhat contrary to the convention described in the preceding -paragraphs.@refill - -@need 800 -@noindent -For example: - -@example -@group -@@deftypefn stacks private push - (@@var@{s@}:in out stack; - @@var@{n@}:in integer) -@dots{} -@@end deftypefn -@end group -@end example - -@noindent -(The @code{@@deftypefn} arguments are shown split into three lines, but -would be a single line in a real Texinfo file.) - -In this instance, the procedure is classified as belonging to the -package @code{stacks} rather than classified as a `procedure' and its -data type is described as @code{private}. (The name of the procedure -is @code{push}, and its arguments are @var{s} and @var{n}.)@refill - -@code{@@deftypefn} creates an entry in the index of functions for -@var{name}.@refill - -@findex deftypefun -@item @@deftypefun @var{data-type} @var{name} @var{arguments}@dots{} -The @code{@@deftypefun} command is the specialized definition command -for functions in typed languages. The command is equivalent to -@samp{@@deftypefn Function @dots{}}.@refill - -@need 800 -@noindent -Thus, - -@smallexample -@group -@@deftypefun int foobar (int @@var@{foo@}, float @@var@{bar@}) -@dots{} -@@end deftypefun -@end group -@end smallexample - -@noindent -produces the following in Info: - -@example -@group --- Function: int foobar (int FOO, float BAR) -@dots{} -@end group -@end example -@iftex - -@need 800 -@noindent -and the following in a printed manual: - -@quotation -@deftypefun int foobar (int @var{foo}, float @var{bar}) -@dots{} -@end deftypefun -@end quotation -@end iftex - -@need 800 -The template is: - -@example -@group -@@deftypefun @var{type} @var{name} @var{arguments}@dots{} -@var{body-of-description} -@@end deftypefun -@end group -@end example - -@code{@@deftypefun} creates an entry in the index of functions for -@var{name}.@refill -@end table - -@node Typed Variables, Abstract Objects, Typed Functions, Def Cmds in Detail -@subsection Variables in Typed Languages - -Variables in typed languages are handled in a manner similar to -functions in typed languages. @xref{Typed Functions}. The general -definition command @code{@@deftypevr} corresponds to -@code{@@deftypefn} and the specialized definition command -@code{@@deftypevar} corresponds to @code{@@deftypefun}.@refill - -@table @code -@findex deftypevr -@item @@deftypevr @var{category} @var{data-type} @var{name} -The @code{@@deftypevr} command is the general definition command for -something like a variable in a typed language---an entity that records -a value. You must choose a term to describe the category of the -entity being defined; for example, ``Variable'' could be used if the -entity is a variable.@refill - -The @code{@@deftypevr} command is written at the beginning of a line -and is followed on the same line by the category of the entity -being described, the data type, and the name of this particular -entity.@refill - -@need 800 -@noindent -For example: - -@example -@group -@@deftypevr @{Global Flag@} int enable -@dots{} -@@end deftypevr -@end group -@end example - -@noindent -produces the following in Info: - -@example -@group --- Global Flag: int enable -@dots{} -@end group -@end example -@iftex - -@noindent -and the following in a printed manual: - -@quotation -@deftypevr {Global Flag} int enable -@dots{} -@end deftypevr -@end quotation -@end iftex - -@need 800 -The template is: - -@example -@@deftypevr @var{category} @var{data-type} @var{name} -@var{body-of-description} -@@end deftypevr -@end example - -@code{@@deftypevr} creates an entry in the index of variables for -@var{name}.@refill - -@findex deftypevar -@item @@deftypevar @var{data-type} @var{name} -The @code{@@deftypevar} command is the specialized definition command -for variables in typed languages. @code{@@deftypevar} is equivalent -to @samp{@@deftypevr Variable @dots{}}.@refill - -@need 800 -@noindent -For example: - -@example -@group -@@deftypevar int fubar -@dots{} -@@end deftypevar -@end group -@end example - -@noindent -produces the following in Info: - -@example -@group --- Variable: int fubar -@dots{} -@end group -@end example -@iftex - -@need 800 -@noindent -and the following in a printed manual: - -@quotation -@deftypevar int fubar -@dots{} -@end deftypevar -@end quotation -@end iftex - -@need 800 -@noindent -The template is: - -@example -@group -@@deftypevar @var{data-type} @var{name} -@var{body-of-description} -@@end deftypevar -@end group -@end example - -@code{@@deftypevar} creates an entry in the index of variables for -@var{name}.@refill -@end table - -@node Abstract Objects, Data Types, Typed Variables, Def Cmds in Detail -@subsection Object-Oriented Programming - -Here are the commands for formatting descriptions about abstract -objects, such as are used in object-oriented programming. A class is -a defined type of abstract object. An instance of a class is a -particular object that has the type of the class. An instance -variable is a variable that belongs to the class but for which each -instance has its own value.@refill - -In a definition, if the name of a class is truly a name defined in the -programming system for a class, then you should write an @code{@@code} -around it. Otherwise, it is printed in the usual text font.@refill - -@table @code -@findex defcv -@item @@defcv @var{category} @var{class} @var{name} -The @code{@@defcv} command is the general definition command for -variables associated with classes in object-oriented programming. The -@code{@@defcv} command is followed by three arguments: the category of -thing being defined, the class to which it belongs, and its -name. Thus,@refill - -@example -@group -@@defcv @{Class Option@} Window border-pattern -@dots{} -@@end defcv -@end group -@end example - -@noindent -illustrates how you would write the first line of a definition of the -@code{border-pattern} class option of the class @code{Window}.@refill - -The template is - -@example -@group -@@defcv @var{category} @var{class} @var{name} -@dots{} -@@end defcv -@end group -@end example - -@code{@@defcv} creates an entry in the index of variables. - -@findex defivar -@item @@defivar @var{class} @var{name} -The @code{@@defivar} command is the definition command for instance -variables in object-oriented programming. @code{@@defivar} is -equivalent to @samp{@@defcv @{Instance Variable@} @dots{}}@refill - -The template is: - -@example -@group -@@defivar @var{class} @var{instance-variable-name} -@var{body-of-definition} -@@end defivar -@end group -@end example - -@code{@@defivar} creates an entry in the index of variables. - -@findex defop -@item @@defop @var{category} @var{class} @var{name} @var{arguments}@dots{} -The @code{@@defop} command is the general definition command for -entities that may resemble methods in object-oriented programming. -These entities take arguments, as functions do, but are associated -with particular classes of objects.@refill - -For example, some systems have constructs called @dfn{wrappers} that -are associated with classes as methods are, but that act more like -macros than like functions. You could use @code{@@defop Wrapper} to -describe one of these.@refill - -Sometimes it is useful to distinguish methods and @dfn{operations}. -You can think of an operation as the specification for a method. -Thus, a window system might specify that all window classes have a -method named @code{expose}; we would say that this window system -defines an @code{expose} operation on windows in general. Typically, -the operation has a name and also specifies the pattern of arguments; -all methods that implement the operation must accept the same -arguments, since applications that use the operation do so without -knowing which method will implement it.@refill - -Often it makes more sense to document operations than methods. For -example, window application developers need to know about the -@code{expose} operation, but need not be concerned with whether a -given class of windows has its own method to implement this operation. -To describe this operation, you would write:@refill - -@example -@@defop Operation windows expose -@end example - -The @code{@@defop} command is written at the beginning of a line and -is followed on the same line by the overall name of the category of -operation, the name of the class of the operation, the name of the -operation, and its arguments, if any.@refill - -@need 800 -@noindent -The template is: - -@example -@group -@@defop @var{category} @var{class} @var{name} @var{arguments}@dots{} -@var{body-of-definition} -@@end defop -@end group -@end example - -@code{@@defop} creates an entry, such as `@code{expose} on -@code{windows}', in the index of functions.@refill - -@findex defmethod -@item @@defmethod @var{class} @var{name} @var{arguments}@dots{} -The @code{@@defmethod} command is the definition command for methods -in object-oriented programming. A method is a kind of function that -implements an operation for a particular class of objects and its -subclasses. In the Lisp Machine, methods actually were functions, but -they were usually defined with @code{defmethod}. - -@code{@@defmethod} is equivalent to @samp{@@defop Method @dots{}}. -The command is written at the beginning of a line and is followed by -the name of the class of the method, the name of the method, and its -arguments, if any.@refill - -@need 800 -@noindent -For example, - -@example -@group -@@defmethod @code{bar-class} bar-method argument -@dots{} -@@end defmethod -@end group -@end example - -@noindent -illustrates the definition for a method called @code{bar-method} of -the class @code{bar-class}. The method takes an argument.@refill - -The template is: - -@example -@group -@@defmethod @var{class} @var{method-name} @var{arguments}@dots{} -@var{body-of-definition} -@@end defmethod -@end group -@end example - -@c !!! reworded to prevent overfull hbox --bob 26 Mar 93 -@code{@@defmethod} creates an entry in the index of functions, such as -`@code{bar-method} on @code{bar-class}'.@refill -@end table - -@node Data Types, , Abstract Objects, Def Cmds in Detail -@subsection Data Types - -Here is the command for data types:@refill - -@table @code -@findex deftp -@item @@deftp @var{category} @var{name} @var{attributes}@dots{} -The @code{@@deftp} command is the generic definition command for data -types. The command is written at the beginning of a line and is -followed on the same line by the category, by the name of the type -(which is a word like @code{int} or @code{float}), and then by names of -attributes of objects of that type. Thus, you could use this command -for describing @code{int} or @code{float}, in which case you could use -@code{data type} as the category. (A data type is a category of -certain objects for purposes of deciding which operations can be -performed on them.)@refill - -In Lisp, for example, @dfn{pair} names a particular data -type, and an object of that type has two slots called the -@sc{car} and the @sc{cdr}. Here is how you would write the first line -of a definition of @code{pair}.@refill - -@example -@group -@@deftp @{Data type@} pair car cdr -@dots{} -@@end deftp -@end group -@end example - -@need 950 -The template is: - -@example -@group -@@deftp @var{category} @var{name-of-type} @var{attributes}@dots{} -@var{body-of-definition} -@@end deftp -@end group -@end example - -@code{@@deftp} creates an entry in the index of data types. -@end table - -@node Def Cmd Conventions, Sample Function Definition, Def Cmds in Detail, Definition Commands -@section Conventions for Writing Definitions -@cindex Definition conventions -@cindex Conventions for writing definitions - -When you write a definition using @code{@@deffn}, @code{@@defun}, or -one of the other definition commands, please take care to use -arguments that indicate the meaning, as with the @var{count} argument -to the @code{forward-word} function. Also, if the name of an argument -contains the name of a type, such as @var{integer}, take care that the -argument actually is of that type.@refill - -@node Sample Function Definition, , Def Cmd Conventions, Definition Commands -@section A Sample Function Definition -@cindex Function definitions -@cindex Command definitions -@cindex Macro definitions -@cindex Sample function definition - -A function definition uses the @code{@@defun} and @code{@@end defun} -commands. The name of the function follows immediately after the -@code{@@defun} command and it is followed, on the same line, by the -parameter list.@refill - -Here is a definition from @cite{The GNU Emacs Lisp Reference Manual}. -(@xref{Calling Functions, , Calling Functions, elisp, The GNU Emacs -Lisp Reference Manual}.) - -@quotation -@defun apply function &rest arguments -@code{apply} calls @var{function} with @var{arguments}, just -like @code{funcall} but with one difference: the last of -@var{arguments} is a list of arguments to give to -@var{function}, rather than a single argument. We also say -that this list is @dfn{appended} to the other arguments. - -@code{apply} returns the result of calling @var{function}. -As with @code{funcall}, @var{function} must either be a Lisp -function or a primitive function; special forms and macros -do not make sense in @code{apply}. - -@example -(setq f 'list) - @result{} list -(apply f 'x 'y 'z) -@error{} Wrong type argument: listp, z -(apply '+ 1 2 '(3 4)) - @result{} 10 -(apply '+ '(1 2 3 4)) - @result{} 10 - -(apply 'append '((a b c) nil (x y z) nil)) - @result{} (a b c x y z) -@end example - -An interesting example of using @code{apply} is found in the description -of @code{mapcar}.@refill -@end defun -@end quotation - -@need 1200 -In the Texinfo source file, this example looks like this: - -@example -@group -@@defun apply function &rest arguments - -@@code@{apply@} calls @@var@{function@} with -@@var@{arguments@}, just like @@code@{funcall@} but with one -difference: the last of @@var@{arguments@} is a list of -arguments to give to @@var@{function@}, rather than a single -argument. We also say that this list is @@dfn@{appended@} -to the other arguments. -@end group - -@group -@@code@{apply@} returns the result of calling -@@var@{function@}. As with @@code@{funcall@}, -@@var@{function@} must either be a Lisp function or a -primitive function; special forms and macros do not make -sense in @@code@{apply@}. -@end group - -@group -@@example -(setq f 'list) - @@result@{@} list -(apply f 'x 'y 'z) -@@error@{@} Wrong type argument: listp, z -(apply '+ 1 2 '(3 4)) - @@result@{@} 10 -(apply '+ '(1 2 3 4)) - @@result@{@} 10 - -(apply 'append '((a b c) nil (x y z) nil)) - @@result@{@} (a b c x y z) -@@end example -@end group - -@group -An interesting example of using @@code@{apply@} is found -in the description of @@code@{mapcar@}.@@refill -@@end defun -@end group -@end example - -@noindent -In this manual, this function is listed in the Command and Variable -Index under @code{apply}.@refill - -Ordinary variables and user options are described using a format like -that for functions except that variables do not take arguments. - -@node Footnotes, Conditionals, Definition Commands, Top -@comment node-name, next, previous, up -@chapter Footnotes -@cindex Footnotes -@findex footnote - -A @dfn{footnote} is for a reference that documents or elucidates the -primary text.@footnote{A footnote should complement or expand upon -the primary text, but a reader should not need to read a footnote to -understand the primary text. For a thorough discussion of footnotes, -see @cite{The Chicago Manual of Style}, which is published by the -University of Chicago Press.}@refill - -In Texinfo, footnotes are created with the @code{@@footnote} command. -This command is followed immediately by a left brace, then by the text -of the footnote, and then by a terminating right brace. The template -is: - -@example -@@footnote@{@var{text}@} -@end example - -Footnotes may be of any length, but are usually short.@refill - -For example, this clause is followed by a sample -footnote@footnote{Here is the sample footnote.}; in the Texinfo -source, it looks like this:@refill - -@example -@dots{}a sample footnote @@footnote@{Here is the sample -footnote.@}; in the Texinfo source@dots{} -@end example - -In a printed manual or book, the reference mark for a footnote is a -small, superscripted number; the text of the footnote is written at -the bottom of the page, below a horizontal line.@refill - -In Info, the reference mark for a footnote is a pair of parentheses -with the footnote number between them, like this: @samp{(1)}.@refill - -Info has two footnote styles, which determine where the text of the -footnote is located:@refill - -@itemize @bullet -@cindex @samp{@r{End}} node footnote style -@item -In the `End' node style, all the footnotes for a single node -are placed at the end of that node. The footnotes are separated from -the rest of the node by a line of dashes with the word -@samp{Footnotes} within it. Each footnote begins with an -@samp{(@var{n})} reference mark.@refill - -@need 700 -@noindent -Here is an example of a single footnote in the end of node style:@refill - -@example -@group - --------- Footnotes --------- - -(1) Here is a sample footnote. -@end group -@end example - -@cindex @samp{@r{Separate}} footnote style -@item -In the `Separate' node style, all the footnotes for a single -node are placed in an automatically constructed node of -their own. In this style, a ``footnote reference'' follows -each @samp{(@var{n})} reference mark in the body of the -node. The footnote reference is actually a cross reference -which you use to reach the footnote node.@refill - -The name of the node containing the footnotes is constructed -by appending @w{@samp{-Footnotes}} to the name of the node -that contains the footnotes. (Consequently, the footnotes' -node for the @file{Footnotes} node is -@w{@file{Footnotes-Footnotes}}!) The footnotes' node has an -`Up' node pointer that leads back to its parent node.@refill - -@noindent -Here is how the first footnote in this manual looks after being -formatted for Info in the separate node style:@refill - -@smallexample -@group -File: texinfo.info Node: Overview-Footnotes, Up: Overview - -(1) Note that the first syllable of "Texinfo" is -pronounced like "speck", not "hex". @dots{} -@end group -@end smallexample -@end itemize - -A Texinfo file may be formatted into an Info file with either footnote -style.@refill - -@findex footnotestyle -Use the @code{@@footnotestyle} command to specify an Info file's -footnote style. Write this command at the beginning of a line followed -by an argument, either @samp{end} for the end node style or -@samp{separate} for the separate node style. - -@need 700 -For example, - -@example -@@footnotestyle end -@end example -@noindent -or -@example -@@footnotestyle separate -@end example - -Write an @code{@@footnotestyle} command before or shortly after the -end-of-header line at the beginning of a Texinfo file. (If you -include the @code{@@footnotestyle} command between the start-of-header -and end-of-header lines, the region formatting commands will format -footnotes as specified.)@refill - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -If you do not specify a footnote style, the formatting commands use -their default style. Currently, @code{makeinfo} uses the `end' style, -while @code{texinfo-format-buffer} and @code{texinfo-format-region} -use the `separate' style.@refill - -@c !!! note: makeinfo's --footnote-style option overrides footnotestyle -@ignore -If you use @code{makeinfo} to create the Info file, the -@samp{--footnote-style} option determines which style is used, -@samp{end} for the end of node style or @samp{separate} for the -separate node style. Thus, to format the Texinfo manual in the -separate node style, you would use the following shell command:@refill - -@example -makeinfo --footnote-style=separate texinfo.texi -@end example - -@noindent -To format the Texinfo manual in the end of node style, you would -type:@refill - -@example -makeinfo --footnote-style=end texinfo.texi -@end example -@end ignore -@ignore -If you use @code{texinfo-format-buffer} or -@code{texinfo-format-region} to create the Info file, the value of the -@code{texinfo-footnote-style} variable controls the footnote style. -It can be either @samp{"separate"} for the separate node style or -@samp{"end"} for the end of node style. (You can change the value of -this variable with the @kbd{M-x edit-options} command (@pxref{Edit -Options, , Editing Variable Values, emacs, The GNU Emacs Manual}), or -with the @kbd{M-x set-variable} command (@pxref{Examining, , Examining -and Setting Variables, emacs, The GNU Emacs Manual}).@refill - -The @code{texinfo-footnote-style} variable also controls the style if -you use the @kbd{M-x makeinfo-region} or @kbd{M-x makeinfo-buffer} -command in Emacs.@refill -@end ignore -This chapter contains two footnotes.@refill - -@node Conditionals, Format/Print Hardcopy, Footnotes, Top -@comment node-name, next, previous, up -@chapter Conditionally Visible Text -@cindex Conditionally visible text -@cindex Text, conditionally visible -@cindex Visibility of conditional text -@cindex If text conditionally visible -@findex ifinfo -@findex iftex - -Sometimes it is good to use different text for a printed manual and -its corresponding Info file. In this case, you can use the -@dfn{conditional commands} to specify which text is for the printed manual -and which is for the Info file.@refill - -@menu -* Conditional Commands:: How to specify text for Info or @TeX{}. -* Using Ordinary TeX Commands:: You can use any and all @TeX{} commands. -* set clear value:: How to designate which text to format (for - both Info and @TeX{}); and how to set a - flag to a string that you can insert. -@end menu - -@node Conditional Commands, Using Ordinary TeX Commands, , Conditionals -@ifinfo -@heading Using @code{@@ifinfo} and @code{@@iftex} -@end ifinfo - -@code{@@ifinfo} begins segments of text that should be ignored -by @TeX{} when it -typesets the printed manual. The segment of text appears only -in the Info file. -The @code{@@ifinfo} command should appear on a line by itself; end -the Info-only text with a line containing @code{@@end ifinfo} by -itself. At the beginning of a Texinfo file, the Info permissions are -contained within a region marked by @code{@@ifinfo} and @code{@@end -ifinfo}. (@xref{Info Summary and Permissions}.)@refill - -The @code{@@iftex} and @code{@@end iftex} commands are similar to the -@code{@@ifinfo} and @code{@@end ifinfo} commands, except that they -specify text that will appear in the printed manual but not in the Info -file.@refill - -@need 700 -For example, - -@example -@@iftex -This text will appear only in the printed manual. -@@end iftex - -@@ifinfo -However, this text will appear only in Info. -@@end ifinfo -@end example - -@noindent -The preceding example produces the following line: - -@iftex -This text will appear only in the printed manual. -@end iftex - -@ifinfo -However, this text will appear only in Info. -@end ifinfo - -@noindent -Note how you only see one of the two lines, depending on whether you -are reading the Info version or the printed version of this -manual.@refill - -The @code{@@titlepage} command is a special variant of @code{@@iftex} that -is used for making the title and copyright pages of the printed -manual. (@xref{titlepage, , @code{@@titlepage}}.) @refill - -@node Using Ordinary TeX Commands, set clear value, Conditional Commands, Conditionals -@comment node-name, next, previous, up -@section Using Ordinary @TeX{} Commands -@cindex @TeX{} commands, using ordinary -@cindex Ordinary @TeX{} commands, using -@cindex Commands using ordinary @TeX{} -@cindex Plain@TeX{} - -Inside a region delineated by @code{@@iftex} and @code{@@end iftex}, -you can embed some Plain@TeX{} commands. Info will ignore these -commands since they are only in that part of the file which is seen by -@TeX{}. You can write the @TeX{} commands as you would write them in -a normal @TeX{} file, except that you must replace the @samp{\} used -by @TeX{} with an @samp{@@}. For example, in the @code{@@titlepage} -section of a Texinfo file, you can use the @TeX{} command -@code{@@vskip} to format the copyright page. (The @code{@@titlepage} -command causes Info to ignore the region automatically, as it does -with the @code{@@iftex} command.)@refill - -However, many features of Plain@TeX{} will not work, as they are -overridden by features of Texinfo. - -@findex tex -You can enter Plain@TeX{} completely, and use @samp{\} in the @TeX{} -commands, by delineating a region with the @code{@@tex} and @code{@@end -tex} commands. (The @code{@@tex} command also causes Info to ignore the -region, like the @code{@@iftex} -command.)@refill - -@cindex Mathematical expressions -For example, here is a mathematical expression written in -Plain@TeX{}:@refill - -@example -@@tex -$$ \chi^2 = \sum_@{i=1@}^N - \left (y_i - (a + b x_i) - \over \sigma_i\right)^2 $$ -@@end tex -@end example - -@noindent -The output of this example will appear only in a printed manual. If -you are reading this in Info, you will not see anything after this -paragraph. -@iftex -In a printed manual, the above expression looks like -this: -@end iftex - -@tex -$$ \chi^2 = \sum_{i=1}^N - \left(y_i - (a + b x_i) - \over \sigma_i\right)^2 $$ -@end tex - -@node set clear value, , Using Ordinary TeX Commands, Conditionals -@comment node-name, next, previous, up -@section @code{@@set}, @code{@@clear}, and @code{@@value} - -You can direct the Texinfo formatting commands to format or ignore parts -of a Texinfo file with the @code{@@set}, @code{@@clear}, @code{@@ifset}, -and @code{@@ifclear} commands.@refill - -In addition, you can use the @code{@@set @var{flag}} command to set the -value of @var{flag} to a string of characters; and use -@code{@@value@{@var{flag}@}} to insert that string. You can use -@code{@@set}, for example, to set a date and use @code{@@value} to -insert the date in several places in the Texinfo file.@refill - -@menu -* ifset ifclear:: Format a region if a flag is set. -* value:: Replace a flag with a string. -* value Example:: An easy way to update edition information. -@end menu - -@node ifset ifclear, value, , set clear value -@subsection @code{@@ifset} and @code{@@ifclear} - -@findex ifset -When a @var{flag} is set, the Texinfo formatting commands format text -between subsequent pairs of @code{@@ifset @var{flag}} and @code{@@end -ifset} commands. When the @var{flag} is cleared, the Texinfo formatting -commands do @emph{not} format the text. - -Use the @code{@@set @var{flag}} command to turn on, or @dfn{set}, a -@var{flag}; a @dfn{flag} can be any single word. The format for the -command looks like this:@refill -@findex set - -@example -@@set @var{flag} -@end example - -Write the conditionally formatted text between @code{@@ifset @var{flag}} -and @code{@@end ifset} commands, like this:@refill - -@example -@group -@@ifset @var{flag} -@var{conditional-text} -@@end ifset -@end group -@end example - -For example, you can create one document that has two variants, such as -a manual for a `large' and `small' model:@refill - -@example -You can use this machine to dig up shrubs -without hurting them. - -@@set large - -@@ifset large -It can also dig up fully grown trees. -@@end ifset - -Remember to replant promptly @dots{} -@end example - -@noindent -In the example, the formatting commands will format the text between -@code{@@ifset large} and @code{@@end ifset} because the @code{large} -flag is set.@refill - -@findex clear -Use the @code{@@clear @var{flag}} command to turn off, or @dfn{clear}, -a flag. Clearing a flag is the opposite of setting a flag. The -command looks like this:@refill - -@example -@@clear @var{flag} -@end example - -@noindent -Write the command on a line of its own. - -When @var{flag} is cleared, the Texinfo formatting commands do -@emph{not} format the text between @code{@@ifset @var{flag}} and -@code{@@end ifset}; that text is ignored and does not appear in either -printed or Info output.@refill - -For example, if you clear the flag of the preceding example by writing -an @code{@@clear large} command after the @code{@@set large} command -(but before the conditional text), then the Texinfo formatting commands -ignore the text between the @code{@@ifset large} and @code{@@end ifset} -commands. In the formatted output, that text does not appear; in both -printed and Info output, you see only the lines that say, ``You can use -this machine to dig up shrubs without hurting them. Remember to replant -promptly @dots{}''. - -@findex ifclear -If a flag is cleared with an @code{@@clear @var{flag}} command, then -the formatting commands format text between subsequent pairs of -@code{@@ifclear} and @code{@@end ifclear} commands. But if the flag -is set with @code{@@set @var{flag}}, then the formatting commands do -@emph{not} format text between an @code{@@ifclear} and an @code{@@end -ifclear} command; rather, they ignore that text. An @code{@@ifclear} -command looks like this:@refill - -@example -@@ifclear @var{flag} -@end example - -@need 700 -In brief, the commands are:@refill - -@table @code -@item @@set @var{flag} -Tell the Texinfo formatting commands that @var{flag} is set.@refill - -@item @@clear @var{flag} -Tell the Texinfo formatting commands that @var{flag} is cleared.@refill - -@item @@ifset @var{flag} -If @var{flag} is set, tell the Texinfo formatting commands to format -the text up to the following @code{@@end ifset} command.@refill - -If @var{flag} is cleared, tell the Texinfo formatting commands to -ignore text up to the following @code{@@end ifset} command.@refill - -@item @@ifclear @var{flag} -If @var{flag} is set, tell the Texinfo formatting commands to ignore -the text up to the following @code{@@end ifclear} command.@refill - -If @var{flag} is cleared, tell the Texinfo formatting commands to -format the text up to the following @code{@@end ifclear} -command.@refill -@end table - -@node value, value Example, ifset ifclear, set clear value -@subsection @code{@@value} -@findex value - -You can use the @code{@@set} command to specify a value for a flag, -which is expanded by the @code{@@value} command. The value is a string -a characters. - -Write the @code{@@set} command like this: - -@example -@@set foo This is a string. -@end example - -@noindent -This sets the value of @code{foo} to ``This is a string.'' - -The Texinfo formatters replace an @code{@@value@{@var{flag}@}} command with -the string to which @var{flag} is set.@refill - -Thus, when @code{foo} is set as shown above, the Texinfo formatters convert - -@example -@group -@@value@{foo@} -@exdent @r{to} -This is a string. -@end group -@end example - -You can write an @code{@@value} command within a paragraph; but you -must write an @code{@@set} command on a line of its own. - -If you write the @code{@@set} command like this: - -@example -@@set foo -@end example - -@noindent -without specifying a string, the value of @code{foo} is an empty string. - -If you clear a previously set flag with an @code{@@clear @var{flag}} -command, a subsequent @code{@@value@{flag@}} command is invalid and the -string is replaced with an error message that says @samp{@{No value for -"@var{flag}"@}}. - -For example, if you set @code{foo} as follows:@refill - -@example -@@set how-much very, very, very -@end example - -@noindent -then the formatters transform - -@example -@group -It is a @@value@{how-much@} wet day. -@exdent @r{into} -It is a very, very, very wet day. -@end group -@end example - -If you write - -@example -@@clear how-much -@end example - -@noindent -then the formatters transform - -@example -@group -It is a @@value@{how-much@} wet day. -@exdent @r{into} -It is a @{No value for "how-much"@} wet day. -@end group -@end example - -@node value Example, , value, set clear value -@subsection @code{@@value} Example - -You can use the @code{@@value} command to limit the number of places you -need to change when you record an update to a manual. -Here is how it is done in @cite{The GNU Make Manual}: - -@need 1000 -@noindent -Set the flags: - -@example -@group -@@set EDITION 0.35 Beta -@@set VERSION 3.63 Beta -@@set UPDATED 14 August 1992 -@@set UPDATE-MONTH August 1992 -@end group -@end example - -@need 750 -@noindent -Write text for the first @code{@@ifinfo} section, for people reading the -Texinfo file: - -@example -@group -This is Edition @@value@{EDITION@}, -last updated @@value@{UPDATED@}, -of @@cite@{The GNU Make Manual@}, -for @@code@{make@}, Version @@value@{VERSION@}. -@end group -@end example - -@need 1000 -@noindent -Write text for the title page, for people reading the printed manual: -@c List only the month and the year since that looks less fussy on a -@c printed cover than a date that lists the day as well. - -@example -@group -@@title GNU Make -@@subtitle A Program for Directing Recompilation -@@subtitle Edition @@value@{EDITION@}, @dots{} -@@subtitle @@value@{UPDATE-MONTH@} -@end group -@end example - -@noindent -(On a printed cover, a date listing the month and the year looks less -fussy than a date listing the day as well as the month and year.) - -@need 750 -@noindent -Write text for the Top node, for people reading the Info file: - -@example -@group -This is Edition @@value@{EDITION@} -of the @@cite@{GNU Make Manual@}, -last updated @@value@{UPDATED@} -for @@code@{make@} Version @@value@{VERSION@}. -@end group -@end example - -@need 950 -After you format the manual, the text in the first @code{@@ifinfo} -section looks like this: - -@example -@group -This is Edition 0.35 Beta, last updated 14 August 1992, -of `The GNU Make Manual', for `make', Version 3.63 Beta. -@end group -@end example - -When you update the manual, change only the values of the flags; you do -not need to rewrite the three sections. - -@node Format/Print Hardcopy, Create an Info File, Conditionals, Top -@comment node-name, next, previous, up -@chapter Format and Print Hardcopy -@cindex Format and print hardcopy -@cindex Hardcopy, printing it -@cindex Making a printed manual -@cindex Sorting indices -@cindex Indices, sorting -@cindex @TeX{} index sorting -@findex texindex - -There are three major shell commands for making a printed manual from a -Texinfo file: one for converting the Texinfo file into a file that will be -printed, a second for sorting indices, and a third for printing the -formatted document. When you use the shell commands, you can either -work directly in the operating system shell or work within a shell -inside GNU Emacs.@refill - -If you are using GNU Emacs, you can use commands provided by Texinfo -mode instead of shell commands. In addition to the three commands to -format a file, sort the indices, and print the result, Texinfo mode -offers key bindings for commands to recenter the output buffer, show the -print queue, and delete a job from the print queue.@refill - -@menu -* Use TeX:: Use @TeX{} to format for hardcopy. -* Shell Format & Print:: How to format and print a hardcopy manual - with shell commands. -* Within Emacs:: How to format and print from an Emacs shell. -* Texinfo Mode Printing:: How to format and print in Texinfo mode. -* Compile-Command:: How to print using Emacs's compile command. -* Requirements Summary:: @TeX{} formatting requirements summary. -* Preparing for TeX:: What you need to do to use @TeX{}. -* Overfull hboxes:: What are and what to do with overfull hboxes. -* smallbook:: How to print small format books and manuals. -* A4 Paper:: How to print on European A4 paper. -* Cropmarks and Magnification:: How to print marks to indicate the size - of pages and how to print scaled up output. -@end menu - -@node Use TeX, Shell Format & Print, , Format/Print Hardcopy -@ifinfo -@heading Use @TeX{} -@end ifinfo - -The typesetting program called @TeX{} is used for formatting a Texinfo -file. @TeX{} is a very powerful typesetting program and, if used right, -does an exceptionally good job. @xref{Obtaining TeX, , How to Obtain -@TeX{}}, for information on how to obtain @TeX{}.@refill - -The @code{makeinfo}, @code{texinfo-format-region}, and -@code{texinfo-format-buffer} commands read the very same @@-commands -in the Texinfo file as does @TeX{}, but process them differently to -make an Info file; see @ref{Create an Info File}.@refill - -@node Shell Format & Print, Within Emacs, Use TeX, Format/Print Hardcopy -@comment node-name, next, previous, up -@section Format and Print Using Shell Commands - -@cindex DVI file -Format the Texinfo file with the shell command @code{tex} followed by -the name of the Texinfo file. This produces a formatted @sc{dvi} file -as well as several auxiliary files containing indices, cross -references, etc. The @sc{dvi} file (for @dfn{DeVice Independent} -file) can be printed on a wide variety of printers.@refill - -The @code{tex} formatting command itself does not sort the indices; it -writes an output file of unsorted index data. This is a misfeature of -@TeX{}. Hence, to generate a printed index, you first need a sorted -index to work from. The @code{texindex} command sorts indices. (The -source file @file{texindex.c} comes as part of the standard GNU -distribution and is usually installed when Emacs is installed.)@refill -@findex texindex -@ignore -Usage: texindex [-k] [-T tempdir] infile [-o outfile] ... - -Each infile arg can optionally be followed by a `-o outfile' arg; -for each infile that is not followed by a -o arg, the infile name with -`s' (for `sorted') appended is used for the outfile. - --T dir is the directory to put temp files in, instead of /tmp. --k means `keep tempfiles', for debugging. -@end ignore - -The @code{tex} formatting command outputs unsorted index files under -names that obey a standard convention. These names are the name of -your main input file to the @code{tex} formatting command, with -everything after the first period thrown away, and the two letter -names of indices added at the end. For example, the raw index output -files for the input file @file{foo.texinfo} would be @file{foo.cp}, -@file{foo.vr}, @file{foo.fn}, @file{foo.tp}, @file{foo.pg} and -@file{foo.ky}. Those are exactly the arguments to give to -@code{texindex}.@refill - -@need 1000 -Or else, you can use @samp{??} as ``wild-cards'' and give the command in -this form:@refill - -@example -texindex foo.?? -@end example - -@noindent -This command will run @code{texindex} on all the unsorted index files, -including any that you have defined yourself using @code{@@defindex} -or @code{@@defcodeindex}. (You may execute @samp{texindex foo.??} -even if there are similarly named files with two letter extensions -that are not index files, such as @samp{foo.el}. The @code{texindex} -command reports but otherwise ignores such files.)@refill - -For each file specified, @code{texindex} generates a sorted index file -whose name is made by appending @samp{s} to the input file name. The -@code{@@printindex} command knows to look for a file of that name. -@code{texindex} does not alter the raw index output file.@refill - -After you have sorted the indices, you need to rerun the @code{tex} -formatting command on the Texinfo file. This regenerates a formatted -@sc{dvi} file with up-to-date index entries.@footnote{If you use more -than one index and have cross references to an index other than the -first, you must run @code{tex} @emph{three times} to get correct output: -once to generate raw index data; again (after @code{texindex}) to output -the text of the indices and determine their true page numbers; and a -third time to output correct page numbers in cross references to them. -However, cross references to indices are rare.}@refill - -To summarize, this is a three step process: - -@enumerate -@item -Run the @code{tex} formatting command on the Texinfo file. This -generates the formatted @sc{dvi} file as well as the raw index files -with two letter extensions.@refill - -@item -Run the shell command @code{texindex} on the raw index files to sort -them. This creates the corresponding sorted index files.@refill - -@item -Rerun the @code{tex} formatting command on the Texinfo file. This -regenerates a formatted @sc{dvi} file with the index entries in the -correct order. This second run also corrects the page numbers for -the cross references. (The tables of contents are always correct.)@refill -@end enumerate - -You need not run @code{texindex} each time after you run the -@code{tex} formatting. If you do not, on the next run, the @code{tex} -formatting command will use whatever sorted index files happen to -exist from the previous use of @code{texindex}. This is usually -@sc{ok} while you are debugging.@refill - -@findex texi2dvi @r{(shell script)} -Rather than type the @code{tex} and @code{texindex} commands yourself, -you can use @code{texi2dvi}. This shell script is designed to -simplify the @code{tex}---@code{texindex}---@code{tex} sequence by -figuring out whether index files and @sc{dvi} files are up-to-date. -It runs @code{texindex} and @code{tex} only when necessary. - -@need 1000 -The syntax for @code{texi2dvi} is like this (where @samp{%} is the -shell prompt):@refill - -@example -% texi2dvi @var{filename}@dots{} -@end example - -@findex lpr @r{(@sc{dvi} print command)} -Finally, you can print the @sc{dvi} file with the @sc{dvi} print command. -The precise command to use depends on the system; @samp{lpr -d} is -common. The @sc{dvi} print command may require a file name without any -extension or with a @samp{.dvi} extension.@refill - -@need 1200 -The following commands, for example, sort the indices, format, and -print the @cite{Bison Manual} (where @samp{%} is the shell -prompt):@refill - -@example -@group -% tex bison.texinfo -% texindex bison.?? -% tex bison.texinfo -% lpr -d bison.dvi -@end group -@end example - -@noindent -(Remember that the shell commands may be different at your site; but -these are commonly used versions.)@refill - -@node Within Emacs, Texinfo Mode Printing, Shell Format & Print, Format/Print Hardcopy -@comment node-name, next, previous, up -@section From an Emacs Shell @dots{} -@cindex Print, format from Emacs shell -@cindex Format, print from Emacs shell -@cindex Shell, format, print from -@cindex Emacs shell, format, print from -@cindex GNU Emacs shell, format, print from - -You can give formatting and printing commands from a shell within GNU -Emacs. To create a shell within Emacs, type @kbd{M-x shell}. In this -shell, you can format and print the document. @xref{Shell Format & Print, , -How to Format and Print Using Shell Commands}, for details.@refill - -You can switch to and from the shell buffer while @code{tex} is -running and do other editing. If you are formatting a long document -on a slow machine, this can be very convenient.@refill - -You can also use @code{texi2dvi} from an Emacs shell. For example, -here is how to use @code{texi2dvi} to format and print @cite{Using and -Porting GNU CC} from a shell within Emacs (where @samp{%} is the shell -prompt):@refill - -@example -@group -% texi2dvi gcc.texinfo -% lpr -d gcc.dvi -@end group -@end example -@ifinfo - -@xref{Texinfo Mode Printing}, for more information about formatting -and printing in Texinfo mode.@refill -@end ifinfo - -@node Texinfo Mode Printing, Compile-Command, Within Emacs, Format/Print Hardcopy -@section Formatting and Printing in Texinfo Mode -@cindex Region printing in Texinfo mode -@cindex Format and print in Texinfo mode -@cindex Print and format in Texinfo mode - -Texinfo mode provides several predefined key commands for @TeX{} -formatting and printing. These include commands for sorting indices, -looking at the printer queue, killing the formatting job, and -recentering the display of the buffer in which the operations -occur.@refill - -@table @kbd -@item C-c C-t C-r -@itemx M-x texinfo-tex-region -Run @TeX{} on the current region.@refill - -@item C-c C-t C-b -@itemx M-x texinfo-tex-buffer -Run @TeX{} on the current buffer.@refill - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -@item C-c C-t C-i -@itemx M-x texinfo-texindex -Sort the indices of a Texinfo file that have been formatted with -@code{texinfo-tex-region} or @code{texinfo-tex-buffer}.@refill - -@item C-c C-t C-p -@itemx M-x texinfo-tex-print -Print a @sc{dvi} file that was made with @code{texinfo-tex-region} or -@code{texinfo-tex-buffer}.@refill - -@item C-c C-t C-q -@itemx M-x texinfo-show-tex-print-queue -Show the print queue.@refill - -@item C-c C-t C-d -@itemx M-x texinfo-delete-from-tex-print-queue -Delete a job from the print queue; you will be prompted for the job -number shown by a preceding @kbd{C-c C-t C-q} command -(@code{texinfo-show-tex-print-queue}).@refill - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -@item C-c C-t C-k -@itemx M-x texinfo-kill-tex-job -Kill either the currently running @TeX{} job that has been started by -@code{texinfo-tex-region} or @code{texinfo-tex-buffer}, or any other -process running in the Texinfo shell buffer.@refill - -@item C-c C-t C-x -@itemx M-x texinfo-quit-tex-job -Quit a @TeX{} formatting job that has stopped because of an error by -sending an @key{x} to it. When you do this, @TeX{} preserves a record -of what it did in a @file{.log} file.@refill - -@item C-c C-t C-l -@itemx M-x texinfo-recenter-tex-output-buffer -Redisplay the shell buffer in which the @TeX{} printing and formatting -commands are run to show its most recent output.@refill -@end table - -Thus, the usual sequence of commands for formatting a buffer is as -follows (with comments to the right):@refill - -@example -@group -C-c C-t C-b @r{Run @TeX{} on the buffer.} -C-c C-t C-i @r{Sort the indices.} -C-c C-t C-b @r{Rerun @TeX{} to regenerate indices.} -C-c C-t C-p @r{Print the @sc{dvi} file.} -C-c C-t C-q @r{Display the printer queue.} -@end group -@end example - -The Texinfo mode @TeX{} formatting commands start a subshell in Emacs -called the @file{*texinfo-tex-shell*}. The @code{texinfo-tex-command}, -@code{texinfo-texindex-command}, and @code{tex-dvi-print-command} -commands are all run in this shell. - -You can watch the commands operate in the @samp{*texinfo-tex-shell*} buffer, -and you can switch to and from and use the @samp{*texinfo-tex-shell*} buffer -as you would any other shell buffer.@refill - -@need 1500 -The formatting and print commands depend on the values of several variables. -The default values are:@refill - -@sp 1 -@example -@group - @r{Variable} @r{Default value} - -texinfo-tex-command "tex" -texinfo-texindex-command "texindex" -texinfo-tex-shell-cd-command "cd" -texinfo-tex-dvi-print-command "lpr -d" -texinfo-show-tex-queue-command "lpq" -texinfo-delete-from-print-queue-command "lprm" -texinfo-start-of-header "%**start" -texinfo-end-of-header "%**end" -texinfo-tex-trailer "@@bye" -@end group -@end example - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -The default values of both the @code{texinfo-tex-command} and the -@code{texinfo-texindex-command} variables are set in the @file{texnfo-tex.el} -file.@refill - -You can change the values of these variables with the @kbd{M-x -edit-options} command (@pxref{Edit Options, , Editing Variable Values, -emacs, The GNU Emacs Manual}), with the @kbd{M-x set-variable} command -(@pxref{Examining, , Examining and Setting Variables, emacs, The GNU -Emacs Manual}), or with your @file{.emacs} initialization file -(@pxref{Init File, , , emacs, The GNU Emacs Manual}).@refill - -@node Compile-Command, Requirements Summary, Texinfo Mode Printing, Format/Print Hardcopy -@comment node-name, next, previous, up -@section Using the Local Variables List -@cindex Local variables -@cindex Compile command for formatting -@cindex Format with the compile command - -Yet another way to apply the @TeX{} formatting command to a Texinfo -file is to put that command in a @dfn{local variables list} at the end -of the Texinfo file. You can then specify the @TeX{} formatting -command as a @code{compile-command} and have Emacs run the @TeX{} -formatting command by typing @kbd{M-x compile}. This creates a -special shell called the @samp{*compilation buffer*} in which Emacs -runs the compile command. For example, at the end of the -@file{gdb.texinfo} file, after the @code{@@bye}, you would put the -following:@refill - -@example -@@c Local Variables: -@@c compile-command: "tex gdb.texinfo" -@@c End: -@end example - -@noindent -This technique is most often used by programmers who also compile programs -this way; see @ref{Compilation, , , emacs, The GNU Emacs Manual}.@refill - -@node Requirements Summary, Preparing for TeX, Compile-Command, Format/Print Hardcopy -@comment node-name, next, previous, up -@section @TeX{} Formatting Requirements Summary -@cindex Requirements for formatting -@cindex Formatting requirements - -Every Texinfo file that is to be input to @TeX{} must begin with a -@code{\input} command and contain an @code{@@settitle} command:@refill - -@example -\input texinfo -@@settitle @var{name-of-manual} -@end example - -@noindent -The first command instructs @TeX{} to load the macros it needs to -process a Texinfo file and the second command specifies the title of -printed manual.@refill - -@need 1000 -Every Texinfo file must end with a line that terminates @TeX{} -processing and forces out unfinished pages:@refill - -@example -@@bye -@end example - -Strictly speaking, these three lines are all a Texinfo file needs for -@TeX{}, besides the body. (The @code{@@setfilename} line is the only -line that a Texinfo file needs for Info formatting.)@refill - -Usually, the file's first line contains an @samp{@@c -*-texinfo-*-} -comment that causes Emacs to switch to Texinfo mode when you edit the -file. In addition, the beginning usually includes an -@code{@@setfilename} for Info formatting, an @code{@@setchapternewpage} -command, a title page, a copyright page, and permissions. Besides an -@code{@@bye}, the end of a file usually includes indices and a table of -contents.@refill - -@iftex -For more information, see -@ref{setchapternewpage, , @code{@@setchapternewpage}}, -@ref{Headings, ,Page Headings}, -@ref{Titlepage & Copyright Page}, -@ref{Printing Indices & Menus}, and -@ref{Contents}. -@end iftex -@noindent -@ifinfo -For more information, see@* -@ref{setchapternewpage, , @code{@@setchapternewpage}},@* -@ref{Headings, ,Page Headings},@* -@ref{Titlepage & Copyright Page},@* -@ref{Printing Indices & Menus}, and@* -@ref{Contents}. -@end ifinfo - -@node Preparing for TeX, Overfull hboxes, Requirements Summary, Format/Print Hardcopy -@comment node-name, next, previous, up -@section Preparing to Use @TeX{} -@cindex Preparing to use @TeX{} -@cindex @TeX{} input initialization -@cindex @code{TEXINPUTS} environment variable -@vindex TEXINPUTS -@cindex @b{.profile} initialization file -@cindex @b{.cshrc} initialization file -@cindex Initialization file for @TeX{} input - -@TeX{} needs to know where to find the @file{texinfo.tex} file -that you have told it to input with the @samp{\input texinfo} command -at the beginning of the first line. The @file{texinfo.tex} file tells -@TeX{} how to handle @@-commands. (@file{texinfo.tex} is -included in the standard GNU distributions.)@refill - -Usually, the @file{texinfo.tex} file is put in the default directory -that contains @TeX{} macros (the @file{/usr/lib/tex/macros} -directory) when GNU Emacs or other GNU software is installed. -In this case, @TeX{} will -find the file and you do not need to do anything special. -Alternatively, you can put @file{texinfo.tex} in the directory in -which the Texinfo source file is located, and @TeX{} will find it -there.@refill - -However, you may want to specify the location of the @code{\input} file -yourself. One way to do this is to write the complete path for the file -after the @code{\input} command. Another way is to set the -@code{TEXINPUTS} environment variable in your @file{.cshrc} or -@file{.profile} file. The @code{TEXINPUTS} environment variable will tell -@TeX{} where to find the @file{texinfo.tex} file and any other file that -you might want @TeX{} to use.@refill - -Whether you use a @file{.cshrc} or @file{.profile} file depends on -whether you use @code{csh}, @code{sh}, or @code{bash} for your shell -command interpreter. When you use @code{csh}, it looks to the -@file{.cshrc} file for initialization information, and when you use -@code{sh} or @code{bash}, it looks to the @file{.profile} file.@refill - -@need 1000 -In a @file{.cshrc} file, you could use the following @code{csh} command -sequence:@refill - -@example -setenv TEXINPUTS .:/usr/me/mylib:/usr/lib/tex/macros -@end example - -@need 1000 -In a @file{.profile} file, you could use the following @code{sh} command -sequence: - -@example -@group -TEXINPUTS=.:/usr/me/mylib:/usr/lib/tex/macros -export TEXINPUTS -@end group -@end example - -@noindent -This would cause @TeX{} to look for @file{\input} file first in the current -directory, indicated by the @samp{.}, then in a hypothetical user's -@file{me/mylib} directory, and finally in the system library.@refill - -@node Overfull hboxes, smallbook, Preparing for TeX, Format/Print Hardcopy -@comment node-name, next, previous, up -@section Overfull ``hboxes'' -@cindex Overfull @samp{hboxes} -@cindex @samp{hboxes}, overfull -@cindex Final output - -@TeX{} is sometimes unable to typeset a line without extending it into -the right margin. This can occur when @TeX{} comes upon what it -interprets as a long word that it cannot hyphenate, such as an -electronic mail network address or a very long title. When this -happens, @TeX{} prints an error message like this:@refill - -@example -Overfull \hbox (20.76302pt too wide) -@end example - -@noindent -(In @TeX{}, lines are in ``horizontal boxes'', hence the term, ``hbox''. -The backslash, @samp{\}, is the @TeX{} equivalent of @samp{@@}.)@refill - -@TeX{} also provides the line number in the Texinfo source file and -the text of the offending line, which is marked at all the places that -@TeX{} knows how to hyphenate words. -@xref{Debugging with TeX, , Catching Errors with @TeX{} Formatting}, -for more information about typesetting errors.@refill - -If the Texinfo file has an overfull hbox, you can rewrite the sentence -so the overfull hbox does not occur, or you can decide to leave it. A -small excursion into the right margin often does not matter and may not -even be noticeable.@refill - -@cindex Black rectangle in hardcopy -@cindex Rectangle, ugly, black in hardcopy -However, unless told otherwise, @TeX{} will print a large, ugly, black -rectangle beside the line that contains the overful hbox. This is so -you will notice the location of the problem if you are correcting a -draft.@refill - -@need 1000 -@findex finalout -To prevent such a monstrosity from marring your final printout, write -the following in the beginning of the Texinfo file on a line of its own, -before the @code{@@titlepage} command:@refill - -@example -@@finalout -@end example - -@node smallbook, A4 Paper, Overfull hboxes, Format/Print Hardcopy -@comment node-name, next, previous, up -@section Printing ``Small'' Books -@findex smallbook -@cindex Small book size -@cindex Book, printing small -@cindex Page sizes for books -@cindex Size of printed book - -By default, @TeX{} typesets pages for printing in an 8.5 by 11 inch -format. However, you can direct @TeX{} to typeset a document in a 7 by -9.25 inch format that is suitable for bound books by inserting the -following command on a line by itself at the beginning of the Texinfo -file, before the title page:@refill - -@example -@@smallbook -@end example - -@noindent -(Since regular sized books are often about 7 by 9.25 inches, this -command might better have been called the @code{@@regularbooksize} -command, but it came to be called the @code{@@smallbook} command by -comparison to the 8.5 by 11 inch format.)@refill - -If you write the @code{@@smallbook} command between the -start-of-header and end-of-header lines, the Texinfo mode @TeX{} -region formatting command, @code{texinfo-tex-region}, will format the -region in ``small'' book size (@pxref{Start of Header}).@refill - -The Free Software Foundation distributes printed copies of @cite{The GNU -Emacs Manual} and other manuals in the ``small'' book size. -@xref{smallexample & smalllisp, , @code{@@smallexample} and -@code{@@smalllisp}}, for information about commands that make it easier -to produce examples for a smaller manual.@refill - -@node A4 Paper, Cropmarks and Magnification, smallbook, Format/Print Hardcopy -@comment node-name, next, previous, up -@section Printing on A4 Paper -@cindex A4 paper, printing on -@cindex Paper size, European A4 -@cindex European A4 paper -@findex afourpaper - -You can tell @TeX{} to typeset a document for printing on European size -A4 paper with the @code{@@afourpaper} command. Write the command on a -line by itself between @code{@@iftex} and @code{@@end iftex} lines near -the beginning of the Texinfo file, before the title page:@refill - -For example, this is how you would write the header for this manual:@refill - -@example -@group -\input texinfo @@c -*-texinfo-*- -@@c %**start of header -@@setfilename texinfo -@@settitle Texinfo -@@syncodeindex vr fn -@@iftex -@@afourpaper -@@end iftex -@@c %**end of header -@end group -@end example - -@node Cropmarks and Magnification, , A4 Paper, Format/Print Hardcopy -@comment node-name, next, previous, up -@section Cropmarks and Magnification - -@findex cropmarks -@cindex Cropmarks for printing -@cindex Printing cropmarks -You can attempt to direct @TeX{} to print cropmarks at the corners of -pages with the @code{@@cropmarks} command. Write the @code{@@cropmarks} -command on a line by itself between @code{@@iftex} and @code{@@end -iftex} lines near the beginning of the Texinfo file, before the title -page, like this:@refill - -@example -@group -@@iftex -@@cropmarks -@@end iftex -@end group -@end example - -This command is mainly for printers that typeset several pages on one -sheet of film; but you can attempt to use it to mark the corners of a -book set to 7 by 9.25 inches with the @code{@@smallbook} command. -(Printers will not produce cropmarks for regular sized output that is -printed on regular sized paper.) Since different printing machines work -in different ways, you should explore the use of this command with a -spirit of adventure. You may have to redefine the command in the -@file{texinfo.tex} definitions file.@refill - -@findex mag @r{(@TeX{} command)} -@cindex Magnified printing -@cindex Larger or smaller pages -You can attempt to direct @TeX{} to typeset pages larger or smaller than -usual with the @code{\mag} @TeX{} command. Everything that is typeset -is scaled proportionally larger or smaller. (@code{\mag} stands for -``magnification''.) This is @emph{not} a Texinfo @@-command, but is a -Plain@TeX{} command that is prefixed with a backslash. You have to -write this command between @code{@@tex} and @code{@@end tex} -(@pxref{Using Ordinary TeX Commands, , Using Ordinary @TeX{} -Commands}).@refill - -Follow the @code{\mag} command with an @samp{=} and then a number that -is 1000 times the magnification you desire. For example, to print pages -at 1.2 normal size, write the following near the beginning of the -Texinfo file, before the title page:@refill - -@example -@group -@@tex -\mag=1200 -@@end tex -@end group -@end example - -With some printing technologies, you can print normal-sized copies that -look better than usual by using a larger-than-normal master.@refill - -Depending on your system, @code{\mag} may not work or may work only at -certain magnifications. Be prepared to experiment.@refill - -@node Create an Info File, Install an Info File, Format/Print Hardcopy, Top -@comment node-name, next, previous, up -@chapter Creating an Info File -@cindex Creating an Info file -@cindex Info, creating an on-line file -@cindex Formatting a file for Info - -@code{makeinfo} is a utility that converts a Texinfo file into an Info -file; @code{texinfo-format-region} and @code{texinfo-format-buffer} are -GNU Emacs functions that do the same.@refill - -A Texinfo file must possess an @code{@@setfilename} line near its -beginning, otherwise the Info formatting commands will fail.@refill - -For information on installing the Info file in the Info system, see -@ref{Install an Info File}.@refill - -@menu -* makeinfo advantages:: @code{makeinfo} provides better error checking. -* Invoking makeinfo:: How to run @code{makeinfo} from a shell. -* makeinfo options:: Specify fill-column and other options. -* Pointer Validation:: How to check that pointers point somewhere. -* makeinfo in Emacs:: How to run @code{makeinfo} from Emacs. -* texinfo-format commands:: Two Info formatting commands written - in Emacs Lisp are an alternative - to @code{makeinfo}. -* Batch Formatting:: How to format for Info in Emacs Batch mode. -* Tag and Split Files:: How tagged and split files help Info - to run better. -@end menu - -@node makeinfo advantages, Invoking makeinfo, , Create an Info File -@ifinfo -@heading @code{makeinfo} Preferred -@end ifinfo - -The @code{makeinfo} utility creates an Info file from a Texinfo source -file more quickly than either of the Emacs formatting commands and -provides better error messages. We recommend it. @code{makeinfo} is a -C program that is independent of Emacs. You do not need to run Emacs to -use @code{makeinfo}, which means you can use @code{makeinfo} on machines -that are too small to run Emacs. You can run @code{makeinfo} in -any one of three ways: from an operating system shell, from a shell -inside Emacs, or by typing a key command in Texinfo mode in Emacs. -@refill - -The @code{texinfo-format-region} and the @code{texinfo-format-buffer} -commands are useful if you cannot run @code{makeinfo}. Also, in some -circumstances, they format short regions or buffers more quickly than -@code{makeinfo}.@refill - -@node Invoking makeinfo, makeinfo options, makeinfo advantages, Create an Info File -@section Invoking @code{makeinfo} from a Shell - -To create an Info file from a Texinfo file, type @code{makeinfo} -followed by the name of the Texinfo file. Thus, to create the Info -file for Bison, type the following at the shell prompt (where @samp{%} -is the prompt):@refill - -@example -% makeinfo bison.texinfo -@end example - -(You can run a shell inside Emacs by typing @kbd{M-x -shell}.)@refill - -@ifinfo -Sometimes you will want to specify options. For example, if you wish -to discover which version of @code{makeinfo} you are using, -type:@refill - -@example -% makeinfo --version -@end example - -@xref{makeinfo options}, for more information. -@end ifinfo - -@node makeinfo options, Pointer Validation, Invoking makeinfo, Create an Info File -@comment node-name, next, previous, up -@section Options for @code{makeinfo} -@cindex @code{makeinfo} options -@cindex Options for @code{makeinfo} - -The @code{makeinfo} command takes a number of options. Most often, -options are used to set the value of the fill column and specify the -footnote style. Each command line option is a word preceded by -@samp{--}@footnote{@samp{--} has replaced @samp{+}, the old introductory -character, to maintain POSIX.2 compatibility without losing long-named -options.} or a letter preceded by @samp{-}. You can use abbreviations -for the option names as long as they are unique.@refill - -For example, you could use the following command to create an Info -file for @file{bison.texinfo} in which each line is filled to only 68 -columns (where @samp{%} is the prompt):@refill - -@example -% makeinfo --fill-column=68 bison.texinfo -@end example - -You can write two or more options in sequence, like this:@refill - -@example -% makeinfo --no-split --fill-column=70 @dots{} -@end example - -@noindent -This would keep the Info file together as one possibly very long -file and would also set the fill column to 70.@refill - -@iftex -If you wish to discover which version of @code{makeinfo} -you are using, type:@refill - -@example -% makeinfo --version -@end example -@end iftex - -The options are:@refill - -@need 100 -@table @code -@item -D @var{var} -Cause @var{var} to be defined. This is equivalent to -@code{@@set @var{var}} in the Texinfo file. - -@need 150 -@item --error-limit @var{limit} -Set the maximum number of errors that @code{makeinfo} will report -before exiting (on the assumption that continuing would be useless). -The default number of errors that can be reported before -@code{makeinfo} gives up is 100.@refill - -@need 150 -@item --fill-column @var{width} -Specify the maximum number of columns in a line; this is the right-hand -edge of a line. Paragraphs that are filled will be filled to this -width. (Filling is the process of breaking up and connecting lines so -that lines are the same length as or shorter than the number specified -as the fill column. Lines are broken between words.) The default value -for @code{fill-column} is 72. -@refill - -@item --footnote-style @var{style} -Set the footnote style to @var{style}, either @samp{end} for the end -node style or @samp{separate} for the separate node style. The value -set by this option overrides the value set in a Texinfo file by an -@code{@@footnotestyle} command. When the footnote style is -@samp{separate}, @code{makeinfo} makes a new node containing the -footnotes found in the current node. When the footnote style is -@samp{end}, @code{makeinfo} places the footnote references at the end -of the current node.@refill - -@need 150 -@item -I @var{dir} -Add @code{dir} to the directory search list for finding files that are -included using the @code{@@include} command. By default, -@code{makeinfo} searches only the current directory. - -@need 150 -@item --no-headers -Do not include menus or node lines in the output. This results in an -@sc{ascii} file that you cannot read in Info since it does not contain -the requisite nodes or menus; but you can print such a file in a -single, typewriter-like font and produce acceptable output. - -@need 150 -@item --no-split -Suppress the splitting stage of @code{makeinfo}. Normally, large -output files (where the size is greater than 70k bytes) are split into -smaller subfiles, each one approximately 50k bytes. If you specify -@samp{--no-split}, @code{makeinfo} will not split up the output -file.@refill - -@need 100 -@item --no-pointer-validate -@item --no-validate -Suppress the pointer-validation phase of @code{makeinfo}. Normally, -after a Texinfo file is processed, some consistency checks are made to -ensure that cross references can be resolved, etc. -@xref{Pointer Validation}.@refill - -@need 150 -@item --no-warn -Suppress the output of warning messages. This does @emph{not} -suppress the output of error messages, only warnings. You might -want this if the file you are creating has examples of Texinfo cross -references within it, and the nodes that are referenced do not actually -exist.@refill - -@item --no-number-footnotes -Supress automatic footnote numbering. By default, @code{makeinfo} -numbers each footnote sequentially in a single node, resetting the -current footnote number to 1 at the start of each node. - -@need 150 -@item --output @var{file} -@itemx -o @var{file} -Specify that the output should be directed to @var{file} and not to the -file name specified in the @code{@@setfilename} command found in the Texinfo -source. @var{file} can be the special token @samp{-}, which specifies -standard output. - -@need 150 -@item --paragraph-indent @var{indent} -Set the paragraph indentation style to @var{indent}. The value set by -this option overrides the value set in a Texinfo file by an -@code{@@paragraphindent} command. The value of @var{indent} is -interpreted as follows:@refill - -@itemize @bullet -@item -If the value of @var{indent} is @samp{asis}, do not change the -existing indentation at the starts of paragraphs.@refill - -@item -If the value of @var{indent} is zero, delete any existing -indentation.@refill - -@item -If the value of @var{indent} is greater than zero, indent each -paragraph by that number of spaces.@refill -@end itemize - -@need 100 -@item --reference-limit @var{limit} -Set the value of the number of references to a node that -@code{makeinfo} will make without reporting a warning. If a node has more -than this number of references in it, @code{makeinfo} will make the -references but also report a warning.@refill - -@need 150 -@item -U @var{var} -Cause @var{var} to be undefined. This is equivalent to -@code{@@clear @var{var}} in the Texinfo file. - -@need 100 -@item --verbose -Cause @code{makeinfo} to display messages saying what it is doing. -Normally, @code{makeinfo} only outputs messages if there are errors or -warnings.@refill - -@need 100 -@item --version -Report the version number of this copy of @code{makeinfo}.@refill -@end table - -@node Pointer Validation, makeinfo in Emacs, makeinfo options, Create an Info File -@section Pointer Validation -@cindex Pointer validation with @code{makeinfo} -@cindex Validation of pointers - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -@code{makeinfo} will check the validity of the final Info file unless -you suppress pointer-validation by using the -@samp{--no-pointer-validation} option. Mostly, this means ensuring -that nodes you have referenced really exist. Here is a complete list -of what is checked:@refill - -@enumerate -@item -If a `Next', `Previous', or `Up' node reference is a reference to a -node in the current file and is not an external reference such as to -@file{(dir)}, then the referenced node must exist.@refill - -@item -In every node, if the `Previous' node is different from the `Up' node, -then the `Previous' node must also be pointed to by a `Next' node.@refill - -@item -Every node except the `Top' node must have an `Up' pointer.@refill - -@item -The node referenced by an `Up' pointer must contain a reference to the -current node in some manner other than through a `Next' reference. -This includes menu entries and cross references.@refill - -@item -If the `Next' reference of a node is not the same as the `Next' reference -of the `Up' reference, then the node referenced by the `Next' pointer -must have a `Previous' pointer that points back to the current node. -This rule allows the last node in a section to point to the first node -of the next chapter.@refill -@end enumerate - -@node makeinfo in Emacs, texinfo-format commands, Pointer Validation, Create an Info File -@section Running @code{makeinfo} inside Emacs -@cindex Running @code{makeinfo} in Emacs -@cindex @code{makeinfo} inside Emacs -@cindex Shell, running @code{makeinfo} in - -You can run @code{makeinfo} in GNU Emacs Texinfo mode by using either the -@code{makeinfo-region} or the @code{makeinfo-buffer} commands. In -Texinfo mode, the commands are bound to @kbd{C-c C-m C-r} and @kbd{C-c -C-m C-b} by default.@refill - -@table @kbd -@item C-c C-m C-r -@itemx M-x makeinfo-region -Format the current region for Info.@refill -@findex makeinfo-region - -@item C-c C-m C-b -@itemx M-x makeinfo-buffer -Format the current buffer for Info.@refill -@findex makeinfo-buffer -@end table - -When you invoke either @code{makeinfo-region} or -@code{makeinfo-buffer}, Emacs prompts for a file name, offering the -name of the visited file as the default. You can edit the default -file name in the minibuffer if you wish, before typing @key{RET} to -start the @code{makeinfo} process.@refill - -The Emacs @code{makeinfo-region} and @code{makeinfo-buffer} commands -run the @code{makeinfo} program in a temporary shell buffer. If -@code{makeinfo} finds any errors, Emacs displays the error messages in -the temporary buffer.@refill - -@cindex Errors, parsing -@cindex Parsing errors -@findex next-error -You can parse the error messages by typing @kbd{C-x `} -(@code{next-error}). This causes Emacs to go to and position the -cursor on the line in the Texinfo source that @code{makeinfo} thinks -caused the error. @xref{Compilation, , Running @code{make} or -Compilers Generally, emacs, The GNU Emacs Manual}, for more -information about using the @code{next-error} command.@refill - -In addition, you can kill the shell in which the @code{makeinfo} -command is running or make the shell buffer display its most recent -output.@refill - - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -@table @kbd -@item C-c C-m C-k -@itemx M-x makeinfo-kill-job -@findex makeinfo-kill-job -Kill the currently running job created by -@code{makeinfo-region} or @code{makeinfo-buffer}.@refill - -@item C-c C-m C-l -@itemx M-x makeinfo-recenter-output-buffer -@findex makeinfo-recenter-output-buffer -Redisplay the @code{makeinfo} shell buffer to display its most recent -output.@refill -@end table - -@noindent -(Note that the parallel commands for killing and recentering a @TeX{} -job are @kbd{C-c C-t C-k} and @kbd{C-c C-t C-l}. @xref{Texinfo Mode -Printing}.)@refill - -You can specify options for @code{makeinfo} by setting the -@code{makeinfo-options} variable with either the @kbd{M-x -edit-options} or the @kbd{M-x set-variable} command, or by setting the -variable in your @file{.emacs} initialization file.@refill - -For example, you could write the following in your @file{.emacs} file:@refill - -@example -@group -(setq makeinfo-options - "--paragraph-indent=0 --no-split - --fill-column=70 --verbose") -@end group -@end example - -@c If you write these three cross references using xref, you see -@c three references to the same named manual, which looks strange. -@iftex -For more information, see @ref{makeinfo options, , Options for -@code{makeinfo}}, as well as ``Editing Variable Values,''``Examining and -Setting Variables,'' and ``Init File'' in the @cite{The GNU Emacs -Manual}. -@end iftex -@noindent -@ifinfo -For more information, see@* -@ref{Edit Options, , Editing Variable Values, emacs, The GNU Emacs Manual},@* -@ref{Examining, , Examining and Setting Variables, emacs, The GNU Emacs Manual},@* -@ref{Init File, , , emacs, The GNU Emacs Manual}, and@* -@ref{makeinfo options, , Options for @code{makeinfo}}. -@end ifinfo - -@node texinfo-format commands, Batch Formatting, makeinfo in Emacs, Create an Info File -@comment node-name, next, previous, up -@section The @code{texinfo-format@dots{}} Commands -@findex texinfo-format-region -@findex texinfo-format-buffer - -In GNU Emacs in Texinfo mode, you can format part or all of a Texinfo -file with the @code{texinfo-format-region} command. This formats the -current region and displays the formatted text in a temporary buffer -called @samp{*Info Region*}.@refill - -Similarly, you can format a buffer with the -@code{texinfo-format-buffer} command. This command creates a new -buffer and generates the Info file in it. Typing @kbd{C-x C-s} will -save the Info file under the name specified by the -@code{@@setfilename} line which must be near the beginning of the -Texinfo file.@refill - -@table @kbd -@item C-c C-e C-r -@itemx @code{texinfo-format-region} -Format the current region for Info. -@findex texinfo-format-region - -@item C-c C-e C-b -@itemx @code{texinfo-format-buffer} -Format the current buffer for Info. -@findex texinfo-format-buffer -@end table - -The @code{texinfo-format-region} and @code{texinfo-format-buffer} -commands provide you with some error checking, and other functions can -provide you with further help in finding formatting errors. These -procedures are described in an appendix; see @ref{Catching Mistakes}. -However, the @code{makeinfo} program is often faster and -provides better error checking (@pxref{makeinfo in Emacs}).@refill - -@node Batch Formatting, Tag and Split Files, texinfo-format commands, Create an Info File -@comment node-name, next, previous, up -@section Batch Formatting -@cindex Batch formatting for Info -@cindex Info batch formatting - -You can format Texinfo files for Info using @code{batch-texinfo-format} -and Emacs Batch mode. You can run Emacs in Batch mode from any shell, -including a shell inside of Emacs. (@xref{Command Switches, , Command -Line Switches and Arguments, emacs, The GNU Emacs Manual}.)@refill - -Here is the command to format all the files that end in @file{.texinfo} -in the current directory (where @samp{%} is the shell prompt):@refill - -@example -% emacs -batch -funcall batch-texinfo-format *.texinfo -@end example - -@noindent -Emacs processes all the files listed on the command line, even if an -error occurs while attempting to format some of them.@refill - -Run @code{batch-texinfo-format} only with Emacs in Batch mode as shown; -it is not interactive. It kills the Batch mode Emacs on completion.@refill - -@code{batch-texinfo-format} is convenient if you lack @code{makeinfo} -and want to format several Texinfo files at once. When you use Batch -mode, you create a new Emacs process. This frees your current Emacs, so -you can continue working in it. (When you run -@code{texinfo-format-region} or @code{texinfo-format-buffer}, you cannot -use that Emacs for anything else until the command finishes.)@refill - -@node Tag and Split Files, , Batch Formatting, Create an Info File -@comment node-name, next, previous, up -@section Tag Files and Split Files -@cindex Making a tag table automatically -@cindex Tag table, making automatically - -If a Texinfo file has more than 30,000 bytes, -@code{texinfo-format-buffer} automatically creates a tag table -for its Info file; @code{makeinfo} always creates a tag table. With -a @dfn{tag table}, Info can jump to new nodes more quickly than it can -otherwise.@refill - -@cindex Indirect subfiles -In addition, if the Texinfo file contains more than about 70,000 -bytes, @code{texinfo-format-buffer} and @code{makeinfo} split the -large Info file into shorter @dfn{indirect} subfiles of about 50,000 -bytes each. Big files are split into smaller files so that Emacs does -not need to make a large buffer to hold the whole of a large Info -file; instead, Emacs allocates just enough memory for the small, split -off file that is needed at the time. This way, Emacs avoids wasting -memory when you run Info. (Before splitting was implemented, Info -files were always kept short and @dfn{include files} were designed as -a way to create a single, large printed manual out of the smaller Info -files. @xref{Include Files}, for more information. Include files are -still used for very large documents, such as @cite{The Emacs Lisp -Reference Manual}, in which each chapter is a separate file.)@refill - -When a file is split, Info itself makes use of a shortened version of -the original file that contains just the tag table and references to -the files that were split off. The split off files are called -@dfn{indirect} files.@refill - -The split off files have names that are created by appending @w{@samp{-1}}, -@w{@samp{-2}}, @w{@samp{-3}} and so on to the file name specified by the -@code{@@setfilename} command. The shortened version of the original file -continues to have the name specified by @code{@@setfilename}.@refill - -At one stage in writing this document, for example, the Info file was saved -as @file{test-texinfo} and that file looked like this:@refill - -@example -@group -Info file: test-texinfo, -*-Text-*- -produced by texinfo-format-buffer -from file: new-texinfo-manual.texinfo - -^_ -Indirect: -test-texinfo-1: 102 -test-texinfo-2: 50422 -test-texinfo-3: 101300 -^_^L -Tag table: -(Indirect) -Node: overview^?104 -Node: info file^?1271 -Node: printed manual^?4853 -Node: conventions^?6855 -@dots{} -@end group -@end example - -@noindent -(But @file{test-texinfo} had far more nodes than are shown here.) Each of -the split off, indirect files, @file{test-texinfo-1}, -@file{test-texinfo-2}, and @file{test-texinfo-3}, is listed in this file -after the line that says @samp{Indirect:}. The tag table is listed after -the line that says @samp{Tag table:}. @refill - -In the list of indirect files, the number following the file name -records the cumulative number of bytes in the preceding indirect files, -not counting the file list itself, the tag table, or the permissions -text in each file. In the tag table, the number following the node name -records the location of the beginning of the node, in bytes from the -beginning.@refill - -If you are using @code{texinfo-format-buffer} to create Info files, -you may want to run the @code{Info-validate} command. (The -@code{makeinfo} command does such a good job on its own, you do not -need @code{Info-validate}.) However, you cannot run the @kbd{M-x -Info-validate} node-checking command on indirect files. For -information on how to prevent files from being split and how to -validate the structure of the nodes, see @ref{Using -Info-validate}.@refill - -@node Install an Info File, Command List, Create an Info File, Top -@comment node-name, next, previous, up -@chapter Installing an Info File -@cindex Installing an Info file -@cindex Info file installation -@cindex @file{dir} directory for Info installation - -Info files are usually kept in the @file{info} -directory. (You can find the location of this directory within Emacs -by typing @kbd{C-h i} to enter Info and then typing @kbd{C-x C-f} to -see the full pathname to the @file{info} directory.) - -@menu -* Directory file:: The top level menu for all Info files. -* New Info File:: Listing a new info file. -* Other Info Directories:: How to specify Info files that are - located in other directories. -@end menu - -@node Directory file, New Info File, , Install an Info File -@ifinfo -@heading The @file{dir} File -@end ifinfo - -For Info to work, the @file{info} directory must contain a file that -serves as a top level directory for the Info system. By convention, -this file is called @file{dir}. The @file{dir} file is itself an Info -file. It contains the top level menu for all the Info files in the -system. The menu looks like this:@refill - -@example -* Menu: - -* Info: (info). Documentation browsing system. -* Emacs: (emacs). The extensible, self-documenting - text editor. -* Texinfo: (texinfo). With one source file, make - either a printed manual using - TeX or an Info file. -@dots{} -@end example - -Each of these menu entries points to the `Top' node of the Info file -that is named in parentheses. (The menu entry does not need to -specify the `Top' node, since Info goes to the `Top' node if no node -name is mentioned. @xref{Other Info Files, , Nodes in Other Info -Files}.)@refill - -Thus, the @samp{Info} entry points to the `Top' node of the -@file{info} file and the @samp{Emacs} entry points to the `Top' node -of the @file{emacs} file.@refill - -In each of the Info files, the `Up' pointer of the `Top' node refers -back to the @code{dir} file. For example, the line for the `Top' -node of the Emacs manual looks like this in Info:@refill - -@example -File: emacs Node: Top, Up: (DIR), Next: Distrib -@end example - -@noindent -(Note that in this case, the @file{dir} file name is written in upper -case letters---it can be written in either upper or lower case. Info -has a feature that it will change the case of the file name to lower -case if it cannot find the name as written.)@refill - -@c !!! Can any file name be written in upper or lower case, -@c or is dir a special case? -@c Yes, apparently so, at least with Gillespie's Info. --rjc 24mar92 -@c -@node New Info File, Other Info Directories, Directory file, Install an Info File -@section Listing a New Info File -@cindex Adding a new info file -@cindex Listing a new info file -@cindex New info file, listing it in @file{dir} file -@cindex Info file, listing new one -@cindex @file{dir} file listing - -To add a new Info file to your system, write a menu entry for it in the -menu in the @file{dir} file in the @file{info} directory. Also, move -the new Info file itself to the @file{info} directory. For example, if -you were adding documentation for GDB, you would write the following new -entry:@refill - -@example -* GDB: (gdb). The source-level C debugger. -@end example - -@noindent -The first part of the menu entry is the menu entry name, followed by a -colon. The second part is the name of the Info file, in parentheses, -followed by a period. The third part is the description.@refill - -Conventionally, the name of an Info file has a @file{.info} extension. -Thus, you might list the name of the file like this: - -@example -* GDB: (gdb.info). The source-level C debugger. -@end example - -@noindent -However, Info will look for a file with a @file{.info} extension if it -does not find the file under the name given in the menu. This means -that you can refer to the file @file{gdb.info} as @file{gdb}, as shown -in the first example. This looks better. - -@node Other Info Directories, , New Info File, Install an Info File -@comment node-name, next, previous, up -@section Info Files in Other Directories -@cindex Installing Info in another directory -@cindex Info installed in another directory -@cindex Another Info directory - -If an Info file is not in the @file{info} directory, there are two -ways to specify its location:@refill - -@itemize @bullet -@item -Write the pathname as the menu's second part, or;@refill - -@item -Specify the @file{info} directory name in an environment variable in -your @file{.profile} or @file{.cshrc} initialization file. (Only you -and others with the same environment variable will be able to find Info -files whose location is specified this way.)@refill -@end itemize - -For example, to reach a test file in the @file{~bob/manuals} -directory, you could add an entry like this to the menu in the -@file{dir} file:@refill - -@example -* Test: (~bob/manuals/info-test). Bob's own test file. -@end example - -@noindent -In this case, the absolute file name of the @file{info-test} file is -written as the second part of the menu entry.@refill - -@vindex INFOPATH -Alternatively, you can tell Info where to look by setting the -@code{INFOPATH} environment variable in your @file{.cshrc} or -@file{.profile} file.@refill - -If you use @code{sh} or @code{bash} for your shell command interpreter, -you must set the @code{INFOPATH} environment variable in the -@file{.profile} initialization file; but if you use @code{csh}, you must -set the variable in the @file{.cshrc} initialization file. The two -files require slightly different command formats.@refill - -@itemize @bullet -@item -In a @file{.cshrc} file, you could set the @code{INFOPATH} -variable as follows:@refill - -@smallexample -setenv INFOPATH .:~bob/manuals:/usr/local/emacs/info -@end smallexample - -@item -In a @file{.profile} file, you would achieve the same effect by -writing:@refill - -@smallexample -INFOPATH=.:~bob/manuals:/usr/local/emacs/info -export INFOPATH -@end smallexample -@end itemize - -@noindent -Either form would cause Info to look first in the current directory, -indicated by the @samp{.}, then in the @file{~bob/manuals} directory, -and finally in the @file{/usr/local/emacs/info} directory (which is -a common location for the standard Info directory).@refill - -@c ================ Appendix starts here ================ - -@node Command List, Tips, Install an Info File, Top -@appendix @@-Command List -@cindex Alphabetical @@-command list -@cindex List of @@-commands -@cindex @@-command list - -Here is an alphabetical list of the @@-commands in Texinfo. Square -brackets, @t{[}@w{ }@t{]}, indicate optional arguments; an ellipsis, -@samp{@dots{}}, indicates repeated text.@refill - -@sp 1 -@table @code -@item @@* -Force a line break. Do not end a paragraph that uses @code{@@*} with -an @code{@@refill} command. @xref{Line Breaks}.@refill - -@item @@. -Stands for a period that really does end a sentence (usually after an -end-of-sentence capital letter). @xref{Controlling Spacing}.@refill - -@item @@: -Indicate to @TeX{} that an immediately preceding period, question -mark, exclamation mark, or colon does not end a sentence. Prevent -@TeX{} from inserting extra whitespace as it does at the end of a -sentence. The command has no effect on the Info file output. -@xref{Controlling Spacing}.@refill - -@item @@@@ -Stands for @samp{@@}. @xref{Braces Atsigns Periods, , Inserting -@samp{@@}}.@refill - -@item @@@{ -Stands for a left-hand brace, @samp{@{}. -@xref{Braces Atsigns Periods, , Inserting @@ braces and periods}.@refill - -@item @@@} -Stands for a right-hand brace, @samp{@}}. -@xref{Braces Atsigns Periods, , Inserting @@ braces and periods}.@refill - -@item @@appendix @var{title} -Begin an appendix. The title appears in the table -of contents of a printed manual. In Info, the title is -underlined with asterisks. @xref{unnumbered & appendix, , The -@code{@@unnumbered} and @code{@@appendix} Commands}.@refill - -@item @@appendixsec @var{title} -@itemx @@appendixsection @var{title} -Begin an appendix section within an appendix. The section title appears -in the table of contents of a printed manual. In Info, the title is -underlined with equal signs. @code{@@appendixsection} is a longer -spelling of the @code{@@appendixsec} command. @xref{unnumberedsec -appendixsec heading, , Section Commands}.@refill - -@item @@appendixsubsec @var{title} -Begin an appendix subsection within an appendix. The title appears -in the table of contents of a printed manual. In Info, the title is -underlined with hyphens. @xref{unnumberedsubsec appendixsubsec -subheading, , Subsection Commands}.@refill - -@item @@appendixsubsubsec @var{title} -Begin an appendix subsubsection within a subappendix. The title -appears in the table of contents of a printed manual. In Info, the -title is underlined with periods. @xref{subsubsection,, The `subsub' -Commands}.@refill - -@item @@asis -Used following @code{@@table}, @code{@@ftable}, and @code{@@vtable} to -print the table's first column without highlighting (``as is''). -@xref{Two-column Tables, , Making a Two-column Table}.@refill - -@item @@author @var{author} -Typeset @var{author} flushleft and underline it. @xref{title -subtitle author, , The @code{@@title} and @code{@@author} -Commands}.@refill - -@item @@b@{@var{text}@} -Print @var{text} in @b{bold} font. No effect in Info. @xref{Fonts}.@refill - -@ignore -@item @@br -Force a paragraph break. If used within a line, follow @code{@@br} -with braces. @xref{br, , @code{@@br}}.@refill -@end ignore - -@item @@bullet@{@} -Generate a large round dot, or the closest possible -thing to one. @xref{bullet, , @code{@@bullet}}.@refill - -@item @@bye -Stop formatting a file. The formatters do not see the contents of a -file following an @code{@@bye} command. @xref{Ending a File}.@refill - -@item @@c @var{comment} -Begin a comment in Texinfo. The rest of the line does not appear in -either the Info file or the printed manual. A synonym for -@code{@@comment}. @xref{Conventions, , General Syntactic -Conventions}.@refill - -@item @@cartouche -Highlight an example or quotation by drawing a box with rounded -corners around it. Pair with @code{@@end cartouche}. No effect in -Info. @xref{cartouche, , Drawing Cartouches Around Examples}.)@refill - -@item @@center @var{line-of-text} -Center the line of text following the command. -@xref{titlefont center sp, , @code{@@center}}.@refill - -@item @@chapheading @var{title} -Print a chapter-like heading in the text, but not in the table of -contents of a printed manual. In Info, the title is underlined with -asterisks. @xref{majorheading & chapheading, , @code{@@majorheading} -and @code{@@chapheading}}.@refill - -@item @@chapter @var{title} -Begin a chapter. The chapter title appears in the table of -contents of a printed manual. In Info, the title is underlined with -asterisks. @xref{chapter, , @code{@@chapter}}.@refill - -@item @@cindex @var{entry} -Add @var{entry} to the index of concepts. @xref{Index Entries, , -Defining the Entries of an Index}.@refill - -@item @@cite@{@var{reference}@} -Highlight the name of a book or other reference that lacks a -companion Info file. @xref{cite, , @code{@@cite}}.@refill - -@item @@clear @var{flag} -Unset @var{flag}, preventing the Texinfo formatting commands from -formatting text between subsequent pairs of @code{@@ifset @var{flag}} -and @code{@@end ifset} commands, and preventing -@code{@@value@{@var{flag}@}} from expanding to the value to which -@var{flag} is set. -@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill - -@item @@code@{@var{sample-code}@} -Highlight text that is an expression, a syntactically complete token -of a program, or a program name. @xref{code, , @code{@@code}}.@refill - -@item @@comment @var{comment} -Begin a comment in Texinfo. The rest of the line does not appear in -either the Info file or the printed manual. A synonym for @code{@@c}. -@xref{Conventions, , General Syntactic Conventions}.@refill - -@item @@contents -Print a complete table of contents. Has no effect in Info, which uses -menus instead. @xref{Contents, , Generating a Table of -Contents}.@refill - -@item @@copyright@{@} -Generate a copyright symbol. @xref{copyright symbol, , -@code{@@copyright}}.@refill - -@ignore -@item @@ctrl@{@var{ctrl-char}@} -Describe an @sc{ascii} control character. Insert actual control character -into Info file. @xref{ctrl, , @code{@@ctrl}}.@refill -@end ignore - -@item @@defcodeindex @var{index-name} -Define a new index and its indexing command. Print entries in an -@code{@@code} font. @xref{New Indices, , Defining New -Indices}.@refill - -@item @@defcv @var{category} @var{class} @var{name} -Format a description for a variable associated with a class in -object-oriented programming. Takes three arguments: the category of -thing being defined, the class to which it belongs, and its name. -@xref{Definition Commands}.@refill - -@item @@deffn @var{category} @var{name} @var{arguments}@dots{} -Format a description for a function, interactive command, or similar -entity that may take arguments. @code{@@deffn} takes as arguments the -category of entity being described, the name of this particular -entity, and its arguments, if any. @xref{Definition Commands}.@refill - -@item @@defindex @var{index-name} -Define a new index and its indexing command. Print entries in a roman -font. @xref{New Indices, , Defining New Indices}.@refill - -@item @@defivar @var{class} @var{instance-variable-name} -Format a description for an instance variable in object-oriented -programming. The command is equivalent to @samp{@@defcv @{Instance -Variable@} @dots{}}. @xref{Definition Commands}.@refill - -@item @@defmac @var{macro-name} @var{arguments}@dots{} -Format a description for a macro. The command is equivalent to -@samp{@@deffn Macro @dots{}}. @xref{Definition Commands}.@refill - -@item @@defmethod @var{class} @var{method-name} @var{arguments}@dots{} -Format a description for a method in object-oriented programming. The -command is equivalent to @samp{@@defop Method @dots{}}. Takes as -arguments the name of the class of the method, the name of the -method, and its arguments, if any. @xref{Definition Commands}.@refill - -@item @@defop @var{category} @var{class} @var{name} @var{arguments}@dots{} -Format a description for an operation in object-oriented programming. -@code{@@defop} takes as arguments the overall name of the category of -operation, the name of the class of the operation, the name of the -operation, and its arguments, if any. @xref{Definition -Commands}.@refill - -@need 100 -@item @@defopt @var{option-name} -Format a description for a user option. The command is equivalent to -@samp{@@defvr @{User Option@} @dots{}}. @xref{Definition Commands}.@refill - -@need 100 -@item @@defspec @var{special-form-name} @var{arguments}@dots{} -Format a description for a special form. The command is equivalent to -@samp{@@deffn @{Special Form@} @dots{}}. @xref{Definition Commands}.@refill - -@need 200 -@item @@deftp @var{category} @var{name-of-type} @var{attributes}@dots{} -Format a description for a data type. @code{@@deftp} takes as -arguments the category, the name of the type (which is a word like -@samp{int} or @samp{float}), and then the names of attributes of -objects of that -type. @xref{Definition Commands}.@refill - -@item @@deftypefn @var{classification} @var{data-type} @var{name} @var{arguments}@dots{} -Format a description for a function or similar entity that may take -arguments and that is typed. @code{@@deftypefn} takes as arguments -the classification of entity being described, the type, the name of -the entity, and its arguments, if any. @xref{Definition -Commands}.@refill - -@item @@deftypefun @var{data-type} @var{function-name} @var{arguments}@dots{} -Format a description for a function in a typed language. -The command is equivalent to @samp{@@deftypefn Function @dots{}}. -@xref{Definition Commands}.@refill - -@item @@deftypevr @var{classification} @var{data-type} @var{name} -Format a description for something like a variable in a typed -language---an entity that records a value. Takes as arguments the -classification of entity being described, the type, and the name of -the entity. @xref{Definition Commands}.@refill - -@item @@deftypevar @var{data-type} @var{variable-name} -Format a description for a variable in a typed language. The command is -equivalent to @samp{@@deftypevr Variable @dots{}}. @xref{Definition -Commands}.@refill - -@item @@defun @var{function-name} @var{arguments}@dots{} -Format a description for functions. The command is equivalent to -@samp{@@deffn Function @dots{}}. @xref{Definition Commands}.@refill - -@item @@defvar @var{variable-name} -Format a description for variables. The command is equivalent to -@samp{@@defvr Variable @dots{}}. @xref{Definition Commands}.@refill - -@item @@defvr @var{category} @var{name} -Format a description for any kind of variable. @code{@@defvr} takes -as arguments the category of the entity and the name of the entity. -@xref{Definition Commands}.@refill - -@item @@dfn@{@var{term}@} -Highlight the introductory or defining use of a term. -@xref{dfn, , @code{@@dfn}}.@refill - -@need 100 -@item @@display -Begin a kind of example. Indent text, do not fill, do not select a -new font. Pair with @code{@@end display}. @xref{display, , -@code{@@display}}.@refill - -@need 100 -@item @@dmn@{@var{dimension}@} -Format a dimension. Cause @TeX{} to insert a narrow space before -@var{dimension}. No effect in Info. Use for writing a number -followed by an abbreviation of a dimension name, such as -@samp{12@dmn{pt}}, written as @samp{12@@dmn@{pt@}}, with no space -between the number and the @code{@@dmn} command. @xref{dmn, , -@code{@@dmn}}.@refill - -@need 100 -@item @@dots@{@} -Insert an ellipsis: @samp{@dots{}}. -@xref{dots, , @code{@@dots}}.@refill - -@need 100 -@item @@emph@{@var{text}@} -Highlight @var{text}; text is displayed in @emph{italics} in printed -output, and surrounded by asterisks in Info. @xref{Emphasis, , Emphasizing Text}.@refill - -@need 100 -@item @@enumerate [@var{number-or-letter}] -Begin a numbered list, using @code{@@item} for each entry. -Optionally, start list with @var{number-or-letter}. Pair with -@code{@@end enumerate}. @xref{enumerate, , -@code{@@enumerate}}.@refill - -@need 100 -@item @@equiv@{@} -Indicate to the reader the exact equivalence of two forms with a -glyph: @samp{@equiv{}}. @xref{Equivalence}.@refill - -@item @@error@{@} -Indicate to the reader with a glyph that the following text is -an error message: @samp{@error{}}. @xref{Error Glyph}.@refill - -@item @@evenfooting [@var{left}] @@| [@var{center}] @@| [@var{right}] -Specify page footings for even-numbered (left-hand) pages. Not relevant to -Info. @xref{Custom Headings, , How to Make Your Own Headings}.@refill - -@item @@evenheading [@var{left}] @@| [@var{center}] @@| [@var{right}] -Specify page headings for even-numbered (left-hand) pages. Not relevant to -Info. @xref{Custom Headings, , How to Make Your Own Headings}.@refill - -@item @@everyfooting [@var{left}] @@| [@var{center}] @@| [@var{right}] -Specify page footings for every page. Not relevant to Info. @xref{Custom -Headings, , How to Make Your Own Headings}.@refill - -@item @@everyheading [@var{left}] @@| [@var{center}] @@| [@var{right}] -Specify page headings for every page. Not relevant to Info. @xref{Custom -Headings, , How to Make Your Own Headings}.@refill - -@item @@example -Begin an example. Indent text, do not fill, and select fixed-width font. -Pair with @code{@@end example}. @xref{example, , -@code{@@example}}.@refill - -@item @@exdent @var{line-of-text} -Remove any indentation a line might have. @xref{exdent, , -Undoing the Indentation of a Line}.@refill - -@item @@expansion@{@} -Indicate the result of a macro expansion to the reader with a special -glyph: @samp{@expansion{}}. -@xref{expansion, , @expansion{} Indicating an Expansion}.@refill - -@item @@file@{@var{filename}@} -Highlight the name of a file, buffer, node, or directory. @xref{file, , -@code{@@file}}.@refill - -@item @@finalout -Prevent @TeX{} from printing large black warning rectangles beside -over-wide lines. @xref{Overfull hboxes}.@refill - -@need 100 -@item @@findex @var{entry} -Add @var{entry} to the index of functions. @xref{Index Entries, , -Defining the Entries of an Index}.@refill - -@need 200 -@item @@flushleft -Left justify every line but leave the right end ragged. -Leave font as is. Pair with @code{@@end flushleft}. -@xref{flushleft & flushright, , @code{@@flushleft} and -@code{@@flushright}}.@refill - -@need 200 -@item @@flushright -Right justify every line but leave the left end ragged. -Leave font as is. Pair with @code{@@end flushright}. -@xref{flushleft & flushright, , @code{@@flushleft} and -@code{@@flushright}}.@refill - -@need 200 -@item @@footnote@{@var{text-of-footnote}@} -Enter a footnote. Footnote text is printed at the bottom of the page -by @TeX{}; Info may format in either `End' node or `Separate' node style. -@xref{Footnotes}.@refill - -@item @@footnotestyle @var{style} -Specify an Info file's footnote style, either @samp{end} for the end -node style or @samp{separate} for the separate node style. -@xref{Footnotes}.@refill - -@item @@format -Begin a kind of example. Like @code{@@example} or @code{@@display}, -but do not narrow the margins and do not select the fixed-width font. -Pair with @code{@@end format}. @xref{example, , -@code{@@example}}.@refill - -@item @@ftable @var{formatting-command} -Begin a two-column table, using @code{@@item} for each entry. -Automatically enter each of the items in the first column into the -index of functions. Pair with @code{@@end ftable}. The same as -@code{@@table}, except for indexing. @xref{ftable vtable, , -@code{@@ftable} and @code{@@vtable}}.@refill - -@item @@group -Hold text together that must appear on one printed page. Pair with -@code{@@end group}. Not relevant to Info. @xref{group, , -@code{@@group}}.@refill - -@item @@heading @var{title} -Print an unnumbered section-like heading in the text, but not in the -table of contents of a printed manual. In Info, the title is -underlined with equal signs. @xref{unnumberedsec appendixsec heading, -, Section Commands}.@refill - -@item @@headings @var{on-off-single-double} -Turn page headings on or off, or specify single-sided or double-sided -page headings for printing. @code{@@headings on} is synonymous with -@code{@@headings double}. @xref{headings on off, , The -@code{@@headings} Command}.@refill - -@item @@i@{@var{text}@} -Print @var{text} in @i{italic} font. No effect in Info. -@xref{Fonts}.@refill - -@item @@ifclear @var{flag} -If @var{flag} is cleared, the Texinfo formatting commands format text -between @code{@@ifclear @var{flag}} and the following @code{@@end -ifclear} command. -@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill - -@item @@ifinfo -Begin a stretch of text that will be ignored by @TeX{} when it -typesets the printed manual. The text appears only in the Info file. -Pair with @code{@@end ifinfo}. @xref{Conditionals, , Conditionally -Visible Text}.@refill - -@item @@ifset @var{flag} -If @var{flag} is set, the Texinfo formatting commands format text -between @code{@@ifset @var{flag}} and the following @code{@@end ifset} -command. -@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill - -@item @@iftex -Begin a stretch of text that will not appear in the Info file, but -will be processed only by @TeX{}. Pair with @code{@@end iftex}. -@xref{Conditionals, , Conditionally Visible Text}.@refill - -@item @@ignore -Begin a stretch of text that will not appear in either the Info file -or the printed output. Pair with @code{@@end ignore}. -@xref{Comments, , Comments and Ignored Text}.@refill - -@item @@include @var{filename} -Incorporate the contents of the file @var{filename} into the Info file -or printed document. @xref{Include Files}.@refill - -@item @@inforef@{@var{node-name}, [@var{entry-name}], @var{info-file-name}@} -Make a cross reference to an Info file for which there is no printed -manual. @xref{inforef, , Cross references using -@code{@@inforef}}.@refill - -@item \input @var{macro-definitions-file} -Use the specified macro definitions file. This command is used only -in the first line of a Texinfo file to cause @TeX{} to make use of the -@file{texinfo} macro definitions file. The backslash in @code{\input} -is used instead of an @code{@@} because @TeX{} does not properly -recognize @code{@@} until after it has read the definitions file. -@xref{Header, , The Texinfo File Header}.@refill - -@item @@item -Indicate the beginning of a marked paragraph for @code{@@itemize} and -@code{@@enumerate}; indicate the beginning of the text of a first column -entry for @code{@@table}, @code{@@ftable}, and @code{@@vtable}. -@xref{Lists and Tables}.@refill - -@item @@itemize @var{mark-generating-character-or-command} -Produce a sequence of indented paragraphs, with a mark inside the left -margin at the beginning of each paragraph. Pair with @code{@@end -itemize}. @xref{itemize, , @code{@@itemize}}.@refill - -@item @@itemx -Like @code{@@item} but do not generate extra vertical space above the -item text. @xref{itemx, , @code{@@itemx}}.@refill - -@item @@kbd@{@var{keyboard-characters}@} -Indicate text that consists of characters of input to be typed by -users. @xref{kbd, , @code{@@kbd}}.@refill - -@item @@key@{@var{key-name}@} -Highlight @var{key-name}, a conventional name for a key on a keyboard. -@xref{key, , @code{@@key}}.@refill - -@item @@kindex @var{entry} -Add @var{entry} to the index of keys. @xref{Index Entries, , Defining the -Entries of an Index}.@refill - -@item @@lisp -Begin an example of Lisp code. Indent text, do not fill, and select -fixed-width font. Pair with @code{@@end lisp}. @xref{Lisp Example, , -@code{@@lisp}}.@refill - -@item @@majorheading @var{title} -Print a chapter-like heading in the text, but not in the table of -contents of a printed manual. Generate more vertical whitespace before -the heading than the @code{@@chapheading} command. In Info, the chapter -heading line is underlined with asterisks. @xref{majorheading & -chapheading, , @code{@@majorheading} and @code{@@chapheading}}.@refill - -@item @@menu -Mark the beginning of a menu of nodes in Info. No effect in a printed -manual. Pair with @code{@@end menu}. @xref{Menus}.@refill - -@item @@minus@{@} -Generate a minus sign. @xref{minus, , @code{@@minus}}.@refill - -@item @@need @var{n} -Start a new page in a printed manual if fewer than @var{n} mils -(thousandths of an inch) remain on the current page. @xref{need, , -@code{@@need}}.@refill - -@item @@node @var{name, next, previous, up} -Define the beginning of a new node in Info, and serve as a locator for -references for @TeX{}. @xref{node, , @code{@@node}}.@refill - -@need 200 -@item @@noindent -Prevent text from being indented as if it were a new paragraph. -@xref{noindent, , @code{@@noindent}}.@refill - -@item @@oddfooting [@var{left}] @@| [@var{center}] @@| [@var{right}] -Specify page footings for odd-numbered (right-hand) pages. Not relevant to -Info. @xref{Custom Headings, , How to Make Your Own Headings}.@refill - -@item @@oddheading [@var{left}] @@| [@var{center}] @@| [@var{right}] -Specify page headings for odd-numbered (right-hand) pages. Not relevant to -Info. @xref{Custom Headings, , How to Make Your Own Headings}.@refill - -@item @@page -Start a new page in a printed manual. No effect in Info. -@xref{page, , @code{@@page}}.@refill - -@item @@paragraphindent @var{indent} -Indent paragraphs by @var{indent} number of spaces; delete indentation -if the value of @var{indent} is 0; and do not change indentation if -@var{indent} is @code{asis}. @xref{paragraphindent, , Paragraph -Indenting}.@refill - -@item @@pindex @var{entry} -Add @var{entry} to the index of programs. @xref{Index Entries, , Defining -the Entries of an Index}.@refill - -@item @@point@{@} -Indicate the position of point in a buffer to the reader with a -glyph: @samp{@point{}}. @xref{Point Glyph, , Indicating -Point in a Buffer}.@refill - -@item @@print@{@} -Indicate printed output to the reader with a glyph: -@samp{@print{}}. @xref{Print Glyph}.@refill - -@item @@printindex @var{index-name} -Print an alphabetized two-column index in a printed manual or generate -an alphabetized menu of index entries for Info. @xref{Printing -Indices & Menus}.@refill - -@item @@pxref@{@var{node-name}, [@var{entry}], [@var{topic-or-title}], [@var{info-file}], [@var{manual}]@} -Make a reference that starts with a lower case `see' in a printed -manual. Use within parentheses only. Do not follow command with a -punctuation mark. The Info formatting commands automatically insert -terminating punctuation as needed, which is why you do not need to -insert punctuation. Only the first argument is mandatory. -@xref{pxref, , @code{@@pxref}}.@refill - -@item @@quotation -Narrow the margins to indicate text that is quoted from another real -or imaginary work. Write command on a line of its own. Pair with -@code{@@end quotation}. @xref{quotation, , -@code{@@quotation}}.@refill - -@need 100 -@item @@r@{@var{text}@} -Print @var{text} in @r{roman} font. No effect in Info. -@xref{Fonts}.@refill - -@need 300 -@item @@ref@{@var{node-name}, [@var{entry}], [@var{topic-or-title}], [@var{info-file}], [@var{manual}]@} -Make a reference. In a printed manual, the reference does not start -with a `See'. Follow command with a punctuation mark. Only the first -argument is mandatory. @xref{ref, , @code{@@ref}}.@refill - -@need 300 -@item @@refill -In Info, refill and indent the paragraph after all the other processing -has been done. No effect on @TeX{}, which always refills. This command -is no longer needed, since all formatters now automatically refill. -@xref{Refilling Paragraphs}.@refill - -@need 300 -@item @@result@{@} -Indicate the result of an expression to the reader with a special -glyph: @samp{@result{}}. @xref{result, , @code{@@result}}.@refill - -@item @@samp@{@var{text}@} -Highlight @var{text} that is a literal example of a sequence of -characters. Used for single characters, for statements, and often for -entire shell commands. @xref{samp, , @code{@@samp}}.@refill - -@item @@sc@{@var{text}@} -Set @var{text} in a printed output in @sc{the small caps font} and -set text in the Info file in uppercase letters. -@xref{Smallcaps}.@refill - -@item @@section @var{title} -Begin a section within a chapter. In a printed manual, the section -title is numbered and appears in the table of contents. In Info, the -title is underlined with equal signs. @xref{section, , -@code{@@section}}.@refill - -@item @@set @var{flag} [@var{string}] -Make @var{flag} active, causing the Texinfo formatting commands to -format text between subsequent pairs of @code{@@ifset @var{flag}} and -@code{@@end ifset} commands. Optionally, set value of @var{flag} to -@var{string}. -@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill - -@item @@setchapternewpage @var{on-off-odd} -Specify whether chapters start on new pages, and if so, whether on -odd-numbered (right-hand) new pages. @xref{setchapternewpage, , -@code{@@setchapternewpage}}.@refill - -@item @@setfilename @var{info-file-name} -Provide a name for the Info file. @xref{Conventions, , General -Syntactic Conventions}.@refill - -@item @@settitle @var{title} -Provide a title for page headers in a printed manual. -@xref{Conventions, , General Syntactic Conventions}.@refill - -@item @@shortcontents -Print a short table of contents. Not relevant to Info, which uses -menus rather than tables of contents. A synonym for -@code{@@summarycontents}. @xref{Contents, , Generating a Table of -Contents}.@refill - -@need 400 -@item @@smallbook -Cause @TeX{} to produce a printed manual in a 7 by 9.25 inch format -rather than the regular 8.5 by 11 inch format. @xref{smallbook, , -Printing Small Books}. Also, see @ref{smallexample & smalllisp, , -@code{@@smallexample} and @code{@@smalllisp}}.@refill - -@need 400 -@item @@smallexample -Indent text to indicate an example. Do not fill, select fixed-width -font. In @code{@@smallbook} format, print text in a smaller font than -with @code{@@example}. Pair with @code{@@end smallexample}. -@xref{smallexample & smalllisp, , @code{@@smallexample} and -@code{@@smalllisp}}.@refill - -@need 400 -@item @@smalllisp -Begin an example of Lisp code. Indent text, do not fill, select -fixed-width font. In @code{@@smallbook} format, print text in a -smaller font. Pair with @code{@@end smalllisp}. @xref{smallexample & -smalllisp, , @code{@@smallexample} and @code{@@smalllisp}}.@refill - -@need 700 -@item @@sp @var{n} -Skip @var{n} blank lines. @xref{sp, , @code{@@sp}}.@refill - -@need 700 -@item @@strong @var{text} -Emphasize @var{text} by typesetting it in a @strong{bold} font for the -printed manual and by surrounding it with asterisks for Info. -@xref{emph & strong, , Emphasizing Text}.@refill - -@item @@subheading @var{title} -Print an unnumbered subsection-like heading in the text, but not in -the table of contents of a printed manual. In Info, the title is -underlined with hyphens. @xref{unnumberedsubsec appendixsubsec -subheading, , @code{@@unnumberedsubsec} @code{@@appendixsubsec} -@code{@@subheading}}.@refill - -@item @@subsection @var{title} -Begin a subsection within a section. In a printed manual, the -subsection title is numbered and appears in the table of contents. In -Info, the title is underlined with hyphens. @xref{subsection, , -@code{@@subsection}}.@refill - -@item @@subsubheading @var{title} -Print an unnumbered subsubsection-like heading in the text, but not in -the table of contents of a printed manual. In Info, the title is -underlined with periods. @xref{subsubsection, , The `subsub' -Commands}.@refill - -@item @@subsubsection @var{title} -Begin a subsubsection within a subsection. In a printed manual, -the subsubsection title is numbered and appears in the table of -contents. In Info, the title is underlined with periods. -@xref{subsubsection, , The `subsub' Commands}.@refill - -@item @@subtitle @var{title} -In a printed manual, set a subtitle in a normal sized font flush to -the right-hand side of the page. Not relevant to Info, which does not -have title pages. @xref{title subtitle author, , @code{@@title} -@code{@@subtitle} and @code{@@author} Commands}.@refill - -@item @@summarycontents -Print a short table of contents. Not relevant to Info, which uses -menus rather than tables of contents. A synonym for -@code{@@shortcontents}. @xref{Contents, , Generating a Table of -Contents}.@refill - -@need 300 -@item @@syncodeindex @var{from-index} @var{into-index} -Merge the index named in the first argument into the index named in -the second argument, printing the entries from the first index in -@code{@@code} font. @xref{Combining Indices}.@refill - -@need 300 -@item @@synindex @var{from-index} @var{into-index} -Merge the index named in the first argument into the index named in -the second argument. Do not change the font of @var{from-index} -entries. @xref{Combining Indices}.@refill - -@need 100 -@item @@t@{@var{text}@} -Print @var{text} in a @t{fixed-width}, typewriter-like font. -No effect in Info. @xref{Fonts}.@refill - -@need 400 -@item @@table @var{formatting-command} -Begin a two-column table, using @code{@@item} for each entry. Write -each first column entry on the same line as @code{@@item}. First -column entries are printed in the font resulting from -@var{formatting-command}. Pair with @code{@@end table}. -@xref{Two-column Tables, , Making a Two-column Table}. -Also see @ref{ftable vtable, , @code{@@ftable} and @code{@@vtable}}, -and @ref{itemx, , @code{@@itemx}}.@refill - -@item @@TeX@{@} -Insert the logo @TeX{}. @xref{TeX and copyright, , Inserting @TeX{} -and @copyright{}}.@refill - -@item @@tex -Enter @TeX{} completely. Pair with @code{@@end tex}. @xref{Using -Ordinary TeX Commands, , Using Ordinary @TeX{} Commands}.@refill - -@item @@thischapter -In a heading or footing, stands for the number and name of the current -chapter, in the format `Chapter 1: Title'. @xref{Custom -Headings, , How to Make Your Own Headings}.@refill - -@item @@thischaptername -In a heading or footing, stands for the name of the current chapter. -@xref{Custom Headings, , How to Make Your Own Headings}.@refill - -@item @@thisfile -In a heading or footing, stands for the name of the current -@code{@@include} file. Does not insert anything if not within an -@code{@@include} file. @xref{Custom Headings, , How to Make Your Own -Headings}.@refill - -@item @@thispage -In a heading or footing, stands for the current page number. -@xref{Custom Headings, , How to Make Your Own Headings}.@refill - -@ignore -@item @@thissection -In a heading or footing, stands for the title of the current section. -@xref{Custom Headings, , How to Make Your Own Headings}.@refill -@end ignore - -@item @@thistitle -In a heading or footing, stands for the name of the document, as specified -by the @code{@@settitle} command. @xref{Custom Headings, , How to -Make Your Own Headings}.@refill - -@item @@tindex @var{entry} -Add @var{entry} to the index of data types. @xref{Index Entries, , -Defining the Entries of an Index}.@refill - -@item @@title @var{title} -In a printed manual, set a title flush to the left-hand side of the -page in a larger than normal font and underline it with a black rule. -Not relevant to Info, which does not have title pages. @xref{title -subtitle author, , The @code{@@title} @code{@@subtitle} and -@code{@@author} Commands}.@refill - -@need 400 -@item @@titlefont@{@var{text}@} -In a printed manual, print @var{text} in a larger than normal font. -Not relevant to Info, which does not have title pages. -@xref{titlefont center sp, , The @code{@@titlefont} @code{@@center} -and @code{@@sp} Commands}.@refill - -@need 300 -@item @@titlepage -Indicate to Texinfo the beginning of the title page. Write command on -a line of its own. Pair with @code{@@end titlepage}. Nothing between -@code{@@titlepage} and @code{@@end titlepage} appears in Info. -@xref{titlepage, , @code{@@titlepage}}.@refill - -@need 150 -@item @@today@{@} -Insert the current date, in `1 Jan 1900' style. @xref{Custom -Headings, , How to Make Your Own Headings}.@refill - -@item @@top @var{title} -In a Texinfo file to be formatted with @code{makeinfo}, identify the -topmost @code{@@node} line in the file, which must be written on the line -immediately preceding the @code{@@top} command. Used for -@code{makeinfo}'s node pointer insertion feature. The title is -underlined with asterisks. Both the @code{@@node} line and the @code{@@top} -line normally should be enclosed by @code{@@ifinfo} and @code{@@end -ifinfo}. In @TeX{} and @code{texinfo-format-buffer}, the @code{@@top} -command is merely a synonym for @code{@@unnumbered}. @xref{makeinfo -Pointer Creation, , Creating Pointers with @code{makeinfo}}. - -@item @@unnumbered @var{title} -In a printed manual, begin a chapter that appears without chapter -numbers of any kind. The title appears in the table of contents of a -printed manual. In Info, the title is underlined with asterisks. -@xref{unnumbered & appendix, , @code{@@unnumbered} and -@code{@@appendix}}.@refill - -@item @@unnumberedsec @var{title} -In a printed manual, begin a section that appears without section -numbers of any kind. The title appears in the table of contents of a -printed manual. In Info, the title is underlined with equal signs. -@xref{unnumberedsec appendixsec heading, , Section Commands}.@refill - -@item @@unnumberedsubsec @var{title} -In a printed manual, begin an unnumbered subsection within a -chapter. The title appears in the table of contents of a printed -manual. In Info, the title is underlined with hyphens. -@xref{unnumberedsubsec appendixsubsec subheading, , -@code{@@unnumberedsubsec} @code{@@appendixsubsec} -@code{@@subheading}}.@refill - -@item @@unnumberedsubsubsec @var{title} -In a printed manual, begin an unnumbered subsubsection within a -chapter. The title appears in the table of contents of a printed -manual. In Info, the title is underlined with periods. -@xref{subsubsection, , The `subsub' Commands}.@refill - -@item @@value@{@var{flag}@} -Replace @var{flag} with the value to which it is set by @code{@@set -@var{flag}}. -@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill - -@item @@var@{@var{metasyntactic-variable}@} -Highlight a metasyntactic variable, which is something that stands for -another piece of text. @xref{var, , Indicating Metasyntactic -Variables}.@refill - -@need 400 -@item @@vindex @var{entry} -Add @var{entry} to the index of variables. @xref{Index Entries, , -Defining the Entries of an Index}.@refill - -@need 400 -@item @@vskip @var{amount} -In a printed manual, insert whitespace so as to push text on the -remainder of the page towards the bottom of the page. Used in -formatting the copyright page with the argument @samp{0pt plus -1filll}. (Note spelling of @samp{filll}.) @code{@@vskip} may be used -only in contexts ignored for Info. @xref{Copyright & Permissions, , -The Copyright Page and Printed Permissions}.@refill - -@need 400 -@item @@vtable @var{formatting-command} -Begin a two-column table, using @code{@@item} for each entry. -Automatically enter each of the items in the first column into the -index of variables. Pair with @code{@@end vtable}. The same as -@code{@@table}, except for indexing. @xref{ftable vtable, , -@code{@@ftable} and @code{@@vtable}}.@refill - -@need 400 -@item @@w@{@var{text}@} -Prevent @var{text} from being split across two lines. Do not end a -paragraph that uses @code{@@w} with an @code{@@refill} command. -In the Texinfo file, keep @var{text} on one line. -@xref{w, , @code{@@w}}.@refill - -@need 400 -@item @@xref@{@var{node-name}, [@var{entry}], [@var{topic-or-title}], [@var{info-file}], [@var{manual}]@} -Make a reference that starts with `See' in a printed manual. Follow -command with a punctuation mark. Only the first argument is -mandatory. @xref{xref, , @code{@@xref}}.@refill -@end table - -@node Tips, Sample Texinfo File, Command List, Top -@comment node-name, next, previous, up -@appendix Tips and Hints - -Here are some tips for writing Texinfo documentation:@refill - -@cindex Tips -@cindex Usage tips -@cindex Hints -@itemize @bullet -@item -Write in the present tense, not in the past or the future. - -@item -Write actively! For example, write ``We recommend that @dots{}'' rather -than ``It is recommended that @dots{}''. - -@item -Use 70 or 72 as your fill column. Longer lines are hard to read. - -@item -Include a copyright notice and copying permissions. -@end itemize - -@subsubheading Index, index, index! - -Write many index entries, in different ways. -Readers like indices; they are helpful and convenient. - -Although it is easiest to write index entries as you write the body of -the text, some people prefer to write entries afterwards. In either -case, write an entry before the paragraph to which it applies. This -way, an index entry points to the first page of a paragraph that is -split across pages. - -Here are more hints we have found valuable: - -@itemize @bullet -@item -Write each index entry differently, so each entry refers to a different -place in the document. The index of an Info file lists only one -location for each entry. - -@item -Write index entries only where a topic is discussed significantly. For -example, it is not useful to index ``debugging information'' in a -chapter on reporting bugs. Someone who wants to know about debugging -information will certainly not find it in that chapter. - -@item -Consistently capitalize the first word of every index entry, or else use -lower case. According to convention, you should capitalize the first -word of an index entry. However, this practice may make an index look -crowded. Some writers prefer lower case. Regardless of which you -prefer, choose one style and stick to it. Mixing the two styles looks -bad. - -@item -Always capitalize or use upper case for those words in an index for -which this is proper, such as names of countries or acronyms. - -@item -Write the indexing commands that refer to a whole section immediately -after the section command, and write the indexing commands that refer to -the paragraph before the paragraph. - -@need 1000 -In the example that follows, a blank line comes after the index -entry for ``Leaping'': - -@example -@group -@@section The Dog and the Fox -@@cindex Jumping, in general -@@cindex Leaping - -@@cindex Dog, lazy, jumped over -@@cindex Lazy dog jumped over -@@cindex Fox, jumps over dog -@@cindex Quick fox jumps over dog -The quick brown fox jumps over the lazy dog. -@end group -@end example - -@noindent -(Note that the example shows entries for the same concept that are -written in different ways---@samp{Lazy dog}, and @samp{Dog, lazy}---so -readers can look up the concept in different ways.) -@end itemize - -@subsubheading Blank lines - -@itemize @bullet -@item -Insert a blank line between a sectioning command and the first following -sentence or paragraph, or between the indexing commands associated with -the sectioning command and the first following sentence or paragraph, as -shown in the tip on indexing. Otherwise, a formatter may fold title and -paragraph together. - -@item -Always insert a blank line before an @code{@@table} command and after an -@code{@@end table} command; but never insert a blank line after an -@code{@@table} command or before an @code{@@end table} command. - -@need 1000 -For example, - -@example -@group -Types of fox: - -@@table @@samp -@@item Quick -Jump over lazy dogs. -@end group - -@group -@@item Brown -Also jump over lazy dogs. -@@end table - -@end group -@group -@@noindent -On the other hand, @dots{} -@end group -@end example - -Insert blank lines before and after @code{@@itemize} @dots{} @code{@@end -itemize} and @code{@@enumerate} @dots{} @code{@@end enumerate} in the -same way. -@end itemize - -@subsubheading Complete phrases - -Complete phrases are easier to read than @dots{} - -@itemize @bullet -@item -Write entries in an itemized list as complete sentences; or at least, as -complete phrases. Incomplete expressions @dots{} awkward @dots{} like -this. - -@item -Write the prefatory sentence or phrase for a multi-item list or table as -a complete expression. Do not write ``You can set:''; instead, write -``You can set these variables:''. The former expression sounds cut off. -@end itemize - -@subsubheading Editions, dates and versions - -Write the edition and version numbers and date in three places in every -manual: - -@enumerate -@item -In the first @code{@@ifinfo} section, for people reading the Texinfo file. - -@item -In the @code{@@titlepage} section, for people reading the printed manual. - -@item -In the `Top' node, for people reading the Info file. -@end enumerate - -@noindent -Also, it helps to write a note before the first @code{@@ifinfo} -section to explain what you are doing. - -@need 800 -@noindent -For example: - -@example -@group -@@c ===> NOTE! <== -@@c Specify the edition and version numbers and date -@@c in *three* places: -@@c 1. First ifinfo section 2. title page 3. top node -@@c To find the locations, search for !!set -@end group - -@group -@@ifinfo -@@c !!set edition, date, version -This is Edition 4.03, January 1992, -of the @@cite@{GDB Manual@} for GDB Version 4.3. -@dots{} -@end group -@end example - -@noindent ----or use @code{@@set} and @code{@@value} -(@pxref{value Example, , @code{@@value} Example}). - -@subsubheading Definition Commands - -Definition commands are @code{@@deffn}, @code{@@defun}, -@code{@@defmac}, and the like, and enable you to write descriptions in -a uniform format.@refill - -@itemize @bullet -@item -Write just one definition command for each entity you define with a -definition command. The automatic indexing feature creates an index -entry that leads the reader to the definition. - -@item -Use @code{@@table} @dots{} @code{@@end table} in an appendix that -contains a summary of functions, not @code{@@deffn} or other definition -commands. -@end itemize - -@subsubheading Capitalization - -@itemize @bullet -@item -Capitalize @samp{Texinfo}; it is a name. Do not write the @samp{x} or -@samp{i} in upper case. - -@item -Capitalize @samp{Info}; it is a name. - -@item -Write @TeX{} using the @code{@@TeX@{@}} command. Note the uppercase -@samp{T} and @samp{X}. This command causes the formatters to -typeset the name according to the wishes of Donald Knuth, who wrote -@TeX{}. -@end itemize - -@subsubheading Spaces - -Do not use spaces to format a Texinfo file, except inside of -@code{@@example} @dots{} @code{@@end example} and similar commands. - -@need 700 -For example, @TeX{} fills the following: - -@example -@group - @@kbd@{C-x v@} - @@kbd@{M-x vc-next-action@} - Perform the next logical operation - on the version-controlled file - corresponding to the current buffer. -@end group -@end example - -@need 950 -@noindent -so it looks like this: - -@iftex -@quotation - @kbd{C-x v} - @kbd{M-x vc-next-action} - Perform the next logical operation on the version-controlled file - corresponding to the current buffer. -@end quotation -@end iftex -@ifinfo -@quotation -`C-x v' `M-x vc-next-action' Perform the next logical operation on the -version-controlled file corresponding to the current buffer. -@end quotation -@end ifinfo - -@noindent -In this case, the text should be formatted with -@code{@@table}, @code{@@item}, and @code{@@itemx}, to create a table. - -@subsubheading @@code, @@samp, @@var, and @samp{---} - -@itemize @bullet -@item -Use @code{@@code} around Lisp symbols, including command names. -For example, - -@example -The main function is @@code@{vc-next-action@}, @dots{} -@end example - -@item -Avoid putting letters such as @samp{s} immediately after an -@samp{@@code}. Such letters look bad. - -@item -Use @code{@@var} around meta-variables. Do not write angle brackets -around them. - -@item -Use three hyphens in a row, @samp{---}, to indicate a long dash. @TeX{} -typesets these as a long dash and the Info formatters reduce three -hyphens to two. -@end itemize - -@subsubheading Periods Outside of Quotes - -Place periods and other punctuation marks @emph{outside} of quotations, -unless the punctuation is part of the quotation. This practice goes against -convention, but enables the reader to distinguish between the contents -of the quotation and the whole passage. - -For example, you should write the following sentence with the period -outside the end quotation marks: - -@example -Evidently, @samp{au} is an abbreviation for ``author''. -@end example - -@noindent -since @samp{au} does @emph{not} serve as an abbreviation for -@samp{author.} (with a period following the word). - -@subsubheading Introducing New Terms - -@itemize @bullet -@item -Introduce new terms so that a user who does not know them can understand -them from context; or write a definition for the term. - -For example, in the following, the terms ``check in'', ``register'' and -``delta'' are all appearing for the first time; the example sentence should be -rewritten so they are understandable. - -@quotation -The major function assists you in checking in a file to your -version control system and registering successive sets of changes to -it as deltas. -@end quotation - -@item -Use the @code{@@dfn} command around a word being introduced, to indicate -that the user should not expect to know the meaning already, and should -expect to learn the meaning from this passage. -@end itemize - -@subsubheading @@pxref - -@c !!! maybe include this in the tips on pxref -@ignore -By the way, it is okay to use pxref with something else in front of -it within the parens, as long as the pxref is followed by the close -paren, and the material inside the parents is not part of a larger -sentence. Also, you can use xref inside parens as part of a complete -sentence so long as you terminate the cross reference with punctuation. -@end ignore -Absolutely never use @code{@@pxref} except in the special context for -which it is designed: inside parentheses, with the closing parenthesis -following immediately after the closing brace. One formatter -automatically inserts closing punctuation and the other does not. This -means that the output looks right both in printed output and in an Info -file, but only when the command is used inside parentheses. - -@subsubheading Invoking from a Shell - -You can invoke programs such as Emacs, GCC, and GAWK from a shell. -The documentation for each program should contain a section that -describes this. Unfortunately, if the node names and titles for these -sections are all different, readers find it hard to search for the -section.@refill - -Name such sections with a phrase beginning with the word -@w{`Invoking @dots{}'}, as in `Invoking Emacs'; this way -users can find the section easily. - -@subsubheading @sc{ansi c} Syntax - -When you use @code{@@example} to describe a C function's calling -conventions, use the @sc{ansi c} syntax, like this:@refill - -@example -void dld_init (char *@@var@{path@}); -@end example - -@noindent -And in the subsequent discussion, refer to the argument values by -writing the same argument names, again highlighted with -@code{@@var}.@refill - -@need 800 -Avoid the obsolete style that looks like this:@refill - -@example -#include <dld.h> - -dld_init (path) -char *path; -@end example - -Also, it is best to avoid writing @code{#include} above the -declaration just to indicate that the function is declared in a -header file. The practice may give the misimpression that the -@code{#include} belongs near the declaration of the function. Either -state explicitly which header file holds the declaration or, better -yet, name the header file used for a group of functions at the -beginning of the section that describes the functions.@refill - -@subsubheading Bad Examples - -Here are several examples of bad writing to avoid: - -In this example, say, `` @dots{} you must @code{@@dfn}@{check -in@} the new version.'' That flows better. - -@quotation -When you are done editing the file, you must perform a -@code{@@dfn}@{check in@}. -@end quotation - -In the following example, say, ``@dots{} makes a unified interface such as VC -mode possible.'' - -@quotation -SCCS, RCS and other version-control systems all perform similar -functions in broadly similar ways (it is this resemblance which makes -a unified control mode like this possible). -@end quotation - -And in this example, you should specify what `it' refers to: - -@quotation -If you are working with other people, it assists in coordinating -everyone's changes so they do not step on each other. -@end quotation - -@subsubheading And Finally @dots{} - -@itemize @bullet -@item -Pronounce @TeX{} as if the @samp{X} were a Greek `chi', as the last -sound in the name `Bach'. But pronounce Texinfo as in `speck': -@samp{teckinfo}. - -@item -Write notes for yourself at the very end of a Texinfo file after the -@code{@@bye}. None of the formatters process text after the -@code{@@bye}; it is as if the text were within @code{@@ignore} @dots{} -@code{@@end ignore}. -@end itemize - -@node Sample Texinfo File, Sample Permissions, Tips, Top -@comment node-name, next, previous, up -@appendix A Sample Texinfo File -@cindex Sample Texinfo file, no comments - -Here is a complete, short sample Texinfo file, without any commentary. -You can see this file, with comments, in the first chapter. -@xref{Short Sample, , A Short Sample Texinfo File}. - -@sp 1 -@example -\input texinfo @@c -*-texinfo-*- -@@c %**start of header -@@setfilename sample.info -@@settitle Sample Document -@@c %**end of header - -@@setchapternewpage odd - -@@ifinfo -This is a short example of a complete Texinfo file. - -Copyright 1990 Free Software Foundation, Inc. -@@end ifinfo - -@@titlepage -@@sp 10 -@@comment The title is printed in a large font. -@@center @@titlefont@{Sample Title@} - -@@c The following two commands start the copyright page. -@@page -@@vskip 0pt plus 1filll -Copyright @@copyright@{@} 1990 Free Software Foundation, Inc. -@@end titlepage - -@@node Top, First Chapter, (dir), (dir) -@@comment node-name, next, previous, up - -@@menu -* First Chapter:: The first chapter is the - only chapter in this sample. -* Concept Index:: This index has two entries. -@@end menu - -@@node First Chapter, Concept Index, Top, Top -@@comment node-name, next, previous, up -@@chapter First Chapter -@@cindex Sample index entry - -This is the contents of the first chapter. -@@cindex Another sample index entry - -Here is a numbered list. - -@@enumerate -@@item -This is the first item. - -@@item -This is the second item. -@@end enumerate - -The @@code@{makeinfo@} and @@code@{texinfo-format-buffer@} -commands transform a Texinfo file such as this into -an Info file; and @@TeX@{@} typesets it for a printed -manual. - -@@node Concept Index, , First Chapter, Top -@@comment node-name, next, previous, up -@@unnumbered Concept Index - -@@printindex cp - -@@contents -@@bye -@end example - -@node Sample Permissions, Include Files, Sample Texinfo File, Top -@appendix Sample Permissions -@cindex Permissions -@cindex Copying permissions - -Texinfo files should contain sections that tell the readers that they -have the right to copy and distribute the Texinfo file, the Info file, -and the printed manual.@refill - -Also, if you are writing a manual about software, you should explain -that the software is free and either include the GNU General Public -License (GPL) or provide a reference to it. @xref{Distrib, , -Distribution, emacs, The GNU Emacs Manual}, for an example of the text -that could be used in the software ``Distribution'', ``General Public -License'', and ``NO WARRANTY'' sections of a document. @xref{Copying, -, Texinfo Copying Conditions}, for an example of a brief explanation -of how the copying conditions provide you with rights. @refill - -@menu -* Inserting Permissions:: How to put permissions in your document. -* ifinfo Permissions:: Sample @samp{ifinfo} copying permissions. -* Titlepage Permissions:: Sample Titlepage copying permissions. -@end menu - -@node Inserting Permissions, ifinfo Permissions, , Sample Permissions -@ifinfo -@appendixsec Inserting Permissions -@end ifinfo - -In a Texinfo file, the first @code{@@ifinfo} section usually begins -with a line that says what the file documents. This is what a person -reading the unprocessed Texinfo file or using the advanced Info -command @kbd{g *} sees first. @inforef{Expert, Advanced Info -commands, info}, for more information. (A reader using the regular -Info commands usually starts reading at the first node and skips -this first section, which is not in a node.)@refill - -In the @code{@@ifinfo} section, the summary sentence is followed by a -copyright notice and then by the copying permission notice. One of -the copying permission paragraphs is enclosed in @code{@@ignore} and -@code{@@end ignore} commands. This paragraph states that the Texinfo -file can be processed through @TeX{} and printed, provided the printed -manual carries the proper copying permission notice. This paragraph -is not made part of the Info file since it is not relevant to the Info -file; but it is a mandatory part of the Texinfo file since it permits -people to process the Texinfo file in @TeX{} and print the -results.@refill - -In the printed manual, the Free Software Foundation copying permission -notice follows the copyright notice and publishing information and is -located within the region delineated by the @code{@@titlepage} and -@code{@@end titlepage} commands. The copying permission notice is exactly -the same as the notice in the @code{@@ifinfo} section except that the -paragraph enclosed in @code{@@ignore} and @code{@@end ignore} commands is -not part of the notice.@refill - -To make it simple to insert a permission notice into each section of -the Texinfo file, sample permission notices for each section are -reproduced in full below.@refill - -Note that you may need to specify the correct name of a section -mentioned in the permission notice. For example, in @cite{The GDB -Manual}, the name of the section referring to the General Public -License is called the ``GDB General Public License'', but in the -sample shown below, that section is referred to generically as the -``GNU General Public License''. If the Texinfo file does not carry a -copy of the General Public License, leave out the reference to it, but -be sure to include the rest of the sentence.@refill - -@node ifinfo Permissions, Titlepage Permissions, Inserting Permissions, Sample Permissions -@comment node-name, next, previous, up -@appendixsec @samp{ifinfo} Copying Permissions -@cindex @samp{ifinfo} permissions - -In the @code{@@ifinfo} section of a Texinfo file, the standard Free -Software Foundation permission notice reads as follows:@refill - -@example -This file documents @dots{} - -Copyright 1992 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim -copies of this manual provided the copyright notice and -this permission notice are preserved on all copies. - -@@ignore -Permission is granted to process this file through TeX -and print the results, provided the printed document -carries a copying permission notice identical to this -one except for the removal of this paragraph (this -paragraph not being relevant to the printed manual). - -@@end ignore -Permission is granted to copy and distribute modified -versions of this manual under the conditions for -verbatim copying, provided also that the sections -entitled ``Copying'' and ``GNU General Public License'' -are included exactly as in the original, and provided -that the entire resulting derived work is distributed -under the terms of a permission notice identical to this -one. - -Permission is granted to copy and distribute -translations of this manual into another language, -under the above conditions for modified versions, -except that this permission notice may be stated in a -translation approved by the Free Software Foundation. -@end example - -@node Titlepage Permissions, , ifinfo Permissions, Sample Permissions -@comment node-name, next, previous, up -@appendixsec Titlepage Copying Permissions -@cindex Titlepage permissions - -In the @code{@@titlepage} section of a Texinfo file, the standard Free -Software Foundation copying permission notice follows the copyright -notice and publishing information. The standard phrasing is as -follows:@refill - -@example -Permission is granted to make and distribute verbatim -copies of this manual provided the copyright notice and -this permission notice are preserved on all copies. - -Permission is granted to copy and distribute modified -versions of this manual under the conditions for -verbatim copying, provided also that the sections -entitled ``Copying'' and ``GNU General Public License'' -are included exactly as in the original, and provided -that the entire resulting derived work is distributed -under the terms of a permission notice identical to this -one. - -Permission is granted to copy and distribute -translations of this manual into another language, -under the above conditions for modified versions, -except that this permission notice may be stated in a -translation approved by the Free Software Foundation. -@end example - -@node Include Files, Headings, Sample Permissions, Top -@comment node-name, next, previous, up -@appendix Include Files -@cindex Include files - -When @TeX{} or an Info formatting command sees an @code{@@include} -command in a Texinfo file, it processes the contents of the file named -by the command and incorporates them into the @sc{dvi} or Info file being -created. Index entries from the included file are incorporated into -the indices of the output file.@refill - -Include files let you keep a single large document as a collection of -conveniently small parts.@refill - -@menu -* Using Include Files:: How to use the @code{@@include} command. -* texinfo-multiple-files-update:: How to create and update nodes and - menus when using included files. -* Include File Requirements:: What @code{texinfo-multiple-files-update} expects. -* Sample Include File:: A sample outer file with included files - within it; and a sample included file. -* Include Files Evolution:: How use of the @code{@@include} command - has changed over time. -@end menu - -@node Using Include Files, texinfo-multiple-files-update, , Include Files -@appendixsec How to Use Include Files -@findex include - -To include another file within a Texinfo file, write the -@code{@@include} command at the beginning of a line and follow it on -the same line by the name of a file to be included. For -example:@refill - -@example -@@include buffers.texi -@end example - -An included file should simply be a segment of text that you expect to -be included as is into the overall or @dfn{outer} Texinfo file; it -should not contain the standard beginning and end parts of a Texinfo -file. In particular, you should not start an included file with a -line saying @samp{\input texinfo}; if you do, that phrase is inserted -into the output file as is. Likewise, you should not end an included -file with an @code{@@bye} command; nothing after @code{@@bye} is -formatted.@refill - -In the past, you were required to write an @code{@@setfilename} line at the -beginning of an included file, but no longer. Now, it does not matter -whether you write such a line. If an @code{@@setfilename} line exists -in an included file, it is ignored.@refill - -Conventionally, an included file begins with an @code{@@node} line that -is followed by an @code{@@chapter} line. Each included file is one -chapter. This makes it easy to use the regular node and menu creating -and updating commands to create the node pointers and menus within the -included file. However, the simple Emacs node and menu creating and -updating commands do not work with multiple Texinfo files. Thus you -cannot use these commands to fill in the `Next', `Previous', and `Up' -pointers of the @code{@@node} line that begins the included file. Also, -you cannot use the regular commands to create a master menu for the -whole file. Either you must insert the menus and the `Next', -`Previous', and `Up' pointers by hand, or you must use the GNU Emacs -Texinfo mode command, @code{texinfo-multiple-files-update}, that is -designed for @code{@@include} files.@refill - -@node texinfo-multiple-files-update, Include File Requirements, Using Include Files, Include Files -@appendixsec @code{texinfo-multiple-files-update} -@findex texinfo-multiple-files-update - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -GNU Emacs Texinfo mode provides a command to handle included files -called @code{texinfo-multiple-files-update}. This command creates or -updates `Next', `Previous', and `Up' pointers of included files as -well as those in the outer or overall Texinfo file, and it creates or -updates a main menu in the outer file. Depending whether you call it -with optional arguments, the command updates only the pointers in the -first @code{@@node} line of the included files or all of them:@refill - -@table @kbd -@item M-x texinfo-multiple-files-update -Called without any arguments:@refill - -@itemize @minus -@item -Create or update the `Next', `Previous', and `Up' pointers of the -first @code{@@node} line in each file included in an outer or overall -Texinfo file.@refill - -@item -Create or update the `Top' level node pointers of the outer or -overall file.@refill - -@item -Create or update a main menu in the outer file.@refill -@end itemize - -@item C-u M-x texinfo-multiple-files-update -Called with @kbd{C-u} as a prefix argument: - -@itemize @minus{} -@item -Create or update pointers in the first @code{@@node} line in each -included file. - -@item -Create or update the `Top' level node pointers of the outer file. - -@item -Create and insert a master menu in the outer file. The master menu -is made from all the menus in all the included files.@refill -@end itemize - -@item C-u 8 M-x texinfo-multiple-files-update -Called with a numeric prefix argument, such as @kbd{C-u 8}: - -@itemize @minus -@item -Create or update @strong{all} the `Next', `Previous', and `Up' pointers -of all the included files.@refill - -@item -Create or update @strong{all} the menus of all the included -files.@refill - -@item -Create or update the `Top' level node pointers of the outer or -overall file.@refill - -@item -And then create a master menu in the outer file. This is similar to -invoking @code{texinfo-master-menu} with an argument when you are -working with just one file.@refill -@end itemize -@end table - -Note the use of the prefix argument in interactive use: with a regular -prefix argument, just @w{@kbd{C-u}}, the -@code{texinfo-multiple-files-update} command inserts a master menu; -with a numeric prefix argument, such as @kbd{C-u 8}, the command -updates @strong{every} pointer and menu in @strong{all} the files and then inserts a -master menu.@refill - -@node Include File Requirements, Sample Include File, texinfo-multiple-files-update, Include Files -@appendixsec Include File Requirements -@cindex Include file requirements -@cindex Requirements for include files - -If you plan to use the @code{texinfo-multiple-files-update} command, -the outer Texinfo file that lists included files within it should -contain nothing but the beginning and end parts of a Texinfo file, and -a number of @code{@@include} commands listing the included files. It -should not even include indices, which should be listed in an included -file of their own.@refill - -Moreover, each of the included files must contain exactly one highest -level node (conventionally, @code{@@chapter} or equivalent), -and this node must be the first node in the included file. -Furthermore, each of these highest level nodes in each included file -must be at the same hierarchical level in the file structure. -Usually, each is an @code{@@chapter}, an @code{@@appendix}, or an -@code{@@unnumbered} node. Thus, normally, each included file contains -one, and only one, chapter or equivalent-level node.@refill - -The outer file should contain only @emph{one} node, the `Top' node. It -should @emph{not} contain any nodes besides the single `Top' node. The -@code{texinfo-multiple-files-update} command will not process -them.@refill - -@node Sample Include File, Include Files Evolution, Include File Requirements, Include Files -@appendixsec Sample File with @code{@@include} -@cindex Sample @code{@@include} file -@cindex Include file sample -@cindex @code{@@include} file sample - -Here is an example of a complete outer Texinfo file with @code{@@include} files -within it before running @code{texinfo-multiple-files-update}, which -would insert a main or master menu:@refill - -@example -@group -\input texinfo @@c -*-texinfo-*- -@c %**start of header -@@setfilename include-example.info -@@settitle Include Example -@c %**end of header -@end group - -@group -@@setchapternewpage odd -@@titlepage -@@sp 12 -@@center @@titlefont@{Include Example@} -@@sp 2 -@@center by Whom Ever -@end group - -@group -@@page -@@vskip 0pt plus 1filll -Copyright @@copyright@{@} 1990 Free Software Foundation, Inc. -@@end titlepage -@end group - -@group -@@ifinfo -@@node Top, First, (dir), (dir) -@@top Master Menu -@@end ifinfo -@end group - -@group -@@include foo.texinfo -@@include bar.texinfo -@@include concept-index.texinfo -@end group - -@group -@@summarycontents -@@contents - -@@bye -@end group -@end example - -An included file, such as @file{foo.texinfo}, might look like -this:@refill - -@example -@group -@@node First, Second, , Top -@@chapter First Chapter - -Contents of first chapter @dots{} -@end group -@end example - -The full contents of @file{concept-index.texinfo} might be as simple as this: - -@example -@group -@@node Concept Index, , Second, Top -@@unnumbered Concept Index - -@@printindex cp -@end group -@end example - -The outer Texinfo source file for @cite{The GNU Emacs Lisp Reference -Manual} is named @file{elisp.texi}. This outer file contains a master -menu with 417 entries and a list of 41 @code{@@include} -files.@refill - -@node Include Files Evolution, , Sample Include File, Include Files -@comment node-name, next, previous, up -@appendixsec Evolution of Include Files - -When Info was first created, it was customary to create many small -Info files on one subject. Each Info file was formatted from its own -Texinfo source file. This custom meant that Emacs did not need to -make a large buffer to hold the whole of a large Info file when -someone wanted information; instead, Emacs allocated just enough -memory for the small Info file that contained the particular -information sought. This way, Emacs could avoid wasting memory.@refill - -References from one file to another were made by referring to the file -name as well as the node name. (@xref{Other Info Files, , Referring to -Other Info Files}. Also, see @ref{Four and Five Arguments, , -@code{@@xref} with Four and Five Arguments}.)@refill - -Include files were designed primarily as a way to create a single, -large printed manual out of several smaller Info files. In a printed -manual, all the references were within the same document, so @TeX{} -could automatically determine the references' page numbers. The Info -formatting commands used include files only for creating joint -indices; each of the individual Texinfo files had to be formatted for -Info individually. (Each, therefore, required its own -@code{@@setfilename} line.)@refill - -However, because large Info files are now split automatically, it is -no longer necessary to keep them small.@refill - -Nowadays, multiple Texinfo files are used mostly for large documents, -such as @cite{The GNU Emacs Lisp Reference Manual}, and for projects -in which several different people write different sections of a -document simultaneously.@refill - -In addition, the Info formatting commands have been extended to work -with the @code{@@include} command so as to create a single large Info -file that is split into smaller files if necessary. This means that -you can write menus and cross references without naming the different -Texinfo files.@refill - -@node Headings, Catching Mistakes, Include Files, Top -@comment node-name, next, previous, up -@appendix Page Headings -@cindex Headings -@cindex Footings -@cindex Page numbering -@cindex Page headings -@cindex Formatting headings and footings - -Most printed manuals contain headings along the top of every page -except the title and copyright pages. Some manuals also contain -footings. (Headings and footings have no meaning to Info, which is -not paginated.)@refill - -@menu -* Headings Introduced:: Conventions for using page headings. -* Heading Format:: Standard page heading formats. -* Heading Choice:: How to specify the type of page heading. -* Custom Headings:: How to create your own headings and footings. -@end menu - -@node Headings Introduced, Heading Format, , Headings -@ifinfo -@heading Headings Introduced -@end ifinfo - -Texinfo provides standard page heading formats for manuals that are printed -on one side of each sheet of paper and for manuals that are printed on -both sides of the paper. Usually, you will use one or other of these -formats, but you can specify your own format, if you wish.@refill - -In addition, you can specify whether chapters should begin on a new -page, or merely continue the same page as the previous chapter; and if -chapters begin on new pages, you can specify whether they must be -odd-numbered pages.@refill - -By convention, a book is printed on both sides of each sheet of paper. -When you open a book, the right-hand page is odd-numbered, and -chapters begin on right-hand pages---a preceding left-hand page is -left blank if necessary. Reports, however, are often printed on just -one side of paper, and chapters begin on a fresh page immediately -following the end of the preceding chapter. In short or informal -reports, chapters often do not begin on a new page at all, but are -separated from the preceding text by a small amount of whitespace.@refill - -The @code{@@setchapternewpage} command controls whether chapters begin -on new pages, and whether one of the standard heading formats is used. -In addition, Texinfo has several heading and footing commands that you -can use to generate your own heading and footing formats.@refill - -In Texinfo, headings and footings are single lines at the tops and -bottoms of pages; you cannot create multiline headings or footings. -Each header or footer line is divided into three parts: a left part, a -middle part, and a right part. Any part, or a whole line, may be left -blank. Text for the left part of a header or footer line is set -flushleft; text for the middle part is centered; and, text for the -right part is set flushright.@refill - -@node Heading Format, Heading Choice, Headings Introduced, Headings -@comment node-name, next, previous, up -@appendixsec Standard Heading Formats - -Texinfo provides two standard heading formats, one for manuals printed -on one side of each sheet of paper, and the other for manuals printed -on both sides of the paper. - -By default, nothing is specified for the footing of a Texinfo file, -so the footing remains blank.@refill - -The standard format for single-sided printing consists of a header -line in which the left-hand part contains the name of the chapter, the -central part is blank, and the right-hand part contains the page -number.@refill - -@need 950 -A single-sided page looks like this: - -@example -@group - _______________________ - | | - | chapter page number | - | | - | Start of text ... | - | ... | - | | - -@end group -@end example - -The standard format for two-sided printing depends on whether the page -number is even or odd. By convention, even-numbered pages are on the -left- and odd-numbered pages are on the right. (@TeX{} will adjust the -widths of the left- and right-hand margins. Usually, widths are -correct, but during double-sided printing, it is wise to check that -pages will bind properly---sometimes a printer will produce output in -which the even-numbered pages have a larger right-hand margin than the -odd-numbered pages.)@refill - -In the standard double-sided format, the left part of the left-hand -(even-numbered) page contains the page number, the central part is -blank, and the right part contains the title (specified by the -@code{@@settitle} command). The left part of the right-hand -(odd-numbered) page contains the name of the chapter, the central part -is blank, and the right part contains the page number.@refill - -@need 750 -Two pages, side by side as in an open book, look like this:@refill - -@example -@group - _______________________ _______________________ - | | | | - | page number title | | chapter page number | - | | | | - | Start of text ... | | More text ... | - | ... | | ... | - | | | | - -@end group -@end example - -@noindent -The chapter name is preceded by the word @samp{Chapter}, the chapter -number and a colon. This makes it easier to keep track of where you -are in the manual.@refill - -@node Heading Choice, Custom Headings, Heading Format, Headings -@comment node-name, next, previous, up -@appendixsec Specifying the Type of Heading - -@TeX{} does not begin to generate page headings for a standard Texinfo -file until it reaches the @code{@@end titlepage} command. Thus, the -title and copyright pages are not numbered. The @code{@@end -titlepage} command causes @TeX{} to begin to generate page headings -according to a standard format specified by the -@code{@@setchapternewpage} command that precedes the -@code{@@titlepage} section.@refill - -@need 1000 -There are four possibilities:@refill - -@table @asis -@item No @code{@@setchapternewpage} command -Cause @TeX{} to specify the single-sided heading format, with chapters -on new pages. This is the same as @code{@@setchapternewpage on}.@refill - -@item @code{@@setchapternewpage on} -Specify the single-sided heading format, with chapters on new pages.@refill - -@item @code{@@setchapternewpage off} -Cause @TeX{} to start a new chapter on the same page as the last page of -the preceding chapter, after skipping some vertical whitespace. Also -cause @TeX{} to typeset for single-sided printing. (You can override -the headers format with the @code{@@headings double} command; see -@ref{headings on off, , The @code{@@headings} Command}.)@refill - -@item @code{@@setchapternewpage odd} -Specify the double-sided heading format, with chapters on new pages.@refill -@end table - -@noindent -Texinfo lacks an @code{@@setchapternewpage even} command.@refill - -@node Custom Headings, , Heading Choice, Headings -@comment node-name, next, previous, up -@appendixsec How to Make Your Own Headings - -You can use the standard headings provided with Texinfo or specify -your own.@refill - -@c Following paragraph is verbose to prevent overfull hboxes. -Texinfo provides six commands for specifying headings and -footings. The @code{@@everyheading} command and -@code{@@everyfooting} command generate page headers and footers -that are the same for both even- and odd-numbered pages. -The @code{@@evenheading} command and @code{@@evenfooting} -command generate headers and footers for even-numbered -(left-hand) pages; and the @code{@@oddheading} command and -@code{@@oddfooting} command generate headers and footers for -odd-numbered (right-hand) pages.@refill - -Write custom heading specifications in the Texinfo file immediately -after the @code{@@end titlepage} command. Enclose your specifications -between @code{@@iftex} and @code{@@end iftex} commands since the -@code{texinfo-format-buffer} command may not recognize them. Also, -you must cancel the predefined heading commands with the -@code{@@headings off} command before defining your own -specifications.@refill - -@need 1000 -Here is how to tell @TeX{} to place the chapter name at the left, the -page number in the center, and the date at the right of every header -for both even- and odd-numbered pages:@refill - -@example -@group -@@iftex -@@headings off -@@everyheading @@thischapter @@| @@thispage @@| @@today@{@} -@@end iftex -@end group -@end example - -@noindent -You need to divide the left part from the central part and the central -part from the right had part by inserting @samp{@@|} between parts. -Otherwise, the specification command will not be able to tell where -the text for one part ends and the next part begins.@refill - -Each part can contain text or @@-commands. The text -is printed as if the part were within an ordinary paragraph in the -body of the page. The @@-commands replace -themselves with the page number, date, chapter name, or -whatever.@refill - -@need 950 -Here are the six heading and footing commands:@refill - -@findex everyheading -@findex everyfooting -@table @code -@item @@everyheading @var{left} @@| @var{center} @@| @var{right} -@itemx @@everyfooting @var{left} @@| @var{center} @@| @var{right} - -The `every' commands specify the format for both even- and odd-numbered -pages. These commands are for documents that are printed on one side -of each sheet of paper, or for documents in which you want symmetrical -headers or footers.@refill - -@findex evenheading -@findex evenfooting -@findex oddheading -@findex oddfooting -@item @@evenheading @var{left} @@| @var{center} @@| @var{right} -@itemx @@oddheading @var{left} @@| @var{center} @@| @var{right} - -@itemx @@evenfooting @var{left} @@| @var{center} @@| @var{right} -@itemx @@oddfooting @var{left} @@| @var{center} @@| @var{right} - -The `even' and `odd' commands specify the format for even-numbered -pages and odd-numbered pages. These commands are for books and -manuals that are printed on both sides of each sheet of paper.@refill -@end table - -Use the @samp{@@this@dots{}} series of @@-commands to -provide the names of chapters -and sections and the page number. You can use the -@samp{@@this@dots{}} commands in the left, center, or right portions -of headers and footers, or anywhere else in a Texinfo file so long as -they are between @code{@@iftex} and @code{@@end iftex} commands.@refill - -@need 1000 -Here are the @samp{@@this@dots{}} commands:@refill - -@table @code -@findex thispage -@item @@thispage -Expands to the current page number.@refill -@c !!! Karl Berry says that `thissection' fails on page breaks. -@ignore -@item @@thissection -Expands to the name of the current section.@refill -@end ignore - -@findex thischaptername -@item @@thischaptername -Expands to the name of the current chapter.@refill - -@findex thischapter -@item @@thischapter -Expands to the number and name of the current -chapter, in the format `Chapter 1: Title'.@refill - -@findex thistitle -@item @@thistitle -Expands to the name of the document, as specified by the -@code{@@settitle} command.@refill - -@findex thisfile -@item @@thisfile -For @code{@@include} files only: expands to the name of the current -@code{@@include} file. If the current Texinfo source file is not an -@code{@@include} file, this command has no effect. This command does -@emph{not} provide the name of the current Texinfo source file unless -it is an @code{@@include} file. (@xref{Include Files}, for more -information about @code{@@include} files.)@refill -@end table - -@noindent -You can also use the @code{@@today@{@}} command, which expands to the -current date, in `1 Jan 1900' format.@refill -@findex today - -Other @@-commands and text are printed in a header or footer just as -if they were in the body of a page. It is useful to incorporate text, -particularly when you are writing drafts:@refill - -@example -@group -@@iftex -@@headings off -@@everyheading @@emph@{Draft!@} @@| @@thispage @@| @@thischapter -@@everyfooting @@| @@| Version: 0.27: @@today@{@} -@@end iftex -@end group -@end example - -Beware of overlong titles: they may overlap another part of the -header or footer and blot it out.@refill - -@node Catching Mistakes, Refilling Paragraphs, Headings, Top -@comment node-name, next, previous, up -@appendix Formatting Mistakes -@cindex Structure, catching mistakes in -@cindex Nodes, catching mistakes -@cindex Catching mistakes -@cindex Correcting mistakes -@cindex Mistakes, catching -@cindex Problems, catching -@cindex Debugging the Texinfo structure - -Besides mistakes in the content of your documentation, there -are two kinds of mistake you can make with Texinfo: you can make mistakes -with @@-commands, and you can make mistakes with the structure of the -nodes and chapters.@refill - -Emacs has two tools for catching the @@-command mistakes and two for -catching structuring mistakes.@refill - -For finding problems with @@-commands, you can run @TeX{} or a region -formatting command on the region that has a problem; indeed, you can -run these commands on each region as you write it.@refill - -For finding problems with the structure of nodes and chapters, you can use -@kbd{C-c C-s} (@code{texinfo-show-structure}) and the related @code{occur} -command and you can use the @kbd{M-x Info-validate} command.@refill - -@menu -* makeinfo preferred:: @code{makeinfo} finds errors. -* Debugging with Info:: How to catch errors with Info formatting. -* Debugging with TeX:: How to catch errors with @TeX{} formatting. -* Using texinfo-show-structure:: How to use @code{texinfo-show-structure}. -* Using occur:: How to list all lines containing a pattern. -* Running Info-Validate:: How to find badly referenced nodes. -@end menu - -@node makeinfo preferred, Debugging with Info, , Catching Mistakes -@ifinfo -@heading @code{makeinfo} Find Errors -@end ifinfo - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -The @code{makeinfo} program does an excellent job of catching errors -and reporting them---far better than either the -@code{texinfo-format-region} or the @code{texinfo-format-buffer} -command. In addition, the various functions for automatically -creating and updating node pointers and menus remove many -opportunities for human error.@refill - -If you can, use the updating commands to create and insert pointers -and menus. These prevent many errors. Then use @code{makeinfo} (or -its Texinfo mode manifestations, @code{makeinfo-region} and -@code{makeinfo-buffer}) to format your file and check for other -errors. This is the best way to work with Texinfo. But if you -cannot use @code{makeinfo}, or your problem is very puzzling, then you -may want to use the tools described in this appendix.@refill - -@node Debugging with Info, Debugging with TeX, makeinfo preferred, Catching Mistakes -@comment node-name, next, previous, up -@appendixsec Catching Errors with Info Formatting -@cindex Catching errors with Info formatting -@cindex Debugging with Info formatting - -After you have written part of a Texinfo file, you can use the -@code{texinfo-format-region} or the @code{makeinfo-region} command to -see whether the region formats properly.@refill - -Most likely, however, you are reading this section because for some -reason you cannot use the @code{makeinfo-region} command; therefore, the -rest of this section presumes that you are using -@code{texinfo-format-region}.@refill - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -If you make a mistake with an @@-command, -@code{texinfo-format-region} will stop processing at or after the -error and display an error message. To see where in the buffer the -error occurred, switch to the @samp{*Info Region*} buffer; the cursor -will be in a position that is after the location of the error. Also, -the text will not be formatted after the place where the error -occurred (or more precisely, where it was detected).@refill - -For example, if you accidentally end a menu with the command @code{@@end -menus} with an `s' on the end, instead of with @code{@@end menu}, you -will see an error message that says:@refill - -@example -@@end menus is not handled by texinfo -@end example - -@noindent -The cursor will stop at the point in the buffer where the error -occurs, or not long after it. The buffer will look like this:@refill - -@example -@group ----------- Buffer: *Info Region* ---------- -* Menu: - -* Using texinfo-show-structure:: How to use - `texinfo-show-structure' - to catch mistakes. -* Running Info-Validate:: How to check for - unreferenced nodes. -@@end menus -@point{} ----------- Buffer: *Info Region* ---------- -@end group -@end example - -The @code{texinfo-format-region} command sometimes provides slightly -odd error messages. For example, the following cross reference fails to format:@refill - -@example -(@@xref@{Catching Mistakes, for more info.) -@end example - -@noindent -In this case, @code{texinfo-format-region} detects the missing closing -brace but displays a message that says @samp{Unbalanced parentheses} -rather than @samp{Unbalanced braces}. This is because the formatting -command looks for mismatches between braces as if they were -parentheses.@refill - -Sometimes @code{texinfo-format-region} fails to detect mistakes. For -example, in the following, the closing brace is swapped with the -closing parenthesis:@refill - -@example -(@@xref@{Catching Mistakes), for more info.@} -@end example - -@noindent -Formatting produces: -@example -(*Note for more info.: Catching Mistakes) -@end example - -The only way for you to detect this error is to realize that the -reference should have looked like this:@refill - -@example -(*Note Catching Mistakes::, for more info.) -@end example - -Incidentally, if you are reading this node in Info and type @kbd{f -@key{RET}} (@code{Info-follow-reference}), you will generate an error -message that says: - -@example -No such node: "Catching Mistakes) The only way @dots{} -@end example - -@noindent -This is because Info perceives the example of the error as the first -cross reference in this node and if you type a @key{RET} immediately -after typing the Info @kbd{f} command, Info will attempt to go to the -referenced node. If you type @kbd{f catch @key{TAB} @key{RET}}, Info -will complete the node name of the correctly written example and take -you to the `Catching Mistakes' node. (If you try this, you can return -from the `Catching Mistakes' node by typing @kbd{l} -(@code{Info-last}).) - -@c !!! section on using Elisp debugger ignored. -@ignore -Sometimes @code{texinfo-format-region} will stop long after the -original error; this is because it does not discover the problem until -then. In this case, you will need to backtrack.@refill - -@c menu -@c * Using the Emacs Lisp Debugger:: How to use the Emacs Lisp debugger. -@c end menu - -@c node Using the Emacs Lisp Debugger -@c appendixsubsec Using the Emacs Lisp Debugger -@c index Using the Emacs Lisp debugger -@c index Emacs Lisp debugger -@c index Debugger, using the Emacs Lisp - -If an error is especially elusive, you can turn on the Emacs Lisp -debugger and look at the backtrace; this tells you where in the -@code{texinfo-format-region} function the problem occurred. You can -turn on the debugger with the command:@refill - -@example -M-x set-variable @key{RET} debug-on-error @key{RET} t @key{RET} -@end example - -@noindent -and turn it off with - -@example -M-x set-variable @key{RET} debug-on-error @key{RET} nil @key{RET} -@end example - -Often, when you are using the debugger, it is easier to follow what is -going on if you use the Emacs Lisp files that are not byte-compiled. -The byte-compiled sources send octal numbers to the debugger that may -look mysterious. To use the uncompiled source files, load -@file{texinfmt.el} and @file{texinfo.el} with the @kbd{M-x load-file} -command.@refill - -The debugger will not catch an error if @code{texinfo-format-region} -does not detect one. In the example shown above, -@code{texinfo-format-region} did not find the error when the whole -list was formatted, but only when part of the list was formatted. -When @code{texinfo-format-region} did not find an error, the debugger -did not find one either. @refill - -However, when @code{texinfo-format-region} did report an error, it -invoked the debugger. This is the backtrace it produced:@refill - -@example ----------- Buffer: *Backtrace* ---------- -Signalling: (search-failed "[@},]") - re-search-forward("[@},]") - (while ...) - (let ...) - texinfo-format-parse-args() - (let ...) - texinfo-format-xref() - funcall(texinfo-format-xref) - (if ...) - (let ...) - (if ...) - (while ...) - texinfo-format-scan() - (save-excursion ...) - (let ...) - texinfo-format-region(103370 103631) -* call-interactively(texinfo-format-region) ----------- Buffer: *Backtrace* ---------- -@end example - -The backtrace is read from the bottom up. -@code{texinfo-format-region} was called interactively; and it, in -turn, called various functions, including @code{texinfo-format-scan}, -@code{texinfo-format-xref} and @code{texinfo-format-parse-args}. -Inside the function @code{texinfo-format-parse-args}, the function -@code{re-search-forward} was called; it was this function that could -not find the missing right-hand brace.@refill - -@xref{Lisp Debug, , Debugging Emacs Lisp, emacs, The GNU Emacs -Manual}, for more information.@refill -@end ignore - -@node Debugging with TeX, Using texinfo-show-structure, Debugging with Info, Catching Mistakes -@comment node-name, next, previous, up -@appendixsec Catching Errors with @TeX{} Formatting -@cindex Catching errors with @TeX{} formatting -@cindex Debugging with @TeX{} formatting - -You can also catch mistakes when you format a file with @TeX{}.@refill - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -Usually, you do this after you have run -@code{texinfo-format-buffer} (or, better, @code{makeinfo-buffer}) on -the same file, because @code{texinfo-format-buffer} sometimes displays -error messages that make more sense than @TeX{}. (@xref{Debugging -with Info}, for more information.)@refill - -For example, @TeX{} was run on a Texinfo file, part of which is shown -here:@refill - -@example ----------- Buffer: texinfo.texi ---------- -name of the texinfo file as an extension. The -@@samp@{??@} are `wildcards' that cause the shell to -substitute all the raw index files. (@@xref@{sorting -indices, for more information about sorting -indices.)@@refill ----------- Buffer: texinfo.texi ---------- -@end example - -@noindent -(The cross reference lacks a closing brace.) -@TeX{} produced the following output, after which it stopped:@refill - -@example ----------- Buffer: *texinfo-tex-shell* ---------- -Runaway argument? -@{sorting indices, for more information about sorting -indices.) @@refill @@ETC. -! Paragraph ended before @@xref was complete. -<to be read again> - @@par -l.27 - -? ----------- Buffer: *texinfo-tex-shell* ---------- -@end example - -In this case, @TeX{} produced an accurate and -understandable error message: - -@example -Paragraph ended before @@xref was complete. -@end example - -@noindent -@samp{@@par} is an internal @TeX{} command of no relevance to Texinfo. -@samp{l.27} means that @TeX{} detected the problem on line 27 of the -Texinfo file. The @samp{?} is the prompt @TeX{} uses in this -circumstance.@refill - -Unfortunately, @TeX{} is not always so helpful, and sometimes you must -truly be a Sherlock Holmes to discover what went wrong.@refill - -In any case, if you run into a problem like this, you can do one of three -things.@refill - -@enumerate -@item -You can tell @TeX{} to continue running and ignore just this error by -typing @key{RET} at the @samp{?} prompt.@refill - -@item -You can tell @TeX{} to continue running and to ignore all errors as best -it can by typing @kbd{r @key{RET}} at the @samp{?} prompt.@refill - -This is often the best thing to do. However, beware: the one error -may produce a cascade of additional error messages as its consequences -are felt through the rest of the file. (To stop @TeX{} when it is -producing such an avalanche of error messages, type @kbd{C-d} (or -@kbd{C-c C-d}, if you are running a shell inside Emacs Version 18.))@refill - -@item -You can tell @TeX{} to stop this run by typing @kbd{x @key{RET}} -at the @samp{?} prompt.@refill -@end enumerate - -Please note that if you are running @TeX{} inside Emacs, you need to -switch to the shell buffer and line at which @TeX{} offers the @samp{?} -prompt.@refill - -Sometimes @TeX{} will format a file without producing error messages even -though there is a problem. This usually occurs if a command is not ended -but @TeX{} is able to continue processing anyhow. For example, if you fail -to end an itemized list with the @code{@@end itemize} command, @TeX{} will -write a @sc{dvi} file that you can print out. The only error message that -@TeX{} will give you is the somewhat mysterious comment that@refill - -@example -(@@end occurred inside a group at level 1) -@end example - -@noindent -However, if you print the @sc{dvi} file, you will find that the text -of the file that follows the itemized list is entirely indented as if -it were part of the last item in the itemized list. The error message -is the way @TeX{} says that it expected to find an @code{@@end} -command somewhere in the file; but that it could not determine where -it was needed.@refill - -Another source of notoriously hard-to-find errors is a missing -@code{@@end group} command. If you ever are stumped by -incomprehensible errors, look for a missing @code{@@end group} command -first.@refill - -If the Texinfo file lacks header lines, -@TeX{} may stop in the -beginning of its run and display output that looks like the following. -The @samp{*} indicates that @TeX{} is waiting for input.@refill - -@example -This is TeX, Version 2.0 for Berkeley UNIX -(preloaded format=plain-cm 87.10.25) -(test.texinfo [1]) -* -@end example - -@noindent -In this case, simply type @kbd{\end @key{RET}} after the asterisk. Then -write the header lines in the Texinfo file and run the @TeX{} command -again. (Note the use of the backslash, @samp{\}. @TeX{} uses @samp{\} -instead of @samp{@@}; and in this circumstance, you are working -directly with @TeX{}, not with Texinfo.)@refill - -@node Using texinfo-show-structure, Using occur, Debugging with TeX, Catching Mistakes -@comment node-name, next, previous, up -@appendixsec Using @code{texinfo-show-structure} -@cindex Showing the structure of a file -@findex texinfo-show-structure - -It is not always easy to keep track of the nodes, chapters, sections, and -subsections of a Texinfo file. This is especially true if you are revising -or adding to a Texinfo file that someone else has written.@refill - -In GNU Emacs, in Texinfo mode, the @code{texinfo-show-structure} -command lists all the lines that begin with the @@-commands that -specify the structure: @code{@@chapter}, @code{@@section}, -@code{@@appendix}, and so on. With an argument (@w{@kbd{C-u}} -as prefix argument, if interactive), -the command also shows the @code{@@node} lines. The -@code{texinfo-show-structure} command is bound to @kbd{C-c C-s} in -Texinfo mode, by default.@refill - -The lines are displayed in a buffer called the @samp{*Occur*} buffer. -For example, when @code{texinfo-show-structure} was run on an earlier -version of this appendix, it produced the following:@refill - -@smallexample -Lines matching "^@@\\(chapter \\|sect\\|sub\\|unnum\\|major\\| -heading \\|appendix\\)" in buffer texinfo.texi. - 4:@@appendix Formatting Mistakes - 52:@@appendixsec Catching Errors with Info Formatting -222:@@appendixsec Catching Errors with @@TeX@{@} Formatting -338:@@appendixsec Using @@code@{texinfo-show-structure@} -407:@@appendixsubsec Using @@code@{occur@} -444:@@appendixsec Finding Badly Referenced Nodes -513:@@appendixsubsec Running @@code@{Info-validate@} -573:@@appendixsubsec Splitting a File Manually -@end smallexample - -This says that lines 4, 52, and 222 of @file{texinfo.texi} begin with -the @code{@@appendix}, @code{@@appendixsec}, and @code{@@appendixsec} -commands respectively. If you move your cursor into the @samp{*Occur*} -window, you can position the cursor over one of the lines and use the -@kbd{C-c C-c} command (@code{occur-mode-goto-occurrence}), to jump to -the corresponding spot in the Texinfo file. @xref{Other Repeating -Search, , Using Occur, emacs, The GNU Emacs Manual}, for more -information about @code{occur-mode-goto-occurrence}.@refill - -The first line in the @samp{*Occur*} window describes the @dfn{regular -expression} specified by @var{texinfo-heading-pattern}. This regular -expression is the pattern that @code{texinfo-show-structure} looks for. -@xref{Regexps, , Using Regular Expressions, emacs, The GNU Emacs Manual}, -for more information.@refill - -When you invoke the @code{texinfo-show-structure} command, Emacs will -display the structure of the whole buffer. If you want to see the -structure of just a part of the buffer, of one chapter, for example, -use the @kbd{C-x n} (@code{narrow-to-region}) command to mark the -region. (@xref{Narrowing, , , emacs, The GNU Emacs Manual}.) This is -how the example used above was generated. (To see the whole buffer -again, use @kbd{C-x w} (@code{widen}).)@refill - -If you call @code{texinfo-show-structure} with a prefix argument by -typing @w{@kbd{C-u C-c C-s}}, it will list lines beginning with -@code{@@node} as well as the lines beginning with the @@-sign commands -for @code{@@chapter}, @code{@@section}, and the like.@refill - -You can remind yourself of the structure of a Texinfo file by looking at -the list in the @samp{*Occur*} window; and if you have mis-named a node -or left out a section, you can correct the mistake.@refill - -@node Using occur, Running Info-Validate, Using texinfo-show-structure, Catching Mistakes -@comment node-name, next, previous, up -@appendixsec Using @code{occur} -@cindex Occurrences, listing with @code{@@occur} -@findex occur - -Sometimes the @code{texinfo-show-structure} command produces too much -information. Perhaps you want to remind yourself of the overall structure -of a Texinfo file, and are overwhelmed by the detailed list produced by -@code{texinfo-show-structure}. In this case, you can use the @code{occur} -command directly. To do this, type@refill - -@example -@kbd{M-x occur} -@end example - -@noindent -and then, when prompted, type a @dfn{regexp}, a regular expression for -the pattern you want to match. (@xref{Regexps, , Regular Expressions, -emacs, The GNU Emacs Manual}.) The @code{occur} command works from -the current location of the cursor in the buffer to the end of the -buffer. If you want to run @code{occur} on the whole buffer, place -the cursor at the beginning of the buffer.@refill - -For example, to see all the lines that contain the word -@samp{@@chapter} in them, just type @samp{@@chapter}. This will -produce a list of the chapters. It will also list all the sentences -with @samp{@@chapter} in the middle of the line.@refill - -If you want to see only those lines that start with the word -@samp{@@chapter}, type @samp{^@@chapter} when prompted by -@code{occur}. If you want to see all the lines that end with a word -or phrase, end the last word with a @samp{$}; for example, -@samp{catching mistakes$}. This can be helpful when you want to see -all the nodes that are part of the same chapter or section and -therefore have the same `Up' pointer.@refill - -@xref{Other Repeating Search, , Using Occur, emacs , The GNU Emacs Manual}, -for more information.@refill - -@node Running Info-Validate, , Using occur, Catching Mistakes -@comment node-name, next, previous, up -@appendixsec Finding Badly Referenced Nodes -@findex Info-validate -@cindex Nodes, checking for badly referenced -@cindex Checking for badly referenced nodes -@cindex Looking for badly referenced nodes -@cindex Finding badly referenced nodes -@cindex Badly referenced nodes - -You can use the @code{Info-validate} command to check whether any of -the `Next', `Previous', `Up' or other node pointers fail to point to a -node. This command checks that every node pointer points to an -existing node. The @code{Info-validate} command works only on Info -files, not on Texinfo files.@refill - -The @code{makeinfo} program validates pointers automatically, so you -do not need to use the @code{Info-validate} command if you are using -@code{makeinfo}. You only may need to use @code{Info-validate} if you -are unable to run @code{makeinfo} and instead must create an Info file -using @code{texinfo-format-region} or @code{texinfo-format-buffer}, or -if you write an Info file from scratch.@refill - -@menu -* Using Info-validate:: How to run @code{Info-validate}. -* Unsplit:: How to create an unsplit file. -* Tagifying:: How to tagify a file. -* Splitting:: How to split a file manually. -@end menu - -@node Using Info-validate, Unsplit, , Running Info-Validate -@appendixsubsec Running @code{Info-validate} -@cindex Running @code{Info-validate} -@cindex Info validating a large file -@cindex Validating a large file - -To use @code{Info-validate}, visit the Info file you wish to check and -type:@refill - -@example -M-x Info-validate -@end example - -@noindent -(Note that the @code{Info-validate} command requires an upper case -`I'. You may also need to create a tag table before running -@code{Info-validate}. @xref{Tagifying}.)@refill - -If your file is valid, you will receive a message that says ``File appears -valid''. However, if you have a pointer that does not point to a node, -error messages will be displayed in a buffer called @samp{*problems in -info file*}.@refill - -For example, @code{Info-validate} was run on a test file that contained -only the first node of this manual. One of the messages said:@refill - -@example -In node "Overview", invalid Next: Texinfo Mode -@end example - -@noindent -This meant that the node called @samp{Overview} had a `Next' pointer that -did not point to anything (which was true in this case, since the test file -had only one node in it).@refill - -Now suppose we add a node named @samp{Texinfo Mode} to our test case -but we do not specify a `Previous' for this node. Then we will get -the following error message:@refill - -@example -In node "Texinfo Mode", should have Previous: Overview -@end example - -@noindent -This is because every `Next' pointer should be matched by a -`Previous' (in the node where the `Next' points) which points back.@refill - -@code{Info-validate} also checks that all menu entries and cross references -point to actual nodes.@refill - -Note that @code{Info-validate} requires a tag table and does not work -with files that have been split. (The @code{texinfo-format-buffer} -command automatically splits large files.) In order to use -@code{Info-validate} on a large file, you must run -@code{texinfo-format-buffer} with an argument so that it does not split -the Info file; and you must create a tag table for the unsplit -file.@refill - -@node Unsplit, Tagifying, Using Info-validate, Running Info-Validate -@comment node-name, next, previous, up -@appendixsubsec Creating an Unsplit File -@cindex Creating an unsplit file -@cindex Unsplit file creation - -You can run @code{Info-validate} only on a single Info file that has a -tag table. The command will not work on the indirect subfiles that -are generated when a master file is split. If you have a large file -(longer than 70,000 bytes or so), you need to run the -@code{texinfo-format-buffer} or @code{makeinfo-buffer} command in such -a way that it does not create indirect subfiles. You will also need -to create a tag table for the Info file. After you have done this, -you can run @code{Info-validate} and look for badly referenced -nodes.@refill - -@c !!! broke into two paragraphs to prevent overfull hbox --bob 26 Mar 93 -The first step is to create an unsplit Info file. - -To prevent @code{texinfo-format-buffer} from splitting a Texinfo file -into smaller Info files, give a prefix to the @kbd{M-x -texinfo-format-buffer} command:@refill - -@example -C-u M-x texinfo-format-buffer -@end example - -@noindent -or else - -@example -C-u C-c C-e C-b -@end example - -@noindent -When you do this, Texinfo will not split the file and will not create -a tag table for it. @refill -@cindex Making a tag table manually -@cindex Tag table, making manually - -@node Tagifying, Splitting, Unsplit, Running Info-Validate -@appendixsubsec Tagifying a File - -After creating an unsplit Info file, you must create a tag table for -it. Visit the Info file you wish to tagify and type:@refill - -@example -M-x Info-tagify -@end example - -@noindent -(Note the upper case @key{I} in @code{Info-tagify}.) This creates an -Info file with a tag table that you can validate.@refill - -The third step is to validate the Info file:@refill - -@example -M-x Info-validate -@end example - -@noindent -(Note the upper case @key{I} in @code{Info-validate}.) -In brief, the steps are:@refill - -@example -@group -C-u M-x texinfo-format-buffer -M-x Info-tagify -M-x Info-validate -@end group -@end example - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -After you have validated the node structure, you will be able to rerun -@code{texinfo-format-buffer} in the normal way so it will construct a -tag table and split the file automatically, or you can make the tag -table and split the file manually.@refill - -@node Splitting, , Tagifying, Running Info-Validate -@comment node-name, next, previous, up -@appendixsubsec Splitting a File Manually -@cindex Splitting an Info file manually -@cindex Info file, splitting manually - -You should split a large file or else let the -@code{texinfo-format-buffer} or @code{makeinfo-buffer} command do it -for you automatically. (Generally you will let one of the formatting -commands do this job for you. @xref{Create an Info File}.)@refill - -The split-off files are called the indirect subfiles.@refill - -Info files are split to save memory. With smaller files, Emacs does not -have make such a large buffer to hold the information.@refill - -If an Info file has more than 30 nodes, you should also make a tag -table for it. @xref{Using Info-validate}, for information -about creating a tag table. (Again, tag tables are usually created -automatically by the formatting command; you only need to create a tag -table yourself if you are doing the job manually. Most likely, you -will do this for a large, unsplit file on which you have run -@code{Info-validate}.)@refill - -@c Info-split is autoloaded in `loaddefs.el' in Emacs 18.51 -@ignore -Before running @code{Info-split}, you need to load the @code{info} library -into Emacs by giving the command @kbd{M-x load-library @key{RET} info -@key{RET}}. -@end ignore - -Visit the Info file you wish to tagify and split and type the two -commands:@refill - -@example -M-x Info-tagify -M-x Info-split -@end example - -@noindent -(Note that the @samp{I} in @samp{Info} is upper case.)@refill - -When you use the @code{Info-split} command, the buffer is modified into a -(small) Info file which lists the indirect subfiles. This file should be -saved in place of the original visited file. The indirect subfiles are -written in the same directory the original file is in, with names generated -by appending @samp{-} and a number to the original file name.@refill - -The primary file still functions as an Info file, but it contains just -the tag table and a directory of subfiles.@refill - -@node Refilling Paragraphs, Command Syntax, Catching Mistakes, Top -@comment node-name, next, previous, up -@appendix Refilling Paragraphs -@cindex Refilling paragraphs -@cindex Filling paragraphs -@findex refill - -The @code{@@refill} command refills and, optionally, indents the first -line of a paragraph.@footnote{Perhaps the command should have been -called the @code{@@refillandindent} command, but @code{@@refill} is -shorter and the name was chosen before indenting was possible.} The -@code{@@refill} command is no longer important, but we describe it here -because you once needed it. You will see it in many old Texinfo -files.@refill - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -Without refilling, paragraphs containing long @@-constructs may look -bad after formatting because the formatter removes @@-commands and -shortens some lines more than others. In the past, neither -@code{texinfo-format-region} nor -@code{texinfo-format-buffer} refilled paragraphs -automatically. The @code{@@refill} command had to be written at the -end of every paragraph to cause these formatters to fill them. (Both -@TeX{} and @code{makeinfo} have always refilled paragraphs -automatically.) Now, all the Info formatters automatically fill and -indent those paragraphs that need to be filled and indented.@refill - -@c !!! changed wording to prevent overfull hbox --bob 26 Mar 93 -The @code{@@refill} command causes both the @code{texinfo-format-region} -command and the -@code{texinfo-format-buffer} command to refill a paragraph in the Info file -@emph{after} all the other processing has been done. For this reason, -you can not use @code{@@refill} with a paragraph containing either -@code{@@*} or @code{@@w@{ @dots{} @}} since the refilling action will -override those two commands.@refill - -The @code{texinfo-format-region} and @code{texinfo-format-buffer} -commands now automatically append @code{@@refill} to the end of each -paragraph that should be filled. They do not append @code{@@refill} to -the ends of paragraphs that contain @code{@@*} or @w{@code{@@w@{ @dots{}@}}} -and therefore do not refill or indent them.@refill - -@node Command Syntax, Obtaining TeX, Refilling Paragraphs, Top -@comment node-name, next, previous, up -@appendix @@-Command Syntax -@cindex @@-command syntax - -The character @samp{@@} is used to start special Texinfo commands. -(It has the same meaning that @samp{\} has in Plain@TeX{}.) Texinfo -has four types of @@-command:@refill - -@table @asis -@item 1. Non-alphabetic commands. -These commands consist of an @@ followed by a punctuation mark or other -character that is not part of the alphabet. Non-alphabetic commands -are almost always part of the text within a paragraph, and never take -any argument. The two characters (@@ and the other one) are complete -in themselves; none is followed by braces. The non-alphabetic -commands are: @code{@@.}, @code{@@:}, @code{@@*}, @code{@@@@}, -@code{@@@{}, and @code{@@@}}.@refill - -@item 2. Alphabetic commands that do not require arguments. -These commands start with @@ followed by a word followed by left- and -right-hand braces. These commands insert special symbols in the -document; they do not require arguments. For example, -@code{@@dots@{@}} @result{} @samp{@dots{}}, @code{@@equiv@{@}} -@result{} @samp{@equiv{}}, @code{@@TeX@{@}} @result{} `@TeX{}', -and @code{@@bullet@{@}} @result{} @samp{@bullet{}}.@refill - -@item 3. Alphabetic commands that require arguments within braces. -These commands start with @@ followed by a letter or a word, followed by an -argument within braces. For example, the command @code{@@dfn} indicates -the introductory or defining use of a term; it is used as follows: @samp{In -Texinfo, @@@@-commands are @@dfn@{mark-up@} commands.}@refill - -@item 4. Alphabetic commands that occupy an entire line. -These commands occupy an entire line. The line starts with @@, -followed by the name of the command (a word); for example, @code{@@center} -or @code{@@cindex}. If no argument is needed, the word is followed by -the end of the line. If there is an argument, it is separated from -the command name by a space. Braces are not used.@refill -@end table - -@cindex Braces and argument syntax -Thus, the alphabetic commands fall into classes that have -different argument syntaxes. You cannot tell to which class a command -belongs by the appearance of its name, but you can tell by the -command's meaning: if the command stands for a glyph, it is in -class 2 and does not require an argument; if it makes sense to use the -command together with other text as part of a paragraph, the command -is in class 3 and must be followed by an argument in braces; -otherwise, it is in class 4 and uses the rest of the line as its -argument.@refill - -The purpose of having a different syntax for commands of classes 3 and -4 is to make Texinfo files easier to read, and also to help the GNU -Emacs paragraph and filling commands work properly. There is only one -exception to this rule: the command @code{@@refill}, which is always -used at the end of a paragraph immediately following the final period -or other punctuation character. @code{@@refill} takes no argument and -does @emph{not} require braces. @code{@@refill} never confuses the -Emacs paragraph commands because it cannot appear at the beginning of -a line.@refill - -@node Obtaining TeX, New Features, Command Syntax, Top -@appendix How to Obtain @TeX{} -@cindex Obtaining @TeX{} -@cindex @TeX{}, how to obtain - -@c !!! Here is information about obtaining TeX. Update it whenever. -@c Last updated by RJC on 6 October 1992 -@c based on message from elisabet@@.u.washington.edu -@TeX{} is freely redistributable. You can obtain @TeX{} for Unix -systems from the University of Washington for a distribution -fee.@refill - -To order a full distribution, send $200.00 for a 1/2-inch 9-track 1600 -bpi (@code{tar} or @code{cpio}) tape reel, or $210.00 for a 1/4-inch -4-track QIC-24 (@code{tar} or @code{cpio}) cartridge, to:@refill - -@display -Northwest Computing Support Center -DR-10, Thomson Hall 35 -University of Washington -Seattle, Washington 98195 -@end display - -@noindent -Please make checks payable to the University of Washington.@refill - -Prepaid orders are preferred but purchase orders are acceptable; -however, purchase orders carry an extra charge of $10.00, to pay for -processing.@refill - -Overseas sites: please add to the base cost $20.00 for shipment via -air parcel post, or $30.00 for shipment via courier.@refill - -Please check with the Northwest Computing Support Center at the -University of Washington for current prices and formats:@refill - -@example -@group -@r{telephone:} (206) 543-6259 -@r{email:} elisabet@@u.washington.edu -@end group -@end example - -@node New Features, Command and Variable Index, Obtaining TeX, Top -@appendix Second Edition Features - -@tex -% Widen the space for the first column so three control-character -% strings fit in the first column. Switched back to default .8in -% value at end of chapter. -\global\tableindent=1.0in -@end tex - -The second edition of the Texinfo manual describes more than 20 new -Texinfo mode commands and more than 50 previously undocumented Texinfo -@@-commands. This edition is more than twice the length of the first -edition.@refill - -Here is a brief description of the new commands.@refill - -@menu -* New Texinfo Mode Commands:: The updating commands are especially useful. -* New Commands:: Many newly described @@-commands. -@end menu - -@node New Texinfo Mode Commands, New Commands, , New Features -@appendixsec New Texinfo Mode Commands - -Texinfo mode provides commands and features especially designed for -working with Texinfo files. More than 20 new commands have been -added, including commands for automatically creating and updating -both nodes and menus. This is a tedious task when done by hand.@refill - -The keybindings are intended to be somewhat mnemonic.@refill - -@subheading Update all nodes and menus - -The @code{texinfo-master-menu} command is the primary command: - -@table @kbd -@item C-c C-u m -@itemx M-x texinfo-master-menu -Create or update a master menu. -With @kbd{C-u} as a prefix argument, -first create or update all nodes -and regular menus. -@end table - -@subheading Update Pointers - -@noindent -Create or update `Next', `Previous', and `Up' node pointers.@refill - -@noindent -@xref{Updating Nodes and Menus}. - -@table @kbd -@item C-c C-u C-n -@itemx M-x texinfo-update-node -Update a node. - -@item C-c C-u C-e -@itemx M-x texinfo-every-node-update -Update every node in the buffer. -@end table - -@subheading Update Menus - -@noindent -Create or update menus.@refill - -@noindent -@xref{Updating Nodes and Menus}. - -@table @kbd -@item C-c C-u C-m -@itemx M-x texinfo-make-menu -Make or update a menu. - -@item C-c C-u C-a -@itemx M-x texinfo-all-menus-update -Make or update all the menus in a buffer. -With @kbd{C-u} as a prefix argument, -first update all the nodes. -@end table - -@subheading Insert Title as Description - -@noindent -Insert a node's chapter or section title in the space for the -description in a menu entry line; position point so you can edit the -insert. (This command works somewhat differently than the other -insertion commands, which insert only a predefined string.)@refill - -@noindent -@xref{Inserting, Inserting Frequently Used Commands}. - -@table @kbd -@item C-c C-c C-d -Insert title. -@end table - -@subheading Format for Info - -@noindent -Provide keybindings both for the Info formatting commands that are -written in Emacs Lisp and for @code{makeinfo} that is written in -C.@refill - -@noindent -@xref{Info Formatting}. - -@noindent -Use the Emacs lisp @code{texinfo-format@dots{}} commands: - -@table @kbd -@item C-c C-e C-r -Format the region. - -@item C-c C-e C-b -Format the buffer. -@end table - -@noindent -Use @code{makeinfo}: - -@table @kbd -@item C-c C-m C-r -Format the region. - -@item C-c C-m C-b -Format the buffer. - -@item C-c C-m C-l -Recenter the @code{makeinfo} output buffer. - -@item C-c C-m C-k -Kill the @code{makeinfo} formatting job. -@end table - -@subheading Typeset and Print - -@noindent -Typeset and print Texinfo documents from within Emacs.@refill - -@ifinfo -@noindent -@xref{Printing}. -@end ifinfo -@iftex -@noindent -@xref{Printing, , Formatting and Printing}. -@end iftex - -@table @kbd -@item C-c C-t C-r -Run @TeX{} on the region. - -@item C-c C-t C-b -Run @TeX{} on the buffer. - -@item C-c C-t C-i -Run @code{texindex}. - -@item C-c C-t C-p -Print the @sc{dvi} file. - -@item C-c C-t C-q -Show the print queue. - -@item C-c C-t C-d -Delete a job from the print queue. - -@item C-c C-t C-k -Kill the current @TeX{} formatting job. - -@item C-c C-t C-x -Quit a currently stopped @TeX{} formatting job. - -@item C-c C-t C-l -Recenter the output buffer. -@end table - -@subheading Other Updating Commands - -@noindent -The ``other updating commands'' do not have standard keybindings because -they are used less frequently.@refill - -@noindent -@xref{Other Updating Commands}. - -@table @kbd -@item M-x texinfo-insert-node-lines -Insert missing @code{@@node} lines using -section titles as node names. - -@item M-x texinfo-multiple-files-update -Update a multi-file document. -With a numeric prefix, such as @kbd{C-u 8}, -update @strong{every} pointer and -menu in @strong{all} the files and -then insert a master menu. - -@item M-x texinfo-indent-menu-description -Indent descriptions in menus. - -@item M-x texinfo-sequential-node-update -Insert node pointers in strict sequence. -@end table - -@node New Commands, , New Texinfo Mode Commands, New Features -@appendixsec New Texinfo @@-Commands - -The second edition of the Texinfo manual describes more than 50 -commands that were not described in the first edition. A third or so -of these commands existed in Texinfo but were not documented in the -manual; the others are new. Here is a listing, with brief -descriptions of them:@refill - -@subheading Indexing - -@noindent -Create your own index, and merge indices.@refill - -@noindent -@xref{Indices}. - -@table @kbd -@item @@defindex @var{index-name} -Define a new index and its indexing command. -See also the @code{@@defcodeindex} command. - -@c written verbosely to avoid overful hbox -@item @@synindex @var{from-index} @var{into-index} -Merge the @var{from-index} index into the @var{into-index} index. -See also the @code{@@syncodeindex} command. -@end table - -@subheading Definitions - -@noindent -Describe functions, variables, macros, -commands, user options, special forms, and other such artifacts in a -uniform format.@refill - -@noindent -@xref{Definition Commands}. - -@table @kbd -@item @@deffn @var{category} @var{name} @var{arguments}@dots{} -Format a description for functions, interactive -commands, and similar entities. - -@item @@defvr, @@defop, @dots{} -15 other related commands. -@end table - -@subheading Glyphs - -@noindent -Indicate the results of evaluation, expansion, -printed output, an error message, equivalence of expressions, and the -location of point.@refill - -@noindent -@xref{Glyphs}. - -@table @kbd -@item @@equiv@{@} -@itemx @equiv{} -Equivalence: - -@item @@error@{@} -@itemx @error{} -Error message - -@item @@expansion@{@} -@itemx @expansion{} -Macro expansion - -@item @@point@{@} -@itemx @point{} -Position of point - -@item @@print@{@} -@itemx @print{} -Printed output - -@item @@result@{@} -@itemx @result{} -Result of an expression -@end table - -@subheading Page Headings - -@noindent -Customize page headings. - -@noindent -@xref{Headings}. - -@table @kbd -@item @@headings @var{on-off-single-double} -Headings on or off, single, or double-sided. - -@item @@evenfooting [@var{left}] @@| [@var{center}] @@| [@var{right}] -Footings for even-numbered (left-hand) pages. - -@item @@evenheading, @@everyheading, @@oddheading, @dots{} -Five other related commands. - -@item @@thischapter -Insert name of chapter and chapter number. - -@item @@thischaptername, @@thisfile, @@thistitle, @@thispage -Related commands. -@end table - -@subheading Formatting - -@noindent -Format blocks of text. - -@noindent -@xref{Quotations and Examples}, and@* -@ref{Lists and Tables, , Making Lists and Tables}. - -@table @kbd -@item @@cartouche -Draw rounded box surrounding text (not in Info). - -@item @@enumerate @var{optional-arg} -Enumerate a list with letters or numbers. - -@item @@exdent @var{line-of-text} -Remove indentation. - -@item @@flushleft -Left justify. - -@item @@flushright -Right justify. - -@item @@format -Do not narrow nor change font. - -@item @@ftable @var{formatting-command} -@itemx @@vtable @var{formatting-command} -Two-column table with indexing. - -@item @@lisp -For an example of Lisp code. - -@item @@smallexample -@itemx @@smalllisp -Like @@table and @@lisp @r{but for} @@smallbook. -@end table - -@subheading Conditionals - -@noindent -Conditionally format text. - -@noindent -@xref{set clear value, , @code{@@set} @code{@@clear} @code{@@value}}.@refill - -@table @kbd -@item @@set @var{flag} [@var{string}] -Set a flag. Optionally, set value -of @var{flag} to @var{string}. - -@item @@clear @var{flag} -Clear a flag. - -@item @@value@{@var{flag}@} -Replace with value to which @var{flag} is set. - -@item @@ifset @var{flag} -Format, if @var{flag} is set. - -@item @@ifclear @var{flag} -Ignore, if @var{flag} is set. -@end table - -@subheading @@heading series for Titles - -@noindent -Produce unnumbered headings that do not appear in a table of contents. - -@noindent -@xref{Structuring}. - -@table @kbd -@item @@heading @var{title} -Unnumbered section-like heading not listed -in the table of contents of a printed manual. - -@item @@chapheading, @@majorheading, @@subheading, @@subsubheading -Related commands. -@end table - -@need 1000 -@subheading Font commands - -@need 1000 -@noindent -@xref{Smallcaps}, and @* -@ref{Fonts}. - -@table @kbd -@item @@r@{@var{text}@} -Print in roman font. - -@item @@sc@{@var{text}@} -Print in @sc{small caps} font. -@end table - -@subheading Miscellaneous - -@noindent -See @ref{title subtitle author, , @code{@@title} @code{@@subtitle} and @code{@@author} Commands},@* -see @ref{Overfull hboxes},@* -see @ref{Footnotes},@* -see @ref{dmn, , Format a Dimension},@* -see @ref{minus, , Inserting a Minus Sign},@* -see @ref{paragraphindent, , Paragraph Indenting},@* -see @ref{Cross Reference Commands},@* -see @ref{title subtitle author, , @code{@@title} @code{@@subtitle} and @code{@@author}}, and@* -see @ref{Custom Headings, , How to Make Your Own Headings}. - -@need 700 -@table @kbd -@item @@author @var{author} -Typeset author's name. - -@item @@finalout -Produce cleaner printed output. - -@item @@footnotestyle -Specify footnote style. - -@item @@dmn@{@var{dimension}@} -Format a dimension. - -@item @@minus@{@} -Generate a minus sign. - -@item @@paragraphindent -Specify paragraph indentation. - -@item @@ref@{@var{node-name}, @r{[}@var{entry}@r{]}, @r{[}@var{topic-or-title}@r{]}, @r{[}@var{info-file}@r{]}, @r{[}@var{manual}@r{]}@} -Make a reference. In the printed manual, the -reference does not start with the word `see'. - -@item @@title @var{title} -Typeset @var{title} in the alternative -title page format. - -@item @@subtitle @var{subtitle} -Typeset @var{subtitle} in the alternative -title page format. - -@item @@today@{@} -Insert the current date. -@end table -@tex -% Switch width of first column of tables back to default value -\global\tableindent=.8in -@end tex - -@node Command and Variable Index, Concept Index, New Features, Top -@comment node-name, next, previous, up -@unnumbered Command and Variable Index - -This is an alphabetical list of all the @@-commands and several -variables. To make the list easier to use, the commands are listed -without their preceding @samp{@@}.@refill - -@printindex fn - -@node Concept Index, , Command and Variable Index, Top -@comment node-name, next, previous, up -@unnumbered Concept Index - -@printindex cp - -@summarycontents -@contents -@bye diff --git a/gnu/usr.bin/texinfo/info-files/texi-files/userdoc.texi b/gnu/usr.bin/texinfo/info-files/texi-files/userdoc.texi deleted file mode 100644 index 4ebeae84a581..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi-files/userdoc.texi +++ /dev/null @@ -1,1263 +0,0 @@ -@c This file is meant to be included in any arbitrary piece of -@c documentation that wishes to describe the info program. Some day -@c info-stnd.texi should probably use this file instead of duplicating -@c its contents. -@c -@c This file documents the use of the standalone GNU Info program, -@c versions 2.7 and later. - -@ifclear InfoProgVer -@set InfoProgVer 2.9 -@end ifclear -@synindex vr cp -@synindex fn cp -@synindex ky cp - -@heading What is Info? - -This text documents the use of the GNU Info program, version -@value{InfoProgVer}. - -@dfn{Info} is a program which is used to view info files on an ASCII -terminal. @dfn{info files} are the result of processing texinfo files -with the program @code{makeinfo} or with the Emacs command @code{M-x -texinfo-format-buffer}. Finally, @dfn{texinfo} is a documentation -language which allows a printed manual and online documentation (an info -file) to be produced from a single source file. - -@menu -* Options:: Options you can pass on the command line. -* Cursor Commands:: Commands which move the cursor within a node. -* Scrolling Commands:: Commands for moving the node around in a window. -* Node Commands:: Commands for selecting a new node. -* Searching Commands:: Commands for searching an info file. -* Xref Commands:: Commands for selecting cross references. -* Window Commands:: Commands which manipulate multiple windows. -* Printing Nodes:: How to print out the contents of a node. -* Miscellaneous Commands:: A few commands that defy categories. -* Variables:: How to change the default behaviour of Info. -* Info for Sys Admins:: How to setup Info. Using special options. -@ifset STANDALONE -* GNU Info Global Index:: Global index containing keystrokes, command names, - variable names, and general concepts. -@end ifset -@end menu - -@node Options -@chapter Command Line Options -@cindex command line options -@cindex arguments, command line - -GNU Info accepts several options to control the initial node being -viewed, and to specify which directories to search for info files. Here -is a template showing an invocation of GNU Info from the shell: - -@example -info [--@var{option-name} @var{option-value}] @var{menu-item}@dots{} -@end example - -The following @var{option-names} are available when invoking Info from -the shell: - -@table @code -@cindex directory path -@item --directory @var{directory-path} -@itemx -d @var{directory-path} -Adds @var{directory-path} to the list of directory paths searched when -Info needs to find a file. You may issue @code{--directory} multiple -times; once for each directory which contains info files. -Alternatively, you may specify a value for the environment variable -@code{INFOPATH}; if @code{--directory} is not given, the value of -@code{INFOPATH} is used. The value of @code{INFOPATH} is a colon -separated list of directory names. If you do not supply -@code{INFOPATH} or @code{--directory-path} a default path is used. - -@item --file @var{filename} -@itemx -f @var{filename} -@cindex info file, selecting -Specifies a particular info file to visit. Instead of visiting the file -@code{dir}, Info will start with @code{(@var{filename})Top} as the first -file and node. - -@item --node @var{nodename} -@itemx -n @var{nodename} -@cindex node, selecting -Specifies a particular node to visit in the initial file loaded. This -is especially useful in conjunction with @code{--file}@footnote{Of -course, you can specify both the file and node in a @code{--node} -command; but don't forget to escape the open and close parentheses from -the shell as in: @code{info --node '(emacs)Buffers'}}. You may specify -@code{--node} multiple times; for an interactive Info, each -@var{nodename} is visited in its own window, for a non-interactive Info -(such as when @code{--output} is given) each @var{nodename} is processed -sequentially. - -@item --output @var{filename} -@itemx -o @var{filename} -@cindex file, outputting to -@cindex outputting to a file -Specify @var{filename} as the name of a file to output to. Each node -that Info visits will be output to @var{filename} instead of -interactively viewed. A value of @code{-} for @var{filename} specifies -the standard output. - -@item --subnodes -@cindex @code{--subnodes}, command line option -This option only has meaning when given in conjunction with -@code{--output}. It means to recursively output the nodes appearing in -the menus of each node being output. Menu items which resolve to -external info files are not output, and neither are menu items which are -members of an index. Each node is only output once. - -@item --help -@itemx -h -Produces a relatively brief description of the available Info options. - -@item --version -@cindex version information -Prints the version information of Info and exits. - -@item @var{menu-item} -@cindex menu, following -Remaining arguments to Info are treated as the names of menu items. The -first argument would be a menu item in the initial node visited, while -the second argument would be a menu item in the first argument's node. -You can easily move to the node of your choice by specifying the menu -names which describe the path to that node. For example, - -@example -info emacs buffers -@end example - -first selects the menu item @samp{Emacs} in the node @samp{(dir)Top}, -and then selects the menu item @samp{Buffers} in the node -@samp{(emacs)Top}. - -@end table - -@node Cursor Commands -@chapter Moving the Cursor -@cindex cursor, moving -Many people find that reading screens of text page by page is made -easier when one is able to indicate particular pieces of text with some -kind of pointing device. Since this is the case, GNU Info (both the -Emacs and standalone versions) have several commands which allow you to -move the cursor about the screen. The notation used in this manual to -describe keystrokes is identical to the notation used within the Emacs -manual, and the GNU Readline manual. @xref{Characters, , Character -Conventions, emacs, the GNU Emacs Manual}, if you are unfamilar with the -notation. - -The following table lists the basic cursor movement commands in Info. -Each entry consists of the key sequence you should type to execute the -cursor movement, the @code{M-x}@footnote{@code{M-x} is also a command; it -invokes @code{execute-extended-command}. @xref{M-x, , Executing an -extended command, emacs, the GNU Emacs Manual}, for more detailed -information.} command name (displayed in parentheses), and a short -description of what the command does. All of the cursor motion commands -can take an @dfn{numeric} argument (@pxref{Miscellaneous Commands, -@code{universal-argument}}), to find out how to supply them. With a -numeric argument, the motion commands are simply executed that -many times; for example, a numeric argument of 4 given to -@code{next-line} causes the cursor to move down 4 lines. With a -negative numeric argument, the motion is reversed; an argument of -4 -given to the @code{next-line} command would cause the cursor to move -@emph{up} 4 lines. - -@table @asis -@item @code{C-n} (@code{next-line}) -@kindex C-n -@findex next-line -Moves the cursor down to the next line. - -@item @code{C-p} (@code{prev-line}) -@kindex C-p -@findex prev-line -Move the cursor up to the previous line. - -@item @code{C-a} (@code{beginning-of-line}) -@kindex C-a, in Info windows -@findex beginning-of-line -Move the cursor to the start of the current line. - -@item @code{C-e} (@code{end-of-line}) -@kindex C-e, in Info windows -@findex end-of-line -Moves the cursor to the end of the current line. - -@item @code{C-f} (@code{forward-char}) -@kindex C-f, in Info windows -@findex forward-char -Move the cursor forward a character. - -@item @code{C-b} (@code{backward-char}) -@kindex C-b, in Info windows -@findex backward-char -Move the cursor backward a character. - -@item @code{M-f} (@code{forward-word}) -@kindex M-f, in Info windows -@findex forward-word -Moves the cursor forward a word. - -@item @code{M-b} (@code{backward-word}) -@kindex M-b, in Info winows -@findex backward-word -Moves the cursor backward a word. - -@item @code{M-<} (@code{beginning-of-node}) -@itemx @code{b} -@kindex b, in Info winows -@kindex M-< -@findex beginning-of-node -Moves the cursor to the start of the current node. - -@item @code{M->} (@code{end-of-node}) -@kindex M-> -@findex end-of-node -Moves the cursor to the end of the current node. - -@item @code{M-r} (@code{move-to-window-line}) -@kindex M-r -@findex move-to-window-line -Moves the cursor to a specific line of the window. Without a numeric -argument, @code{M-r} moves the cursor to the start of the line in the -center of the window. With a numeric argument of @var{n}, @code{M-r} -moves the cursor to the start of the @var{n}th line in the window. -@end table - -@node Scrolling Commands -@chapter Moving Text Within a Window -@cindex scrolling - -Sometimes you are looking at a screenful of text, and only part of the -current paragraph you are reading is visible on the screen. The -commands detailed in this section are used to shift which part of the -current node is visible on the screen. - -@table @asis -@item @code{SPC} (@code{scroll-forward}) -@itemx @code{C-v} -@kindex SPC, in Info windows -@kindex C-v -@findex scroll-forward -Shift the text in this window up. That is, show more of the node which -is currently below the bottom of the window. With a numeric argument, -show that many more lines at the bottom of the window; a numeric -argument of 4 would shift all of the text in the window up 4 lines -(discarding the top 4 lines), and show you four new lines at the bottom -of the window. Without a numeric argument, @key{SPC} takes the bottom -two lines of the window and places them at the top of the window, -redisplaying almost a completely new screenful of lines. - -@item @code{DEL} (@code{scroll-backward}) -@itemx @code{M-v} -@kindex DEL, in Info windows -@kindex M-v -@findex scroll-backward -Shift the text in this window down. The inverse of -@code{scroll-forward}. - -@end table - -@cindex scrolling through node structure -The @code{scroll-forward} and @code{scroll-backward} commands can also -move forward and backward through the node structure of the file. If -you press @key{SPC} while viewing the end of a node, or @key{DEL} while -viewing the beginning of a node, what happens is controlled by the -variable @code{scroll-behaviour}. @xref{Variables, -@code{scroll-behaviour}}, for more information. - -@table @asis -@item @code{C-l} (@code{redraw-display}) -@kindex C-l -@findex redraw-display -Redraw the display from scratch, or shift the line containing the cursor -to a specified location. With no numeric argument, @samp{C-l} clears -the screen, and then redraws its entire contents. Given a numeric -argument of @var{n}, the line containing the cursor is shifted so that -it is on the @var{n}th line of the window. - -@item @code{C-x w} (@code{toggle-wrap}) -@kindex C-w -@findex toggle-wrap -Toggles the state of line wrapping in the current window. Normally, -lines which are longer than the screen width @dfn{wrap}, i.e., they are -continued on the next line. Lines which wrap have a @samp{\} appearing -in the rightmost column of the screen. You can cause such lines to be -terminated at the rightmost column by changing the state of line -wrapping in the window with @code{C-x w}. When a line which needs more -space than one screen width to display is displayed, a @samp{$} appears -in the rightmost column of the screen, and the remainder of the line is -invisible. -@end table - -@node Node Commands -@chapter Selecting a New Node -@cindex nodes, selection of - -This section details the numerous Info commands which select a new node -to view in the current window. - -The most basic node commands are @samp{n}, @samp{p}, @samp{u}, and -@samp{l}. - -When you are viewing a node, the top line of the node contains some Info -@dfn{pointers} which describe where the next, previous, and up nodes -are. Info uses this line to move about the node structure of the file -when you use the following commands: - -@table @asis -@item @code{n} (@code{next-node}) -@kindex n -@findex next-node -Selects the `Next' node. - -@item @code{p} (@code{prev-node}) -@kindex p -@findex prev-node -Selects the `Prev' node. - -@item @code{u} (@code{up-node}) -@kindex u -@findex up-node -Selects the `Up' node. -@end table - -You can easily select a node that you have already viewed in this window -by using the @samp{l} command -- this name stands for "last", and -actually moves through the list of already visited nodes for this -window. @samp{l} with a negative numeric argument moves forward through -the history of nodes for this window, so you can quickly step between -two adjacent (in viewing history) nodes. - -@table @asis -@item @code{l} (@code{history-node}) -@kindex l -@findex history-node -Selects the most recently selected node in this window. -@end table - -Two additional commands make it easy to select the most commonly -selected nodes; they are @samp{t} and @samp{d}. - -@table @asis -@item @code{t} (@code{top-node}) -@kindex t -@findex top-node -Selects the node @samp{Top} in the current info file. - -@item @code{d} (@code{dir-node}) -@kindex d -@findex dir-node -Selects the directory node (i.e., the node @samp{(dir)}). -@end table - -Here are some other commands which immediately result in the selection -of a different node in the current window: - -@table @asis -@item @code{<} (@code{first-node}) -@kindex < -@findex first-node -Selects the first node which appears in this file. This node is most -often @samp{Top}, but it doesn't have to be. - -@item @code{>} (@code{last-node}) -@kindex > -@findex last-node -Selects the last node which appears in this file. - -@item @code{]} (@code{global-next-node}) -@kindex ] -@findex global-next-node -Moves forward or down through node structure. If the node that you are -currently viewing has a @samp{Next} pointer, that node is selected. -Otherwise, if this node has a menu, the first menu item is selected. If -there is no @samp{Next} and no menu, the same process is tried with the -@samp{Up} node of this node. - -@item @code{[} (@code{global-prev-node}) -@kindex [ -@findex global-prev-node -Moves backward or up through node structure. If the node that you are -currently viewing has a @samp{Prev} pointer, that node is selected. -Otherwise, if the node has an @samp{Up} pointer, that node is selected, -and if it has a menu, the last item in the menu is selected. -@end table - -You can get the same behaviour as @code{global-next-node} and -@code{global-prev-node} while simply scrolling through the file with -@key{SPC} and @key{DEL}; @xref{Variables, @code{scroll-behaviour}}, for -more information. - -@table @asis -@item @code{g} (@code{goto-node}) -@kindex g -@findex goto-node -Reads the name of a node and selects it. No completion is done while -reading the node name, since the desired node may reside in a separate -file. The node must be typed exactly as it appears in the info file. A -file name may be included as with any node specification, for example - -@example -@code{g(emacs)Buffers} -@end example - -finds the node @samp{Buffers} in the info file @file{emacs}. - -@item @code{C-x k} (@code{kill-node}) -@kindex C-x k -@findex kill-node -Kills a node. The node name is prompted for in the echo area, with a -default of the current node. @dfn{Killing} a node means that Info tries -hard to forget about it, removing it from the list of history nodes kept -for the window where that node is found. Another node is selected in -the window which contained the killed node. - -@item @code{C-x C-f} (@code{view-file}) -@kindex C-x C-f -@findex view-file -Reads the name of a file and selects the entire file. The command -@example -@code{C-x C-f @var{filename}} -@end example -is equivalent to typing -@example -@code{g(@var{filename})*} -@end example - -@item @code{C-x C-b} (@code{list-visited-nodes}) -@kindex C-x C-b -@findex list-visited-nodes -Makes a window containing a menu of all of the currently visited nodes. -This window becomes the selected window, and you may use the standard -Info commands within it. - -@item @code{C-x b} (@code{select-visited-node}) -@kindex C-x b -@findex select-visited-node -Selects a node which has been previously visited in a visible window. -This is similar to @samp{C-x C-b} followed by @samp{m}, but no window is -created. -@end table - -@node Searching Commands -@chapter Searching an Info File -@cindex searching - -GNU Info allows you to search for a sequence of characters throughout an -entire info file, search through the indices of an info file, or find -areas within an info file which discuss a particular topic. - -@table @asis -@item @code{s} (@code{search}) -@kindex s -@findex search -Reads a string in the echo area and searches for it. - -@item @code{C-s} (@code{isearch-forward}) -@kindex C-s -@findex isearch-forward -Interactively searches forward through the info file for a string as you -type it. - -@item @code{C-r} (@code{isearch-backward}) -@kindex C-r -@findex isearch-backward -Interactively searches backward through the info file for a string as -you type it. - -@item @code{i} (@code{index-search}) -@kindex i -@findex index-search -Looks up a string in the indices for this info file, and selects a node -where the found index entry points to. - -@item @code{,} (@code{next-index-match}) -@kindex , -@findex next-index-match -Moves to the node containing the next matching index item from the last -@samp{i} command. -@end table - -The most basic searching command is @samp{s} (@code{search}). The -@samp{s} command prompts you for a string in the echo area, and then -searches the remainder of the info file for an ocurrence of that string. -If the string is found, the node containing it is selected, and the -cursor is left positioned at the start of the found string. Subsequent -@samp{s} commands show you the default search string within @samp{[} and -@samp{]}; pressing @key{RET} instead of typing a new string will use the -default search string. - -@dfn{Incremental searching} is similar to basic searching, but the -string is looked up while you are typing it, instead of waiting until -the entire search string has been specified. - -@node Xref Commands -@chapter Selecting Cross References - -We have already discussed the @samp{Next}, @samp{Prev}, and @samp{Up} -pointers which appear at the top of a node. In addition to these -pointers, a node may contain other pointers which refer you to a -different node, perhaps in another info file. Such pointers are called -@dfn{cross references}, or @dfn{xrefs} for short. - -@menu -* Parts of an Xref:: What a cross reference is made of. -* Selecting Xrefs:: Commands for selecting menu or note items. -@end menu - -@node Parts of an Xref -@section Parts of an Xref - -Cross references have two major parts: the first part is called the -@dfn{label}; it is the name that you can use to refer to the cross -reference, and the second is the @dfn{target}; it is the full name of -the node that the cross reference points to. - -The target is separated from the label by a colon @samp{:}; first the -label appears, and then the target. For example, in the sample menu -cross reference below, the single colon separates the label from the -target. - -@example -* Foo Label: Foo Target. More information about Foo. -@end example - -Note the @samp{.} which ends the name of the target. The @samp{.} is -not part of the target; it serves only to let Info know where the target -name ends. - -A shorthand way of specifying references allows two adjacent colons to -stand for a target name which is the same as the label name: - -@example -* Foo Commands:: Commands pertaining to Foo. -@end example - -In the above example, the name of the target is the same as the name of -the label, in this case @code{Foo Commands}. - -You will normally see two types of cross references while viewing nodes: -@dfn{menu} references, and @dfn{note} references. Menu references -appear within a node's menu; they begin with a @samp{*} at the beginning -of a line, and continue with a label, a target, and a comment which -describes what the contents of the node pointed to contains. - -Note references appear within the body of the node text; they begin with -@code{*Note}, and continue with a label and a target. - -Like @samp{Next}, @samp{Prev} and @samp{Up} pointers, cross references -can point to any valid node. They are used to refer you to a place -where more detailed information can be found on a particular subject. -Here is a cross reference which points to a node within the Texinfo -documentation: @xref{xref, , Writing an Xref, texinfo, the Texinfo -Manual}, for more information on creating your own texinfo cross -references. - -@node Selecting Xrefs -@section Selecting Xrefs - -The following table lists the Info commands which operate on menu items. - -@table @asis -@item @code{1} (@code{menu-digit}) -@itemx @code{2} @dots{} @code{9} -@cindex 1 @dots{} 9, in Info windows -@kindex 1 @dots{} 9, in Info windows -@findex menu-digit -Within an Info window, pressing a single digit, (such as @samp{1}), -selects that menu item, and places its node in the current window. -For convenience, there is one exception; pressing @samp{0} selects the -@emph{last} item in the node's menu. - -@item @code{0} (@code{last-menu-item}) -@kindex 0, in Info windows -@findex last-menu-item -Select the last item in the current node's menu. - -@item @code{m} (@code{menu-item}) -@kindex m -@findex menu-item -Reads the name of a menu item in the echo area and selects its node. -Completion is available while reading the menu label. - -@item @code{M-x find-menu} -@findex find-menu -Moves the cursor to the start of this node's menu. -@end table - -This table lists the Info commands which operate on note cross references. - -@table @asis -@item @code{f} (@code{xref-item}) -@itemx @code{r} -@kindex f -@kindex r -@findex xref-item -Reads the name of a note cross reference in the echo area and selects -its node. Completion is available while reading the cross reference -label. -@end table - -Finally, the next few commands operate on menu or note references alike: - -@table @asis -@item @code{TAB} (@code{move-to-next-xref}) -@kindex TAB, in Info windows -@findex move-to-next-xref -Moves the cursor to the start of the next nearest menu item or note -reference in this node. You can then use @key{RET} -(@code{select-reference-this-line} to select the menu or note reference. - -@item @code{M-TAB} (@code{move-to-prev-xref}) -@kindex M-TAB, in Info windows -@findex move-to-prev-xref -Moves the cursor the start of the nearest previous menu item or note -reference in this node. - -@item @code{RET} (@code{select-reference-this-line}) -@kindex RET, in Info windows -@findex select-reference-this-line -Selects the menu item or note reference appearing on this line. -@end table - -@node Window Commands -@chapter Manipulating Multiple Windows -@cindex windows, manipulating - -A @dfn{window} is a place to show the text of a node. Windows have a -view area where the text of the node is displayed, and an associated -@dfn{mode line}, which briefly describes the node being viewed. - -GNU Info supports multiple windows appearing in a single screen; each -window is separated from the next by its modeline. At any time, there -is only one @dfn{active} window, that is, the window in which the cursor -appears. There are commands available for creating windows, changing -the size of windows, selecting which window is active, and for deleting -windows. - -@menu -* The Mode Line:: What appears in the mode line? -* Basic Windows:: Manipulating windows in Info. -* The Echo Area:: Used for displaying errors and reading input. -@end menu - -@node The Mode Line -@section The Mode Line - -A @dfn{mode line} is a line of inverse video which appears at the bottom -of an info window. It describes the contents of the window just above -it; this information includes the name of the file and node appearing in -that window, the number of screen lines it takes to display the node, -and the percentage of text that is above the top of the window. It can -also tell you if the indirect tags table for this info file needs to be -updated, and whether or not the info file was compressed when stored on -disk. - -Here is a sample mode line for a window containing an uncompressed file -named @file{dir}, showing the node @samp{Top}. - -@example ------Info: (dir)Top, 40 lines --Top--------------------------------------- - ^^ ^ ^^^ ^^ - (file)Node #lines where -@end example - -When a node comes from a file which is compressed on disk, this is -indicated in the mode line with two small @samp{z}'s. In addition, if -the info file containing the node has been split into subfiles, the name -of the subfile containing the node appears in the modeline as well: - -@example ---zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z--------------- -@end example - -When Info makes a node internally, such that there is no corresponding -info file on disk, the name of the node is surrounded by asterisks -(@samp{*}). The name itself tells you what the contents of the window -are; the sample mode line below shows an internally constructed node -showing possible completions: - -@example ------Info: *Completions*, 7 lines --All----------------------------------- -@end example - -@node Basic Windows -@section Window Commands - -It can be convenient to view more than one node at a time. To allow -this, Info can display more than one @dfn{window}. Each window has its -own mode line (@pxref{The Mode Line}) and history of nodes viewed in that -window (@pxref{Node Commands, , @code{history-node}}). - -@table @asis -@item @code{C-x o} (@code{next-window}) -@cindex windows, selecting -@kindex C-x o -@findex next-window -Selects the next window on the screen. Note that the echo area can only be -selected if it is already in use, and you have left it temporarily. -Normally, @samp{C-x o} simply moves the cursor into the next window on -the screen, or if you are already within the last window, into the first -window on the screen. Given a numeric argument, @samp{C-x o} moves over -that many windows. A negative argument causes @samp{C-x o} to select -the previous window on the screen. - -@item @code{M-x prev-window} -@findex prev-window -Selects the previous window on the screen. This is identical to -@samp{C-x o} with a negative argument. - -@item @code{C-x 2} (@code{split-window}) -@cindex windows, creating -@kindex C-x 2 -@findex split-window -Splits the current window into two windows, both showing the same node. -Each window is one half the size of the original window, and the cursor -remains in the original window. The variable @code{automatic-tiling} -can cause all of the windows on the screen to be resized for you -automatically, please @pxref{Variables, , automatic-tiling} for more -information. - -@item @code{C-x 0} (@code{delete-window}) -@cindex windows, deleting -@kindex C-x 0 -@findex delete-window -Deletes the current window from the screen. If you have made too many -windows and your screen appears cluttered, this is the way to get rid of -some of them. - -@item @code{C-x 1} (@code{keep-one-window}) -@kindex C-x 1 -@findex keep-one-window -Deletes all of the windows excepting the current one. - -@item @code{ESC C-v} (@code{scroll-other-window}) -@kindex ESC C-v, in Info windows -@findex scroll-other-window -Scrolls the other window, in the same fashion that @samp{C-v} might -scroll the current window. Given a negative argument, the "other" -window is scrolled backward. - -@item @code{C-x ^} (@code{grow-window}) -@kindex C-x ^ -@findex grow-window -Grows (or shrinks) the current window. Given a numeric argument, grows -the current window that many lines; with a negative numeric argument, -the window is shrunk instead. - -@item @code{C-x t} (@code{tile-windows}) -@cindex tiling -@kindex C-x t -@findex tile-windows -Divides the available screen space among all of the visible windows. -Each window is given an equal portion of the screen in which to display -its contents. The variable @code{automatic-tiling} can cause -@code{tile-windows} to be called when a window is created or deleted. -@xref{Variables, , @code{automatic-tiling}}. -@end table - -@node The Echo Area -@section The Echo Area -@cindex echo area - -The @dfn{echo area} is a one line window which appears at the bottom of -the screen. It is used to display informative or error messages, and to -read lines of input from you when that is necessary. Almost all of the -commands available in the echo area are identical to their Emacs -counterparts, so please refer to that documentation for greater depth of -discussion on the concepts of editing a line of text. The following -table briefly lists the commands that are available while input is being -read in the echo area: - -@table @asis -@item @code{C-f} (@code{echo-area-forward}) -@kindex C-f, in the echo area -@findex echo-area-forward -Moves forward a character. - -@item @code{C-b} (@code{echo-area-backward}) -@kindex C-b, in the echo area -@findex echo-area-backward -Moves backward a character. - -@item @code{C-a} (@code{echo-area-beg-of-line}) -@kindex C-a, in the echo area -@findex echo-area-beg-of-line -Moves to the start of the input line. - -@item @code{C-e} (@code{echo-area-end-of-line}) -@kindex C-e, in the echo area -@findex echo-area-end-of-line -Moves to the end of the input line. - -@item @code{M-f} (@code{echo-area-forward-word}) -@kindex M-f, in the echo area -@findex echo-area-forward-word -Moves forward a word. - -@item @code{M-b} (@code{echo-area-backward-word}) -@kindex M-b, in the echo area -@findex echo-area-backward-word -Moves backward a word. - -@item @code{C-d} (@code{echo-area-delete}) -@kindex C-d, in the echo area -@findex echo-area-delete -Deletes the character under the cursor. - -@item @code{DEL} (@code{echo-area-rubout}) -@kindex DEL, in the echo area -@findex echo-area-rubout -Deletes the character behind the cursor. - -@item @code{C-g} (@code{echo-area-abort}) -@kindex C-g, in the echo area -@findex echo-area-abort -Cancels or quits the current operation. If completion is being read, -@samp{C-g} discards the text of the input line which does not match any -completion. If the input line is empty, @samp{C-g} aborts the calling -function. - -@item @code{RET} (@code{echo-area-newline}) -@kindex RET, in the echo area -@findex echo-area-newline -Accepts (or forces completion of) the current input line. - -@item @code{C-q} (@code{echo-area-quoted-insert}) -@kindex C-q, in the echo area -@findex echo-area-quoted-insert -Inserts the next character verbatim. This is how you can insert control -characters into a search string, for example. - -@item @var{printing character} (@code{echo-area-insert}) -@kindex printing characters, in the echo area -@findex echo-area-insert -Inserts the character. - -@item @code{M-TAB} (@code{echo-area-tab-insert}) -@kindex M-TAB, in the echo area -@findex echo-area-tab-insert -Inserts a TAB character. - -@item @code{C-t} (@code{echo-area-transpose-chars}) -@kindex C-t, in the echo area -@findex echo-area-transpose-chars -Transposes the characters at the cursor. -@end table - -The next group of commands deal with @dfn{killing}, and @dfn{yanking} -text. For an in depth discussion of killing and yanking, -@pxref{Killing, , Killing and Deleting, emacs, the GNU Emacs Manual} - -@table @asis -@item @code{M-d} (@code{echo-area-kill-word}) -@kindex M-d, in the echo area -@findex echo-area-kill-word -Kills the word following the cursor. - -@item @code{M-DEL} (@code{echo-area-backward-kill-word}) -@kindex M-DEL, in the echo area -@findex echo-area-backward-kill-word -Kills the word preceding the cursor. - -@item @code{C-k} (@code{echo-area-kill-line}) -@kindex C-k, in the echo area -@findex echo-area-kill-line -Kills the text from the cursor to the end of the line. - -@item @code{C-x DEL} (@code{echo-area-backward-kill-line}) -@kindex C-x DEL, in the echo area -@findex echo-area-backward-kill-line -Kills the text from the cursor to the beginning of the line. - -@item @code{C-y} (@code{echo-area-yank}) -@kindex C-y, in the echo area -@findex echo-area-yank -Yanks back the contents of the last kill. - -@item @code{M-y} (@code{echo-area-yank-pop}) -@kindex M-y, in the echo area -@findex echo-area-yank-pop -Yanks back a previous kill, removing the last yanked text first. -@end table - -Sometimes when reading input in the echo area, the command that needed -input will only accept one of a list of several choices. The choices -represent the @dfn{possible completions}, and you must respond with one -of them. Since there are a limited number of responses you can make, -Info allows you to abbreviate what you type, only typing as much of the -response as is necessary to uniquely identify it. In addition, you can -request Info to fill in as much of the response as is possible; this -is called @dfn{completion}. - -The following commands are available when completing in the echo area: - -@table @asis -@item @code{TAB} (@code{echo-area-complete}) -@itemx @code{SPC} -@kindex TAB, in the echo area -@kindex SPC, in the echo area -@findex echo-area-complete -Inserts as much of a completion as is possible. - -@item @code{?} (@code{echo-area-possible-completions}) -@kindex ?, in the echo area -@findex echo-area-possible-completions -Displays a window containing a list of the possible completions of what -you have typed so far. For example, if the available choices are: -@example -bar -foliate -food -forget -@end example -and you have typed an @samp{f}, followed by @samp{?}, the possible -completions would contain: -@example -foliate -food -forget -@end example -i.e., all of the choices which begin with @samp{f}. Pressing @key{SPC} -or @key{TAB} would result in @samp{fo} appearing in the echo area, since -all of the choices which begin with @samp{f} continue with @samp{o}. -Now, typing @samp{l} followed by @samp{TAB} results in @samp{foliate} -appearing in the echo area, since that is the only choice which begins -with @samp{fol}. - -@item @code{ESC C-v} (@code{echo-area-scroll-completions-window}) -@kindex ESC C-v, in the echo area -@findex echo-area-scroll-completions-window -Scrolls the completions window, if that is visible, or the "other" -window if not. -@end table - -@node Printing Nodes -@chapter Printing Out Nodes -@cindex printing - -You may wish to print out the contents of a node as a quick reference -document for later use. Info provides you with a command for doing -this. In general, we recommend that you use @TeX{} to format the -document and print sections of it, by running @code{tex} on the texinfo -source file. - -@table @asis -@item @code{M-x print-node} -@findex print-node -@cindex INFO_PRINT_COMMAND, environment variable -Pipes the contents of the current node through the command in the -environment variable @code{INFO_PRINT_COMMAND}. If the variable doesn't -exist, the node is simply piped to @code{lpr}. -@end table - -@node Miscellaneous Commands -@chapter Miscellaneous Commands - -GNU Info contains several commands which self-document GNU Info: - -@table @asis -@item @code{M-x describe-command} -@cindex functions, describing -@cindex commands, describing -@findex describe-command -Reads the name of an Info command in the echo area and then displays a -brief description of what that command does. - -@item @code{M-x describe-key} -@cindex keys, describing -@findex describe-key -Reads a key sequence in the echo area, and then displays the name and -documentation of the Info command that the key sequence invokes. - -@item @code{M-x describe-variable} -Reads the name of a variable in the echo area and then displays a brief -description of what the variable affects. - -@item @code{M-x where-is} -@findex where-is -Reads the name of an Info command in the echo area, and then displays -a key sequence which can be typed in order to invoke that command. - -@item @code{C-h} (@code{get-help-window}) -@itemx @code{?} -@kindex C-h -@kindex ?, in Info windows -@findex get-help-window -Creates (or moves into) the window displaying @code{*Help*}, and places -a node containing a quick reference card into it. This window displays -the most concise information about GNU Info available. - -@item @code{h} (@code{get-info-help-node}) -@kindex h -@findex get-info-help-node -Tries hard to visit the node @code{(info)Help}. The info file -@file{info.texi} distributed with GNU Info contains this node. Of -course, the file must first be processed with @code{makeinfo}, and then -placed into the location of your info directory. -@end table - -Here are the commands for creating a numeric argument: - -@table @asis -@item @code{C-u} (@code{universal-argument}) -@cindex numeric arguments -@kindex C-u -@findex universal-argument -Starts (or multiplies by 4) the current numeric argument. @samp{C-u} is -a good way to give a small numeric argument to cursor movement or -scrolling commands; @samp{C-u C-v} scrolls the screen 4 lines, while -@samp{C-u C-u C-n} moves the cursor down 16 lines. - -@item @code{M-1} (@code{add-digit-to-numeric-arg}) -@itemx @code{M-2} @dots{} @code{M-9} -@kindex M-1 @dots{} M-9 -@findex add-digit-to-numeric-arg -Adds the digit value of the invoking key to the current numeric -argument. Once Info is reading a numeric argument, you may just type -the digits of the argument, without the Meta prefix. For example, you -might give @samp{C-l} a numeric argument of 32 by typing: - -@example -@kbd{C-u 3 2 C-l} -@end example -or -@example -@kbd{M-3 2 C-l} -@end example -@end table - -@samp{C-g} is used to abort the reading of a multi-character key -sequence, to cancel lengthy operations (such as multi-file searches) and -to cancel reading input in the echo area. - -@table @asis -@item @code{C-g} (@code{abort-key}) -@cindex cancelling typeahead -@cindex cancelling the current operation -@kindex C-g, in Info windows -@findex abort-key -Cancels current operation. -@end table - -The @samp{q} command of Info simply quits running Info. - -@table @asis -@item @code{q} (@code{quit}) -@cindex quitting -@kindex q -@findex quit -Exits GNU Info. -@end table - -If the operating system tells GNU Info that the screen is 60 lines tall, -and it is actually only 40 lines tall, here is a way to tell Info that -the operating system is correct. - -@table @asis -@item @code{M-x set-screen-height} -@findex set-screen-height -@cindex screen, changing the height of -Reads a height value in the echo area and sets the height of the -displayed screen to that value. -@end table - -Finally, Info provides a convenient way to display footnotes which might -be associated with the current node that you are viewing: - -@table @asis -@item @code{ESC C-f} (@code{show-footnotes}) -@kindex ESC C-f -@findex show-footnotes -@cindex footnotes, displaying -Shows the footnotes (if any) associated with the current node in another -window. You can have Info automatically display the footnotes -associated with a node when the node is selected by setting the variable -@code{automatic-footnotes}. @xref{Variables, , @code{automatic-footnotes}}. -@end table - -@node Variables -@chapter Manipulating Variables - -GNU Info contains several @dfn{variables} whose values are looked at by various -Info commands. You can change the values of these variables, and thus -change the behaviour of Info to more closely match your environment and -info file reading manner. - -@table @asis -@item @code{M-x set-variable} -@cindex variables, setting -@findex set-variable -Reads the name of a variable, and the value for it, in the echo area and -then sets the variable to that value. Completion is available when -reading the variable name; often, completion is available when reading -the value to give to the variable, but that depends on the variable -itself. If a variable does @emph{not} supply multiple choices to -complete over, it expects a numeric value. - -@item @code{M-x describe-variable} -@cindex variables, describing -@findex describe-variable -Reads the name of a variable in the echo area and then displays a brief -description of what the variable affects. -@end table - -Here is a list of the variables that you can set in Info. - -@table @code -@item automatic-footnotes -@vindex automatic-footnotes -When set to @code{On}, footnotes appear and disappear automatically. -This variable is @code{On} by default. When a node is selected, a -window containing the footnotes which appear in that node is created, -and the footnotes are displayed within the new window. The window that -Info creates to contain the footnotes is called @samp{*Footnotes*}. If -a node is selected which contains no footnotes, and a @samp{*Footnotes*} -window is on the screen, the @samp{*Footnotes*} window is deleted. -Footnote windows created in this fashion are not automatically tiled so -that they can use as little of the display as is possible. - -@item automatic-tiling -@vindex automatic-tiling -When set to @code{On}, creating or deleting a window resizes other -windows. This variable is @code{Off} by default. Normally, typing -@samp{C-x 2} divides the current window into two equal parts. When -@code{automatic-tiling} is set to @code{On}, all of the windows are -resized automatically, keeping an equal number of lines visible in each -window. There are exceptions to the automatic tiling; specifically, the -windows @samp{*Completions*} and @samp{*Footnotes*} are @emph{not} -resized through automatic tiling; they remain their original size. - -@item visible-bell -@vindex visible-bell -When set to @code{On}, GNU Info attempts to flash the screen instead of -ringing the bell. This variable is @code{Off} by default. Of course, -Info can only flash the screen if the terminal allows it; in the case -that the terminal does not allow it, the setting of this variable has no -effect. However, you can make Info perform quietly by setting the -@code{errors-ring-bell} variable to @code{Off}. - -@item errors-ring-bell -@vindex errors-ring-bell -When set to @code{On}, errors cause the bell to ring. The default -setting of this variable is @code{On}. - -@item gc-compressed-files -@vindex gc-compressed-files -When set to @code{On}, Info garbage collects files which had to be -uncompressed. The default value of this variable is @code{Off}. -Whenever a node is visited in Info, the info file containing that node -is read into core, and Info reads information about the tags and nodes -contained in that file. Once the tags information is read by Info, it -is never forgotten. However, the actual text of the nodes does not need -to remain in core unless a particular info window needs it. For -non-compressed files, the text of the nodes does not remain in core when -it is no longer in use. But de-compressing a file can be a time -consuming operation, and so Info tries hard not to do it twice. -@code{gc-compressed-files} tells Info it is okay to garbage collect the -text of the nodes of a file which was compressed on disk. - -@item show-index-match -@vindex show-index-match -When set to @code{On}, the portion of the matched search string is -highlighted in the message which explains where the matched search -string was found. The default value of this variable is @code{On}. -When Info displays the location where an index match was found, -(@pxref{Searching Commands, , @code{next-index-match}}), the portion of the -string that you had typed is highlighted by displaying it in the inverse -case from its surrounding characters. - -@item scroll-behaviour -@vindex scroll-behaviour -Controls what happens when forward scrolling is requested at the end of -a node, or when backward scrolling is requested at the beginning of a -node. The default value for this variable is @code{Continuous}. There -are three possible values for this variable: - -@table @code -@item Continuous -Tries to get the first item in this node's menu, or failing that, the -@samp{Next} node, or failing that, the @samp{Next} of the @samp{Up}. -This behaviour is identical to using the @samp{]} -(@code{global-next-node}) and @samp{[} (@code{global-prev-node}) -commands. - -@item Next Only -Only tries to get the @samp{Next} node. - -@item Page Only -Simply gives up, changing nothing. If @code{scroll-behaviour} is -@code{Page Only}, no scrolling command can change the node that is being -viewed. -@end table - -@item scroll-step -@vindex scroll-step -The number of lines to scroll when the cursor moves out of the window. -Scrolling happens automatically if the cursor has moved out of the -visible portion of the node text when it is time to display. Usually -the scrolling is done so as to put the cursor on the center line of the -current window. However, if the variable @code{scroll-step} has a -nonzero value, Info attempts to scroll the node text by that many lines; -if that is enough to bring the cursor back into the window, that is what -is done. The default value of this variable is 0, thus placing the -cursor (and the text it is attached to) in the center of the window. -Setting this variable to 1 causes a kind of "smooth scrolling" which -some people prefer. - -@item ISO-Latin -@cindex ISO Latin characters -@vindex ISO-Latin -When set to @code{On}, Info accepts and displays ISO Latin characters. -By default, Info assumes an ASCII character set. @code{ISO-Latin} tells -Info that it is running in an environment where the European standard -character set is in use, and allows you to input such characters to -Info, as well as display them. -@end table - -@node Info for Sys Admins -@chapter Info for System Administrators - -This text describes some common ways of setting up an Info heierarchy -from scratch, and details the various options that are available when -installing Info. This text is designed for the person who is installing -GNU Info on the system; although users may find the information present -in this section interesting, none of it is vital to understanding how to -use GNU Info. - -@menu -* Setting the INFOPATH:: Where are my Info files kept? -* Editing the DIR node:: What goes in `DIR', and why? -* Storing Info files:: Alternate formats allow flexibilty in setups. -* Using `localdir':: Building DIR on the fly. -* Example setups:: Some common ways to origanize Info files. -@end menu - -@node Setting the INFOPATH -@section Setting the INFOPATH -Where are my Info files kept? - -@node Editing the DIR node -@section Editing the DIR node -What goes in `DIR', and why? - -@node Storing Info files -@section Storing Info files -Alternate formats allow flexibilty in setups. - -@node Using `localdir' -@section Using `localdir' -Building DIR on the fly. - -@node Example setups -@section Example setups -Some common ways to origanize Info files. - -@ifset STANDALONE -@node GNU Info Global Index -@appendix Global Index -@printindex cp -@end ifset diff --git a/gnu/usr.bin/texinfo/info-files/texi.info b/gnu/usr.bin/texinfo/info-files/texi.info deleted file mode 100644 index cd677e85cd5e..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info +++ /dev/null @@ -1,297 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -Indirect: -texi.info-1: 1096 -texi.info-2: 50585 -texi.info-3: 100344 -texi.info-4: 149083 -texi.info-5: 197497 -texi.info-6: 247275 -texi.info-7: 296490 -texi.info-8: 346023 -texi.info-9: 387598 -texi.info-10: 433598 -texi.info-11: 476101 - -Tag Table: -(Indirect) -Node: Top1096 -Node: Copying21758 -Node: Overview23766 -Node: Using Texinfo25673 -Node: Info Files28165 -Node: Printed Books32225 -Node: Formatting Commands35110 -Node: Conventions38551 -Node: Comments40811 -Node: Minimum42233 -Node: Six Parts44386 -Node: Short Sample45896 -Node: Acknowledgements50027 -Node: Texinfo Mode50585 -Node: Texinfo Mode Overview51956 -Node: Emacs Editing52709 -Node: Inserting54839 -Node: Showing the Structure59115 -Node: Updating Nodes and Menus61634 -Node: Updating Commands62706 -Node: Updating Requirements68741 -Node: Other Updating Commands71042 -Node: Info Formatting74311 -Node: Printing75635 -Node: Texinfo Mode Summary77399 -Node: Beginning a File82167 -Node: Four Parts83056 -Node: Sample Beginning84502 -Node: Header86125 -Node: First Line87476 -Node: Start of Header88448 -Node: setfilename89163 -Node: settitle90763 -Node: setchapternewpage92646 -Node: paragraphindent95412 -Node: End of Header96877 -Node: Info Summary and Permissions97717 -Node: Titlepage & Copyright Page98738 -Node: titlepage100344 -Node: titlefont center sp102665 -Node: title subtitle author103895 -Node: Copyright & Permissions106171 -Node: end titlepage108176 -Node: headings on off109881 -Node: The Top Node111707 -Node: Title of Top Node112862 -Node: Master Menu Parts114099 -Node: Software Copying Permissions116150 -Node: Ending a File117318 -Node: Printing Indices & Menus118165 -Node: Contents120448 -Node: File End122790 -Node: Structuring123462 -Node: Tree Structuring125043 -Node: Structuring Command Types126467 -Node: makeinfo top128792 -Node: chapter129323 -Node: unnumbered & appendix130147 -Node: majorheading & chapheading130986 -Node: section131808 -Node: unnumberedsec appendixsec heading132573 -Node: subsection133560 -Node: unnumberedsubsec appendixsubsec subheading134131 -Node: subsubsection135083 -Node: Nodes136603 -Node: Two Paths137538 -Node: Node Menu Illustration138810 -Node: node142510 -Node: Node Names145206 -Node: Writing a Node146271 -Node: Node Line Tips148291 -Node: Node Line Requirements149083 -Node: First Node150691 -Node: makeinfo top command151811 -Node: Top Node Summary153591 -Node: makeinfo Pointer Creation154728 -Node: Menus155977 -Node: Menu Location157220 -Node: Writing a Menu158884 -Node: Menu Parts159850 -Node: Less Cluttered Menu Entry160848 -Node: Menu Example161473 -Node: Other Info Files162995 -Node: Cross References164855 -Node: References165734 -Node: Cross Reference Commands167458 -Node: Cross Reference Parts168509 -Node: xref171238 -Node: Reference Syntax172035 -Node: One Argument173679 -Node: Two Arguments174690 -Node: Three Arguments175804 -Node: Four and Five Arguments178189 -Node: Top Node Naming180602 -Node: ref181610 -Node: pxref182998 -Node: inforef185382 -Node: Marking Text186662 -Node: Indicating187283 -Node: Useful Highlighting189014 -Node: code190199 -Node: kbd193243 -Node: key194431 -Node: samp195985 -Node: var197497 -Node: file199287 -Node: dfn199893 -Node: cite200802 -Node: Emphasis201243 -Node: emph & strong202071 -Node: Smallcaps203041 -Node: Fonts204371 -Node: Quotations and Examples205427 -Node: Block Enclosing Commands207048 -Node: quotation209043 -Node: example210132 -Node: noindent212190 -Node: Lisp Example213657 -Node: smallexample & smalllisp214488 -Node: display216516 -Node: format217146 -Node: exdent217605 -Node: flushleft & flushright218684 -Node: cartouche219946 -Node: Lists and Tables220716 -Node: Introducing Lists221311 -Node: itemize222953 -Node: enumerate225104 -Node: Two-column Tables227594 -Node: table228287 -Node: ftable vtable230601 -Node: itemx231644 -Node: Indices232604 -Node: Index Entries233753 -Node: Predefined Indices234870 -Node: Indexing Commands235865 -Node: Combining Indices239873 -Node: syncodeindex241235 -Node: synindex242874 -Node: New Indices243398 -Node: Insertions245227 -Node: Braces Atsigns Periods245985 -Node: Inserting An Atsign247275 -Node: Inserting Braces247533 -Node: Controlling Spacing247932 -Node: dmn249490 -Node: Dots Bullets250719 -Node: dots251525 -Node: bullet251920 -Node: TeX and copyright252297 -Node: tex252861 -Node: copyright symbol253233 -Node: minus253479 -Node: Glyphs254350 -Node: Glyphs Summary255461 -Node: result255973 -Node: expansion256430 -Node: Print Glyph257352 -Node: Error Glyph258203 -Node: Equivalence259021 -Node: Point Glyph259683 -Node: Breaks261206 -Node: Break Commands262558 -Node: Line Breaks263246 -Node: w264248 -Node: sp265066 -Node: page265474 -Node: group265851 -Node: need267596 -Node: Definition Commands268326 -Node: Def Cmd Template269897 -Node: Optional Arguments272807 -Node: deffnx274396 -Node: Def Cmds in Detail275352 -Node: Functions Commands276462 -Node: Variables Commands279391 -Node: Typed Functions281340 -Node: Typed Variables284875 -Node: Abstract Objects286856 -Node: Data Types291752 -Node: Def Cmd Conventions293005 -Node: Sample Function Definition293566 -Node: Footnotes296490 -Node: Conditionals300343 -Node: Conditional Commands301099 -Node: Using Ordinary TeX Commands302508 -Node: set clear value303956 -Node: ifset ifclear304761 -Node: value307921 -Node: value Example309339 -Node: Format/Print Hardcopy310917 -Node: Use TeX312719 -Node: Shell Format & Print313310 -Node: Within Emacs317908 -Node: Texinfo Mode Printing318896 -Node: Compile-Command322646 -Node: Requirements Summary323554 -Node: Preparing for TeX324974 -Node: Overfull hboxes326989 -Node: smallbook328549 -Node: A4 Paper329782 -Node: Cropmarks and Magnification330484 -Node: Create an Info File332460 -Node: makeinfo advantages333764 -Node: Invoking makeinfo334651 -Node: makeinfo options335363 -Node: Pointer Validation340823 -Node: makeinfo in Emacs342207 -Node: texinfo-format commands344752 -Node: Batch Formatting346023 -Node: Tag and Split Files347269 -Node: Install an Info File350626 -Node: Directory file351276 -Node: New Info File352956 -Node: Other Info Directories354095 -Node: Command List355961 -Node: Tips387598 -Node: Sample Texinfo File399031 -Node: Sample Permissions401147 -Node: Inserting Permissions402188 -Node: ifinfo Permissions404469 -Node: Titlepage Permissions406088 -Node: Include Files407348 -Node: Using Include Files408434 -Node: texinfo-multiple-files-update410368 -Node: Include File Requirements412759 -Node: Sample Include File414004 -Node: Include Files Evolution415532 -Node: Headings417509 -Node: Headings Introduced418144 -Node: Heading Format420033 -Node: Heading Choice422489 -Node: Custom Headings423860 -Node: Catching Mistakes428069 -Node: makeinfo preferred429359 -Node: Debugging with Info430260 -Node: Debugging with TeX433598 -Node: Using texinfo-show-structure437940 -Node: Using occur441040 -Node: Running Info-Validate442579 -Node: Using Info-validate443639 -Node: Unsplit445454 -Node: Tagifying446502 -Node: Splitting447361 -Node: Refilling Paragraphs448981 -Node: Command Syntax450800 -Node: Obtaining TeX453731 -Node: New Features454842 -Node: New Texinfo Mode Commands455424 -Node: New Commands458894 -Node: Command and Variable Index463543 -Node: Concept Index476101 - -End Tag Table diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-1 b/gnu/usr.bin/texinfo/info-files/texi.info-1 deleted file mode 100644 index 28b4895fc7e5..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-1 +++ /dev/null @@ -1,1131 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: Top, Next: Copying, Prev: (dir), Up: (dir) - -Texinfo -******* - - Texinfo is a documentation system that uses a single source file to -produce both on-line information and printed output. - - The first part of this master menu lists the major nodes in this Info -document, including the @-command and concept indices. The rest of the -menu lists all the lower level nodes in the document. - - This is Edition 2.18 of the Texinfo documentation, 26 March 1993, -for Texinfo Version 2. - -* Menu: - -* Copying:: Your rights. -* Overview:: Texinfo in brief. -* Texinfo Mode:: How to use Texinfo mode. -* Beginning a File:: What is at the beginning of a Texinfo file? -* Ending a File:: What is at the end of a Texinfo file? -* Structuring:: How to create chapters, sections, subsections, - appendices, and other parts. -* Nodes:: How to write nodes. -* Menus:: How to write menus. -* Cross References:: How to write cross references. -* Marking Text:: How to mark words and phrases as code, - keyboard input, meta-syntactic - variables, and the like. -* Quotations and Examples:: How to write quotations, examples, etc. -* Lists and Tables:: How to write lists and tables. -* Indices:: How to create indices. -* Insertions:: How to insert @-signs, braces, etc. -* Glyphs:: How to indicate results of evaluation, - expansion of macros, errors, etc. -* Breaks:: How to force and prevent line and page breaks. -* Definition Commands:: How to describe functions and the like - in a uniform manner. -* Footnotes:: How to write footnotes. -* Conditionals:: How to specify text for either TeX or Info. -* Format/Print Hardcopy:: How to convert a Texinfo file to a file - for printing and how to print that file. -* Create an Info File:: Convert a Texinfo file into an Info file. -* Install an Info File:: Make an Info file accessible to users. -* Command List:: All the Texinfo @-commands. -* Tips:: Hints on how to write a Texinfo document. -* Sample Texinfo File:: A sample Texinfo file to look at. -* Sample Permissions:: Tell readers they have the right to copy - and distribute. -* Include Files:: How to incorporate other Texinfo files. -* Headings:: How to write page headings and footings. -* Catching Mistakes:: How to find formatting mistakes. -* Refilling Paragraphs:: All about paragraph refilling. -* Command Syntax:: A description of @-Command syntax. -* Obtaining TeX:: How to Obtain TeX. -* New Features:: Texinfo second edition features. -* Command and Variable Index:: A menu containing commands and variables. -* Concept Index:: A menu covering many topics. - - -- The Detailed Node Listing -- - -Overview of Texinfo - -* Using Texinfo:: Create a conventional printed book - or an Info file. -* Info Files:: What is an Info file? -* Printed Books:: Characteristics of a printed book or manual. -* Formatting Commands:: @-commands are used for formatting. -* Conventions:: General rules for writing a Texinfo file. -* Comments:: How to write comments and mark regions that - the formatting commands will ignore. -* Minimum:: What a Texinfo file must have. -* Six Parts:: Usually, a Texinfo file has six parts. -* Short Sample:: A short sample Texinfo file. -* Acknowledgements:: - -Using Texinfo Mode - -* Texinfo Mode Overview:: How Texinfo mode can help you. -* Emacs Editing:: Texinfo mode adds to GNU Emacs' general - purpose editing features. -* Inserting:: How to insert frequently used @-commands. -* Showing the Structure:: How to show the structure of a file. -* Updating Nodes and Menus:: How to update or create new nodes and menus. -* Info Formatting:: How to format for Info. -* Printing:: How to format and print part or all of a file. -* Texinfo Mode Summary:: Summary of all the Texinfo mode commands. - -Updating Nodes and Menus - -* Updating Commands:: Five major updating commands. -* Updating Requirements:: How to structure a Texinfo file for - using the updating command. -* Other Updating Commands:: How to indent descriptions, insert - missing nodes lines, and update - nodes in sequence. - -Beginning a Texinfo File - -* Four Parts:: Four parts begin a Texinfo file. -* Sample Beginning:: Here is a sample beginning for a Texinfo file. -* Header:: The very beginning of a Texinfo file. -* Info Summary and Permissions:: Summary and copying permissions for Info. -* Titlepage & Copyright Page:: Creating the title and copyright pages. -* The Top Node:: Creating the `Top' node and master menu. -* Software Copying Permissions:: Ensure that you and others continue to - have the right to use and share software. - -The Texinfo File Header - -* First Line:: The first line of a Texinfo file. -* Start of Header:: Formatting a region requires this. -* setfilename:: Tell Info the name of the Info file. -* settitle:: Create a title for the printed work. -* setchapternewpage:: Start chapters on right-hand pages. -* paragraphindent:: An option to specify paragraph indentation. -* End of Header:: Formatting a region requires this. - -The Title and Copyright Pages - -* titlepage:: Create a title for the printed document. -* titlefont center sp:: The `@titlefont', `@center', - and `@sp' commands. -* title subtitle author:: The `@title', `@subtitle', - and `@author' commands. -* Copyright & Permissions:: How to write the copyright notice and - include copying permissions. -* end titlepage:: Turn on page headings after the title and - copyright pages. -* headings on off:: An option for turning headings on and off - and double or single sided printing. - -The `Top' Node and Master Menu - -* Title of Top Node:: Sketch what the file is about. -* Master Menu Parts:: A master menu has three or more parts. - -Ending a Texinfo File - -* Printing Indices & Menus:: How to print an index in hardcopy and - generate index menus in Info. -* Contents:: How to create a table of contents. -* File End:: How to mark the end of a file. - -Chapter Structuring - -* Tree Structuring:: A manual is like an upside down tree ... -* Structuring Command Types:: How to divide a manual into parts. -* makeinfo top:: The `@top' command, part of the `Top' node. -* chapter:: -* unnumbered & appendix:: -* majorheading & chapheading:: -* section:: -* unnumberedsec appendixsec heading:: -* subsection:: -* unnumberedsubsec appendixsubsec subheading:: -* subsubsection:: Commands for the lowest level sections. - -Nodes - -* Two Paths:: Different commands to structure - Info output and printed output. -* Node Menu Illustration:: A diagram, and sample nodes and menus. -* node:: How to write a node, in detail. -* makeinfo Pointer Creation:: How to create node pointers with `makeinfo'. - -The `@node' Command - -* Node Names:: How to choose node and pointer names. -* Writing a Node:: How to write an `@node' line. -* Node Line Tips:: Keep names short. -* Node Line Requirements:: Keep names unique, without @-commands. -* First Node:: How to write a `Top' node. -* makeinfo top command:: How to use the `@top' command. -* Top Node Summary:: Write a brief description for readers. - -Menus - -* Menu Location:: Put a menu in a short node. -* Writing a Menu:: What is a menu? -* Menu Parts:: A menu entry has three parts. -* Less Cluttered Menu Entry:: Two part menu entry. -* Menu Example:: Two and three part menu entries. -* Other Info Files:: How to refer to a different Info file. - -Cross References - -* References:: What cross references are for. -* Cross Reference Commands:: A summary of the different commands. -* Cross Reference Parts:: A cross reference has several parts. -* xref:: Begin a reference with `See' ... -* Top Node Naming:: How to refer to the beginning of another file. -* ref:: A reference for the last part of a sentence. -* pxref:: How to write a parenthetical cross reference. -* inforef:: How to refer to an Info-only file. - -`@xref' - -* Reference Syntax:: What a reference looks like and requires. -* One Argument:: `@xref' with one argument. -* Two Arguments:: `@xref' with two arguments. -* Three Arguments:: `@xref' with three arguments. -* Four and Five Arguments:: `@xref' with four and five arguments. - -Marking Words and Phrases - -* Indicating:: How to indicate definitions, files, etc. -* Emphasis:: How to emphasize text. - -Indicating Definitions, Commands, etc. - -* Useful Highlighting:: Highlighting provides useful information. -* code:: How to indicate code. -* kbd:: How to show keyboard input. -* key:: How to specify keys. -* samp:: How to show a literal sequence of characters. -* var:: How to indicate a metasyntactic variable. -* file:: How to indicate the name of a file. -* dfn:: How to specify a definition. -* cite:: How to refer to a book that is not in Info. - -Emphasizing Text - -* emph & strong:: How to emphasize text in Texinfo. -* Smallcaps:: How to use the small caps font. -* Fonts:: Various font commands for printed output. - -Quotations and Examples - -* Block Enclosing Commands:: Use different constructs for - different purposes. -* quotation:: How to write a quotation. -* example:: How to write an example in a fixed-width font. -* noindent:: How to prevent paragraph indentation. -* Lisp Example:: How to illustrate Lisp code. -* smallexample & smalllisp:: Forms for the `@smallbook' option. -* display:: How to write an example in the current font. -* format:: How to write an example that does not narrow - the margins. -* exdent:: How to undo the indentation of a line. -* flushleft & flushright:: How to push text flushleft or flushright. -* cartouche:: How to draw cartouches around examples. - -Making Lists and Tables - -* Introducing Lists:: Texinfo formats lists for you. -* itemize:: How to construct a simple list. -* enumerate:: How to construct a numbered list. -* Two-column Tables:: How to construct a two-column table. - -Making a Two-column Table - -* table:: How to construct a two-column table. -* ftable vtable:: How to construct a two-column table - with automatic indexing. -* itemx:: How to put more entries in the first column. - -Creating Indices - -* Index Entries:: Choose different words for index entries. -* Predefined Indices:: Use different indices for different kinds - of entry. -* Indexing Commands:: How to make an index entry. -* Combining Indices:: How to combine indices. -* New Indices:: How to define your own indices. - -Combining Indices - -* syncodeindex:: How to merge two indices, using `@code' - font for the merged-from index. -* synindex:: How to merge two indices, using the - default font of the merged-to index. - -Special Insertions - -* Braces Atsigns Periods:: How to insert braces, `@' and periods. -* dmn:: How to format a dimension. -* Dots Bullets:: How to insert dots and bullets. -* TeX and copyright:: How to insert the TeX logo - and the copyright symbol. -* minus:: How to insert a minus sign. - -Inserting `@', Braces, and Periods - -* Inserting An Atsign:: -* Inserting Braces:: How to insert `{' and `}' -* Controlling Spacing:: How to insert the right amount of space - after punctuation within a sentence. - -Inserting Ellipsis, Dots, and Bullets - -* dots:: How to insert dots ... -* bullet:: How to insert a bullet. - -Inserting TeX and the Copyright Symbol - -* tex:: How to insert the TeX logo. -* copyright symbol:: How to use `@copyright'{}. - -Glyphs for Examples - -* Glyphs Summary:: -* result:: How to show the result of expression. -* expansion:: How to indicate an expansion. -* Print Glyph:: How to indicate printed output. -* Error Glyph:: How to indicate an error message. -* Equivalence:: How to indicate equivalence. -* Point Glyph:: How to indicate the location of point. - -Making and Preventing Breaks - -* Break Commands:: Cause and prevent splits. -* Line Breaks:: How to force a single line to use two lines. -* w:: How to prevent unwanted line breaks. -* sp:: How to insert blank lines. -* page:: How to force the start of a new page. -* group:: How to prevent unwanted page breaks. -* need:: Another way to prevent unwanted page breaks. - -Definition Commands - -* Def Cmd Template:: How to structure a description using a - definition command. -* Optional Arguments:: How to handle optional and repeated arguments. -* deffnx:: How to group two or more `first' lines. -* Def Cmds in Detail:: All the definition commands. -* Def Cmd Conventions:: Conventions for writing definitions. -* Sample Function Definition:: - -The Definition Commands - -* Functions Commands:: Commands for functions and similar entities. -* Variables Commands:: Commands for variables and similar entities. -* Typed Functions:: Commands for functions in typed languages. -* Typed Variables:: Commands for variables in typed languages. -* Abstract Objects:: Commands for object-oriented programming. -* Data Types:: The definition command for data types. - -Conditionally Visible Text - -* Conditional Commands:: How to specify text for Info or TeX. -* Using Ordinary TeX Commands:: You can use any and all TeX commands. -* set clear value:: How to designate which text to format (for - both Info and TeX); and how to set a - flag to a string that you can insert. - -`@set', `@clear', and `@value' - -* ifset ifclear:: Format a region if a flag is set. -* value:: Replace a flag with a string. -* value Example:: An easy way to update edition information. - -Format and Print Hardcopy - -* Use TeX:: Use TeX to format for hardcopy. -* Shell Format & Print:: How to format and print a hardcopy manual - with shell commands. -* Within Emacs:: How to format and print from an Emacs shell. -* Texinfo Mode Printing:: How to format and print in Texinfo mode. -* Compile-Command:: How to print using Emacs's compile command. -* Requirements Summary:: TeX formatting requirements summary. -* Preparing for TeX:: What you need to do to use TeX. -* Overfull hboxes:: What are and what to do with overfull hboxes. -* smallbook:: How to print small format books and manuals. -* A4 Paper:: How to print on European A4 paper. -* Cropmarks and Magnification:: How to print marks to indicate the size - of pages and how to print scaled up output. - -Creating an Info File - -* makeinfo advantages:: `makeinfo' provides better error checking. -* Invoking makeinfo:: How to run `makeinfo' from a shell. -* makeinfo options:: Specify fill-column and other options. -* Pointer Validation:: How to check that pointers point somewhere. -* makeinfo in Emacs:: How to run `makeinfo' from Emacs. -* texinfo-format commands:: Two Info formatting commands written - in Emacs Lisp are an alternative - to `makeinfo'. -* Batch Formatting:: How to format for Info in Emacs Batch mode. -* Tag and Split Files:: How tagged and split files help Info - to run better. - -Installing an Info File - -* Directory file:: The top level menu for all Info files. -* New Info File:: Listing a new info file. -* Other Info Directories:: How to specify Info files that are - located in other directories. - -Sample Permissions - -* Inserting Permissions:: How to put permissions in your document. -* ifinfo Permissions:: Sample `ifinfo' copying permissions. -* Titlepage Permissions:: Sample Titlepage copying permissions. - -Include Files - -* Using Include Files:: How to use the `@include' command. -* texinfo-multiple-files-update:: How to create and update nodes and - menus when using included files. -* Include File Requirements:: What `texinfo-multiple-files-update' expects. -* Sample Include File:: A sample outer file with included files - within it; and a sample included file. -* Include Files Evolution:: How use of the `@include' command - has changed over time. - -Page Headings - -* Headings Introduced:: Conventions for using page headings. -* Heading Format:: Standard page heading formats. -* Heading Choice:: How to specify the type of page heading. -* Custom Headings:: How to create your own headings and footings. - -Formatting Mistakes - -* makeinfo preferred:: `makeinfo' finds errors. -* Debugging with Info:: How to catch errors with Info formatting. -* Debugging with TeX:: How to catch errors with TeX formatting. -* Using texinfo-show-structure:: How to use `texinfo-show-structure'. -* Using occur:: How to list all lines containing a pattern. -* Running Info-Validate:: How to find badly referenced nodes. - -Finding Badly Referenced Nodes - -* Using Info-validate:: How to run `Info-validate'. -* Unsplit:: How to create an unsplit file. -* Tagifying:: How to tagify a file. -* Splitting:: How to split a file manually. - -Second Edition Features - -* New Texinfo Mode Commands:: The updating commands are especially useful. -* New Commands:: Many newly described @-commands. - - -File: texi.info, Node: Copying, Next: Overview, Prev: Top, Up: Top - -Texinfo Copying Conditions -************************** - - The programs currently being distributed that relate to Texinfo -include portions of GNU Emacs, plus other separate programs (including -`makeinfo', `info', `texindex', and `texinfo.tex'). These programs are -"free"; this means that everyone is free to use them and free to -redistribute them on a free basis. The Texinfo-related programs are -not in the public domain; they are copyrighted and there are -restrictions on their distribution, but these restrictions are designed -to permit everything that a good cooperating citizen would want to do. -What is not allowed is to try to prevent others from further sharing -any version of these programs that they might get from you. - - Specifically, we want to make sure that you have the right to give -away copies of the programs that relate to Texinfo, that you receive -source code or else can get it if you want it, that you can change these -programs or use pieces of them in new free programs, and that you know -you can do these things. - - To make sure that everyone has such rights, we have to forbid you to -deprive anyone else of these rights. For example, if you distribute -copies of the Texinfo related programs, you must give the recipients all -the rights that you have. You must make sure that they, too, receive or -can get the source code. And you must tell them their rights. - - Also, for our own protection, we must make certain that everyone -finds out that there is no warranty for the programs that relate to -Texinfo. If these programs are modified by someone else and passed on, -we want their recipients to know that what they have is not what we -distributed, so that any problems introduced by others will not reflect -on our reputation. - - The precise conditions of the licenses for the programs currently -being distributed that relate to Texinfo are found in the General Public -Licenses that accompany them. - - -File: texi.info, Node: Overview, Next: Texinfo Mode, Prev: Copying, Up: Top - -Overview of Texinfo -******************* - - "Texinfo"(1) is a documentation system that uses a single source -file to produce both on-line information and printed output. This -means that instead of writing two different documents, one for the -on-line help or other on-line information and the other for a typeset -manual or other printed work, you need write only one document. When -the work is revised, you need revise only one document. (You can read -the on-line information, known as an "Info file", with an Info -documentation-reading program.) - -* Menu: - -* Using Texinfo:: Create a conventional printed book - or an Info file. -* Info Files:: What is an Info file? -* Printed Books:: Characteristics of a printed book or manual. -* Formatting Commands:: @-commands are used for formatting. -* Conventions:: General rules for writing a Texinfo file. -* Comments:: How to write comments and mark regions that - the formatting commands will ignore. -* Minimum:: What a Texinfo file must have. -* Six Parts:: Usually, a Texinfo file has six parts. -* Short Sample:: A short sample Texinfo file. -* Acknowledgements:: - - ---------- Footnotes ---------- - - (1) Note that the first syllable of "Texinfo" is pronounced like -"speck", not "hex". This odd pronunciation is derived from, but is not -the same as, the pronunciation of TeX. In the word TeX, the `X' is -actually the Greek letter "chi" rather than the English letter "ex". -Pronounce TeX as if the `X' were the last sound in the name `Bach'; but -pronounce Texinfo as if the `x' were a `k'. Spell "Texinfo" with a -capital "T" and write the other letters in lower case. - - -File: texi.info, Node: Using Texinfo, Next: Info Files, Up: Overview - -Using Texinfo -============= - - Using Texinfo, you can create a printed document with the normal -features of a book, including chapters, sections, cross references, and -indices. From the same Texinfo source file, you can create a -menu-driven, on-line Info file with nodes, menus, cross references, and -indices. You can, if you wish, make the chapters and sections of the -printed document correspond to the nodes of the on-line information; -and you use the same cross references and indices for both the Info -file and the printed work. `The GNU Emacs Manual' is a good example of -a Texinfo file, as is this manual. - - To make a printed document, you process a Texinfo source file with -the TeX typesetting program. This creates a DVI file that you can -typeset and print as a book or report. (Note that the Texinfo language -is completely different from TeX's usual language, PlainTeX, which -Texinfo replaces.) If you do not have TeX, but do have `troff' or -`nroff', you can use the `texi2roff' program instead. - - To make an Info file, you process a Texinfo source file with the -`makeinfo' utility or Emacs's `texinfo-format-buffer' command; this -creates an Info file that you can install on-line. - - TeX and `texi2roff' work with many types of printer; similarly, Info -works with almost every type of computer terminal. This power makes -Texinfo a general purpose system, but brings with it a constraint, -which is that a Texinfo file may contain only the customary -"typewriter" characters (letters, numbers, spaces, and punctuation -marks) but no special graphics. - - A Texinfo file is a plain ASCII file containing text and -"@-commands" (words preceded by an `@') that tell the typesetting and -formatting programs what to do. You may edit a Texinfo file with any -text editor; but it is especially convenient to use GNU Emacs since -that editor has a special mode, called Texinfo mode, that provides -various Texinfo-related features. (*Note Texinfo Mode::.) - - Before writing a Texinfo source file, you should become familiar with -the Info documentation reading program and learn about nodes, menus, -cross references, and the rest. (*note info: (info)Top, for more -information.) - - You can use Texinfo to create both on-line help and printed manuals; -moreover, Texinfo is freely redistributable. For these reasons, Texinfo -is the format in which documentation for GNU utilities and libraries is -written. - - -File: texi.info, Node: Info Files, Next: Printed Books, Prev: Using Texinfo, Up: Overview - -Info files -========== - - An Info file is a Texinfo file formatted so that the Info -documentation reading program can operate on it. (`makeinfo' and -`texinfo-format-buffer' are two commands that convert a Texinfo file -into an Info file.) - - Info files are divided into pieces called "nodes", each of which -contains the discussion of one topic. Each node has a name, and -contains both text for the user to read and pointers to other nodes, -which are identified by their names. The Info program displays one node -at a time, and provides commands with which the user can move to other -related nodes. - - *note info: (info)Top, for more information about using Info. - - Each node of an Info file may have any number of child nodes that -describe subtopics of the node's topic. The names of child nodes are -listed in a "menu" within the parent node; this allows you to use -certain Info commands to move to one of the child nodes. Generally, an -Info file is organized like a book. If a node is at the logical level -of a chapter, its child nodes are at the level of sections; likewise, -the child nodes of sections are at the level of subsections. - - All the children of any one parent are linked together in a -bidirectional chain of `Next' and `Previous' pointers. The `Next' -pointer provides a link to the next section, and the `Previous' pointer -provides a link to the previous section. This means that all the nodes -that are at the level of sections within a chapter are linked together. -Normally the order in this chain is the same as the order of the -children in the parent's menu. Each child node records the parent node -name as its `Up' pointer. The last child has no `Next' pointer, and the -first child has the parent both as its `Previous' and as its `Up' -pointer.(1) - - The book-like structuring of an Info file into nodes that correspond -to chapters, sections, and the like is a matter of convention, not a -requirement. The `Up', `Previous', and `Next' pointers of a node can -point to any other nodes, and a menu can contain any other nodes. -Thus, the node structure can be any directed graph. But it is usually -more comprehensible to follow a structure that corresponds to the -structure of chapters and sections in a printed book or report. - - In addition to menus and to `Next', `Previous', and `Up' pointers, -Info provides pointers of another kind, called references, that can be -sprinkled throughout the text. This is usually the best way to -represent links that do not fit a hierarchical structure. - - Usually, you will design a document so that its nodes match the -structure of chapters and sections in the printed output. But there -are times when this is not right for the material being discussed. -Therefore, Texinfo uses separate commands to specify the node structure -for the Info file and the section structure for the printed output. - - Generally, you enter an Info file through a node that by convention -is called `Top'. This node normally contains just a brief summary of -the file's purpose, and a large menu through which the rest of the file -is reached. From this node, you can either traverse the file -systematically by going from node to node, or you can go to a specific -node listed in the main menu, or you can search the index menus and -then go directly to the node that has the information you want. - - If you want to read through an Info file in sequence, as if it were a -printed manual, you can get the whole file with the advanced Info -command `g* RET'. (*note Advanced Info commands: (info)Expert.) - - The `dir' file in the `info' directory serves as the departure point -for the whole Info system. From it, you can reach the `Top' nodes of -each of the documents in a complete Info system. - - ---------- Footnotes ---------- - - (1) In some documents, the first child has no `Previous' pointer. -Occasionally, the last child has the node name of the next following -higher level node as its `Next' pointer. - - -File: texi.info, Node: Printed Books, Next: Formatting Commands, Prev: Info Files, Up: Overview - -Printed Books -============= - - A Texinfo file can be formatted and typeset as a printed book or -manual. To do this, you need TeX, a powerful, sophisticated typesetting -program written by Donald Knuth.(1) - - A Texinfo-based book is similar to any other typeset, printed work: -it can have a title page, copyright page, table of contents, and -preface, as well as chapters, numbered or unnumbered sections and -subsections, page headers, cross references, footnotes, and indices. - - You can use Texinfo to write a book without ever having the intention -of converting it into on-line information. You can use Texinfo for -writing a printed novel, and even to write a printed memo, although -this latter application is not recommended since electronic mail is so -much easier. - - TeX is a general purpose typesetting program. Texinfo provides a -file called `texinfo.tex' that contains information (definitions or -"macros") that TeX uses when it typesets a Texinfo file. -(`texinfo.tex' tells TeX how to convert the Texinfo @-commands to TeX -commands, which TeX can then process to create the typeset document.) -`texinfo.tex' contains the specifications for printing a document. - - Most often, documents are printed on 8.5 inch by 11 inch pages -(216mm by 280mm; this is the default size), but you can also print for -7 inch by 9.25 inch pages (178mm by 235mm; the `@smallbook' size) or on -European A4 size paper (`@afourpaper'). (*Note Printing "Small" Books: -smallbook. Also, see *Note Printing on A4 Paper: A4 Paper.) - - By changing the parameters in `texinfo.tex', you can change the size -of the printed document. In addition, you can change the style in -which the printed document is formatted; for example, you can change the -sizes and fonts used, the amount of indentation for each paragraph, the -degree to which words are hyphenated, and the like. By changing the -specifications, you can make a book look dignified, old and serious, or -light-hearted, young and cheery. - - TeX is freely distributable. It is written in a dialect of Pascal -called WEB and can be compiled either in Pascal or (by using a -conversion program that comes with the TeX distribution) in C. (*Note -TeX Mode: (emacs)TeX Mode, for information about TeX.) - - TeX is very powerful and has a great many features. Because a -Texinfo file must be able to present information both on a -character-only terminal in Info form and in a typeset book, the -formatting commands that Texinfo supports are necessarily limited. - - *Note How to Obtain TeX: Obtaining TeX. - - ---------- Footnotes ---------- - - (1) You can also use the `texi2roff' program if you do not have -TeX; since Texinfo is designed for use with TeX, `texi2roff' is not -described here. `texi2roff' is part of the standard GNU distribution. - - -File: texi.info, Node: Formatting Commands, Next: Conventions, Prev: Printed Books, Up: Overview - -@-commands -========== - - In a Texinfo file, the commands that tell TeX how to typeset the -printed manual and tell `makeinfo' and `texinfo-format-buffer' how to -create an Info file are preceded by `@'; they are called "@-commands". -For example, `@node' is the command to indicate a node and `@chapter' -is the command to indicate the start of a chapter. - - *Please note:* All the @-commands, with the exception of the - `@TeX{}' command, must be written entirely in lower case. - - The Texinfo @-commands are a strictly limited set of constructs. The -strict limits make it possible for Texinfo files to be understood both -by TeX and by the code that converts them into Info files. You can -display Info files on any terminal that displays alphabetic and numeric -characters. Similarly, you can print the output generated by TeX on a -wide variety of printers. - - Depending on what they do or what arguments(1) they take, you need -to write @-commands on lines of their own or as part of sentences: - - * Write a command such as `@noindent' at the beginning of a line as - the only text on the line. (`@noindent' prevents the beginning of - the next line from being indented as the beginning of a paragraph.) - - * Write a command such as `@chapter' at the beginning of a line - followed by the command's arguments, in this case the chapter - title, on the rest of the line. (`@chapter' creates chapter - titles.) - - * Write a command such as `@dots{}' wherever you wish but usually - within a sentence. (`@dots{}' creates dots ...) - - * Write a command such as `@code{SAMPLE-CODE}' wherever you wish - (but usually within a sentence) with its argument, SAMPLE-CODE in - this example, between the braces. (`@code' marks text as being - code.) - - * Write a command such as `@example' at the beginning of a line of - its own; write the body-text on following lines; and write the - matching `@end' command, `@end example' in this case, at the - beginning of a line of its own after the body-text. (`@example' - ... `@end example' indents and typesets body-text as an example.) - -As a general rule, a command requires braces if it mingles among other -text; but it does not need braces if it starts a line of its own. The -non-alphabetic commands, such as `@:', are exceptions to the rule; they -do not need braces. - - As you gain experience with Texinfo, you will rapidly learn how to -write the different commands: the different ways to write commands make -it easier to write and read Texinfo files than if all commands followed -exactly the same syntax. (For details about @-command syntax, see -*Note @-Command Syntax: Command Syntax.) - - ---------- Footnotes ---------- - - (1) The word "argument" comes from the way it is used in -mathematics and does not refer to a disputation between two people; it -refers to the information presented to the command. According to the -`Oxford English Dictionary', the word derives from the Latin for "to -make clear, prove"; thus it came to mean `the evidence offered as -proof', which is to say, `the information offered', which led to its -mathematical meaning. In its other thread of derivation, the word came -to mean `to assert in a manner against which others may make counter -assertions', which led to the meaning of `argument' as a disputation. - - -File: texi.info, Node: Conventions, Next: Comments, Prev: Formatting Commands, Up: Overview - -General Syntactic Conventions -============================= - - All ASCII printing characters except `@', `{' and `}' can appear in -a Texinfo file and stand for themselves. `@' is the escape character -which introduces commands. `{' and `}' should be used only to surround -arguments to certain commands. To put one of these special characters -into the document, put an `@' character in front of it, like this: -`@@', `@{', and `@}'. - - It is customary in TeX to use doubled single-quote characters to -begin and end quotations: ` ` and ' ' (but without a space between the -two single-quote characters). This convention should be followed in -Texinfo files. TeX converts doubled single-quote characters to left- -and right-hand doubled quotation marks and Info converts doubled -single-quote characters to ASCII double-quotes: ` ` and ' ' to " . - - Use three hyphens in a row, `---', for a dash--like this. In TeX, a -single or even a double hyphen produces a printed dash that is shorter -than the usual typeset dash. Info reduces three hyphens to two for -display on the screen. - - To prevent a paragraph from being indented in the printed manual, put -the command `@noindent' on a line by itself before the paragraph. - - If you mark off a region of the Texinfo file with the `@iftex' and -`@end iftex' commands, that region will appear only in the printed -copy; in that region, you can use certain commands borrowed from -PlainTeX that you cannot use in Info. Likewise, if you mark off a -region with the `@ifinfo' and `@end ifinfo' commands, that region will -appear only in the Info file; in that region, you can use Info commands -that you cannot use in TeX. (*Note Conditionals::.) - - *Caution:* Do not use tabs in a Texinfo file! TeX uses - variable-width fonts, which means that it cannot predefine a tab - to work in all circumstances. Consequently, TeX treats tabs like - single spaces, and that is not what they look like. - - To avoid this problem, Texinfo mode causes GNU Emacs to insert - multiple spaces when you press the TAB key. - - Also, you can run `untabify' in Emacs to convert tabs in a region - to multiple spaces. - - -File: texi.info, Node: Comments, Next: Minimum, Prev: Conventions, Up: Overview - -Comments -======== - - You can write comments in a Texinfo file that will not appear in -either the Info file or the printed manual by using the `@comment' -command (which may be abbreviated to `@c'). Such comments are for the -person who reads the Texinfo file. All the text on a line that follows -either `@comment' or `@c' is a comment; the rest of the line does not -appear in either the Info file or the printed manual. (Often, you can -write the `@comment' or `@c' in the middle of a line, and only the text -that follows after the `@comment' or `@c' command does not appear; but -some commands, such as `@settitle' and `@setfilename', work on a whole -line. You cannot use `@comment' or `@c' in a line beginning with such -a command.) - - You can write long stretches of text that will not appear in either -the Info file or the printed manual by using the `@ignore' and `@end -ignore' commands. Write each of these commands on a line of its own, -starting each command at the beginning of the line. Text between these -two commands does not appear in the processed output. You can use -`@ignore' and `@end ignore' for writing comments. Often, `@ignore' and -`@end ignore' is used to enclose a part of the copying permissions that -applies to the Texinfo source file of a document, but not to the Info -or printed version of the document. - - -File: texi.info, Node: Minimum, Next: Six Parts, Prev: Comments, Up: Overview - -What a Texinfo File Must Have -============================= - - By convention, the names of Texinfo files end with one of the -extensions `.texinfo', `.texi', or `.tex'. The longer extension is -preferred since it describes more clearly to a human reader the nature -of the file. The shorter extensions are for operating systems that -cannot handle long file names. - - In order to be made into a printed manual and an Info file, a -Texinfo file *must* begin with lines like this: - - \input texinfo - @setfilename INFO-FILE-NAME - @settitle NAME-OF-MANUAL - -The contents of the file follow this beginning, and then you *must* end -a Texinfo file with a line like this: - - @bye - -The `\input texinfo' line tells TeX to use the `texinfo.tex' file, -which tells TeX how to translate the Texinfo @-commands into TeX -typesetting commands. (Note the use of the backslash, `\'; this is -correct for TeX.) The `@setfilename' line provides a name for the Info -file and the `@settitle' line specifies a title for the page headers (or -footers) of the printed manual. - - The `@bye' line at the end of the file on a line of its own tells -the formatters that the file is ended and to stop formatting. - - Usually, you will not use quite such a spare format, but will include -mode setting and start-of-header and end-of-header lines at the -beginning of a Texinfo file, like this: - - \input texinfo @c -*-texinfo-*- - @c %**start of header - @setfilename INFO-FILE-NAME - @settitle NAME-OF-MANUAL - @c %**end of header - -In the first line, `-*-texinfo-*-' causes Emacs to switch into Texinfo -mode when you edit the file. - - The `@c' lines which surround the `@setfilename' and `@settitle' -lines are optional, but you need them in order to run TeX or Info on -just part of the file. (*Note Start of Header::, for more information.) - - Furthermore, you will usually provide a Texinfo file with a title -page, indices, and the like. But the minimum, which can be useful for -short documents, is just the three lines at the beginning and the one -line at the end. - - -File: texi.info, Node: Six Parts, Next: Short Sample, Prev: Minimum, Up: Overview - -Six Parts of a Texinfo File -=========================== - - Generally, a Texinfo file contains more than the minimal beginning -and end--it usually contains six parts: - -1. Header - The "Header" names the file, tells TeX which definitions' file to - use, and performs other "housekeeping" tasks. - -2. Summary Description and Copyright - The "Summary Description and Copyright" segment describes the - document and contains the copyright notice and copying permissions - for the Info file. The segment must be enclosed between `@ifinfo' - and `@end ifinfo' commands so that the formatters place it only in - the Info file. - -3. Title and Copyright - The "Title and Copyright" segment contains the title and copyright - pages and copying permissions for the printed manual. The segment - must be enclosed between `@titlepage' and `@end titlepage' - commands. The title and copyright page appear only in the printed - manual. - -4. `Top' Node and Master Menu - The "Master Menu" contains a complete menu of all the nodes in the - whole Info file. It appears only in the Info file, in the `Top' - node. - -5. Body - The "Body" of the document may be structured like a traditional - book or encyclopedia or it may be free form. - -6. End - The "End" contains commands for printing indices and generating - the table of contents, and the `@bye' command on a line of its own. - - -File: texi.info, Node: Short Sample, Next: Acknowledgements, Prev: Six Parts, Up: Overview - -A Short Sample Texinfo File -=========================== - - Here is a complete but very short Texinfo file, in 6 parts. The -first three parts of the file, from `\input texinfo' through to `@end -titlepage', look more intimidating than they are. Most of the material -is standard boilerplate; when you write a manual, simply insert the -names for your own manual in this segment. (*Note Beginning a File::.) - -In the following, the sample text is *indented*; comments on it are -not. The complete file, without any comments, is shown in *Note Sample -Texinfo File::. - -Part 1: Header --------------- - -The header does not appear in either the Info file or the -printed output. It sets various parameters, including the -name of the Info file and the title used in the header. - - \input texinfo @c -*-texinfo-*- - @c %**start of header - @setfilename sample.info - @settitle Sample Document - @c %**end of header - - @setchapternewpage odd - -Part 2: Summary Description and Copyright ------------------------------------------ - -The summary description and copyright segment does not -appear in the printed document. - - @ifinfo - This is a short example of a complete Texinfo file. - - Copyright @copyright{} 1990 Free Software Foundation, Inc. - @end ifinfo - -Part 3: Titlepage and Copyright -------------------------------- - -The titlepage segment does not appear in the Info file. - - @titlepage - @sp 10 - @comment The title is printed in a large font. - @center @titlefont{Sample Title} - - @c The following two commands start the copyright page. - @page - @vskip 0pt plus 1filll - Copyright @copyright{} 1990 Free Software Foundation, Inc. - @end titlepage - -Part 4: `Top' Node and Master Menu ----------------------------------- - -The `Top' node contains the master menu for the Info file. -Since a printed manual uses a table of contents rather than -a menu, the master menu appears only in the Info file. - - @node Top, First Chapter, (dir), (dir) - @comment node-name, next, previous, up - - @menu - * First Chapter:: The first chapter is the - only chapter in this sample. - * Concept Index:: This index has two entries. - @end menu - -Part 5: The Body of the Document ---------------------------------- - -The body segment contains all the text of the document, but not the -indices or table of contents. This example illustrates a node and a -chapter containing an enumerated list. - - @node First Chapter, Concept Index, Top, Top - @comment node-name, next, previous, up - @chapter First Chapter - @cindex Sample index entry - - This is the contents of the first chapter. - @cindex Another sample index entry - - Here is a numbered list. - - @enumerate - @item - This is the first item. - - @item - This is the second item. - @end enumerate - - The @code{makeinfo} and @code{texinfo-format-buffer} - commands transform a Texinfo file such as this into - an Info file; and @TeX{} typesets it for a printed - manual. - -Part 6: The End of the Document -------------------------------- - -The end segment contains commands both for generating an index in a node -and unnumbered chapter of its own and for generating the table of -contents; and it contains the `@bye' command that marks the end of the -document. - - @node Concept Index, , First Chapter, Top - @comment node-name, next, previous, up - @unnumbered Concept Index - - @printindex cp - - @contents - @bye - -The Results ------------ - - Here is what the contents of the first chapter of the sample look -like: - - This is the contents of the first chapter. - - Here is a numbered list. - - 1. This is the first item. - - 2. This is the second item. - - The `makeinfo' and `texinfo-format-buffer' commands transform a - Texinfo file such as this into an Info file; and TeX typesets it - for a printed manual. - - -File: texi.info, Node: Acknowledgements, Prev: Short Sample, Up: Overview - -Acknowledgements -================ - - Richard M. Stallman wrote Edition 1.0 of this manual. -Robert J. Chassell revised and extended it, starting with Edition 1.1. - - Our thanks go out to all who helped improve this work, particularly -to Francois Pinard and David D. Zuhn, who tirelessly recorded and -reported mistakes and obscurities; our special thanks go to -Melissa Weisshaus for her frequent and often tedious reviews of nearly -similar editions. Our mistakes are our own. - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-10 b/gnu/usr.bin/texinfo/info-files/texi.info-10 deleted file mode 100644 index f28ff2e0e2a8..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-10 +++ /dev/null @@ -1,1165 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: Debugging with TeX, Next: Using texinfo-show-structure, Prev: Debugging with Info, Up: Catching Mistakes - -Catching Errors with TeX Formatting -=================================== - - You can also catch mistakes when you format a file with TeX. - - Usually, you do this after you have run `texinfo-format-buffer' (or, -better, `makeinfo-buffer') on the same file, because -`texinfo-format-buffer' sometimes displays error messages that make -more sense than TeX. (*Note Debugging with Info::, for more -information.) - - For example, TeX was run on a Texinfo file, part of which is shown -here: - - ---------- Buffer: texinfo.texi ---------- - name of the texinfo file as an extension. The - @samp{??} are `wildcards' that cause the shell to - substitute all the raw index files. (@xref{sorting - indices, for more information about sorting - indices.)@refill - ---------- Buffer: texinfo.texi ---------- - -(The cross reference lacks a closing brace.) TeX produced the following -output, after which it stopped: - - ---------- Buffer: *texinfo-tex-shell* ---------- - Runaway argument? - {sorting indices, for more information about sorting - indices.) @refill @ETC. - ! Paragraph ended before @xref was complete. - <to be read again> - @par - l.27 - - ? - ---------- Buffer: *texinfo-tex-shell* ---------- - - In this case, TeX produced an accurate and understandable error -message: - - Paragraph ended before @xref was complete. - -`@par' is an internal TeX command of no relevance to Texinfo. `l.27' -means that TeX detected the problem on line 27 of the Texinfo file. -The `?' is the prompt TeX uses in this circumstance. - - Unfortunately, TeX is not always so helpful, and sometimes you must -truly be a Sherlock Holmes to discover what went wrong. - - In any case, if you run into a problem like this, you can do one of -three things. - - 1. You can tell TeX to continue running and ignore just this error by - typing RET at the `?' prompt. - - 2. You can tell TeX to continue running and to ignore all errors as - best it can by typing `r RET' at the `?' prompt. - - This is often the best thing to do. However, beware: the one error - may produce a cascade of additional error messages as its - consequences are felt through the rest of the file. (To stop TeX - when it is producing such an avalanche of error messages, type - `C-d' (or `C-c C-d', if you are running a shell inside Emacs - Version 18.)) - - 3. You can tell TeX to stop this run by typing `x RET' at the `?' - prompt. - - Please note that if you are running TeX inside Emacs, you need to -switch to the shell buffer and line at which TeX offers the `?' prompt. - - Sometimes TeX will format a file without producing error messages -even though there is a problem. This usually occurs if a command is -not ended but TeX is able to continue processing anyhow. For example, -if you fail to end an itemized list with the `@end itemize' command, -TeX will write a DVI file that you can print out. The only error -message that TeX will give you is the somewhat mysterious comment that - - (@end occurred inside a group at level 1) - -However, if you print the DVI file, you will find that the text of the -file that follows the itemized list is entirely indented as if it were -part of the last item in the itemized list. The error message is the -way TeX says that it expected to find an `@end' command somewhere in -the file; but that it could not determine where it was needed. - - Another source of notoriously hard-to-find errors is a missing `@end -group' command. If you ever are stumped by incomprehensible errors, -look for a missing `@end group' command first. - - If the Texinfo file lacks header lines, TeX may stop in the -beginning of its run and display output that looks like the following. -The `*' indicates that TeX is waiting for input. - - This is TeX, Version 2.0 for Berkeley UNIX - (preloaded format=plain-cm 87.10.25) - (test.texinfo [1]) - * - -In this case, simply type `\end RET' after the asterisk. Then write -the header lines in the Texinfo file and run the TeX command again. -(Note the use of the backslash, `\'. TeX uses `\' instead of `@'; and -in this circumstance, you are working directly with TeX, not with -Texinfo.) - - -File: texi.info, Node: Using texinfo-show-structure, Next: Using occur, Prev: Debugging with TeX, Up: Catching Mistakes - -Using `texinfo-show-structure' -============================== - - It is not always easy to keep track of the nodes, chapters, -sections, and subsections of a Texinfo file. This is especially true -if you are revising or adding to a Texinfo file that someone else has -written. - - In GNU Emacs, in Texinfo mode, the `texinfo-show-structure' command -lists all the lines that begin with the @-commands that specify the -structure: `@chapter', `@section', `@appendix', and so on. With an -argument (`C-u' as prefix argument, if interactive), the command also -shows the `@node' lines. The `texinfo-show-structure' command is bound -to `C-c C-s' in Texinfo mode, by default. - - The lines are displayed in a buffer called the `*Occur*' buffer. -For example, when `texinfo-show-structure' was run on an earlier -version of this appendix, it produced the following: - - Lines matching "^@\\(chapter \\|sect\\|sub\\|unnum\\|major\\| - heading \\|appendix\\)" in buffer texinfo.texi. - 4:@appendix Formatting Mistakes - 52:@appendixsec Catching Errors with Info Formatting - 222:@appendixsec Catching Errors with @TeX{} Formatting - 338:@appendixsec Using @code{texinfo-show-structure} - 407:@appendixsubsec Using @code{occur} - 444:@appendixsec Finding Badly Referenced Nodes - 513:@appendixsubsec Running @code{Info-validate} - 573:@appendixsubsec Splitting a File Manually - - This says that lines 4, 52, and 222 of `texinfo.texi' begin with the -`@appendix', `@appendixsec', and `@appendixsec' commands respectively. -If you move your cursor into the `*Occur*' window, you can position the -cursor over one of the lines and use the `C-c C-c' command -(`occur-mode-goto-occurrence'), to jump to the corresponding spot in -the Texinfo file. *Note Using Occur: (emacs)Other Repeating Search, -for more information about `occur-mode-goto-occurrence'. - - The first line in the `*Occur*' window describes the "regular -expression" specified by TEXINFO-HEADING-PATTERN. This regular -expression is the pattern that `texinfo-show-structure' looks for. -*Note Using Regular Expressions: (emacs)Regexps, for more information. - - When you invoke the `texinfo-show-structure' command, Emacs will -display the structure of the whole buffer. If you want to see the -structure of just a part of the buffer, of one chapter, for example, -use the `C-x n' (`narrow-to-region') command to mark the region. -(*Note Narrowing: (emacs)Narrowing.) This is how the example used -above was generated. (To see the whole buffer again, use `C-x w' -(`widen').) - - If you call `texinfo-show-structure' with a prefix argument by -typing `C-u C-c C-s', it will list lines beginning with `@node' as well -as the lines beginning with the @-sign commands for `@chapter', -`@section', and the like. - - You can remind yourself of the structure of a Texinfo file by -looking at the list in the `*Occur*' window; and if you have mis-named -a node or left out a section, you can correct the mistake. - - -File: texi.info, Node: Using occur, Next: Running Info-Validate, Prev: Using texinfo-show-structure, Up: Catching Mistakes - -Using `occur' -============= - - Sometimes the `texinfo-show-structure' command produces too much -information. Perhaps you want to remind yourself of the overall -structure of a Texinfo file, and are overwhelmed by the detailed list -produced by `texinfo-show-structure'. In this case, you can use the -`occur' command directly. To do this, type - - `M-x occur' - -and then, when prompted, type a "regexp", a regular expression for the -pattern you want to match. (*Note Regular Expressions: -(emacs)Regexps.) The `occur' command works from the current location -of the cursor in the buffer to the end of the buffer. If you want to -run `occur' on the whole buffer, place the cursor at the beginning of -the buffer. - - For example, to see all the lines that contain the word `@chapter' -in them, just type `@chapter'. This will produce a list of the -chapters. It will also list all the sentences with `@chapter' in the -middle of the line. - - If you want to see only those lines that start with the word -`@chapter', type `^@chapter' when prompted by `occur'. If you want to -see all the lines that end with a word or phrase, end the last word -with a `$'; for example, `catching mistakes$'. This can be helpful -when you want to see all the nodes that are part of the same chapter or -section and therefore have the same `Up' pointer. - - *Note Using Occur: (emacs)Other Repeating Search, for more -information. - - -File: texi.info, Node: Running Info-Validate, Prev: Using occur, Up: Catching Mistakes - -Finding Badly Referenced Nodes -============================== - - You can use the `Info-validate' command to check whether any of the -`Next', `Previous', `Up' or other node pointers fail to point to a -node. This command checks that every node pointer points to an -existing node. The `Info-validate' command works only on Info files, -not on Texinfo files. - - The `makeinfo' program validates pointers automatically, so you do -not need to use the `Info-validate' command if you are using -`makeinfo'. You only may need to use `Info-validate' if you are unable -to run `makeinfo' and instead must create an Info file using -`texinfo-format-region' or `texinfo-format-buffer', or if you write an -Info file from scratch. - -* Menu: - -* Using Info-validate:: How to run `Info-validate'. -* Unsplit:: How to create an unsplit file. -* Tagifying:: How to tagify a file. -* Splitting:: How to split a file manually. - - -File: texi.info, Node: Using Info-validate, Next: Unsplit, Up: Running Info-Validate - -Running `Info-validate' ------------------------ - - To use `Info-validate', visit the Info file you wish to check and -type: - - M-x Info-validate - -(Note that the `Info-validate' command requires an upper case `I'. You -may also need to create a tag table before running `Info-validate'. -*Note Tagifying::.) - - If your file is valid, you will receive a message that says "File -appears valid". However, if you have a pointer that does not point to -a node, error messages will be displayed in a buffer called `*problems -in info file*'. - - For example, `Info-validate' was run on a test file that contained -only the first node of this manual. One of the messages said: - - In node "Overview", invalid Next: Texinfo Mode - -This meant that the node called `Overview' had a `Next' pointer that -did not point to anything (which was true in this case, since the test -file had only one node in it). - - Now suppose we add a node named `Texinfo Mode' to our test case but -we do not specify a `Previous' for this node. Then we will get the -following error message: - - In node "Texinfo Mode", should have Previous: Overview - -This is because every `Next' pointer should be matched by a `Previous' -(in the node where the `Next' points) which points back. - - `Info-validate' also checks that all menu entries and cross -references point to actual nodes. - - Note that `Info-validate' requires a tag table and does not work -with files that have been split. (The `texinfo-format-buffer' command -automatically splits large files.) In order to use `Info-validate' on -a large file, you must run `texinfo-format-buffer' with an argument so -that it does not split the Info file; and you must create a tag table -for the unsplit file. - - -File: texi.info, Node: Unsplit, Next: Tagifying, Prev: Using Info-validate, Up: Running Info-Validate - -Creating an Unsplit File ------------------------- - - You can run `Info-validate' only on a single Info file that has a -tag table. The command will not work on the indirect subfiles that are -generated when a master file is split. If you have a large file -(longer than 70,000 bytes or so), you need to run the -`texinfo-format-buffer' or `makeinfo-buffer' command in such a way that -it does not create indirect subfiles. You will also need to create a -tag table for the Info file. After you have done this, you can run -`Info-validate' and look for badly referenced nodes. - - The first step is to create an unsplit Info file. - - To prevent `texinfo-format-buffer' from splitting a Texinfo file -into smaller Info files, give a prefix to the `M-x -texinfo-format-buffer' command: - - C-u M-x texinfo-format-buffer - -or else - - C-u C-c C-e C-b - -When you do this, Texinfo will not split the file and will not create a -tag table for it. - - -File: texi.info, Node: Tagifying, Next: Splitting, Prev: Unsplit, Up: Running Info-Validate - -Tagifying a File ----------------- - - After creating an unsplit Info file, you must create a tag table for -it. Visit the Info file you wish to tagify and type: - - M-x Info-tagify - -(Note the upper case I in `Info-tagify'.) This creates an Info file -with a tag table that you can validate. - - The third step is to validate the Info file: - - M-x Info-validate - -(Note the upper case I in `Info-validate'.) In brief, the steps are: - - C-u M-x texinfo-format-buffer - M-x Info-tagify - M-x Info-validate - - After you have validated the node structure, you will be able to -rerun `texinfo-format-buffer' in the normal way so it will construct a -tag table and split the file automatically, or you can make the tag -table and split the file manually. - - -File: texi.info, Node: Splitting, Prev: Tagifying, Up: Running Info-Validate - -Splitting a File Manually -------------------------- - - You should split a large file or else let the -`texinfo-format-buffer' or `makeinfo-buffer' command do it for you -automatically. (Generally you will let one of the formatting commands -do this job for you. *Note Create an Info File::.) - - The split-off files are called the indirect subfiles. - - Info files are split to save memory. With smaller files, Emacs does -not have make such a large buffer to hold the information. - - If an Info file has more than 30 nodes, you should also make a tag -table for it. *Note Using Info-validate::, for information about -creating a tag table. (Again, tag tables are usually created -automatically by the formatting command; you only need to create a tag -table yourself if you are doing the job manually. Most likely, you -will do this for a large, unsplit file on which you have run -`Info-validate'.) - - Visit the Info file you wish to tagify and split and type the two -commands: - - M-x Info-tagify - M-x Info-split - -(Note that the `I' in `Info' is upper case.) - - When you use the `Info-split' command, the buffer is modified into a -(small) Info file which lists the indirect subfiles. This file should -be saved in place of the original visited file. The indirect subfiles -are written in the same directory the original file is in, with names -generated by appending `-' and a number to the original file name. - - The primary file still functions as an Info file, but it contains -just the tag table and a directory of subfiles. - - -File: texi.info, Node: Refilling Paragraphs, Next: Command Syntax, Prev: Catching Mistakes, Up: Top - -Refilling Paragraphs -******************** - - The `@refill' command refills and, optionally, indents the first -line of a paragraph.(1) The `@refill' command is no longer important, -but we describe it here because you once needed it. You will see it in -many old Texinfo files. - - Without refilling, paragraphs containing long @-constructs may look -bad after formatting because the formatter removes @-commands and -shortens some lines more than others. In the past, neither -`texinfo-format-region' nor `texinfo-format-buffer' refilled paragraphs -automatically. The `@refill' command had to be written at the end of -every paragraph to cause these formatters to fill them. (Both TeX and -`makeinfo' have always refilled paragraphs automatically.) Now, all -the Info formatters automatically fill and indent those paragraphs that -need to be filled and indented. - - The `@refill' command causes both the `texinfo-format-region' -command and the `texinfo-format-buffer' command to refill a paragraph -in the Info file *after* all the other processing has been done. For -this reason, you can not use `@refill' with a paragraph containing -either `@*' or `@w{ ... }' since the refilling action will override -those two commands. - - The `texinfo-format-region' and `texinfo-format-buffer' commands now -automatically append `@refill' to the end of each paragraph that should -be filled. They do not append `@refill' to the ends of paragraphs that -contain `@*' or `@w{ ...}' and therefore do not refill or indent them. - - ---------- Footnotes ---------- - - (1) Perhaps the command should have been called the -`@refillandindent' command, but `@refill' is shorter and the name was -chosen before indenting was possible. - - -File: texi.info, Node: Command Syntax, Next: Obtaining TeX, Prev: Refilling Paragraphs, Up: Top - -@-Command Syntax -**************** - - The character `@' is used to start special Texinfo commands. (It -has the same meaning that `\' has in PlainTeX.) Texinfo has four types -of @-command: - -1. Non-alphabetic commands. - These commands consist of an @ followed by a punctuation mark or - other character that is not part of the alphabet. Non-alphabetic - commands are almost always part of the text within a paragraph, - and never take any argument. The two characters (@ and the other - one) are complete in themselves; none is followed by braces. The - non-alphabetic commands are: `@.', `@:', `@*', `@@', `@{', and - `@}'. - -2. Alphabetic commands that do not require arguments. - These commands start with @ followed by a word followed by left- - and right-hand braces. These commands insert special symbols in - the document; they do not require arguments. For example, - `@dots{}' => `...', `@equiv{}' => `==', `@TeX{}' => `TeX', and - `@bullet{}' => `*'. - -3. Alphabetic commands that require arguments within braces. - These commands start with @ followed by a letter or a word, - followed by an argument within braces. For example, the command - `@dfn' indicates the introductory or defining use of a term; it is - used as follows: `In Texinfo, @@-commands are @dfn{mark-up} - commands.' - -4. Alphabetic commands that occupy an entire line. - These commands occupy an entire line. The line starts with @, - followed by the name of the command (a word); for example, - `@center' or `@cindex'. If no argument is needed, the word is - followed by the end of the line. If there is an argument, it is - separated from the command name by a space. Braces are not used. - - Thus, the alphabetic commands fall into classes that have different -argument syntaxes. You cannot tell to which class a command belongs by -the appearance of its name, but you can tell by the command's meaning: -if the command stands for a glyph, it is in class 2 and does not -require an argument; if it makes sense to use the command together with -other text as part of a paragraph, the command is in class 3 and must -be followed by an argument in braces; otherwise, it is in class 4 and -uses the rest of the line as its argument. - - The purpose of having a different syntax for commands of classes 3 -and 4 is to make Texinfo files easier to read, and also to help the GNU -Emacs paragraph and filling commands work properly. There is only one -exception to this rule: the command `@refill', which is always used at -the end of a paragraph immediately following the final period or other -punctuation character. `@refill' takes no argument and does *not* -require braces. `@refill' never confuses the Emacs paragraph commands -because it cannot appear at the beginning of a line. - - -File: texi.info, Node: Obtaining TeX, Next: New Features, Prev: Command Syntax, Up: Top - -How to Obtain TeX -***************** - - TeX is freely redistributable. You can obtain TeX for Unix systems -from the University of Washington for a distribution fee. - - To order a full distribution, send $200.00 for a 1/2-inch 9-track -1600 bpi (`tar' or `cpio') tape reel, or $210.00 for a 1/4-inch 4-track -QIC-24 (`tar' or `cpio') cartridge, to: - - Northwest Computing Support Center - DR-10, Thomson Hall 35 - University of Washington - Seattle, Washington 98195 - -Please make checks payable to the University of Washington. - - Prepaid orders are preferred but purchase orders are acceptable; -however, purchase orders carry an extra charge of $10.00, to pay for -processing. - - Overseas sites: please add to the base cost $20.00 for shipment via -air parcel post, or $30.00 for shipment via courier. - - Please check with the Northwest Computing Support Center at the -University of Washington for current prices and formats: - - telephone: (206) 543-6259 - email: elisabet@u.washington.edu - - -File: texi.info, Node: New Features, Next: Command and Variable Index, Prev: Obtaining TeX, Up: Top - -Second Edition Features -*********************** - - The second edition of the Texinfo manual describes more than 20 new -Texinfo mode commands and more than 50 previously undocumented Texinfo -@-commands. This edition is more than twice the length of the first -edition. - - Here is a brief description of the new commands. - -* Menu: - -* New Texinfo Mode Commands:: The updating commands are especially useful. -* New Commands:: Many newly described @-commands. - - -File: texi.info, Node: New Texinfo Mode Commands, Next: New Commands, Up: New Features - -New Texinfo Mode Commands -========================= - - Texinfo mode provides commands and features especially designed for -working with Texinfo files. More than 20 new commands have been added, -including commands for automatically creating and updating both nodes -and menus. This is a tedious task when done by hand. - - The keybindings are intended to be somewhat mnemonic. - -Update all nodes and menus --------------------------- - - The `texinfo-master-menu' command is the primary command: - -`C-c C-u m' -`M-x texinfo-master-menu' - Create or update a master menu. With `C-u' as a prefix argument, - first create or update all nodes and regular menus. - -Update Pointers ---------------- - -Create or update `Next', `Previous', and `Up' node pointers. - -*Note Updating Nodes and Menus::. - -`C-c C-u C-n' -`M-x texinfo-update-node' - Update a node. - -`C-c C-u C-e' -`M-x texinfo-every-node-update' - Update every node in the buffer. - -Update Menus ------------- - -Create or update menus. - -*Note Updating Nodes and Menus::. - -`C-c C-u C-m' -`M-x texinfo-make-menu' - Make or update a menu. - -`C-c C-u C-a' -`M-x texinfo-all-menus-update' - Make or update all the menus in a buffer. With `C-u' as a prefix - argument, first update all the nodes. - -Insert Title as Description ---------------------------- - -Insert a node's chapter or section title in the space for the -description in a menu entry line; position point so you can edit the -insert. (This command works somewhat differently than the other -insertion commands, which insert only a predefined string.) - -*Note Inserting Frequently Used Commands: Inserting. - -`C-c C-c C-d' - Insert title. - -Format for Info ---------------- - -Provide keybindings both for the Info formatting commands that are -written in Emacs Lisp and for `makeinfo' that is written in C. - -*Note Info Formatting::. - -Use the Emacs lisp `texinfo-format...' commands: - -`C-c C-e C-r' - Format the region. - -`C-c C-e C-b' - Format the buffer. - -Use `makeinfo': - -`C-c C-m C-r' - Format the region. - -`C-c C-m C-b' - Format the buffer. - -`C-c C-m C-l' - Recenter the `makeinfo' output buffer. - -`C-c C-m C-k' - Kill the `makeinfo' formatting job. - -Typeset and Print ------------------ - -Typeset and print Texinfo documents from within Emacs. - -*Note Printing::. - -`C-c C-t C-r' - Run TeX on the region. - -`C-c C-t C-b' - Run TeX on the buffer. - -`C-c C-t C-i' - Run `texindex'. - -`C-c C-t C-p' - Print the DVI file. - -`C-c C-t C-q' - Show the print queue. - -`C-c C-t C-d' - Delete a job from the print queue. - -`C-c C-t C-k' - Kill the current TeX formatting job. - -`C-c C-t C-x' - Quit a currently stopped TeX formatting job. - -`C-c C-t C-l' - Recenter the output buffer. - -Other Updating Commands ------------------------ - -The "other updating commands" do not have standard keybindings because -they are used less frequently. - -*Note Other Updating Commands::. - -`M-x texinfo-insert-node-lines' - Insert missing `@node' lines using section titles as node names. - -`M-x texinfo-multiple-files-update' - Update a multi-file document. With a numeric prefix, such as `C-u - 8', update *every* pointer and menu in *all* the files and then - insert a master menu. - -`M-x texinfo-indent-menu-description' - Indent descriptions in menus. - -`M-x texinfo-sequential-node-update' - Insert node pointers in strict sequence. - - -File: texi.info, Node: New Commands, Prev: New Texinfo Mode Commands, Up: New Features - -New Texinfo @-Commands -====================== - - The second edition of the Texinfo manual describes more than 50 -commands that were not described in the first edition. A third or so -of these commands existed in Texinfo but were not documented in the -manual; the others are new. Here is a listing, with brief descriptions -of them: - -Indexing --------- - -Create your own index, and merge indices. - -*Note Indices::. - -`@defindex INDEX-NAME' - Define a new index and its indexing command. See also the - `@defcodeindex' command. - -`@synindex FROM-INDEX INTO-INDEX' - Merge the FROM-INDEX index into the INTO-INDEX index. See also - the `@syncodeindex' command. - -Definitions ------------ - -Describe functions, variables, macros, commands, user options, special -forms, and other such artifacts in a uniform format. - -*Note Definition Commands::. - -`@deffn CATEGORY NAME ARGUMENTS...' - Format a description for functions, interactive commands, and - similar entities. - -`@defvr, @defop, ...' - 15 other related commands. - -Glyphs ------- - -Indicate the results of evaluation, expansion, printed output, an error -message, equivalence of expressions, and the location of point. - -*Note Glyphs::. - -`@equiv{}' -`==' - Equivalence: - -`@error{}' -`error-->' - Error message - -`@expansion{}' -`==>' - Macro expansion - -`@point{}' -`-!-' - Position of point - -`@print{}' -`-|' - Printed output - -`@result{}' -`=>' - Result of an expression - -Page Headings -------------- - -Customize page headings. - -*Note Headings::. - -`@headings ON-OFF-SINGLE-DOUBLE' - Headings on or off, single, or double-sided. - -`@evenfooting [LEFT] @| [CENTER] @| [RIGHT]' - Footings for even-numbered (left-hand) pages. - -`@evenheading, @everyheading, @oddheading, ...' - Five other related commands. - -`@thischapter' - Insert name of chapter and chapter number. - -`@thischaptername, @thisfile, @thistitle, @thispage' - Related commands. - -Formatting ----------- - -Format blocks of text. - -*Note Quotations and Examples::, and -*Note Making Lists and Tables: Lists and Tables. - -`@cartouche' - Draw rounded box surrounding text (not in Info). - -`@enumerate OPTIONAL-ARG' - Enumerate a list with letters or numbers. - -`@exdent LINE-OF-TEXT' - Remove indentation. - -`@flushleft' - Left justify. - -`@flushright' - Right justify. - -`@format' - Do not narrow nor change font. - -`@ftable FORMATTING-COMMAND' -`@vtable FORMATTING-COMMAND' - Two-column table with indexing. - -`@lisp' - For an example of Lisp code. - -`@smallexample' -`@smalllisp' - Like @table and @lisp but for @smallbook. - -Conditionals ------------- - -Conditionally format text. - -*Note `@set' `@clear' `@value': set clear value. - -`@set FLAG [STRING]' - Set a flag. Optionally, set value of FLAG to STRING. - -`@clear FLAG' - Clear a flag. - -`@value{FLAG}' - Replace with value to which FLAG is set. - -`@ifset FLAG' - Format, if FLAG is set. - -`@ifclear FLAG' - Ignore, if FLAG is set. - -@heading series for Titles --------------------------- - -Produce unnumbered headings that do not appear in a table of contents. - -*Note Structuring::. - -`@heading TITLE' - Unnumbered section-like heading not listed in the table of - contents of a printed manual. - -`@chapheading, @majorheading, @subheading, @subsubheading' - Related commands. - -Font commands -------------- - -*Note Smallcaps::, and -*Note Fonts::. - -`@r{TEXT}' - Print in roman font. - -`@sc{TEXT}' - Print in SMALL CAPS font. - -Miscellaneous -------------- - -See *Note `@title' `@subtitle' and `@author' Commands: title subtitle -author, -see *Note Overfull hboxes::, -see *Note Footnotes::, -see *Note Format a Dimension: dmn, -see *Note Inserting a Minus Sign: minus, -see *Note Paragraph Indenting: paragraphindent, -see *Note Cross Reference Commands::, -see *Note `@title' `@subtitle' and `@author': title subtitle author, and -see *Note How to Make Your Own Headings: Custom Headings. - -`@author AUTHOR' - Typeset author's name. - -`@finalout' - Produce cleaner printed output. - -`@footnotestyle' - Specify footnote style. - -`@dmn{DIMENSION}' - Format a dimension. - -`@minus{}' - Generate a minus sign. - -`@paragraphindent' - Specify paragraph indentation. - -`@ref{NODE-NAME, [ENTRY], [TOPIC-OR-TITLE], [INFO-FILE], [MANUAL]}' - Make a reference. In the printed manual, the reference does not - start with the word `see'. - -`@title TITLE' - Typeset TITLE in the alternative title page format. - -`@subtitle SUBTITLE' - Typeset SUBTITLE in the alternative title page format. - -`@today{}' - Insert the current date. - - -File: texi.info, Node: Command and Variable Index, Next: Concept Index, Prev: New Features, Up: Top - -Command and Variable Index -************************** - - This is an alphabetical list of all the @-commands and several -variables. To make the list easier to use, the commands are listed -without their preceding `@'. - -* Menu: - -* * (force line break): Line Breaks. -* . (true end of sentence): Controlling Spacing. -* : (suppress widening): Controlling Spacing. -* @ (single @): Inserting An Atsign. -* { (single {): Inserting Braces. -* } (single }): Inserting Braces. -* afourpaper: A4 Paper. -* appendix: unnumbered & appendix. -* appendixsec: unnumberedsec appendixsec heading. -* appendixsection: unnumberedsec appendixsec heading. -* appendixsubsec: unnumberedsubsec appendixsubsec subheading. -* appendixsubsubsec: subsubsection. -* apply: Sample Function Definition. -* author: title subtitle author. -* b (bold font): Fonts. -* buffer-end: Def Cmd Template. -* bullet: bullet. -* bye: Ending a File. -* bye: File End. -* c (comment): Comments. -* cartouche: cartouche. -* center: titlefont center sp. -* chapheading: majorheading & chapheading. -* chapter: chapter. -* cindex: Indexing Commands. -* cite: cite. -* clear: ifset ifclear. -* code: code. -* comment: Comments. -* contents: Contents. -* copyright: copyright symbol. -* copyright: Copyright & Permissions. -* cropmarks: Cropmarks and Magnification. -* defcodeindex: New Indices. -* defcv: Abstract Objects. -* deffn: Functions Commands. -* deffnx: deffnx. -* defindex: New Indices. -* defivar: Abstract Objects. -* defmac: Functions Commands. -* defmethod: Abstract Objects. -* defop: Abstract Objects. -* defopt: Variables Commands. -* defspec: Functions Commands. -* deftp: Data Types. -* deftypefn: Typed Functions. -* deftypefun: Typed Functions. -* deftypevar: Typed Variables. -* deftypevr: Typed Variables. -* defun: Functions Commands. -* defvar: Variables Commands. -* defvr: Variables Commands. -* dfn: dfn. -* display: display. -* dmn: dmn. -* dots: dots. -* emph: emph & strong. -* end: Quotations and Examples. -* end: Introducing Lists. -* end titlepage: end titlepage. -* enumerate: enumerate. -* evenfooting: Custom Headings. -* evenheading: Custom Headings. -* everyfooting: Custom Headings. -* everyheading: Custom Headings. -* example: example. -* exdent: exdent. -* file: file. -* filll: Copyright & Permissions. -* finalout: Overfull hboxes. -* findex: Indexing Commands. -* flushleft: flushleft & flushright. -* flushright: flushleft & flushright. -* foobar: Optional Arguments. -* footnote: Footnotes. -* footnotestyle: Footnotes. -* format: format. -* forward-word: Def Cmd Template. -* ftable: ftable vtable. -* group: group. -* heading: unnumberedsec appendixsec heading. -* headings: headings on off. -* i (italic font): Fonts. -* ifclear: ifset ifclear. -* ifinfo: Conditionals. -* ifset: ifset ifclear. -* iftex: Conditionals. -* ignore: Comments. -* include: Using Include Files. -* Info-validate: Running Info-Validate. -* INFOPATH: Other Info Directories. -* inforef: inforef. -* input (TeX command): Minimum. -* isearch-backward: deffnx. -* isearch-forward: deffnx. -* item: itemize. -* item: table. -* itemize: itemize. -* itemx: itemx. -* kbd: kbd. -* key: key. -* kindex: Indexing Commands. -* lisp: Lisp Example. -* lpr (DVI print command): Shell Format & Print. -* mag (TeX command): Cropmarks and Magnification. -* majorheading: majorheading & chapheading. -* makeinfo-buffer: makeinfo in Emacs. -* makeinfo-kill-job: makeinfo in Emacs. -* makeinfo-recenter-output-buffer: makeinfo in Emacs. -* makeinfo-region: makeinfo in Emacs. -* menu: Menus. -* minus: minus. -* need: need. -* next-error: makeinfo in Emacs. -* noindent: noindent. -* occur: Using occur. -* occur-mode-goto-occurrence: Showing the Structure. -* oddfooting: Custom Headings. -* oddheading: Custom Headings. -* page: page. -* page-delimiter: Showing the Structure. -* paragraphindent: paragraphindent. -* pindex: Indexing Commands. -* printindex: Printing Indices & Menus. -* pxref: pxref. -* quotation: quotation. -* r (Roman font): Fonts. -* ref: ref. -* refill: Refilling Paragraphs. -* samp: samp. -* sc (small caps font): Smallcaps. -* section: section. -* set: ifset ifclear. -* setchapternewpage: setchapternewpage. -* setfilename: setfilename. -* settitle: settitle. -* shortcontents: Contents. -* smallbook: smallbook. -* smallexample: smallexample & smalllisp. -* smalllisp: smallexample & smalllisp. -* sp (line spacing): sp. -* sp (titlepage line spacing): titlefont center sp. -* strong: emph & strong. -* subheading: unnumberedsubsec appendixsubsec subheading. -* subsection: subsection. -* subsubheading: subsubsection. -* subsubsection: subsubsection. -* subtitle: title subtitle author. -* summarycontents: Contents. -* syncodeindex: syncodeindex. -* syncodeindex: syncodeindex. -* synindex: synindex. -* t (typewriter font): Fonts. -* table: Two-column Tables. -* tex: Using Ordinary TeX Commands. -* tex (command): tex. -* texi2dvi (shell script): Shell Format & Print. -* texindex: Format/Print Hardcopy. -* texindex: Shell Format & Print. -* texinfo-all-menus-update: Updating Commands. -* texinfo-every-node-update: Updating Commands. -* texinfo-format-buffer: Info Formatting. -* texinfo-format-buffer: texinfo-format commands. -* texinfo-format-buffer: texinfo-format commands. -* texinfo-format-region: texinfo-format commands. -* texinfo-format-region: texinfo-format commands. -* texinfo-format-region: Info Formatting. -* texinfo-indent-menu-description: Other Updating Commands. -* texinfo-insert-@code: Inserting. -* texinfo-insert-@dfn: Inserting. -* texinfo-insert-@end: Inserting. -* texinfo-insert-@example: Inserting. -* texinfo-insert-@item: Inserting. -* texinfo-insert-@kbd: Inserting. -* texinfo-insert-@node: Inserting. -* texinfo-insert-@noindent: Inserting. -* texinfo-insert-@samp: Inserting. -* texinfo-insert-@table: Inserting. -* texinfo-insert-@var: Inserting. -* texinfo-insert-braces: Inserting. -* texinfo-insert-node-lines: Other Updating Commands. -* texinfo-make-menu: Updating Commands. -* texinfo-master-menu: Updating Commands. -* texinfo-multiple-files-update: texinfo-multiple-files-update. -* texinfo-multiple-files-update (in brief): Other Updating Commands. -* texinfo-sequential-node-update: Other Updating Commands. -* texinfo-show-structure: Using texinfo-show-structure. -* texinfo-show-structure: Showing the Structure. -* texinfo-start-menu-description: Inserting. -* texinfo-tex-buffer: Printing. -* texinfo-tex-print: Printing. -* texinfo-tex-region: Printing. -* texinfo-update-node: Updating Commands. -* TEXINPUTS: Preparing for TeX. -* thischapter: Custom Headings. -* thischaptername: Custom Headings. -* thisfile: Custom Headings. -* thispage: Custom Headings. -* thistitle: Custom Headings. -* tindex: Indexing Commands. -* title: title subtitle author. -* titlefont: titlefont center sp. -* titlepage: titlepage. -* today: Custom Headings. -* top (@-command): makeinfo top command. -* unnumbered: unnumbered & appendix. -* unnumberedsec: unnumberedsec appendixsec heading. -* unnumberedsubsec: unnumberedsubsec appendixsubsec subheading. -* unnumberedsubsubsec: subsubsection. -* up-list: Inserting. -* value: value. -* var: var. -* vindex: Indexing Commands. -* vskip: Copyright & Permissions. -* vtable: ftable vtable. -* w (prevent line break): w. -* xref: xref. - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-11 b/gnu/usr.bin/texinfo/info-files/texi.info-11 deleted file mode 100644 index f960227aaba1..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-11 +++ /dev/null @@ -1,451 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: Concept Index, Prev: Command and Variable Index, Up: Top - -Concept Index -************* - -* Menu: - -* @-command in nodename: Node Line Requirements. -* @-command list: Command List. -* @-command syntax: Command Syntax. -* @-commands: Formatting Commands. -* .cshrc initialization file: Preparing for TeX. -* .profile initialization file: Preparing for TeX. -* @include file sample: Sample Include File. -* @menu parts: Menu Parts. -* @node line writing: Writing a Node. -* makeinfo inside Emacs: makeinfo in Emacs. -* makeinfo options: makeinfo options. -* TEXINPUTS environment variable: Preparing for TeX. -* dir directory for Info installation: Install an Info File. -* dir file listing: New Info File. -* End node footnote style: Footnotes. -* Separate footnote style: Footnotes. -* Top node: The Top Node. -* Top node is first: First Node. -* Top node naming for references: Top Node Naming. -* Top node summary: Top Node Summary. -* hboxes, overfull: Overfull hboxes. -* ifinfo permissions: ifinfo Permissions. -* TeX commands, using ordinary: Using Ordinary TeX Commands. -* TeX index sorting: Format/Print Hardcopy. -* TeX input initialization: Preparing for TeX. -* TeX, how to obtain: Obtaining TeX. -* A4 paper, printing on: A4 Paper. -* Abbreviations for keys: key. -* Adding a new info file: New Info File. -* Alphabetical @-command list: Command List. -* Another Info directory: Other Info Directories. -* Apostrophe in nodename: Node Line Requirements. -* Arguments, repeated and optional: Optional Arguments. -* Automatic pointer creation with makeinfo: makeinfo Pointer Creation. -* Automatically insert nodes, menus: Updating Nodes and Menus. -* Badly referenced nodes: Running Info-Validate. -* Batch formatting for Info: Batch Formatting. -* Beginning a Texinfo file: Beginning a File. -* Beginning line of a Texinfo file: First Line. -* Black rectangle in hardcopy: Overfull hboxes. -* Blank lines: sp. -* Book characteristics, printed: Printed Books. -* Book, printing small: smallbook. -* Box with rounded corners: cartouche. -* Braces and argument syntax: Command Syntax. -* Braces, inserting: Braces Atsigns Periods. -* Braces, when to use: Formatting Commands. -* Breaks in a line: Line Breaks. -* Buffer formatting and printing: Printing. -* Bullets, inserting: Dots Bullets. -* Capitalizing index entries: Indexing Commands. -* Case in nodename: Node Line Requirements. -* Catching errors with TeX formatting: Debugging with TeX. -* Catching errors with Info formatting: Debugging with Info. -* Catching mistakes: Catching Mistakes. -* Chapter structuring: Structuring. -* Characteristics, printed books or manuals: Printed Books. -* Checking for badly referenced nodes: Running Info-Validate. -* Colon in nodename: Node Line Requirements. -* Combining indices: Combining Indices. -* Comma in nodename: Node Line Requirements. -* Command definitions: Sample Function Definition. -* Commands to insert single characters: Braces Atsigns Periods. -* Commands using ordinary TeX: Using Ordinary TeX Commands. -* Commands, inserting them: Inserting. -* Comments: Comments. -* Compile command for formatting: Compile-Command. -* Conditionally visible text: Conditionals. -* Conditions for copying Texinfo: Copying. -* Contents, Table of: Contents. -* Contents-like outline of file structure: Showing the Structure. -* Conventions for writing definitions: Def Cmd Conventions. -* Conventions, syntactic: Conventions. -* Copying conditions: Copying. -* Copying permissions: Sample Permissions. -* Copying software: Software Copying Permissions. -* Copyright page: Copyright & Permissions. -* Correcting mistakes: Catching Mistakes. -* Create nodes, menus automatically: Updating Nodes and Menus. -* Creating an Info file: Create an Info File. -* Creating an unsplit file: Unsplit. -* Creating index entries: Indexing Commands. -* Creating indices: Indices. -* Creating pointers with makeinfo: makeinfo Pointer Creation. -* Cropmarks for printing: Cropmarks and Magnification. -* Cross reference parts: Cross Reference Parts. -* Cross references: Cross References. -* Cross references using @inforef: inforef. -* Cross references using @pxref: pxref. -* Cross references using @ref: ref. -* Cross references using @xref: xref. -* Debugging the Texinfo structure: Catching Mistakes. -* Debugging with TeX formatting: Debugging with TeX. -* Debugging with Info formatting: Debugging with Info. -* Defining indexing entries: Indexing Commands. -* Defining new indices: New Indices. -* Definition commands: Definition Commands. -* Definition conventions: Def Cmd Conventions. -* Definition template: Def Cmd Template. -* Definitions grouped together: deffnx. -* Description for menu, start: Inserting. -* Different cross reference commands: Cross Reference Commands. -* Dimension formatting: dmn. -* Display formatting: display. -* Distribution: Software Copying Permissions. -* Dots, inserting: dots. -* Dots, inserting: Dots Bullets. -* Double-colon menu entries: Less Cluttered Menu Entry. -* DVI file: Shell Format & Print. -* Ellipsis, inserting: Dots Bullets. -* Emacs: Texinfo Mode. -* Emacs shell, format, print from: Within Emacs. -* Emphasizing text: Emphasis. -* Emphasizing text, font for: emph & strong. -* End of header line: End of Header. -* End titlepage starts headings: end titlepage. -* Ending a Texinfo file: Ending a File. -* Entries for an index: Indexing Commands. -* Entries, making index: Index Entries. -* Enumeration: enumerate. -* Equivalence, indicating it: Equivalence. -* Error message, indicating it: Error Glyph. -* Errors, parsing: makeinfo in Emacs. -* European A4 paper: A4 Paper. -* Evaluation glyph: result. -* Example for a small book: smallexample & smalllisp. -* Example menu: Menu Example. -* Examples, formatting them: example. -* Expansion, indicating it: expansion. -* File beginning: Beginning a File. -* File ending: Ending a File. -* File section structure, showing it: Showing the Structure. -* Filling paragraphs: Refilling Paragraphs. -* Final output: Overfull hboxes. -* Finding badly referenced nodes: Running Info-Validate. -* First line of a Texinfo file: First Line. -* First node: First Node. -* Fonts for indices: syncodeindex. -* Fonts for printing, not for Info: Fonts. -* Footings: Headings. -* Footnotes: Footnotes. -* Format a dimension: dmn. -* Format and print hardcopy: Format/Print Hardcopy. -* Format and print in Texinfo mode: Texinfo Mode Printing. -* Format with the compile command: Compile-Command. -* Format, print from Emacs shell: Within Emacs. -* Formatting a file for Info: Create an Info File. -* Formatting commands: Formatting Commands. -* Formatting examples: example. -* Formatting for Info: Info Formatting. -* Formatting for printing: Printing. -* Formatting headings and footings: Headings. -* Formatting requirements: Requirements Summary. -* Frequently used commands, inserting: Inserting. -* Function definitions: Sample Function Definition. -* General syntactic conventions: Conventions. -* Generating menus with indices: Printing Indices & Menus. -* Glyphs: Glyphs. -* GNU Emacs: Texinfo Mode. -* GNU Emacs shell, format, print from: Within Emacs. -* Going to other Info files' nodes: Other Info Files. -* Group (hold text together vertically): group. -* Grouping two definitions together: deffnx. -* Hardcopy, printing it: Format/Print Hardcopy. -* Header for Texinfo files: Header. -* Header of a Texinfo file: First Line. -* Headings: Headings. -* Headings, page, begin to appear: end titlepage. -* Highlighting text: Indicating. -* Hints: Tips. -* Holding text together vertically: group. -* If text conditionally visible: Conditionals. -* Ignored text: Comments. -* Include file requirements: Include File Requirements. -* Include file sample: Sample Include File. -* Include files: Include Files. -* Indentation undoing: exdent. -* Indenting paragraphs: paragraphindent. -* Index entries: Indexing Commands. -* Index entries, making: Index Entries. -* Index entry capitalization: Indexing Commands. -* Index font types: Indexing Commands. -* Indexing commands, predefined: Indexing Commands. -* Indexing table entries automatically: ftable vtable. -* Indicating commands, definitions, etc.: Indicating. -* Indicating evaluation: result. -* Indices: Indices. -* Indices, combining them: Combining Indices. -* Indices, defining new: New Indices. -* Indices, printing and menus: Printing Indices & Menus. -* Indices, sorting: Format/Print Hardcopy. -* Indices, two letter names: syncodeindex. -* Indirect subfiles: Tag and Split Files. -* Info batch formatting: Batch Formatting. -* Info file installation: Install an Info File. -* Info file requires @setfilename: setfilename. -* Info file, listing new one: New Info File. -* Info file, splitting manually: Splitting. -* Info files: Info Files. -* Info formatting: Info Formatting. -* Info installed in another directory: Other Info Directories. -* Info validating a large file: Using Info-validate. -* Info, creating an on-line file: Create an Info File. -* Info; other files' nodes: Other Info Files. -* Initialization file for TeX input: Preparing for TeX. -* Insert nodes, menus automatically: Updating Nodes and Menus. -* Inserting @, braces, and periods: Braces Atsigns Periods. -* Inserting dots: Dots Bullets. -* Inserting dots: dots. -* Inserting ellipsis: Dots Bullets. -* Inserting frequently used commands: Inserting. -* Inserting special characters and symbols: Insertions. -* Installing an Info file: Install an Info File. -* Installing Info in another directory: Other Info Directories. -* Introduction, as part of file: Software Copying Permissions. -* Itemization: itemize. -* Keys, recommended names: key. -* Larger or smaller pages: Cropmarks and Magnification. -* Less cluttered menu entry: Less Cluttered Menu Entry. -* License agreement: Software Copying Permissions. -* Line breaks: Line Breaks. -* Line breaks, preventing: w. -* Line spacing: sp. -* Lisp example: Lisp Example. -* Lisp example for a small book: smallexample & smalllisp. -* List of @-commands: Command List. -* Listing a new info file: New Info File. -* Lists and tables, making them: Lists and Tables. -* Local variables: Compile-Command. -* Location of menus: Menu Location. -* Looking for badly referenced nodes: Running Info-Validate. -* Macro definitions: Sample Function Definition. -* Magnified printing: Cropmarks and Magnification. -* Making a printed manual: Format/Print Hardcopy. -* Making a tag table automatically: Tag and Split Files. -* Making a tag table manually: Unsplit. -* Making cross references: Cross References. -* Making line and page breaks: Breaks. -* Making lists and tables: Lists and Tables. -* Manual characteristics, printed: Printed Books. -* Marking text within a paragraph: Marking Text. -* Marking words and phrases: Marking Text. -* Master menu: The Top Node. -* Master menu parts: Master Menu Parts. -* Mathematical expressions: Using Ordinary TeX Commands. -* Menu description, start: Inserting. -* Menu entries with two colons: Less Cluttered Menu Entry. -* Menu example: Menu Example. -* Menu location: Menu Location. -* Menu parts: Menu Parts. -* Menu writing: Writing a Menu. -* Menus: Menus. -* Menus generated with indices: Printing Indices & Menus. -* META key: key. -* Meta-syntactic chars for arguments: Optional Arguments. -* Minimal Texinfo file (requirements): Minimum. -* Mistakes, catching: Catching Mistakes. -* Mode, using Texinfo: Texinfo Mode. -* Must have in Texinfo file: Minimum. -* Names for indices: syncodeindex. -* Names recommended for keys: key. -* Naming a `Top' Node in references: Top Node Naming. -* Need space at page bottom: need. -* New index defining: New Indices. -* New info file, listing it in dir file: New Info File. -* Node line requirements: Node Line Requirements. -* Node line writing: Writing a Node. -* Node, defined: node. -* Node, `Top': The Top Node. -* Nodename must be unique: Node Line Requirements. -* Nodename, cannot contain: Node Line Requirements. -* Nodes for menus are short: Menu Location. -* Nodes in other Info files: Other Info Files. -* Nodes, catching mistakes: Catching Mistakes. -* Nodes, checking for badly referenced: Running Info-Validate. -* Obtaining TeX: Obtaining TeX. -* Occurrences, listing with @occur: Using occur. -* Optional and repeated arguments: Optional Arguments. -* Options for makeinfo: makeinfo options. -* Ordinary TeX commands, using: Using Ordinary TeX Commands. -* Other Info files' nodes: Other Info Files. -* Outline of file structure, showing it: Showing the Structure. -* Overfull hboxes: Overfull hboxes. -* Overview of Texinfo: Overview. -* Page breaks: page. -* Page delimiter in Texinfo mode: Showing the Structure. -* Page headings: Headings. -* Page numbering: Headings. -* Page sizes for books: smallbook. -* Pages, starting odd: setchapternewpage. -* Paper size, European A4: A4 Paper. -* Paragraph indentation: paragraphindent. -* Paragraph, marking text within: Marking Text. -* Parsing errors: makeinfo in Emacs. -* Part of file formatting and printing: Printing. -* Parts of a cross reference: Cross Reference Parts. -* Parts of a master menu: Master Menu Parts. -* Parts of a menu: Menu Parts. -* Periods, inserting: Braces Atsigns Periods. -* Permissions: Sample Permissions. -* Permissions, printed: Copyright & Permissions. -* PlainTeX: Using Ordinary TeX Commands. -* Point, indicating it in a buffer: Point Glyph. -* Pointer creation with makeinfo: makeinfo Pointer Creation. -* Pointer validation with makeinfo: Pointer Validation. -* Predefined indexing commands: Indexing Commands. -* Predefined names for indices: syncodeindex. -* Preparing to use TeX: Preparing for TeX. -* Preventing line and page breaks: Breaks. -* Print and format in Texinfo mode: Texinfo Mode Printing. -* Print, format from Emacs shell: Within Emacs. -* Printed book and manual characteristics: Printed Books. -* Printed output, indicating it: Print Glyph. -* Printed permissions: Copyright & Permissions. -* Printing a region or buffer: Printing. -* Printing an index: Printing Indices & Menus. -* Printing cropmarks: Cropmarks and Magnification. -* Problems, catching: Catching Mistakes. -* Quotations: quotation. -* Recommended names for keys: key. -* Rectangle, ugly, black in hardcopy: Overfull hboxes. -* References: Cross References. -* References using @inforef: inforef. -* References using @pxref: pxref. -* References using @ref: ref. -* References using @xref: xref. -* Referring to other Info files: Other Info Files. -* Refilling paragraphs: Refilling Paragraphs. -* Region formatting and printing: Printing. -* Region printing in Texinfo mode: Texinfo Mode Printing. -* Repeated and optional arguments: Optional Arguments. -* Required in Texinfo file: Minimum. -* Requirements for formatting: Requirements Summary. -* Requirements for include files: Include File Requirements. -* Requirements for updating commands: Updating Requirements. -* Result of an expression: result. -* Running Info-validate: Using Info-validate. -* Running makeinfo in Emacs: makeinfo in Emacs. -* Running an Info formatter: Info Formatting. -* Sample @include file: Sample Include File. -* Sample function definition: Sample Function Definition. -* Sample Texinfo file: Short Sample. -* Sample Texinfo file, no comments: Sample Texinfo File. -* Section structure of a file, showing it: Showing the Structure. -* Shell, format, print from: Within Emacs. -* Shell, running makeinfo in: makeinfo in Emacs. -* Short nodes for menus: Menu Location. -* Showing the section structure of a file: Showing the Structure. -* Showing the structure of a file: Using texinfo-show-structure. -* Single characters, commands to insert: Braces Atsigns Periods. -* Size of printed book: smallbook. -* Small book example: smallexample & smalllisp. -* Small book size: smallbook. -* Small caps font: Smallcaps. -* Software copying permissions: Software Copying Permissions. -* Sorting indices: Format/Print Hardcopy. -* Spaces (blank lines): sp. -* Special insertions: Insertions. -* Special typesetting commands: Dots Bullets. -* Specifying index entries: Indexing Commands. -* Splitting an Info file manually: Splitting. -* Start of header line: Start of Header. -* Starting chapters: setchapternewpage. -* Structure of a file, showing it: Showing the Structure. -* Structure, catching mistakes in: Catching Mistakes. -* Structuring of chapters: Structuring. -* Subsection-like commands: unnumberedsubsec appendixsubsec subheading. -* Subsub commands: subsubsection. -* Syntactic conventions: Conventions. -* Syntax, optional & repeated arguments: Optional Arguments. -* Table of contents: Contents. -* Tables and lists, making them: Lists and Tables. -* Tables with indexes: ftable vtable. -* Tables, making two-column: Two-column Tables. -* Tabs; don't use!: Conventions. -* Tag table, making automatically: Tag and Split Files. -* Tag table, making manually: Unsplit. -* Template for a definition: Def Cmd Template. -* Texinfo file beginning: Beginning a File. -* Texinfo file ending: Ending a File. -* Texinfo file header: Header. -* Texinfo file minimum: Minimum. -* Texinfo file section structure, showing it: Showing the Structure. -* Texinfo mode: Texinfo Mode. -* Texinfo overview: Overview. -* Texinfo printed book characteristics: Printed Books. -* Text, conditionally visible: Conditionals. -* Thin space between number, dimension: dmn. -* Tips: Tips. -* Title page: titlepage. -* Titlepage end starts headings: end titlepage. -* Titlepage permissions: Titlepage Permissions. -* Tree structuring: Tree Structuring. -* Two letter names for indices: syncodeindex. -* Two named items for @table: itemx. -* Two part menu entry: Less Cluttered Menu Entry. -* Two `First' Lines for @deffn: deffnx. -* Typesetting commands for dots, etc.: Dots Bullets. -* Uncluttered menu entry: Less Cluttered Menu Entry. -* Unique nodename requirement: Node Line Requirements. -* Unprocessed text: Comments. -* Unsplit file creation: Unsplit. -* Updating nodes and menus: Updating Nodes and Menus. -* Updating requirements: Updating Requirements. -* Usage tips: Tips. -* Validating a large file: Using Info-validate. -* Validation of pointers: Pointer Validation. -* Value of an expression, indicating: result. -* Vertical whitespace (vskip): Copyright & Permissions. -* Vertically holding text together: group. -* Visibility of conditional text: Conditionals. -* Words and phrases, marking them: Marking Text. -* Writing a menu: Writing a Menu. -* Writing an @node line: Writing a Node. - - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-2 b/gnu/usr.bin/texinfo/info-files/texi.info-2 deleted file mode 100644 index 6ad094d10c4d..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-2 +++ /dev/null @@ -1,1289 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: Texinfo Mode, Next: Beginning a File, Prev: Overview, Up: Top - -Using Texinfo Mode -****************** - - You may edit a Texinfo file with any text editor you choose. A -Texinfo file is no different from any other ASCII file. However, GNU -Emacs comes with a special mode, called Texinfo mode, that provides -Emacs commands and tools to help ease your work. - - This chapter describes features of GNU Emacs' Texinfo mode but not -any features of the Texinfo formatting language. If you are reading -this manual straight through from the beginning, you may want to skim -through this chapter briefly and come back to it after reading -succeeding chapters which describe the Texinfo formatting language in -detail. - -* Menu: - -* Texinfo Mode Overview:: How Texinfo mode can help you. -* Emacs Editing:: Texinfo mode adds to GNU Emacs' general - purpose editing features. -* Inserting:: How to insert frequently used @-commands. -* Showing the Structure:: How to show the structure of a file. -* Updating Nodes and Menus:: How to update or create new nodes and menus. -* Info Formatting:: How to format for Info. -* Printing:: How to format and print part or all of a file. -* Texinfo Mode Summary:: Summary of all the Texinfo mode commands. - - -File: texi.info, Node: Texinfo Mode Overview, Next: Emacs Editing, Up: Texinfo Mode - -Texinfo Mode Overview -===================== - - Texinfo mode provides special features for working with Texinfo -files: - - * Insert frequently used @commands. - - * Automatically create `@node' lines. - - * Show the structure of a Texinfo source file. - - * Automatically create or update the `Next', - `Previous', and `Up' pointers of a node. - - * Automatically create or update menus. - - * Automatically create a master menu. - - * Format a part or all of a file for Info. - - * Typeset and print part or all of a file. - - Perhaps the two most helpful features are those for inserting -frequently used @-commands and for creating node pointers and menus. - - -File: texi.info, Node: Emacs Editing, Next: Inserting, Prev: Texinfo Mode Overview, Up: Texinfo Mode - -The Usual GNU Emacs Editing Commands -==================================== - - In most cases, the usual Text mode commands work the same in Texinfo -mode as they do in Text mode. Texinfo mode adds new editing commands -and tools to GNU Emacs' general purpose editing features. The major -difference concerns filling. In Texinfo mode, the paragraph separation -variable and syntax table are redefined so that Texinfo commands that -should be on lines of their own are not inadvertently included in -paragraphs. Thus, the `M-q' (`fill-paragraph') command will refill a -paragraph but not mix an indexing command on a line adjacent to it into -the paragraph. - - In addition, Texinfo mode sets the `page-delimiter' variable to the -value of `texinfo-chapter-level-regexp'; by default, this is a regular -expression matching the commands for chapters and their equivalents, -such as appendices. With this value for the page delimiter, you can -jump from chapter title to chapter title with the `C-x ]' -(`forward-page') and `C-x [' (`backward-page') commands and narrow to a -chapter with the `C-x p' (`narrow-to-page') command. (*Note Pages: -(emacs)Pages, for details about the page commands.) - - You may name a Texinfo file however you wish, but the convention is -to end a Texinfo file name with one of the three extensions `.texinfo', -`.texi', or `.tex'. A longer extension is preferred, since it is -explicit, but a shorter extension may be necessary for operating -systems that limit the length of file names. GNU Emacs automatically -enters Texinfo mode when you visit a file with a `.texinfo' or `.texi' -extension. Also, Emacs switches to Texinfo mode when you visit a file -that has `-*-texinfo-*-' in its first line. If ever you are in another -mode and wish to switch to Texinfo mode, type `M-x texinfo-mode'. - - Like all other Emacs features, you can customize or enhance Texinfo -mode as you wish. In particular, the keybindings are very easy to -change. The keybindings described here are the default or standard -ones. - - -File: texi.info, Node: Inserting, Next: Showing the Structure, Prev: Emacs Editing, Up: Texinfo Mode - -Inserting Frequently Used Commands -================================== - - Texinfo mode provides commands to insert various frequently used -@-commands into the buffer. You can use these commands to save -keystrokes. - - The insert commands are invoked by typing `C-c' twice and then the -first letter of the @-command: - -`C-c C-c c' -`M-x texinfo-insert-@code' - Insert `@code{}' and put the cursor between the braces. - -`C-c C-c d' -`M-x texinfo-insert-@dfn' - Insert `@dfn{}' and put the cursor between the braces. - -`C-c C-c e' -`M-x texinfo-insert-@end' - Insert `@end' and attempt to insert the correct following word, - such as `example' or `table'. (This command does not handle - nested lists correctly, but inserts the word appropriate to the - immediately preceding list.) - -`C-c C-c i' -`M-x texinfo-insert-@item' - Insert `@item' and put the cursor at the beginning of the next - line. - -`C-c C-c k' -`M-x texinfo-insert-@kbd' - Insert `@kbd{}' and put the cursor between the braces. - -`C-c C-c n' -`M-x texinfo-insert-@node' - Insert `@node' and a comment line listing the sequence for the - `Next', `Previous', and `Up' nodes. Leave point after the `@node'. - -`C-c C-c o' -`M-x texinfo-insert-@noindent' - Insert `@noindent' and put the cursor at the beginning of the next - line. - -`C-c C-c s' -`M-x texinfo-insert-@samp' - Insert `@samp{}' and put the cursor between the braces. - -`C-c C-c t' -`M-x texinfo-insert-@table' - Insert `@table' followed by a SPC and leave the cursor after the - SPC. - -`C-c C-c v' -`M-x texinfo-insert-@var' - Insert `@var{}' and put the cursor between the braces. - -`C-c C-c x' -`M-x texinfo-insert-@example' - Insert `@example' and put the cursor at the beginning of the next - line. - -`C-c C-c {' -`M-x texinfo-insert-braces' - Insert `{}' and put the cursor between the braces. - -`C-c C-c }' -`C-c C-c ]' -`M-x up-list' - Move from between a pair of braces forward past the closing brace. - Typing `C-c C-c ]' is easier than typing `C-c C-c }', which is, - however, more mnemonic; hence the two keybindings. (Also, you can - move out from between braces by typing `C-f'.) - - To put a command such as `@code{...}' around an *existing* word, -position the cursor in front of the word and type `C-u 1 C-c C-c c'. -This makes it easy to edit existing plain text. The value of the -prefix argument tells Emacs how many words following point to include -between braces--1 for one word, 2 for two words, and so on. Use a -negative argument to enclose the previous word or words. If you do not -specify a prefix argument, Emacs inserts the @-command string and -positions the cursor between the braces. This feature works only for -those @-commands that operate on a word or words within one line, such -as `@kbd' and `@var'. - - This set of insert commands was created after analyzing the frequency -with which different @-commands are used in the `GNU Emacs Manual' and -the `GDB Manual'. If you wish to add your own insert commands, you can -bind a keyboard macro to a key, use abbreviations, or extend the code -in `texinfo.el'. - - `C-c C-c C-d' (`texinfo-start-menu-description') is an insert -command that works differently from the other insert commands. It -inserts a node's section or chapter title in the space for the -description in a menu entry line. (A menu entry has three parts, the -entry name, the node name, and the description. Only the node name is -required, but a description helps explain what the node is about. -*Note The Parts of a Menu: Menu Parts.) - - To use `texinfo-start-menu-description', position point in a menu -entry line and type `C-c C-c C-d'. The command looks for and copies -the title that goes with the node name, and inserts the title as a -description; it positions point at beginning of the inserted text so you -can edit it. The function does not insert the title if the menu entry -line already contains a description. - - This command is only an aid to writing descriptions; it does not do -the whole job. You must edit the inserted text since a title tends to -use the same words as a node name but a useful description uses -different words. - - -File: texi.info, Node: Showing the Structure, Next: Updating Nodes and Menus, Prev: Inserting, Up: Texinfo Mode - -Showing the Section Structure of a File -======================================= - - You can show the section structure of a Texinfo file by using the -`C-c C-s' command (`texinfo-show-structure'). This command shows the -section structure of a Texinfo file by listing the lines that begin -with the @-commands for `@chapter', `@section', and the like. It -constructs what amounts to a table of contents. These lines are -displayed in another buffer called the `*Occur*' buffer. In that -buffer, you can position the cursor over one of the lines and use the -`C-c C-c' command (`occur-mode-goto-occurrence'), to jump to the -corresponding spot in the Texinfo file. - -`C-c C-s' -`M-x texinfo-show-structure' - Show the `@chapter', `@section', and such lines of a Texinfo file. - -`C-c C-c' -`M-x occur-mode-goto-occurrence' - Go to the line in the Texinfo file corresponding to the line under - the cursor in the `*Occur*' buffer. - - If you call `texinfo-show-structure' with a prefix argument by -typing `C-u C-c C-s', it will list not only those lines with the -@-commands for `@chapter', `@section', and the like, but also the -`@node' lines. (This is how the `texinfo-show-structure' command -worked without an argument in the first version of Texinfo. It was -changed because `@node' lines clutter up the `*Occur*' buffer and are -usually not needed.) You can use `texinfo-show-structure' with a prefix -argument to check whether the `Next', `Previous', and `Up' pointers of -an `@node' line are correct. - - Often, when you are working on a manual, you will be interested only -in the structure of the current chapter. In this case, you can mark -off the region of the buffer that you are interested in with the `C-x -n' (`narrow-to-region') command and `texinfo-show-structure' will work -on only that region. To see the whole buffer again, use `C-x w' -(`widen'). (*Note Narrowing: (emacs)Narrowing, for more information -about the narrowing commands.) - - In addition to providing the `texinfo-show-structure' command, -Texinfo mode sets the value of the page delimiter variable to match the -chapter-level @-commands. This enables you to use the `C-x ]' -(`forward-page') and `C-x [' (`backward-page') commands to move forward -and backward by chapter, and to use the `C-x p' (`narrow-to-page') -command to narrow to a chapter. *Note Pages: (emacs)Pages, for more -information about the page commands. - - -File: texi.info, Node: Updating Nodes and Menus, Next: Info Formatting, Prev: Showing the Structure, Up: Texinfo Mode - -Updating Nodes and Menus -======================== - - Texinfo mode provides commands for automatically creating or updating -menus and node pointers. The commands are called "update" commands -because their most frequent use is for updating a Texinfo file after -you have worked on it; but you can use them to insert the `Next', -`Previous', and `Up' pointers into an `@node' line that has none and to -create menus in a file that has none. - - If you do not use the updating commands, you need to write menus and -node pointers by hand, which is a tedious task. - -* Menu: - -* Updating Commands:: Five major updating commands. -* Updating Requirements:: How to structure a Texinfo file for - using the updating command. -* Other Updating Commands:: How to indent descriptions, insert - missing nodes lines, and update - nodes in sequence. - - -File: texi.info, Node: Updating Commands, Next: Updating Requirements, Up: Updating Nodes and Menus - -The Updating Commands ---------------------- - - You can use the updating commands - - * to insert or update the `Next', `Previous', and `Up' pointers of a - node, - - * to insert or update the menu for a section, and - - * to create a master menu for a Texinfo source file. - - You can also use the commands to update all the nodes and menus in a -region or in a whole Texinfo file. - - The updating commands work only with conventional Texinfo files, -which are structured hierarchically like books. In such files, a -structuring command line must follow closely after each `@node' line, -except for the `Top' `@node' line. (A "structuring command line" is a -line beginning with `@chapter', `@section', or other similar command.) - - You can write the structuring command line on the line that follows -immediately after an `@node' line or else on the line that follows -after a single `@comment' line or a single `@ifinfo' line. You cannot -interpose more than one line between the `@node' line and the -structuring command line; and you may interpose only an `@comment' line -or an `@ifinfo' line. - - Commands which work on a whole buffer require that the `Top' node be -followed by a node with an `@chapter' or equivalent-level command. -Note that the menu updating commands will not create a main or master -menu for a Texinfo file that has only `@chapter'-level nodes! The menu -updating commands only create menus *within* nodes for lower level -nodes. To create a menu of chapters, you must provide a `Top' node. - - The menu updating commands remove menu entries that refer to other -Info files since they do not refer to nodes within the current buffer. -This is a deficiency. Rather than use menu entries, you can use cross -references to refer to other Info files. None of the updating commands -affect cross references. - - Texinfo mode has five updating commands that are used most often: two -are for updating the node pointers or menu of a single node (or a -region); two are for updating every node pointer and menu in a file; -and one, the `texinfo-master-menu' command, is for creating a master -menu for a complete file, and optionally, for updating every node and -menu in the whole Texinfo file. - - The `texinfo-master-menu' command is the primary command: - -`C-c C-u m' -`M-x texinfo-master-menu' - Create or update a master menu that includes all the other menus - (incorporating the descriptions from pre-existing menus, if any). - - With an argument (prefix argument, `C-u,' if interactive), first - create or update all the nodes and all the regular menus in the - buffer before constructing the master menu. (*Note The Top Node - and Master Menu: The Top Node, for more about a master menu.) - - For `texinfo-master-menu' to work, the Texinfo file must have a - `Top' node and at least one subsequent node. - - After extensively editing a Texinfo file, you can type the - following: - - C-u M-x texinfo-master-menu - or - C-u C-c C-u m - - This updates all the nodes and menus completely and all at once. - - The other major updating commands do smaller jobs and are designed -for the person who updates nodes and menus as he or she writes a -Texinfo file. - - The commands are: - -`C-c C-u C-n' -`M-x texinfo-update-node' - Insert the `Next', `Previous', and `Up' pointers for the node that - point is within (i.e., for the `@node' line preceding point). If - the `@node' line has pre-existing `Next', `Previous', or `Up' - pointers in it, the old pointers are removed and new ones inserted. - With an argument (prefix argument, `C-u', if interactive), this - command updates all `@node' lines in the region (which is the text - between point and mark). - -`C-c C-u C-m' -`M-x texinfo-make-menu' - Create or update the menu in the node that point is within. With - an argument (`C-u' as prefix argument, if interactive), the - command makes or updates menus for the nodes which are either - within or a part of the region. - - Whenever `texinfo-make-menu' updates an existing menu, the - descriptions from that menu are incorporated into the new menu. - This is done by copying descriptions from the existing menu to the - entries in the new menu that have the same node names. If the - node names are different, the descriptions are not copied to the - new menu. - -`C-c C-u C-e' -`M-x texinfo-every-node-update' - Insert or update the `Next', `Previous', and `Up' pointers for - every node in the buffer. - -`C-c C-u C-a' -`M-x texinfo-all-menus-update' - Create or update all the menus in the buffer. With an argument - (`C-u' as prefix argument, if interactive), first insert or update - all the node pointers before working on the menus. - - If a master menu exists, the `texinfo-all-menus-update' command - updates it; but the command does not create a new master menu if - none already exists. (Use the `texinfo-master-menu' command for - that.) - - When working on a document that does not merit a master menu, you - can type the following: - - C-u C-c C-u C-a - or - C-u M-x texinfo-all-menus-update - - This updates all the nodes and menus. - - The `texinfo-column-for-description' variable specifies the column -to which menu descriptions are indented. By default, the value is 32 -although it is often useful to reduce it to as low as 24. You can set -the variable with the `M-x edit-options' command (*note Editing -Variable Values: (emacs)Edit Options.) or with the `M-x set-variable' -command (*note Examining and Setting Variables: (emacs)Examining.). - - Also, the `texinfo-indent-menu-description' command may be used to -indent existing menu descriptions to a specified column. Finally, if -you wish, you can use the `texinfo-insert-node-lines' command to insert -missing `@node' lines into a file. (*Note Other Updating Commands::, -for more information.) - - -File: texi.info, Node: Updating Requirements, Next: Other Updating Commands, Prev: Updating Commands, Up: Updating Nodes and Menus - -Updating Requirements ---------------------- - - To use the updating commands, you must organize the Texinfo file -hierarchically with chapters, sections, subsections, and the like. -When you construct the hierarchy of the manual, do not `jump down' more -than one level at a time: you can follow the `Top' node with a chapter, -but not with a section; you can follow a chapter with a section, but -not with a subsection. However, you may `jump up' any number of levels -at one time--for example, from a subsection to a chapter. - - Each `@node' line, with the exception of the line for the `Top' -node, must be followed by a line with a structuring command such as -`@chapter', `@section', or `@unnumberedsubsec'. - - Each `@node' line/structuring-command line combination must look -either like this: - - @node Comments, Minimum, Conventions, Overview - @comment node-name, next, previous, up - @section Comments - - or like this (without the `@comment' line): - - @node Comments, Minimum, Conventions, Overview - @section Comments - -In this example, `Comments' is the name of both the node and the -section. The next node is called `Minimum' and the previous node is -called `Conventions'. The `Comments' section is within the `Overview' -node, which is specified by the `Up' pointer. (Instead of an -`@comment' line, you can write an `@ifinfo' line.) - - If a file has a `Top' node, it must be called `top' or `Top' and be -the first node in the file. - - The menu updating commands create a menu of sections within a -chapter, a menu of subsections within a section, and so on. This means -that you must have a `Top' node if you want a menu of chapters. - - Incidentally, the `makeinfo' command will create an Info file for a -hierarchically organized Texinfo file that lacks `Next', `Previous' and -`Up' pointers. Thus, if you can be sure that your Texinfo file will be -formatted with `makeinfo', you have no need for the `update node' -commands. (*Note Creating an Info File: Create an Info File, for more -information about `makeinfo'.) However, both `makeinfo' and the -`texinfo-format-...' commands require that you insert menus in the file. - - -File: texi.info, Node: Other Updating Commands, Prev: Updating Requirements, Up: Updating Nodes and Menus - -Other Updating Commands ------------------------ - - In addition to the five major updating commands, Texinfo mode -possesses several less frequently used updating commands: - -`M-x texinfo-insert-node-lines' - Insert `@node' lines before the `@chapter', `@section', and other - sectioning commands wherever they are missing throughout a region - in a Texinfo file. - - With an argument (`C-u' as prefix argument, if interactive), the - `texinfo-insert-node-lines' command not only inserts `@node' lines - but also inserts the chapter or section titles as the names of the - corresponding nodes. In addition, it inserts the titles as node - names in pre-existing `@node' lines that lack names. Since node - names should be more concise than section or chapter titles, you - must manually edit node names so inserted. - - For example, the following marks a whole buffer as a region and - inserts `@node' lines and titles throughout: - - C-x h C-u M-x texinfo-insert-node-lines - - (Note that this command inserts titles as node names in `@node' - lines; the `texinfo-start-menu-description' command (*note - Inserting Frequently Used Commands: Inserting.) inserts titles as - descriptions in menu entries, a different action. However, in both - cases, you need to edit the inserted text.) - -`M-x texinfo-multiple-files-update' - Update nodes and menus in a document built from several separate - files. With `C-u' as a prefix argument, create and insert a - master menu in the outer file. With a numeric prefix argument, - such as `C-u 2', first update all the menus and all the `Next', - `Previous', and `Up' pointers of all the included files before - creating and inserting a master menu in the outer file. The - `texinfo-multiple-files-update' command is described in the - appendix on `@include' files. *Note - texinfo-multiple-files-update::. - -`M-x texinfo-indent-menu-description' - Indent every description in the menu following point to the - specified column. You can use this command to give yourself more - space for descriptions. With an argument (`C-u' as prefix - argument, if interactive), the `texinfo-indent-menu-description' - command indents every description in every menu in the region. - However, this command does not indent the second and subsequent - lines of a multi-line description. - -`M-x texinfo-sequential-node-update' - Insert the names of the nodes immediately following and preceding - the current node as the `Next' or `Previous' pointers regardless - of those nodes' hierarchical level. This means that the `Next' - node of a subsection may well be the next chapter. Sequentially - ordered nodes are useful for novels and other documents that you - read through sequentially. (However, in Info, the `g* RET' - command lets you look through the file sequentially, so - sequentially ordered nodes are not strictly necessary.) With an - argument (prefix argument, if interactive), the - `texinfo-sequential-node-update' command sequentially updates all - the nodes in the region. - - -File: texi.info, Node: Info Formatting, Next: Printing, Prev: Updating Nodes and Menus, Up: Texinfo Mode - -Formatting for Info -=================== - - Texinfo mode provides several commands for formatting part or all of -a Texinfo file for Info. Often, when you are writing a document, you -want to format only part of a file--that is, a region. - - You can use either the `texinfo-format-region' or the -`makeinfo-region' command to format a region: - -`C-c C-e C-r' -`M-x texinfo-format-region' -`C-c C-m C-r' -`M-x makeinfo-region' - Format the current region for Info. - - You can use either the `texinfo-format-buffer' or the -`makeinfo-buffer' command to format a whole buffer: - -`C-c C-e C-b' -`M-x texinfo-format-buffer' -`C-c C-m C-b' -`M-x makeinfo-buffer' - Format the current buffer for Info. - - For example, after writing a Texinfo file, you can type the -following: - - C-u C-c C-u m -or - C-u M-x texinfo-master-menu - -This updates all the nodes and menus. Then type the following to create -an Info file: - - C-c C-m C-b -or - M-x makeinfo-buffer - - For the Info formatting commands to work, the file *must* include a -line that has `@setfilename' in its header. - - Not all systems support the `makeinfo'-based formatting commands. - - *Note Create an Info File::, for details about Info formatting. - - -File: texi.info, Node: Printing, Next: Texinfo Mode Summary, Prev: Info Formatting, Up: Texinfo Mode - -Formatting and Printing -======================= - - Typesetting and printing a Texinfo file is a multi-step process in -which you first create a file for printing (called a DVI file), and then -print the file. Optionally, you may also create indices. To do this, -you must run the `texindex' command after first running the `tex' -typesetting command; and then you must run the `tex' command again. - - Often, when you are writing a document, you want to typeset and print -only part of a file to see what it will look like. You can use the -`texinfo-tex-region' and related commands for this purpose. Use the -`texinfo-tex-buffer' command to format all of a buffer. - -`C-c C-t C-r' -`M-x texinfo-tex-region' - Run TeX on the region. - -`C-c C-t C-b' -`M-x texinfo-tex-buffer' - Run TeX on the buffer. - -`C-c C-t C-i' -`M-x texinfo-texindex' - Run `texindex' to sort the indices of a Texinfo file formatted with - `texinfo-tex-region' or `texinfo-tex-buffer'. You must run the - `tex' command a second time after sorting the raw index files. - -`C-c C-t C-p' -`M-x texinfo-tex-print' - Print the file (or the part of the file) previously formatted with - `texinfo-tex-buffer' or `texinfo-tex-region'. - - For `texinfo-tex-region' or `texinfo-tex-buffer' to work, the file -*must* start with a `\input texinfo' line and must include an -`@settitle' line. The file must end with `@bye' on a line by itself. -(When you use `texinfo-tex-region', you must surround the `@settitle' -line with start-of-header and end-of-header lines.) - - *Note Format/Print Hardcopy::, for a description of the other TeX -related commands, such as `tex-show-print-queue'. - - -File: texi.info, Node: Texinfo Mode Summary, Prev: Printing, Up: Texinfo Mode - -Texinfo Mode Summary -==================== - - In Texinfo mode, each set of commands has default keybindings that -begin with the same keys. All the commands that are custom-created for -Texinfo mode begin with `C-c'. The keys are somewhat mnemonic. - -Insert Commands ---------------- - - The insert commands are invoked by typing `C-c' twice and then the -first letter of the @-command to be inserted. (It might make more -sense mnemonically to use `C-c C-i', for `custom insert', but `C-c C-c' -is quick to type.) - - C-c C-c c Insert `@code'. - C-c C-c d Insert `@dfn'. - C-c C-c e Insert `@end'. - C-c C-c i Insert `@item'. - C-c C-c n Insert `@node'. - C-c C-c s Insert `@samp'. - C-c C-c v Insert `@var'. - C-c C-c { Insert braces. - C-c C-c ] - C-c C-c } Move out of enclosing braces. - - C-c C-c C-d Insert a node's section title - in the space for the description - in a menu entry line. - -Show Structure --------------- - - The `texinfo-show-structure' command is often used within a narrowed -region. - - C-c C-s List all the headings. - -The Master Update Command -------------------------- - - The `texinfo-master-menu' command creates a master menu; and can be -used to update every node and menu in a file as well. - - C-c C-u m - M-x texinfo-master-menu - Create or update a master menu. - - C-u C-c C-u m With `C-u' as a prefix argument, first - create or update all nodes and regular - menus, and then create a master menu. - -Update Pointers ---------------- - - The update pointer commands are invoked by typing `C-c C-u' and then -either typing `C-n' for `texinfo-update-node' or typing `C-e' for -`texinfo-every-node-update'. - - C-c C-u C-n Update a node. - C-c C-u C-e Update every node in the buffer. - -Update Menus ------------- - - Invoke the update menu commands by typing `C-c C-u' and then either -`C-m' for `texinfo-make-menu' or `C-a' for `texinfo-all-menus-update'. -To update both nodes and menus at the same time, precede `C-c C-u C-a' -with `C-u'. - - C-c C-u C-m Make or update a menu. - - C-c C-u C-a Make or update all - menus in a buffer. - - C-u C-c C-u C-a With `C-u' as a prefix argument, - first create or update all nodes and - then create or update all menus. - -Format for Info ---------------- - - The Info formatting commands that are written in Emacs Lisp are -invoked by typing `C-c C-e' and then either `C-r' for a region or `C-b' -for the whole buffer. - - The Info formatting commands that are written in C and based on the -`makeinfo' program are invoked by typing `C-c C-m' and then either -`C-r' for a region or `C-b' for the whole buffer. - -Use the `texinfo-format...' commands: - - C-c C-e C-r Format the region. - C-c C-e C-b Format the buffer. - -Use `makeinfo': - - C-c C-m C-r Format the region. - C-c C-m C-b Format the buffer. - C-c C-m C-l Recenter the `makeinfo' output buffer. - C-c C-m C-k Kill the `makeinfo' formatting job. - -Typeset and Print ------------------ - - The TeX typesetting and printing commands are invoked by typing `C-c -C-t' and then another control command: `C-r' for `texinfo-tex-region', -`C-b' for `texinfo-tex-buffer', and so on. - - C-c C-t C-r Run TeX on the region. - C-c C-t C-b Run TeX on the buffer. - C-c C-t C-i Run `texindex'. - C-c C-t C-p Print the DVI file. - C-c C-t C-q Show the print queue. - C-c C-t C-d Delete a job from the print queue. - C-c C-t C-k Kill the current TeX formatting job. - C-c C-t C-x Quit a currently stopped TeX formatting job. - C-c C-t C-l Recenter the output buffer. - -Other Updating Commands ------------------------ - - The `other updating commands' do not have standard keybindings -because they are rarely used. - - M-x texinfo-insert-node-lines - Insert missing `@node' lines in region. - With `C-u' as a prefix argument, - use section titles as node names. - - M-x texinfo-multiple-files-update - Update a multi-file document. - With `C-u 2' as a prefix argument, - create or update all nodes and menus - in all included files first. - - M-x texinfo-indent-menu-description - Indent descriptions. - - M-x texinfo-sequential-node-update - Insert node pointers in strict sequence. - - -File: texi.info, Node: Beginning a File, Next: Ending a File, Prev: Texinfo Mode, Up: Top - -Beginning a Texinfo File -************************ - - Certain pieces of information must be provided at the beginning of a -Texinfo file, such as the name of the file and the title of the -document. - -* Menu: - -* Four Parts:: Four parts begin a Texinfo file. -* Sample Beginning:: Here is a sample beginning for a Texinfo file. -* Header:: The very beginning of a Texinfo file. -* Info Summary and Permissions:: Summary and copying permissions for Info. -* Titlepage & Copyright Page:: Creating the title and copyright pages. -* The Top Node:: Creating the `Top' node and master menu. -* Software Copying Permissions:: Ensure that you and others continue to - have the right to use and share software. - - -File: texi.info, Node: Four Parts, Next: Sample Beginning, Up: Beginning a File - -Four Parts Begin a File -======================= - - Generally, the beginning of a Texinfo file has four parts: - - 1. The header, delimited by special comment lines, that includes the - commands for naming the Texinfo file and telling TeX what - definitions' file to use when processing the Texinfo file. - - 2. A short statement of what the file is about, with a copyright - notice and copying permissions. This is enclosed in `@ifinfo' and - `@end ifinfo' commands so that the formatters place it only in the - Info file. - - 3. A title page and copyright page, with a copyright notice and - copying permissions. This is enclosed between `@titlepage' and - `@end titlepage' commands. The title and copyright page appear - only in the printed manual. - - 4. The `Top' node that contains a menu for the whole Info file. The - contents of this node appear only in the Info file. - - Also, optionally, you may include the copying conditions for a -program and a warranty disclaimer. The copying section will be -followed by an introduction or else by the first chapter of the manual. - - Since the copyright notice and copying permissions for the Texinfo -document (in contrast to the copying permissions for a program) are in -parts that appear only in the Info file or only in the printed manual, -this information must be given twice. - - -File: texi.info, Node: Sample Beginning, Next: Header, Prev: Four Parts, Up: Beginning a File - -Sample Texinfo File Beginning -============================= - - The following sample shows what is needed. - - \input texinfo @c -*-texinfo-*- - @c %**start of header - @setfilename NAME-OF-INFO-FILE - @settitle NAME-OF-MANUAL - @setchapternewpage odd - @c %**end of header - - @ifinfo - This file documents ... - - Copyright YEAR COPYRIGHT-OWNER - - Permission is granted to ... - @end ifinfo - - @c This title page illustrates only one of the - @c two methods of forming a title page. - - @titlepage - @title NAME-OF-MANUAL-WHEN-PRINTED - @subtitle SUBTITLE-IF-ANY - @subtitle SECOND-SUBTITLE - @author AUTHOR - - @c The following two commands - @c start the copyright page. - @page - @vskip 0pt plus 1filll - Copyright @copyright{} YEAR COPYRIGHT-OWNER - - Published by ... - - Permission is granted to ... - @end titlepage - - @node Top, Overview, (dir), (dir) - - @ifinfo - This document describes ... - - This document applies to version ... - of the program named ... - @end ifinfo - - @menu - * Copying:: Your rights and freedoms. - * First Chapter:: Getting started ... - * Second Chapter:: ... - ... - ... - @end menu - - @node First Chapter, Second Chapter, top, top - @comment node-name, next, previous, up - @chapter First Chapter - @cindex Index entry for First Chapter - - -File: texi.info, Node: Header, Next: Info Summary and Permissions, Prev: Sample Beginning, Up: Beginning a File - -The Texinfo File Header -======================= - - Texinfo files start with at least three lines that provide Info and -TeX with necessary information. These are the `\input texinfo' line, -the `@settitle' line, and the `@setfilename' line. If you want to run -TeX on just a part of the Texinfo File, you must write the `@settitle' -and `@setfilename' lines between start-of-header and end-of-header -lines. - - Thus, the beginning of a Texinfo file looks like this: - - \input texinfo @c -*-texinfo-*- - @setfilename sample.info - @settitle Sample Document - -or else like this: - - \input texinfo @c -*-texinfo-*- - @c %**start of header - @setfilename sample.info - @settitle Sample Document - @c %**end of header - -* Menu: - -* First Line:: The first line of a Texinfo file. -* Start of Header:: Formatting a region requires this. -* setfilename:: Tell Info the name of the Info file. -* settitle:: Create a title for the printed work. -* setchapternewpage:: Start chapters on right-hand pages. -* paragraphindent:: An option to specify paragraph indentation. -* End of Header:: Formatting a region requires this. - - -File: texi.info, Node: First Line, Next: Start of Header, Up: Header - -The First Line of a Texinfo File --------------------------------- - - Every Texinfo file that is to be the top-level input to TeX must -begin with a line that looks like this: - - \input texinfo @c -*-texinfo-*- - -This line serves two functions: - - 1. When the file is processed by TeX, the `\input texinfo' command - tells TeX to load the macros needed for processing a Texinfo file. - These are in a file called `texinfo.tex', which is usually located - in the `/usr/lib/tex/macros' directory. TeX uses the backslash, - `\', to mark the beginning of a command, just as Texinfo uses `@'. - The `texinfo.tex' file causes the switch from `\' to `@'; before - the switch occurs, TeX requires `\', which is why it appears at - the beginning of the file. - - 2. When the file is edited in GNU Emacs, the `-*-texinfo-*-' mode - specification tells Emacs to use Texinfo mode. - - -File: texi.info, Node: Start of Header, Next: setfilename, Prev: First Line, Up: Header - -Start of Header ---------------- - - Write a start-of-header line on the second line of a Texinfo file. -Follow the start-of-header line with `@setfilename' and `@settitle' -lines and, optionally, with other command lines, such as `@smallbook' -or `@footnotestyle'; and then by an end-of-header line (*note End of -Header::.). - - With these lines, you can format part of a Texinfo file for Info or -typeset part for printing. - - A start-of-header line looks like this: - - @c %**start of header - - The odd string of characters, `%**', is to ensure that no other -comment is accidentally taken for a start-of-header line. - - -File: texi.info, Node: setfilename, Next: settitle, Prev: Start of Header, Up: Header - -`@setfilename' --------------- - - In order to be made into an Info file, a Texinfo file must contain a -line that looks like this: - - @setfilename INFO-FILE-NAME - - Write the `@setfilename' command at the beginning of a line and -follow it on the same line by the Info file name. Do not write -anything else on the line; anything on the line after the command is -considered part of the file name, including a comment. - - The `@setfilename' line specifies the name of the Info file to be -generated. This name should be different from the name of the Texinfo -file. The convention is to write a name with a `.info' extension, to -produce an Info file name such as `texinfo.info'. - - Some operating systems cannot handle long file names. You can run -into a problem even when the file name you specify is itself short -enough. This occurs because the Info formatters split a long Info file -into short indirect subfiles, and name them by appending `-1', `-2', -..., `-10', `-11', and so on, to the original file name. (*Note Tag -Files and Split Files: Tag and Split Files.) The subfile name -`texinfo.info-10', for example, is too long for some systems; so the -Info file name for this document is actually `texinfo' rather than -`texinfo.info'. - - The Info formatting commands ignore everything written before the -`@setfilename' line, which is why the very first line of the file (the -`\input' line) does not need to be commented out. The `@setfilename' -line is ignored when you typeset a printed manual. - - -File: texi.info, Node: settitle, Next: setchapternewpage, Prev: setfilename, Up: Header - -`@settitle' ------------ - - In order to be made into a printed manual, a Texinfo file must -contain a line that looks like this: - - @settitle TITLE - - Write the `@settitle' command at the beginning of a line and follow -it on the same line by the title. This tells TeX the title to use in a -header or footer. Do not write anything else on the line; anything on -the line after the command is considered part of the title, including a -comment. - - Conventionally, TeX formats a Texinfo file for double-sided output -so as to print the title in the left-hand (even-numbered) page headings -and the current chapter titles in the right-hand (odd-numbered) page -headings. (TeX learns the title of each chapter from each `@chapter' -command.) Page footers are not printed. - - Even if you are printing in a single-sided style, TeX looks for an -`@settitle' command line, in case you include the manual title in the -heading. - - The `@settitle' command should precede everything that generates -actual output in TeX. - - Although the title in the `@settitle' command is usually the same as -the title on the title page, it does not affect the title as it appears -on the title page. Thus, the two do not need not match exactly; and -the title in the `@settitle' command can be a shortened or expanded -version of the title as it appears on the title page. (*Note -`@titlepage': titlepage.) - - TeX prints page headings only for that text that comes after the -`@end titlepage' command in the Texinfo file, or that comes after an -`@headings' command that turns on headings. (*Note The `@headings' -Command: headings on off, for more information.) - - You may, if you wish, create your own, customized headings and -footings. *Note Page Headings: Headings, for a detailed discussion of -this process. - - -File: texi.info, Node: setchapternewpage, Next: paragraphindent, Prev: settitle, Up: Header - -`@setchapternewpage' --------------------- - - In a book or a manual, text is usually printed on both sides of the -paper, chapters start on right-hand pages, and right-hand pages have -odd numbers. But in short reports, text often is printed only on one -side of the paper. Also in short reports, chapters sometimes do not -start on new pages, but are printed on the same page as the end of the -preceding chapter, after a small amount of vertical whitespace. - - You can use the `@setchapternewpage' command with various arguments -to specify how TeX should start chapters and whether it should typeset -pages for printing on one or both sides of the paper (single-sided or -double-sided printing). - - Write the `@setchapternewpage' command at the beginning of a line -followed by its argument. - - For example, you would write the following to cause each chapter to -start on a fresh odd-numbered page: - - @setchapternewpage odd - - You can specify one of three alternatives with the -`@setchapternewpage' command: - -`@setchapternewpage off' - Cause TeX to typeset a new chapter on the same page as the last - chapter, after skipping some vertical whitespace. Also, cause TeX - to format page headers for single-sided printing. (You can - override the headers format with the `@headings double' command; - see *Note The `@headings' Command: headings on off.) - -`@setchapternewpage on' - Cause TeX to start new chapters on new pages and to typeset page - headers for single-sided printing. This is the form most often - used for short reports. - - This alternative is the default. - -`@setchapternewpage odd' - Cause TeX to start new chapters on new, odd-numbered pages - (right-handed pages) and to typeset for double-sided printing. - This is the form most often used for books and manuals. - -Texinfo does not have an `@setchapternewpage even' command. - -(You can countermand or modify an `@setchapternewpage' command with an -`@headings' command. *Note The `@headings' Command: headings on off.) - - At the beginning of a manual or book, pages are not numbered--for -example, the title and copyright pages of a book are not numbered. By -convention, table of contents pages are numbered with roman numerals -and not in sequence with the rest of the document. - - Since an Info file does not have pages, the `@setchapternewpage' -command has no effect on it. - - Usually, you do not write an `@setchapternewpage' command for -single-sided printing, but accept the default which is to typeset for -single-sided printing and to start new chapters on new pages. Usually, -you write an `@setchapternewpage odd' command for double-sided printing. - - -File: texi.info, Node: paragraphindent, Next: End of Header, Prev: setchapternewpage, Up: Header - -Paragraph Indenting -------------------- - - The Info formatting commands may insert spaces at the beginning of -the first line of each paragraph, thereby indenting that paragraph. You -can use the `@paragraphindent' command to specify the indentation. -Write an `@paragraphindent' command at the beginning of a line followed -by either `asis' or a number. The template is: - - @paragraphindent INDENT - - The Info formatting commands indent according to the value of INDENT: - - * If the value of INDENT is `asis', the Info formatting commands do - not change the existing indentation. - - * If the value of INDENT is 0, the Info formatting commands delete - existing indentation. - - * If the value of INDENT is greater than 0, the Info formatting - commands indent the paragraph by that number of spaces. - - The default value of INDENT is `asis'. - - Write the `@paragraphindent' command before or shortly after the -end-of-header line at the beginning of a Texinfo file. (If you write -the command between the start-of-header and end-of-header lines, the -region formatting commands indent paragraphs as specified.) - - A peculiarity of `texinfo-format-buffer' and `texinfo-format-region' -is that they do not indent (nor fill) paragraphs that contain `@w' or -`@*' commands. *Note Refilling Paragraphs::, for a detailed -description of what goes on. - - -File: texi.info, Node: End of Header, Prev: paragraphindent, Up: Header - -End of Header -------------- - - Follow the header lines with an end-of-header line. An -end-of-header line looks like this: - - @c %**end of header - - If you include the `@setchapternewpage' command between the -start-of-header and end-of-header lines, TeX will typeset a region as -that command specifies. Similarly, if you include an `@smallbook' -command between the start-of-header and end-of-header lines, TeX will -typeset a region in the "small" book format. - - The reason for the odd string of characters (`%**') is so that the -`texinfo-tex-region' command does not accidentally find something that -it should not when it is looking for the header. - - The start-of-header line and the end-of-header line are Texinfo mode -variables that you can change. - - -File: texi.info, Node: Info Summary and Permissions, Next: Titlepage & Copyright Page, Prev: Header, Up: Beginning a File - -Summary and Copying Permissions for Info -======================================== - - The title page and the copyright page appear only in the printed -copy of the manual; therefore, the same information must be inserted in -a section that appears only in the Info file. This section usually -contains a brief description of the contents of the Info file, a -copyright notice, and copying permissions. - - The copyright notice should read: - - Copyright YEAR COPYRIGHT-OWNER - -and be put on a line by itself. - - Standard text for the copyright permissions is contained in an -appendix to this manual; see *Note `ifinfo' Copying Permissions: ifinfo -Permissions, for the complete text. - - The permissions text appears in an Info file *before* the first -node. This mean that a reader does *not* see this text when reading -the file using Info, except when using the advanced Info command `g *'. - - -File: texi.info, Node: Titlepage & Copyright Page, Next: The Top Node, Prev: Info Summary and Permissions, Up: Beginning a File - -The Title and Copyright Pages -============================= - - A manual's name and author are usually printed on a title page. -Sometimes copyright information is printed on the title page as well; -more often, copyright information is printed on the back of the title -page. - - The title and copyright pages appear in the printed manual, but not -in the Info file. Because of this, it is possible to use several -slightly obscure TeX typesetting commands that cannot be used in an -Info file. In addition, this part of the beginning of a Texinfo file -contains the text of the copying permissions that will appear in the -printed manual. - - *Note Titlepage Copying Permissions: Titlepage Permissions, for the -standard text for the copyright permissions. - -* Menu: - -* titlepage:: Create a title for the printed document. -* titlefont center sp:: The `@titlefont', `@center', - and `@sp' commands. -* title subtitle author:: The `@title', `@subtitle', - and `@author' commands. -* Copyright & Permissions:: How to write the copyright notice and - include copying permissions. -* end titlepage:: Turn on page headings after the title and - copyright pages. -* headings on off:: An option for turning headings on and off - and double or single sided printing. - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-3 b/gnu/usr.bin/texinfo/info-files/texi.info-3 deleted file mode 100644 index 1058a1aca173..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-3 +++ /dev/null @@ -1,1262 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: titlepage, Next: titlefont center sp, Up: Titlepage & Copyright Page - -`@titlepage' ------------- - - Start the material for the title page and following copyright page -with `@titlepage' on a line by itself and end it with `@end titlepage' -on a line by itself. - - The `@end titlepage' command starts a new page and turns on page -numbering. (*Note Page Headings: Headings, for details about how to -generate of page headings.) All the material that you want to appear -on unnumbered pages should be put between the `@titlepage' and `@end -titlepage' commands. By using the `@page' command you can force a page -break within the region delineated by the `@titlepage' and `@end -titlepage' commands and thereby create more than one unnumbered page. -This is how the copyright page is produced. (The `@titlepage' command -might perhaps have been better named the `@titleandadditionalpages' -command, but that would have been rather long!) - - When you write a manual about a computer program, you should write -the version of the program to which the manual applies on the title -page. If the manual changes more frequently than the program or is -independent of it, you should also include an edition number(1) for the -manual. This helps readers keep track of which manual is for which -version of the program. (The `Top' node should also contain this -information; see *Note `@top': makeinfo top.) - - Texinfo provides two methods for creating a title page. One method -uses the `@titlefont', `@sp', and `@center' commands to generate a -title page in which the words on the page are centered. - - The second method uses the `@title', `@subtitle', and `@author' -commands to create a title page with black rules under the title and -author lines and the subtitle text set flush to the right hand side of -the page. With this method, you do not specify any of the actual -formatting of the title page. You specify the text you want, and -Texinfo does the formatting. You may use either method. - - ---------- Footnotes ---------- - - (1) We have found that it is helpful to refer to versions of -manuals as `editions' and versions of programs as `versions'; -otherwise, we find we are liable to confuse each other in conversation -by referring to both the documentation and the software with the same -words. - - -File: texi.info, Node: titlefont center sp, Next: title subtitle author, Prev: titlepage, Up: Titlepage & Copyright Page - -`@titlefont', `@center', and `@sp' ----------------------------------- - - You can use the `@titlefont', `@sp', and `@center' commands to -create a title page for a printed document. (This is the first of the -two methods for creating a title page in Texinfo.) - - Use the `@titlefont' command to select a large font suitable for the -title itself. - - For example: - - @titlefont{Texinfo} - - Use the `@center' command at the beginning of a line to center the -remaining text on that line. Thus, - - @center @titlefont{Texinfo} - -centers the title, which in this example is "Texinfo" printed in the -title font. - - Use the `@sp' command to insert vertical space. For example: - - @sp 2 - -This inserts two blank lines on the printed page. (*Note `@sp': sp, -for more information about the `@sp' command.) - - A template for this method looks like this: - - @titlepage - @sp 10 - @center @titlefont{NAME-OF-MANUAL-WHEN-PRINTED} - @sp 2 - @center SUBTITLE-IF-ANY - @sp 2 - @center AUTHOR - ... - @end titlepage - - The spacing of the example fits an 8 1/2 by 11 inch manual. - - -File: texi.info, Node: title subtitle author, Next: Copyright & Permissions, Prev: titlefont center sp, Up: Titlepage & Copyright Page - -`@title', `@subtitle', and `@author' ------------------------------------- - - You can use the `@title', `@subtitle', and `@author' commands to -create a title page in which the vertical and horizontal spacing is -done for you automatically. This contrasts with the method described in -the previous section, in which the `@sp' command is needed to adjust -vertical spacing. - - Write the `@title', `@subtitle', or `@author' commands at the -beginning of a line followed by the title, subtitle, or author. - - The `@title' command produces a line in which the title is set flush -to the left-hand side of the page in a larger than normal font. The -title is underlined with a black rule. - - The `@subtitle' command sets subtitles in a normal-sized font flush -to the right-hand side of the page. - - The `@author' command sets the names of the author or authors in a -middle-sized font flush to the left-hand side of the page on a line -near the bottom of the title page. The names are underlined with a -black rule that is thinner than the rule that underlines the title. -(The black rule only occurs if the `@author' command line is followed -by an `@page' command line.) - - There are two ways to use the `@author' command: you can write the -name or names on the remaining part of the line that starts with an -`@author' command: - - @author by Jane Smith and John Doe - -or you can write the names one above each other by using two (or more) -`@author' commands: - - @author Jane Smith - @author John Doe - -(Only the bottom name is underlined with a black rule.) - - A template for this method looks like this: - - @titlepage - @title NAME-OF-MANUAL-WHEN-PRINTED - @subtitle SUBTITLE-IF-ANY - @subtitle SECOND-SUBTITLE - @author AUTHOR - @page - ... - @end titlepage - -Contrast this form with the form of a title page written using the -`@sp', `@center', and `@titlefont' commands: - - @titlepage - @sp 10 - @center @titlefont{Name of Manual When Printed} - @sp 2 - @center Subtitle, If Any - @sp 1 - @center Second subtitle - @sp 2 - @center Author - @page - ... - @end titlepage - - -File: texi.info, Node: Copyright & Permissions, Next: end titlepage, Prev: title subtitle author, Up: Titlepage & Copyright Page - -Copyright Page and Permissions ------------------------------- - - By international treaty, the copyright notice for a book should be -either on the title page or on the back of the title page. The -copyright notice should include the year followed by the name of the -organization or person who owns the copyright. - - When the copyright notice is on the back of the title page, that page -is customarily not numbered. Therefore, in Texinfo, the information on -the copyright page should be within `@titlepage' and `@end titlepage' -commands. - - Use the `@page' command to cause a page break. To push the -copyright notice and the other text on the copyright page towards the -bottom of the page, you can write a somewhat mysterious line after the -`@page' command that reads like this: - - @vskip 0pt plus 1filll - -This is a TeX command that is not supported by the Info formatting -commands. The `@vskip' command inserts whitespace. The `0pt plus -1filll' means to put in zero points of mandatory whitespace, and as -much optional whitespace as needed to push the following text to the -bottom of the page. Note the use of three `l's in the word `filll'; -this is the correct usage in TeX. - - In a printed manual, the `@copyright{}' command generates a `c' -inside a circle. (In Info, it generates `(C)'.) The copyright notice -itself has the following legally defined sequence: - - Copyright (C) YEAR COPYRIGHT-OWNER - - It is customary to put information on how to get a manual after the -copyright notice, followed by the copying permissions for the manual. - - Note that permissions must be given here as well as in the summary -segment within `@ifinfo' and `@end ifinfo' that immediately follows the -header since this text appears only in the printed manual and the -`ifinfo' text appears only in the Info file. - - *Note Sample Permissions::, for the standard text. - - -File: texi.info, Node: end titlepage, Next: headings on off, Prev: Copyright & Permissions, Up: Titlepage & Copyright Page - -Heading Generation ------------------- - - An `@end titlepage' command on a line by itself not only marks the -end of the title and copyright pages, but also causes TeX to start -generating page headings and page numbers. - - To repeat what is said elsewhere, Texinfo has two standard page -heading formats, one for documents which are printed on one side of -each sheet of paper (single-sided printing), and the other for -documents which are printed on both sides of each sheet (double-sided -printing). (*Note `@setchapternewpage': setchapternewpage.) You can -specify these formats in different ways: - - * The conventional way is to write an `@setchapternewpage' command - before the title page commands, and then have the `@end titlepage' - command start generating page headings in the manner desired. - (*Note `@setchapternewpage': setchapternewpage.) - - * Alternatively, you can use the `@headings' command to prevent page - headings from being generated or to start them for either single or - double-sided printing. (Write an `@headings' command immediately - after the `@end titlepage' command. *Note The `@headings' - Command: headings on off, for more information.) - - * Or, you may specify your own page heading and footing format. - *Note Page Headings: Headings, for detailed information about page - headings and footings. - - Most documents are formatted with the standard single-sided or -double-sided format, using `@setchapternewpage odd' for double-sided -printing and no `@setchapternewpage' command for single-sided printing. - - -File: texi.info, Node: headings on off, Prev: end titlepage, Up: Titlepage & Copyright Page - -The `@headings' Command ------------------------ - - The `@headings' command is rarely used. It specifies what kind of -page headings and footings to print on each page. Usually, this is -controlled by the `@setchapternewpage' command. You need the -`@headings' command only if the `@setchapternewpage' command does not -do what you want, or if you want to turn off pre-defined page headings -prior to defining your own. Write an `@headings' command immediately -after the `@end titlepage' command. - - There are four ways to use the `@headings' command: - -`@headings off' - Turn off printing of page headings. - -`@headings single' - Turn on page headings appropriate for single-sided printing. - -`@headings double' -`@headings on' - Turn on page headings appropriate for double-sided printing. The - two commands, `@headings on' and `@headings double', are - synonymous. - - For example, suppose you write `@setchapternewpage off' before the -`@titlepage' command to tell TeX to start a new chapter on the same -page as the end of the last chapter. This command also causes TeX to -typeset page headers for single-sided printing. To cause TeX to -typeset for double sided printing, write `@headings double' after the -`@end titlepage' command. - - You can stop TeX from generating any page headings at all by writing -`@headings off' on a line of its own immediately after the line -containing the `@end titlepage' command, like this: - - @end titlepage - @headings off - -The `@headings off' command overrides the `@end titlepage' command, -which would otherwise cause TeX to print page headings. - - You can also specify your own style of page heading and footing. -*Note Page Headings: Headings, for more information. - - -File: texi.info, Node: The Top Node, Next: Software Copying Permissions, Prev: Titlepage & Copyright Page, Up: Beginning a File - -The `Top' Node and Master Menu -============================== - - The `Top' node is the node from which you enter an Info file. - - A `Top' node should contain a brief description of the Info file and -an extensive, master menu for the whole Info file. This helps the -reader understand what the Info file is about. Also, you should write -the version number of the program to which the Info file applies; or, -at least, the edition number. - - The contents of the `Top' node should appear only in the Info file; -none of it should appear in printed output, so enclose it between -`@ifinfo' and `@end ifinfo' commands. (TeX does not print either an -`@node' line or a menu; they appear only in Info; strictly speaking, -you are not required to enclose these parts between `@ifinfo' and `@end -ifinfo', but it is simplest to do so. *Note Conditionally Visible -Text: Conditionals.) - -* Menu: - -* Title of Top Node:: Sketch what the file is about. -* Master Menu Parts:: A master menu has three or more parts. - - -File: texi.info, Node: Title of Top Node, Next: Master Menu Parts, Up: The Top Node - -`Top' Node Title ----------------- - - Sometimes, you will want to place an `@top' sectioning command line -containing the title of the document immediately after the `@node Top' -line (*note The `@top' Sectioning Command: makeinfo top command., for -more information). - - For example, the beginning of the Top node of this manual contains an -`@top' sectioning command, a short description, and edition and version -information. It looks like this: - - ... - @end titlepage - - @ifinfo - @node Top, Copying, (dir), (dir) - @top Texinfo - - Texinfo is a documentation system... - - This is edition... - ... - @end ifinfo - - @menu - * Copying:: Texinfo is freely - redistributable. - * Overview:: What is Texinfo? - ... - @end menu - - In a `Top' node, the `Previous', and `Up' nodes usually refer to the -top level directory of the whole Info system, which is called `(dir)'. -The `Next' node refers to the first node that follows the main or master -menu, which is usually the copying permissions, introduction, or first -chapter. - - -File: texi.info, Node: Master Menu Parts, Prev: Title of Top Node, Up: The Top Node - -Parts of a Master Menu ----------------------- - - A "master menu" is a detailed main menu listing all the nodes in a -file. - - A master menu is enclosed in `@menu' and `@end menu' commands and -does not appear in the printed document. - - Generally, a master menu is divided into parts. - - * The first part contains the major nodes in the Texinfo file: the - nodes for the chapters, chapter-like sections, and the appendices. - - * The second part contains nodes for the indices. - - * The third and subsequent parts contain a listing of the other, - lower level nodes, often ordered by chapter. This way, rather - than go through an intermediary menu, an inquirer can go directly - to a particular node when searching for specific information. - These menu items are not required; add them if you think they are a - convenience. - - Each section in the menu can be introduced by a descriptive line. So -long as the line does not begin with an asterisk, it will not be -treated as a menu entry. (*Note Writing a Menu::, for more -information.) - - For example, the master menu for this manual looks like the following -(but has many more entries): - - @menu - * Copying:: Texinfo is freely - redistributable. - * Overview:: What is Texinfo? - * Texinfo Mode:: Special features in GNU Emacs. - ... - ... - * Command and Variable Index:: - An entry for each @-command. - * Concept Index:: An entry for each concept. - - --- The Detailed Node Listing --- - - Overview of Texinfo - - * Info Files:: What is an Info file? - * Printed Manuals:: Characteristics of - a printed manual. - ... - ... - - Using Texinfo Mode - - * Info on a Region:: Formatting part of a file - for Info. - ... - ... - @end menu - - -File: texi.info, Node: Software Copying Permissions, Prev: The Top Node, Up: Beginning a File - -Software Copying Permissions -============================ - - If the Texinfo file has a section containing the "General Public -License" and the distribution information and a warranty disclaimer for -the software that is documented, this section usually follows the `Top' -node. The General Public License is very important to Project GNU -software. It ensures that you and others will continue to have a right -to use and share the software. - - The copying and distribution information and the disclaimer are -followed by an introduction or else by the first chapter of the manual. - - Although an introduction is not a required part of a Texinfo file, it -is very helpful. Ideally, it should state clearly and concisely what -the file is about and who would be interested in reading it. In -general, an introduction would follow the licensing and distribution -information, although sometimes people put it earlier in the document. -Usually, an introduction is put in an `@unnumbered' section. (*Note -The `@unnumbered' and `@appendix' Commands: unnumbered & appendix.) - - -File: texi.info, Node: Ending a File, Next: Structuring, Prev: Beginning a File, Up: Top - -Ending a Texinfo File -********************* - - The end of a Texinfo file should include the commands that create -indices and generate detailed and summary tables of contents. And it -must include the `@bye' command that marks the last line processed by -TeX. - - For example: - - @node Concept Index, , Variables Index, Top - @c node-name, next, previous, up - @unnumbered Concept Index - - @printindex cp - - @contents - @bye - -* Menu: - -* Printing Indices & Menus:: How to print an index in hardcopy and - generate index menus in Info. -* Contents:: How to create a table of contents. -* File End:: How to mark the end of a file. - - -File: texi.info, Node: Printing Indices & Menus, Next: Contents, Up: Ending a File - -Index Menus and Printing an Index -================================= - - To print an index means to include it as part of a manual or Info -file. This does not happen automatically just because you use -`@cindex' or other index-entry generating commands in the Texinfo file; -those just cause the raw data for the index to be accumulated. To -generate an index, you must include the `@printindex' command at the -place in the document where you want the index to appear. Also, as -part of the process of creating a printed manual, you must run a -program called `texindex' (*note Format/Print Hardcopy::.) to sort the -raw data to produce a sorted index file. The sorted index file is what -is actually used to print the index. - - Texinfo offers six different types of predefined index: the concept -index, the function index, the variables index, the keystroke index, the -program index, and the data type index (*note Predefined Indices::.). -Each index type has a two-letter name: `cp', `fn', `vr', `ky', `pg', -and `tp'. You may merge indices, or put them into separate sections -(*note Combining Indices::.); or you may define your own indices (*note -Defining New Indices: New Indices.). - - The `@printindex' command takes a two-letter index name, reads the -corresponding sorted index file and formats it appropriately into an -index. - - The `@printindex' command does not generate a chapter heading for -the index. Consequently, you should precede the `@printindex' command -with a suitable section or chapter command (usually `@unnumbered') to -supply the chapter heading and put the index into the table of -contents. Precede the `@unnumbered' command with an `@node' line. - - For example: - - @node Variable Index, Concept Index, Function Index, Top - @comment node-name, next, previous, up - @unnumbered Variable Index - - @printindex vr - - @node Concept Index, , Variable Index, Top - @comment node-name, next, previous, up - @unnumbered Concept Index - - @printindex cp - - @summarycontents - @contents - @bye - -(Readers often prefer that the concept index come last in a book, since -that makes it easiest to find.) - - -File: texi.info, Node: Contents, Next: File End, Prev: Printing Indices & Menus, Up: Ending a File - -Generating a Table of Contents -============================== - - The `@chapter', `@section', and other structuring commands supply -the information to make up a table of contents, but they do not cause -an actual table to appear in the manual. To do this, you must use the -`@contents' and `@summarycontents' commands: - -`@contents' - Generate a table of contents in a printed manual, including all - chapters, sections, subsections, etc., as well as appendices and - unnumbered chapters. (Headings generated by the `@heading' series - of commands do not appear in the table of contents.) The - `@contents' command should be written on a line by itself. - -`@shortcontents' -`@summarycontents' - (`@summarycontents' is a synonym for `@shortcontents'; the two - commands are exactly the same.) - - Generate a short or summary table of contents that lists only the - chapters (and appendices and unnumbered chapters). Omit sections, - subsections and subsubsections. Only a long manual needs a short - table of contents in addition to the full table of contents. - - Write the `@shortcontents' command on a line by itself right - *before* the `@contents' command. - - The table of contents commands automatically generate a chapter-like -heading at the top of the first table of contents page. Write the table -of contents commands at the very end of a Texinfo file, just before the -`@bye' command, following any index sections--anything in the Texinfo -file after the table of contents commands will be omitted from the -table of contents. - - When you print a manual with a table of contents, the table of -contents are printed last and numbered with roman numerals. You need -to place those pages in their proper place, after the title page, -yourself. (This is the only collating you need to do for a printed -manual. The table of contents is printed last because it is generated -after the rest of the manual is typeset.) - - Here is an example of where to write table of contents commands: - - INDICES... - @shortcontents - @contents - @bye - - Since an Info file uses menus instead of tables of contents, the Info -formatting commands ignore the `@contents' and `@shortcontents' -commands. - - -File: texi.info, Node: File End, Prev: Contents, Up: Ending a File - -`@bye' File Ending -================== - - An `@bye' command terminates TeX or Info formatting. None of the -formatting commands see any of the file following `@bye'. The `@bye' -command should be on a line by itself. - - If you wish, you may follow the `@bye' line with notes. These notes -will not be formatted and will not appear in either Info or a printed -manual; it is as if text after `@bye' were within `@ignore' ... `@end -ignore'. Also, you may follow the `@bye' line with a local variables -list. *Note Using Local Variables and the Compile Command: -Compile-Command, for more information. - - -File: texi.info, Node: Structuring, Next: Nodes, Prev: Ending a File, Up: Top - -Chapter Structuring -******************* - - The "chapter structuring" commands divide a document into a -hierarchy of chapters, sections, subsections, and subsubsections. -These commands generate large headings; they also provide information -for the table of contents of a printed manual (*note Generating a Table -of Contents: Contents.). - - The chapter structuring commands do not create an Info node -structure, so normally you should put an `@node' command immediately -before each chapter structuring command (*note Nodes::.). The only -time you are likely to use the chapter structuring commands without -using the node structuring commands is if you are writing a document -that contains no cross references and will never be transformed into -Info format. - - It is unlikely that you will ever write a Texinfo file that is -intended only as an Info file and not as a printable document. If you -do, you might still use chapter structuring commands to create a -heading at the top of each node--but you don't need to. - -* Menu: - -* Tree Structuring:: A manual is like an upside down tree ... -* Structuring Command Types:: How to divide a manual into parts. -* makeinfo top:: The `@top' command, part of the `Top' node. -* chapter:: -* unnumbered & appendix:: -* majorheading & chapheading:: -* section:: -* unnumberedsec appendixsec heading:: -* subsection:: -* unnumberedsubsec appendixsubsec subheading:: -* subsubsection:: Commands for the lowest level sections. - - -File: texi.info, Node: Tree Structuring, Next: Structuring Command Types, Up: Structuring - -Tree Structure of Sections -========================== - - A Texinfo file is usually structured like a book with chapters, -sections, subsections, and the like. This structure can be visualized -as a tree (or rather as an upside-down tree) with the root at the top -and the levels corresponding to chapters, sections, subsection, and -subsubsections. - - Here is a diagram that shows a Texinfo file with three chapters, -each of which has two sections. - - Top - | - ------------------------------------- - | | | - Chapter 1 Chapter 2 Chapter 3 - | | | - -------- -------- -------- - | | | | | | - Section Section Section Section Section Section - 1.1 1.2 2.1 2.2 3.1 3.2 - - In a Texinfo file that has this structure, the beginning of Chapter 2 -looks like this: - - @node Chapter 2, Chapter 3, Chapter 1, top - @chapter Chapter 2 - - The chapter structuring commands are described in the sections that -follow; the `@node' and `@menu' commands are described in following -chapters. (*Note Nodes::, and see *Note Menus::.) - - -File: texi.info, Node: Structuring Command Types, Next: makeinfo top, Prev: Tree Structuring, Up: Structuring - -Types of Structuring Command -============================ - - The chapter structuring commands fall into four groups or series, -each of which contains structuring commands corresponding to the -hierarchical levels of chapters, sections, subsections, and -subsubsections. - - The four groups are the `@chapter' series, the `@unnumbered' series, -the `@appendix' series, and the `@heading' series. - - Each command produces titles that have a different appearance on the -printed page or Info file; only some of the commands produce titles -that are listed in the table of contents of a printed book or manual. - - * The `@chapter' and `@appendix' series of commands produce numbered - or lettered entries both in the body of a printed work and in its - table of contents. - - * The `@unnumbered' series of commands produce unnumbered entries - both in the body of a printed work and in its table of contents. - The `@top' command, which has a special use, is a member of this - series (*note `@top': makeinfo top.). - - * The `@heading' series of commands produce unnumbered headings that - do not appear in a table of contents. The heading commands never - start a new page. - - * The `@majorheading' command produces results similar to using the - `@chapheading' command but generates a larger vertical whitespace - before the heading. - - * When an `@setchapternewpage' command says to do so, the - `@chapter', `@unnumbered', and `@appendix' commands start new - pages in the printed manual; the `@heading' commands do not. - - Here are the four groups of chapter structuring commands: - - No new pages - Numbered Unnumbered Lettered and numbered Unnumbered - In contents In contents In contents Not in contents - - @top @majorheading - @chapter @unnumbered @appendix @chapheading - @section @unnumberedsec @appendixsec @heading - @subsection @unnumberedsubsec @appendixsubsec @subheading - @subsubsection @unnumberedsubsubsec @appendixsubsubsec @subsubheading - - -File: texi.info, Node: makeinfo top, Next: chapter, Prev: Structuring Command Types, Up: Structuring - -`@top' -====== - - The `@top' command is a special sectioning command that you use only -after an `@node Top' line at the beginning of a Texinfo file. The -`@top' command tells the `makeinfo' formatter which node is the `Top' -node. It has the same typesetting effect as `@unnumbered' (*note -`@unnumbered': (`@appendix')unnumbered & appendix.). For detailed -information, see *Note The `@top' Command: makeinfo top command. - - -File: texi.info, Node: chapter, Next: unnumbered & appendix, Prev: makeinfo top, Up: Structuring - -`@chapter' -========== - - `@chapter' identifies a chapter in the document. Write the command -at the beginning of a line and follow it on the same line by the title -of the chapter. - - For example, this chapter in this manual is entitled "Chapter -Structuring"; the `@chapter' line looks like this: - - @chapter Chapter Structuring - - In TeX, the `@chapter' command creates a chapter in the document, -specifying the chapter title. The chapter is numbered automatically. - - In Info, the `@chapter' command causes the title to appear on a line -by itself, with a line of asterisks inserted underneath. Thus, in -Info, the above example produces the following output: - - Chapter Structuring - ******************* - - -File: texi.info, Node: unnumbered & appendix, Next: majorheading & chapheading, Prev: chapter, Up: Structuring - -`@unnumbered', `@appendix' -========================== - - Use the `@unnumbered' command to create a chapter that appears in a -printed manual without chapter numbers of any kind. Use the -`@appendix' command to create an appendix in a printed manual that is -labelled by letter instead of by number. - - For Info file output, the `@unnumbered' and `@appendix' commands are -equivalent to `@chapter': the title is printed on a line by itself with -a line of asterisks underneath. (*Note `@chapter': chapter.) - - To create an appendix or an unnumbered chapter, write an `@appendix' -or `@unnumbered' command at the beginning of a line and follow it on -the same line by the title, as you would if you were creating a chapter. - - -File: texi.info, Node: majorheading & chapheading, Next: section, Prev: unnumbered & appendix, Up: Structuring - -`@majorheading', `@chapheading' -=============================== - - The `@majorheading' and `@chapheading' commands put chapter-like -headings in the body of a document. - - However, neither command causes TeX to produce a numbered heading or -an entry in the table of contents; and neither command causes TeX to -start a new page in a printed manual. - - In TeX, an `@majorheading' command generates a larger vertical -whitespace before the heading than an `@chapheading' command but is -otherwise the same. - - In Info, the `@majorheading' and `@chapheading' commands are -equivalent to `@chapter': the title is printed on a line by itself with -a line of asterisks underneath. (*Note `@chapter': chapter.) - - -File: texi.info, Node: section, Next: unnumberedsec appendixsec heading, Prev: majorheading & chapheading, Up: Structuring - -`@section' -========== - - In a printed manual, an `@section' command identifies a numbered -section within a chapter. The section title appears in the table of -contents. In Info, an `@section' command provides a title for a -segment of text, underlined with `='. - - This section is headed with an `@section' command and looks like -this in the Texinfo file: - - @section @code{@@section} - - To create a section, write the `@section' command at the beginning -of a line and follow it on the same line by the section title. - - Thus, - - @section This is a section - -produces - - This is a section - ================= - -in Info. - - -File: texi.info, Node: unnumberedsec appendixsec heading, Next: subsection, Prev: section, Up: Structuring - -`@unnumberedsec', `@appendixsec', `@heading' -============================================ - - The `@unnumberedsec', `@appendixsec', and `@heading' commands are, -respectively, the unnumbered, appendix-like, and heading-like -equivalents of the `@section' command. (*Note `@section': section.) - -`@unnumberedsec' - The `@unnumberedsec' command may be used within an unnumbered - chapter or within a regular chapter or appendix to provide an - unnumbered section. - -`@appendixsec' -`@appendixsection' - `@appendixsection' is a longer spelling of the `@appendixsec' - command; the two are synonymous. - - Conventionally, the `@appendixsec' or `@appendixsection' command - is used only within appendices. - -`@heading' - You may use the `@heading' command anywhere you wish for a - section-style heading that will not appear in the table of - contents. - - -File: texi.info, Node: subsection, Next: unnumberedsubsec appendixsubsec subheading, Prev: unnumberedsec appendixsec heading, Up: Structuring - -The `@subsection' Command -========================= - - Subsections are to sections as sections are to chapters. (*Note -`@section': section.) In Info, subsection titles are underlined with -`-'. For example, - - @subsection This is a subsection - -produces - - This is a subsection - -------------------- - - In a printed manual, subsections are listed in the table of contents -and are numbered three levels deep. - - -File: texi.info, Node: unnumberedsubsec appendixsubsec subheading, Next: subsubsection, Prev: subsection, Up: Structuring - -The `@subsection'-like Commands -=============================== - - The `@unnumberedsubsec', `@appendixsubsec', and `@subheading' -commands are, respectively, the unnumbered, appendix-like, and -heading-like equivalents of the `@subsection' command. (*Note -`@subsection': subsection.) - - In Info, the `@subsection'-like commands generate a title underlined -with hyphens. In a printed manual, an `@subheading' command produces a -heading like that of a subsection except that it is not numbered and -does not appear in the table of contents. Similarly, an -`@unnumberedsubsec' command produces an unnumbered heading like that of -a subsection and an `@appendixsubsec' command produces a -subsection-like heading labelled with a letter and numbers; both of -these commands produce headings that appear in the table of contents. - - -File: texi.info, Node: subsubsection, Prev: unnumberedsubsec appendixsubsec subheading, Up: Structuring - -The `subsub' Commands -===================== - - The fourth and lowest level sectioning commands in Texinfo are the -`subsub' commands. They are: - -`@subsubsection' - Subsubsections are to subsections as subsections are to sections. - (*Note `@subsection': subsection.) In a printed manual, - subsubsection titles appear in the table of contents and are - numbered four levels deep. - -`@unnumberedsubsubsec' - Unnumbered subsubsection titles appear in the table of contents of - a printed manual, but lack numbers. Otherwise, unnumbered - subsubsections are the same as subsubsections. In Info, unnumbered - subsubsections look exactly like ordinary subsubsections. - -`@appendixsubsubsec' - Conventionally, appendix commands are used only for appendices and - are lettered and numbered appropriately in a printed manual. They - also appear in the table of contents. In Info, appendix - subsubsections look exactly like ordinary subsubsections. - -`@subsubheading' - The `@subsubheading' command may be used anywhere that you need a - small heading that will not appear in the table of contents. In - Info, subsubheadings look exactly like ordinary subsubsection - headings. - - In Info, `subsub' titles are underlined with periods. For example, - - @subsubsection This is a subsubsection - -produces - - This is a subsubsection - ....................... - - -File: texi.info, Node: Nodes, Next: Menus, Prev: Structuring, Up: Top - -Nodes -***** - - "Nodes" are the primary segments of a Texinfo file. They do not -themselves impose a hierarchic or any other kind of structure on a file. -Nodes contain "node pointers" that name other nodes, and can contain -"menus" which are lists of nodes. In Info, the movement commands can -carry you to a pointed-to node or to a node listed in a menu. Node -pointers and menus provide structure for Info files just as chapters, -sections, subsections, and the like, provide structure for printed -books. - -* Menu: - -* Two Paths:: Different commands to structure - Info output and printed output. -* Node Menu Illustration:: A diagram, and sample nodes and menus. -* node:: How to write a node, in detail. -* makeinfo Pointer Creation:: How to create node pointers with `makeinfo'. - - -File: texi.info, Node: Two Paths, Next: Node Menu Illustration, Up: Nodes - -Two Paths -========= - - The node and menu commands and the chapter structuring commands are -independent of each other: - - * In Info, node and menu commands provide structure. The chapter - structuring commands generate headings with different kinds of - underlining--asterisks for chapters, hyphens for sections, and so - on; they do nothing else. - - * In TeX, the chapter structuring commands generate chapter and - section numbers and tables of contents. The node and menu - commands provide information for cross references; they do nothing - else. - - You can use node pointers and menus to structure an Info file any way -you want; and you can write a Texinfo file so that its Info output has a -different structure than its printed output. However, most Texinfo -files are written such that the structure for the Info output -corresponds to the structure for the printed output. It is not -convenient to do otherwise. - - Generally, printed output is structured in a tree-like hierarchy in -which the chapters are the major limbs from which the sections branch -out. Similarly, node pointers and menus are organized to create a -matching structure in the Info output. - - -File: texi.info, Node: Node Menu Illustration, Next: node, Prev: Two Paths, Up: Nodes - -Node and Menu Illustration -========================== - - Here is a copy of the diagram shown earlier that illustrates a -Texinfo file with three chapters, each of which contains two sections. - - Note that the "root" is at the top of the diagram and the "leaves" -are at the bottom. This is how such a diagram is drawn conventionally; -it illustrates an upside-down tree. For this reason, the root node is -called the `Top' node, and `Up' node pointers carry you closer to the -root. - - Top - | - ------------------------------------- - | | | - Chapter 1 Chapter 2 Chapter 3 - | | | - -------- -------- -------- - | | | | | | - Section Section Section Section Section Section - 1.1 1.2 2.1 2.2 3.1 3.2 - - Write the beginning of the node for Chapter 2 like this: - - @node Chapter 2, Chapter 3, Chapter 1, top - @comment node-name, next, previous, up - -This `@node' line says that the name of this node is "Chapter 2", the -name of the `Next' node is "Chapter 3", the name of the `Previous' node -is "Chapter 1", and the name of the `Up' node is "Top". - - *Please Note:* `Next' refers to the next node at the same - hierarchical level in the manual, not necessarily to the next node - within the Texinfo file. In the Texinfo file, the subsequent node - may be at a lower level--a section-level node may follow a - chapter-level node, and a subsection-level node may follow a - section-level node. `Next' and `Previous' refer to nodes at the - *same* hierarchical level. (The `Top' node contains the exception - to this rule. Since the `Top' node is the only node at that - level, `Next' refers to the first following node, which is almost - always a chapter or chapter-level node.) - - To go to Sections 2.1 and 2.2 using Info, you need a menu inside -Chapter 2. (*Note Menus::.) You would write the menu just before the -beginning of Section 2.1, like this: - - @menu - * Sect. 2.1:: Description of this section. - * Sect. 2.2:: - @end menu - - Write the node for Sect. 2.1 like this: - - @node Sect. 2.1, Sect. 2.2, Chapter 2, Chapter 2 - @comment node-name, next, previous, up - - In Info format, the `Next' and `Previous' pointers of a node usually -lead to other nodes at the same level--from chapter to chapter or from -section to section (sometimes, as shown, the `Previous' pointer points -up); an `Up' pointer usually leads to a node at the level above (closer -to the `Top' node); and a `Menu' leads to nodes at a level below (closer -to `leaves'). (A cross reference can point to a node at any level; see -*Note Cross References::.) - - Usually, an `@node' command and a chapter structuring command are -used in sequence, along with indexing commands. (You may follow the -`@node' line with a comment line that reminds you which pointer is -which.) - - Here is the beginning of the chapter in this manual called "Ending a -Texinfo File". This shows an `@node' line followed by a comment line, -an `@chapter' line, and then by indexing lines. - - @node Ending a File, Structuring, Beginning a File, Top - @comment node-name, next, previous, up - @chapter Ending a Texinfo File - @cindex Ending a Texinfo file - @cindex Texinfo file ending - @cindex File ending - - -File: texi.info, Node: node, Next: makeinfo Pointer Creation, Prev: Node Menu Illustration, Up: Nodes - -The `@node' Command -=================== - - A "node" is a segment of text that begins at an `@node' command and -continues until the next `@node' command. The definition of node is -different from that for chapter or section. A chapter may contain -sections and a section may contain subsections; but a node cannot -contain subnodes; the text of a node continues only until the next -`@node' command in the file. A node usually contains only one chapter -structuring command, the one that follows the `@node' line. On the -other hand, in printed output nodes are used only for cross references, -so a chapter or section may contain any number of nodes. Indeed, a -chapter usually contains several nodes, one for each section, -subsection, and subsubsection. - - To create a node, write an `@node' command at the beginning of a -line, and follow it with four arguments, separated by commas, on the -rest of the same line. These arguments are the name of the node, and -the names of the `Next', `Previous', and `Up' pointers, in that order. -You may insert spaces before each pointer if you wish; the spaces are -ignored. You must write the name of the node, and the names of the -`Next', `Previous', and `Up' pointers, all on the same line. Otherwise, -the formatters fail. (*note info: (info)Top, for more information -about nodes in Info.) - - Usually, you write one of the chapter-structuring command lines -immediately after an `@node' line--for example, an `@section' or -`@subsection' line. (*Note Types of Structuring Command: Structuring -Command Types.) - - *Please note:* The GNU Emacs Texinfo mode updating commands work - only with Texinfo files in which `@node' lines are followed by - chapter structuring lines. *Note Updating Requirements::. - - TeX uses `@node' lines to identify the names to use for cross -references. For this reason, you must write `@node' lines in a Texinfo -file that you intend to format for printing, even if you do not intend -to format it for Info. (Cross references, such as the one at the end -of this sentence, are made with `@xref' and its related commands; see -*Note Cross References::.) - -* Menu: - -* Node Names:: How to choose node and pointer names. -* Writing a Node:: How to write an `@node' line. -* Node Line Tips:: Keep names short. -* Node Line Requirements:: Keep names unique, without @-commands. -* First Node:: How to write a `Top' node. -* makeinfo top command:: How to use the `@top' command. -* Top Node Summary:: Write a brief description for readers. - - -File: texi.info, Node: Node Names, Next: Writing a Node, Up: node - -Choosing Node and Pointer Names -------------------------------- - - The name of a node identifies the node. The pointers enable you to -reach other nodes and consist of the names of those nodes. - - Normally, a node's `Up' pointer contains the name of the node whose -menu mentions that node. The node's `Next' pointer contains the name -of the node that follows that node in that menu and its `Previous' -pointer contains the name of the node that precedes it in that menu. -When a node's `Previous' node is the same as its `Up' node, both node -pointers name the same node. - - Usually, the first node of a Texinfo file is the `Top' node, and its -`Up' and `Previous' pointers point to the `dir' file, which contains -the main menu for all of Info. - - The `Top' node itself contains the main or master menu for the -manual. Also, it is helpful to include a brief description of the -manual in the `Top' node. *Note First Node::, for information on how -to write the first node of a Texinfo file. - - -File: texi.info, Node: Writing a Node, Next: Node Line Tips, Prev: Node Names, Up: node - -How to Write an `@node' Line ----------------------------- - - The easiest way to write an `@node' line is to write `@node' at the -beginning of a line and then the name of the node, like this: - - @node NODE-NAME - - If you are using GNU Emacs, you can use the update node commands -provided by Texinfo mode to insert the names of the pointers; or you -can leave the pointers out of the Texinfo file and let `makeinfo' -insert node pointers into the Info file it creates. (*Note Texinfo -Mode::, and *Note makeinfo Pointer Creation::.) - - Alternatively, you can insert the `Next', `Previous', and `Up' -pointers yourself. If you do this, you may find it helpful to use the -Texinfo mode keyboard command `C-c C-c n'. This command inserts -`@node' and a comment line listing the names of the pointers in their -proper order. The comment line helps you keep track of which arguments -are for which pointers. This comment line is especially useful if you -are not familiar with Texinfo. - - The template for a node line with `Next', `Previous', and `Up' -pointers looks like this: - - @node NODE-NAME, NEXT, PREVIOUS, UP - - If you wish, you can ignore `@node' lines altogether in your first -draft and then use the `texinfo-insert-node-lines' command to create -`@node' lines for you. However, we do not recommend this practice. It -is better to name the node itself at the same time that you write a -segment so you can easily make cross references. A large number of -cross references are an especially important feature of a good Info -file. - - After you have inserted an `@node' line, you should immediately -write an @-command for the chapter or section and insert its name. -Next (and this is important!), put in several index entries. Usually, -you will find at least two and often as many as four or five ways of -referring to the node in the index. Use them all. This will make it -much easier for people to find the node. - - -File: texi.info, Node: Node Line Tips, Next: Node Line Requirements, Prev: Writing a Node, Up: node - -`@node' Line Tips ------------------ - - Here are three suggestions: - - * Try to pick node names that are informative but short. - - In the Info file, the file name, node name, and pointer names are - all inserted on one line, which may run into the right edge of the - window. (This does not cause a problem with Info, but is ugly.) - - * Try to pick node names that differ from each other near the - beginnings of their names. This way, it is easy to use automatic - name completion in Info. - - * By convention, node names are capitalized just as they would be for - section or chapter titles--initial and significant words are - capitalized; others are not. - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-4 b/gnu/usr.bin/texinfo/info-files/texi.info-4 deleted file mode 100644 index 8698ab6cb47a..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-4 +++ /dev/null @@ -1,1412 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: Node Line Requirements, Next: First Node, Prev: Node Line Tips, Up: node - -`@node' Line Requirements -------------------------- - - Here are several requirements for `@node' lines: - - * All the node names for a single Info file must be unique. - - Duplicates confuse the Info movement commands. This means, for - example, that if you end every chapter with a summary, you must - name each summary node differently. You cannot just call each one - "Summary". You may, however, duplicate the titles of chapters, - sections, and the like. Thus you can end each chapter in a book - with a section called "Summary", so long as the node names for - those sections are all different. - - * A pointer name must be the name of a node. - - The node to which a pointer points may come before or after the - node containing the pointer. - - * You cannot use any of the Texinfo @-commands in a node name; - @-commands confuse Info. - - Thus, the beginning of the section called `@chapter' looks like - this: - - @node chapter, unnumbered & appendix, makeinfo top, Structuring - @comment node-name, next, previous, up - @section @code{@@chapter} - @findex chapter - - * You cannot use commas, colons, or apostrophes within a node name; - these confuse TeX or the Info formatters. - - For example, the following is a section title: - - @code{@@unnumberedsec}, @code{@@appendixsec}, @code{@@heading} - - The corresponding node name is: - - unnumberedsec appendixsec heading - - * Case is significant. - - -File: texi.info, Node: First Node, Next: makeinfo top command, Prev: Node Line Requirements, Up: node - -The First Node --------------- - - The first node of a Texinfo file is the `Top' node, except in an -included file (*note Include Files::.). - - The `Top' node (which must be named `top' or `Top') should have as -its `Up' and `Previous' nodes the name of a node in another file, where -there is a menu that leads to this file. Specify the file name in -parentheses. If the file is to be installed directly in the Info -directory file, use `(dir)' as the parent of the `Top' node; this is -short for `(dir)top', and specifies the `Top' node in the `dir' file, -which contains the main menu for Info. For example, the `@node Top' -line of this manual looks like this: - - @node Top, Overview, (dir), (dir) - -(You may use the Texinfo updating commands or the `makeinfo' utility to -insert these `Next' and `(dir)' pointers automatically.) - - *Note Install an Info File::, for more information about installing -an Info file in the `info' directory. - - The `Top' node contains the main or master menu for the document. - - -File: texi.info, Node: makeinfo top command, Next: Top Node Summary, Prev: First Node, Up: node - -The `@top' Sectioning Command ------------------------------ - - A special sectioning command, `@top', has been created for use with -the `@node Top' line. The `@top' sectioning command tells `makeinfo' -that it marks the `Top' node in the file. It provides the information -that `makeinfo' needs to insert node pointers automatically. Write the -`@top' command at the beginning of the line immediately following the -`@node Top' line. Write the title on the remaining part of the same -line as the `@top' command. - - In Info, the `@top' sectioning command causes the title to appear on -a line by itself, with a line of asterisks inserted underneath. - - In TeX and `texinfo-format-buffer', the `@top' sectioning command is -merely a synonym for `@unnumbered'. Neither of these formatters -require an `@top' command, and do nothing special with it. You can use -`@chapter' or `@unnumbered' after the `@node Top' line when you use -these formatters. Also, you can use `@chapter' or `@unnumbered' when -you use the Texinfo updating commands to create or update pointers and -menus. - - Whatever sectioning command follows an `@node Top' line, whether it -be `@top' or `@chapter', the `@node Top' line and the immediately -following line and any additional text must be enclosed between -`@ifinfo' and `@end ifinfo' commands. (*Note Conditionals::.) This -prevents the title and the accompanying text from appearing in printed -output. Write the `@ifinfo' command before the `@node' line and write -the `@end ifinfo' command after the `@top' or other sectioning command -and after any additional text. (You can write the `@end ifinfo' -command after the `@end menu' command if you like.) - - -File: texi.info, Node: Top Node Summary, Prev: makeinfo top command, Up: node - -The `Top' Node Summary ----------------------- - - You can help readers by writing a summary in the `Top' node, after -the `@top' line, before the main or master menu. The summary should -briefly describe the Info file. You should also write the version -number of the program to which the manual applies in this section. This -helps the reader keep track of which manual is for which version of the -program. If the manual changes more frequently than the program or is -independent of it, you should also include an edition number for the -manual. (The title page should also contain this information: see -*Note `@titlepage': titlepage.) - - Put the whole of the `Top' node, including the `@top' sectioning -command line if you have one, between `@ifinfo' and `@end ifinfo' so -none of the text appears in the printed output (*note Conditionally -Visible Text: Conditionals.). (You may want to repeat the brief -description from the `Top' node within `@iftex' ... `@end iftex' at the -beginning of the first chapter, for those who read the printed manual.) - - -File: texi.info, Node: makeinfo Pointer Creation, Prev: node, Up: Nodes - -Creating Pointers with `makeinfo' -================================= - - The `makeinfo' program has a feature for automatically creating node -pointers for a hierarchically organized file that lacks them. - - When you take advantage of this feature, you do not need to write the -`Next', `Previous', and `Up' pointers after the name of a node. -However, you must write a sectioning command, such as `@chapter' or -`@section', on the line immediately following each truncated `@node' -line. You cannot write a comment line after a node line; the section -line must follow it immediately. - - In addition, you must follow the `Top' `@node' line with a line -beginning with `@top' to mark the `Top' node in the file. *Note `@top': -makeinfo top. - - Finally, you must write the name of each node (except for the `Top' -node) in a menu that is one or more hierarchical levels above the -node's hierarchical level. - - This node pointer insertion feature in `makeinfo' is an alternative -to the menu and pointer creation and update commands in Texinfo mode. -(*Note Updating Nodes and Menus::.) It is especially helpful to people -who do not use GNU Emacs for writing Texinfo documents. - - -File: texi.info, Node: Menus, Next: Cross References, Prev: Nodes, Up: Top - -Menus -***** - - "Menus" contain pointers to subordinate nodes.(1) In Info, you use -menus to go to such nodes. Menus have no effect in printed manuals and -do not appear in them. - - By convention, a menu is put at the end of a node since a reader who -uses the menu may not see text that follows it. - - A node that has a menu should *not* contain much text. If you have -a lot of text and a menu, move most of the text into a new subnode--all -but a few lines. - -* Menu: - -* Menu Location:: Put a menu in a short node. -* Writing a Menu:: What is a menu? -* Menu Parts:: A menu entry has three parts. -* Less Cluttered Menu Entry:: Two part menu entry. -* Menu Example:: Two and three part menu entries. -* Other Info Files:: How to refer to a different Info file. - - ---------- Footnotes ---------- - - (1) Menus can carry you to any node, regardless of the hierarchical -structure; even to nodes in a different Info file. However, the GNU -Emacs Texinfo mode updating commands work only to create menus of -subordinate nodes. Conventionally, cross references are used to refer -to other nodes. - - -File: texi.info, Node: Menu Location, Next: Writing a Menu, Up: Menus - -Menus Need Short Nodes -====================== - - A reader can easily see a menu that is close to the beginning of the -node. The node should be short. As a practical matter, you should -locate a menu within 20 lines of the beginning of the node. Otherwise, -a reader with a terminal that displays only a few lines may miss the -menu and its associated text. - - The short text before a menu may look awkward in a printed manual. -To avoid this, you can write a menu near the beginning of its node and -follow the menu by an `@node' line, and then an `@heading' line located -within `@ifinfo' and `@end ifinfo'. This way, the menu, `@node' line, -and title appear only in the Info file, not the printed document. - - For example, the preceding two paragraphs follow an Info-only menu, -`@node' line, and heading, and look like this: - - @menu - * Menu Location:: Put a menu in a short node. - * Writing a Menu:: What is a menu? - * Menu Parts:: A menu entry has three parts. - * Less Cluttered Menu Entry:: Two part menu entry. - * Menu Example:: Two and three part entries. - * Other Info Files:: How to refer to a different - Info file. - @end menu - - @node Menu Location, Writing a Menu, , Menus - @ifinfo - @heading Menus Need Short Nodes - @end ifinfo - - The Texinfo file for this document contains more than a dozen -examples of this procedure. One is at the beginning of this chapter; -another is at the beginning of the "Cross References" chapter. - - -File: texi.info, Node: Writing a Menu, Next: Menu Parts, Prev: Menu Location, Up: Menus - -Writing a Menu -============== - - A menu consists of an `@menu' command on a line by itself followed -by menu entry lines or menu comment lines and then by an `@end menu' -command on a line by itself. - - A menu looks like this: - - @menu - Larger Units of Text - - * Files:: All about handling files. - * Multiples: Buffers. Multiple buffers; editing - several files at once. - @end menu - - In a menu, every line that begins with an `* ' is a "menu entry". -(Note the space after the asterisk.) A line that does not start with -an `* ' may also appear in a menu. Such a line is not a menu entry but -is a menu comment line that appears in the Info file. In the example -above, the line `Larger Units of Text' is a menu comment line; the two -lines starting with `* ' are menu entries. - - -File: texi.info, Node: Menu Parts, Next: Less Cluttered Menu Entry, Prev: Writing a Menu, Up: Menus - -The Parts of a Menu -=================== - - A menu entry has three parts, only the second of which is required: - - 1. The menu entry name. - - 2. The name of the node (required). - - 3. A description of the item. - - The template for a menu entry looks like this: - - * MENU-ENTRY-NAME: NODE-NAME. DESCRIPTION - - Follow the menu entry name with a single colon and follow the node -name with tab, comma, period, or newline. - - In Info, a user selects a node with the `m' (`Info-menu') command. -The menu entry name is what the user types after the `m' command. - - The third part of a menu entry is a descriptive phrase or sentence. -Menu entry names and node names are often short; the description -explains to the reader what the node is about. The description, which -is optional, can spread over two or more lines. A useful description -complements the node name rather than repeats it. - - -File: texi.info, Node: Less Cluttered Menu Entry, Next: Menu Example, Prev: Menu Parts, Up: Menus - -Less Cluttered Menu Entry -========================= - - When the menu entry name and node name are the same, you can write -the name immediately after the asterisk and space at the beginning of -the line and follow the name with two colons. - - For example, write - - * Name:: DESCRIPTION - -instead of - - * Name: Name. DESCRIPTION - - You should use the node name for the menu entry name whenever -possible, since it reduces visual clutter in the menu. - - -File: texi.info, Node: Menu Example, Next: Other Info Files, Prev: Less Cluttered Menu Entry, Up: Menus - -A Menu Example -============== - - A menu looks like this in Texinfo: - - @menu - * menu entry name: Node name. A short description. - * Node name:: This form is preferred. - @end menu - -This produces: - - * menu: - - * menu entry name: Node name. A short description. - * Node name:: This form is preferred. - - Here is an example as you might see it in a Texinfo file: - - @menu - Larger Units of Text - - * Files:: All about handling files. - * Multiples: Buffers. Multiple buffers; editing - several files at once. - @end menu - -This produces: - - * menu: - Larger Units of Text - - * Files:: All about handling files. - * Multiples: Buffers. Multiple buffers; editing - several files at once. - - In this example, the menu has two entries. `Files' is both a menu -entry name and the name of the node referred to by that name. -`Multiples' is the menu entry name; it refers to the node named -`Buffers'. The line `Larger Units of Text' is a comment; it appears in -the menu, but is not an entry. - - Since no file name is specified with either `Files' or `Buffers', -they must be the names of nodes in the same Info file (*note Referring -to Other Info Files: Other Info Files.). - - -File: texi.info, Node: Other Info Files, Prev: Menu Example, Up: Menus - -Referring to Other Info Files -============================= - - You can create a menu entry that enables a reader in Info to go to a -node in another Info file by writing the file name in parentheses just -before the node name. In this case, you should use the three-part menu -entry format, which saves the reader from having to type the file name. - - The format looks like this: - - @menu - * FIRST-ENTRY-NAME:(FILENAME)NODENAME. DESCRIPTION - * SECOND-ENTRY-NAME:(FILENAME)SECOND-NODE. DESCRIPTION - @end menu - - For example, to refer directly to the `Outlining' and `Rebinding' -nodes in the `Emacs Manual', you would write a menu like this: - - @menu - * Outlining: (emacs)Outline Mode. The major mode for - editing outlines. - * Rebinding: (emacs)Rebinding. How to redefine the - meaning of a key. - @end menu - - If you do not list the node name, but only name the file, then Info -presumes that you are referring to the `Top' node. - - The `dir' file that contains the main menu for Info has menu entries -that list only file names. These take you directly to the `Top' nodes -of each Info document. (*Note Install an Info File::.) - - For example: - - * Info: (info). Documentation browsing system. - * Emacs: (emacs). The extensible, self-documenting - text editor. - -(The `dir' top level directory for the Info system is an Info file, not -a Texinfo file, but a menu entry looks the same in both types of file.) - - Note that the GNU Emacs Texinfo mode menu updating commands only work -with nodes within the current buffer, so you cannot use them to create -menus that refer to other files. You must write such menus by hand. - - -File: texi.info, Node: Cross References, Next: Marking Text, Prev: Menus, Up: Top - -Cross References -**************** - - "Cross references" are used to refer the reader to other parts of the -same or different Texinfo files. In Texinfo, nodes are the places to -which cross references can refer. - -* Menu: - -* References:: What cross references are for. -* Cross Reference Commands:: A summary of the different commands. -* Cross Reference Parts:: A cross reference has several parts. -* xref:: Begin a reference with `See' ... -* Top Node Naming:: How to refer to the beginning of another file. -* ref:: A reference for the last part of a sentence. -* pxref:: How to write a parenthetical cross reference. -* inforef:: How to refer to an Info-only file. - - -File: texi.info, Node: References, Next: Cross Reference Commands, Up: Cross References - -What References Are For -======================= - - Often, but not always, a printed document should be designed so that -it can be read sequentially. People tire of flipping back and forth to -find information that should be presented to them as they need it. - - However, in any document, some information will be too detailed for -the current context, or incidental to it; use cross references to -provide access to such information. Also, an on-line help system or a -reference manual is not like a novel; few read such documents in -sequence from beginning to end. Instead, people look up what they -need. For this reason, such creations should contain many cross -references to help readers find other information that they may not -have read. - - In a printed manual, a cross reference results in a page reference, -unless it is to another manual altogether, in which case the cross -reference names that manual. - - In Info, a cross reference results in an entry that you can follow -using the Info `f' command. (*note Some advanced Info commands: -(info)Help-Adv.) - - The various cross reference commands use nodes to define cross -reference locations. This is evident in Info, in which a cross -reference takes you to the specified node. TeX also uses nodes to -define cross reference locations, but the action is less obvious. When -TeX generates a DVI file, it records nodes' page numbers and uses the -page numbers in making references. Thus, if you are writing a manual -that will only be printed, and will not be used on-line, you must -nonetheless write `@node' lines to name the places to which you make -cross references. - - -File: texi.info, Node: Cross Reference Commands, Next: Cross Reference Parts, Prev: References, Up: Cross References - -Different Cross Reference Commands -================================== - - There are four different cross reference commands: - -`@xref' - Used to start a sentence in the printed manual saying `See ...' or - an entry in the Info file saying `*Note ...'. - -`@ref' - Used within or, more often, at the end of a sentence; same as - `@xref' for Info; produces just the reference in the printed - manual without a preceding `See'. - -`@pxref' - Used within parentheses to make a reference that suits both an Info - file and a printed book. Starts with a lower case `see' within the - printed manual. (`p' is for `parenthesis'.) - -`@inforef' - Used to make a reference to an Info file for which there is no - printed manual. - -(The `@cite' command is used to make references to books and manuals -for which there is no corresponding Info file and, therefore, no node -to which to point. *Note `@cite': cite.) - - -File: texi.info, Node: Cross Reference Parts, Next: xref, Prev: Cross Reference Commands, Up: Cross References - -Parts of a Cross Reference -========================== - - A cross reference command requires only one argument, which is the -name of the node to which it refers. But a cross reference command may -contain up to four additional arguments. By using these arguments, you -can provide a cross reference name for Info, a topic description or -section title for the printed output, the name of a different Info -file, and the name of a different printed manual. - - Here is a simple cross reference example: - - @xref{Node name}. - -which produces - - *Note Node name::. - -and - - See Section NNN [Node name], page PPP. - - Here is an example of a full five-part cross reference: - - @xref{Node name, Cross Reference Name, Particular Topic, - info-file-name, A Printed Manual}, for details. - -which produces - - *Note Cross Reference Name: (info-file-name)Node name, - for details. - -in Info and - - See section "Particular Topic" in A Printed Manual, for details. - -in a printed book. - - The five possible arguments for a cross reference are: - - 1. The node name (required). This is the node to which the cross - reference takes you. In a printed document, the location of the - node provides the page reference only for references within the - same document. - - 2. The cross reference name for the Info reference, if it is to be - different from the node name. If you include this argument, it - argument becomes the first part of the cross reference. It is - usually omitted. - - 3. A topic description or section name. Often, this is the title of - the section. This is used as the name of the reference in the - printed manual. If omitted, the node name is used. - - 4. The name of the Info file in which the reference is located, if it - is different from the current file. - - 5. The name of a printed manual from a different Texinfo file. - - The template for a full five argument cross reference looks like -this: - - @xref{NODE-NAME, CROSS-REFERENCE-NAME, TITLE-OR-TOPIC, - INFO-FILE-NAME, PRINTED-MANUAL-TITLE}. - - Cross references with one, two, three, four, and five arguments are -described separately following the description of `@xref'. - - Write a node name in a cross reference in exactly the same way as in -the `@node' line, including the same capitalization; otherwise, the -formatters may not find the reference. - - You can write cross reference commands within a paragraph, but note -how Info and TeX format the output of each of the various commands: -write `@xref' at the beginning of a sentence; write `@pxref' only -within parentheses, and so on. - - -File: texi.info, Node: xref, Next: Top Node Naming, Prev: Cross Reference Parts, Up: Cross References - -`@xref' -======= - - The `@xref' command generates a cross reference for the beginning of -a sentence. The Info formatting commands convert it into an Info cross -reference, which the Info `f' command can use to bring you directly to -another node. The TeX typesetting commands convert it into a page -reference, or a reference to another book or manual. - -* Menu: - -* Reference Syntax:: What a reference looks like and requires. -* One Argument:: `@xref' with one argument. -* Two Arguments:: `@xref' with two arguments. -* Three Arguments:: `@xref' with three arguments. -* Four and Five Arguments:: `@xref' with four and five arguments. - - -File: texi.info, Node: Reference Syntax, Next: One Argument, Up: xref - -What a Reference Looks Like and Requires ----------------------------------------- - - Most often, an Info cross reference looks like this: - - *Note NODE-NAME::. - -or like this - - *Note CROSS-REFERENCE-NAME: NODE-NAME. - -In TeX, a cross reference looks like this: - - See Section SECTION-NUMBER [NODE-NAME], page PAGE. - -or like this - - See Section SECTION-NUMBER [TITLE-OR-TOPIC], page PAGE. - - The `@xref' command does not generate a period or comma to end the -cross reference in either the Info file or the printed output. You -must write that period or comma yourself; otherwise, Info will not -recognize the end of the reference. (The `@pxref' command works -differently. *Note `@pxref': pxref.) - - *Please note:* A period or comma *must* follow the closing brace - of an `@xref'. It is required to terminate the cross reference. - This period or comma will appear in the output, both in the Info - file and in the printed manual. - - `@xref' must refer to an Info node by name. Use `@node' to define -the node (*note Writing a Node::.). - - `@xref' is followed by several arguments inside braces, separated by -commas. Whitespace before and after these commas is ignored. - - A cross reference requires only the name of a node; but it may -contain up to four additional arguments. Each of these variations -produces a cross reference that looks somewhat different. - - *Please note:* Commas separate arguments in a cross reference; - avoid including them in the title or other part lest the formatters - mistake them for separators. - - -File: texi.info, Node: One Argument, Next: Two Arguments, Prev: Reference Syntax, Up: xref - -`@xref' with One Argument -------------------------- - - The simplest form of `@xref' takes one argument, the name of another -node in the same Info file. The Info formatters produce output that -the Info readers can use to jump to the reference; TeX produces output -that specifies the page and section number for you. - -For example, - - @xref{Tropical Storms}. - -produces - - *Note Tropical Storms::. - -and - - See Section 3.1 [Tropical Storms], page 24. - -(Note that in the preceding example the closing brace is followed by a -period.) - - You can write a clause after the cross reference, like this: - - @xref{Tropical Storms}, for more info. - -which produces - - *Note Tropical Storms::, for more info. - - See Section 3.1 [Tropical Storms], page 24, for more info. - -(Note that in the preceding example the closing brace is followed by a -comma, and then by the clause, which is followed by a period.) - - -File: texi.info, Node: Two Arguments, Next: Three Arguments, Prev: One Argument, Up: xref - -`@xref' with Two Arguments --------------------------- - - With two arguments, the second is used as the name of the Info cross -reference, while the first is still the name of the node to which the -cross reference points. - -The template is like this: - - @xref{NODE-NAME, CROSS-REFERENCE-NAME}. - -For example, - - @xref{Electrical Effects, Lightning}. - -produces: - - *Note Lightning: Electrical Effects. - -and - - See Section 5.2 [Electrical Effects], page 57. - -(Note that in the preceding example the closing brace is followed by a -period; and that the node name is printed, not the cross reference -name.) - - You can write a clause after the cross reference, like this: - - @xref{Electrical Effects, Lightning}, for more info. - -which produces - *Note Lightning: Electrical Effects, for more info. - -and - - See Section 5.2 [Electrical Effects], page 57, for more info. - -(Note that in the preceding example the closing brace is followed by a -comma, and then by the clause, which is followed by a period.) - - -File: texi.info, Node: Three Arguments, Next: Four and Five Arguments, Prev: Two Arguments, Up: xref - -`@xref' with Three Arguments ----------------------------- - - A third argument replaces the node name in the TeX output. The third -argument should be the name of the section in the printed output, or -else state the topic discussed by that section. Often, you will want to -use initial upper case letters so it will be easier to read when the -reference is printed. Use a third argument when the node name is -unsuitable because of syntax or meaning. - - Remember to avoid placing a comma within the title or topic section -of a cross reference, or within any other section. The formatters -divide cross references into arguments according to the commas; a comma -within a title or other section will divide it into two arguments. In -a reference, you need to write a title such as "Clouds, Mist, and Fog" -without the commas. - - Also, remember to write a comma or period after the closing brace of -a `@xref' to terminate the cross reference. In the following examples, -a clause follows a terminating comma. - -The template is like this: - - @xref{NODE-NAME, CROSS-REFERENCE-NAME, TITLE-OR-TOPIC}. - -For example, - - @xref{Electrical Effects, Lightning, Thunder and Lightning}, - for details. - -produces - - *Note Lightning: Electrical Effects, for details. - -and - - See Section 5.2 [Thunder and Lightning], page 57, for details. - - If a third argument is given and the second one is empty, then the -third argument serves both. (Note how two commas, side by side, mark -the empty second argument.) - - @xref{Electrical Effects, , Thunder and Lightning}, - for details. - -produces - - *Note Thunder and Lightning: Electrical Effects, for details. - -and - - See Section 5.2 [Thunder and Lightning], page 57, for details. - - As a practical matter, it is often best to write cross references -with just the first argument if the node name and the section title are -the same, and with the first and third arguments if the node name and -title are different. - - Here are several examples from `The GAWK Manual': - - @xref{Sample Program}. - @xref{Glossary}. - @xref{Case-sensitivity, ,Case-sensitivity in Matching}. - @xref{Close Output, , Closing Output Files and Pipes}, - for more information. - @xref{Regexp, , Regular Expressions as Patterns}. - - -File: texi.info, Node: Four and Five Arguments, Prev: Three Arguments, Up: xref - -`@xref' with Four and Five Arguments ------------------------------------- - - In a cross reference, a fourth argument specifies the name of another -Info file, different from the file in which the reference appears, and -a fifth argument specifies its title as a printed manual. - - Remember that a comma or period must follow the closing brace of an -`@xref' command to terminate the cross reference. In the following -examples, a clause follows a terminating comma. - -The template is: - - @xref{NODE-NAME, CROSS-REFERENCE-NAME, TITLE-OR-TOPIC, - INFO-FILE-NAME, PRINTED-MANUAL-TITLE}. - -For example, - - @xref{Electrical Effects, Lightning, Thunder and Lightning, - weather, An Introduction to Meteorology}, for details. - -produces - - *Note Lightning: (weather)Electrical Effects, for details. - -The name of the Info file is enclosed in parentheses and precedes the -name of the node. - -In a printed manual, the reference looks like this: - - See section "Thunder and Lightning" in An Introduction to - Meteorology, for details. - -The title of the printed manual is typeset in italics; and the -reference lacks a page number since TeX cannot know to which page a -reference refers when that reference is to another manual. - - Often, you will leave out the second argument when you use the long -version of `@xref'. In this case, the third argument, the topic -description, will be used as the cross reference name in Info. - -The template looks like this: - - @xref{NODE-NAME, , TITLE-OR-TOPIC, INFO-FILE-NAME, - PRINTED-MANUAL-TITLE}, for details. - -which produces - - *Note TITLE-OR-TOPIC: (INFO-FILE-NAME)NODE-NAME, for details. - -and - - See section TITLE-OR-TOPIC in PRINTED-MANUAL-TITLE, for details. - -For example, - - @xref{Electrical Effects, , Thunder and Lightning, - weather, An Introduction to Meteorology}, for details. - -produces - - *Note Thunder and Lightning: (weather)Electrical Effects, - for details. - -and - - See section "Thunder and Lightning" in An Introduction to - Meteorology, for details. - - On rare occasions, you may want to refer to another Info file that -is within a single printed manual--when multiple Texinfo files are -incorporated into the same TeX run but make separate Info files. In -this case, you need to specify only the fourth argument, and not the -fifth. - - -File: texi.info, Node: Top Node Naming, Next: ref, Prev: xref, Up: Cross References - -Naming a `Top' Node -=================== - - In a cross reference, you must always name a node. This means that -in order to refer to a whole manual, you must identify the `Top' node by -writing it as the first argument to the `@xref' command. (This is -different from the way you write a menu entry; see *Note Referring to -Other Info Files: Other Info Files.) At the same time, to provide a -meaningful section topic or title in the printed cross reference -(instead of the word `Top'), you must write an appropriate entry for -the third argument to the `@xref' command. - -Thus, to make a cross reference to `The GNU Make Manual', write: - - @xref{Top, , Overview, make, The GNU Make Manual}. - -which produces - - *Note Overview: (make)Top. - -and - - See section "Overview" in The GNU Make Manual. - -In this example, `Top' is the name of the first node, and `Overview' is -the name of the first section of the manual. - - -File: texi.info, Node: ref, Next: pxref, Prev: Top Node Naming, Up: Cross References - -`@ref' -====== - - `@ref' is nearly the same as `@xref' except that it does not -generate a `See' in the printed output, just the reference itself. -This makes it useful as the last part of a sentence. - -For example, - - For more information, see @ref{Hurricanes}. - -produces - - For more information, see *Note Hurricanes. - -and - - For more information, see Section 8.2 [Hurricanes], page 123. - - The `@ref' command sometimes leads writers to express themselves in -a manner that is suitable for a printed manual but looks awkward in the -Info format. Bear in mind that your audience will be using both the -printed and the Info format. - -For example, - - Sea surges are described in @ref{Hurricanes}. - -produces - - Sea surges are described in Section 6.7 [Hurricanes], page 72. - -in a printed document, and the following in Info: - - Sea surges are described in *Note Hurricanes::. - - *Caution:* You *must* write a period or comma immediately after an - `@ref' command with two or more arguments. Otherwise, Info will - not find the end of the cross reference entry and its attempt to - follow the cross reference will fail. As a general rule, you - should write a period or comma after every `@ref' command. This - looks best in both the printed and the Info output. - - -File: texi.info, Node: pxref, Next: inforef, Prev: ref, Up: Cross References - -`@pxref' -======== - - The parenthetical reference command, `@pxref', is nearly the same as -`@xref', but you use it *only* inside parentheses and you do *not* type -a comma or period after the command's closing brace. The command -differs from `@xref' in two ways: - - 1. TeX typesets the reference for the printed manual with a lower case - `see' rather than an upper case `See'. - - 2. The Info formatting commands automatically end the reference with a - closing colon or period. - - Because one type of formatting automatically inserts closing -punctuation and the other does not, you should use `@pxref' *only* -inside parentheses as part of another sentence. Also, you yourself -should not insert punctuation after the reference, as you do with -`@xref'. - - `@pxref' is designed so that the output looks right and works right -between parentheses both in printed output and in an Info file. In a -printed manual, a closing comma or period should not follow a cross -reference within parentheses; such punctuation is wrong. But in an -Info file, suitable closing punctuation must follow the cross reference -so Info can recognize its end. `@pxref' spares you the need to use -complicated methods to put a terminator into one form of the output and -not the other. - -With one argument, a parenthetical cross reference looks like this: - - ... storms cause flooding (@pxref{Hurricanes}) ... - -which produces - - ... storms cause flooding (*Note Hurricanes::) ... - -and - - ... storms cause flooding (see Section 6.7 [Hurricanes], page 72) - ... - - With two arguments, a parenthetical cross reference has this -template: - - ... (@pxref{NODE-NAME, CROSS-REFERENCE-NAME}) ... - -which produces - - ... (*Note CROSS-REFERENCE-NAME: NODE-NAME.) ... - -and - - ... (see Section NNN [NODE-NAME], page PPP) ... - - `@pxref' can be used with up to five arguments just like `@xref' -(*note `@xref': xref.). - - *Please note:* Use `@pxref' only as a parenthetical reference. Do - not try to use `@pxref' as a clause in a sentence. It will look - bad in either the Info file, the printed output, or both. - - Also, parenthetical cross references look best at the ends of - sentences. Although you may write them in the middle of a - sentence, that location breaks up the flow of text. - - -File: texi.info, Node: inforef, Prev: pxref, Up: Cross References - -`@inforef' -========== - - `@inforef' is used for cross references to Info files for which -there are no printed manuals. Even in a printed manual, `@inforef' -generates a reference directing the user to look in an Info file. - - The command takes either two or three arguments, in the following -order: - - 1. The node name. - - 2. The cross reference name (optional). - - 3. The Info file name. - -Separate the arguments with commas, as with `@xref'. Also, you must -terminate the reference with a comma or period after the `}', as you do -with `@xref'. - -The template is: - - @inforef{NODE-NAME, CROSS-REFERENCE-NAME, INFO-FILE-NAME}, - -Thus, - - @inforef{Expert, Advanced Info commands, info}, - for more information. - -produces - - *Note Advanced Info commands: (info)Expert, - for more information. - -and - - See Info file `info', node `Expert', for more information. - -Similarly, - - @inforef{Expert, , info}, for more information. - -produces - - *Note (info)Expert::, for more information. - -and - - See Info file `info', node `Expert', for more information. - - The converse of `@inforef' is `@cite', which is used to refer to -printed works for which no Info form exists. *Note `@cite': cite. - - -File: texi.info, Node: Marking Text, Next: Quotations and Examples, Prev: Cross References, Up: Top - -Marking Words and Phrases -************************* - - In Texinfo, you can mark words and phrases in a variety of ways. -The Texinfo formatters use this information to determine how to -highlight the text. You can specify, for example, whether a word or -phrase is a defining occurrence, a metasyntactic variable, or a symbol -used in a program. Also, you can emphasize text. - -* Menu: - -* Indicating:: How to indicate definitions, files, etc. -* Emphasis:: How to emphasize text. - - -File: texi.info, Node: Indicating, Next: Emphasis, Up: Marking Text - -Indicating Definitions, Commands, etc. -====================================== - - Texinfo has commands for indicating just what kind of object a piece -of text refers to. For example, metasyntactic variables are marked by -`@var', and code by `@code'. Since the pieces of text are labelled by -commands that tell what kind of object they are, it is easy to change -the way the Texinfo formatters prepare such text. (Texinfo is an -*intentional* formatting language rather than a *typesetting* -formatting language.) - - For example, in a printed manual, code is usually illustrated in a -typewriter font; `@code' tells TeX to typeset this text in this font. -But it would be easy to change the way TeX highlights code to use -another font, and this change would not effect how keystroke examples -are highlighted. If straight typesetting commands were used in the body -of the file and you wanted to make a change, you would need to check -every single occurrence to make sure that you were changing code and -not something else that should not be changed. - -* Menu: - -* Useful Highlighting:: Highlighting provides useful information. -* code:: How to indicate code. -* kbd:: How to show keyboard input. -* key:: How to specify keys. -* samp:: How to show a literal sequence of characters. -* var:: How to indicate a metasyntactic variable. -* file:: How to indicate the name of a file. -* dfn:: How to specify a definition. -* cite:: How to refer to a book that is not in Info. - - -File: texi.info, Node: Useful Highlighting, Next: code, Up: Indicating - -Highlighting Commands are Useful --------------------------------- - - The highlighting commands can be used to generate useful information -from the file, such as lists of functions or file names. It is -possible, for example, to write a program in Emacs Lisp (or a keyboard -macro) to insert an index entry after every paragraph that contains -words or phrases marked by a specified command. You could do this to -construct an index of functions if you had not already made the entries. - - The commands serve a variety of purposes: - -`@code{SAMPLE-CODE}' - Indicate text that is a literal example of a piece of a program. - -`@kbd{KEYBOARD-CHARACTERS}' - Indicate keyboard input. - -`@key{KEY-NAME}' - Indicate the conventional name for a key on a keyboard. - -`@samp{TEXT}' - Indicate text that is a literal example of a sequence of - characters. - -`@var{METASYNTACTIC-VARIABLE}' - Indicate a metasyntactic variable. - -`@file{FILE-NAME}' - Indicate the name of a file. - -`@dfn{TERM}' - Indicate the introductory or defining use of a term. - -`@cite{REFERENCE}' - Indicate the name of a book. - - -File: texi.info, Node: code, Next: kbd, Prev: Useful Highlighting, Up: Indicating - -`@code'{SAMPLE-CODE} --------------------- - - Use the `@code' command to indicate text that is a piece of a -program and which consists of entire syntactic tokens. Enclose the -text in braces. - - Thus, you should use `@code' for an expression in a program, for the -name of a variable or function used in a program, or for a keyword. -Also, you should use `@code' for the name of a program, such as `diff', -that is a name used in the machine. (You should write the name of a -program in the ordinary text font if you regard it as a new English -word, such as `Emacs' or `Bison'.) - - Use `@code' for environment variables such as `TEXINPUTS', and other -variables. - - Use `@code' for command names in command languages that resemble -programming languages, such as Texinfo or the shell. For example, -`@code' and `@samp' are produced by writing `@code{@@code}' and -`@code{@@samp}' in the Texinfo source, respectively. - - Note, however, that you should not use `@code' for shell options -such as `-c' when such options stand alone. (Use `@samp'.) Also, an -entire shell command often looks better if written using `@samp' rather -than `@code'. In this case, the rule is to choose the more pleasing -format. - - It is incorrect to alter the case of a word inside an `@code' -command when it appears at the beginning of a sentence. Most computer -languages are case sensitive. In C, for example, `Printf' is different -from the identifier `printf', and most likely is a misspelling of it. -Even in languages which are not case sensitive, it is confusing to a -human reader to see identifiers spelled in different ways. Pick one -spelling and always use that. If you do not want to start a sentence -with a command written all in lower case, you should rearrange the -sentence. - - Do not use the `@code' command for a string of characters shorter -than a syntactic token. If you are writing about `TEXINPU', which is -just a part of the name for the `TEXINPUTS' environment variable, you -should use `@samp'. - - In particular, you should not use the `@code' command when writing -about the characters used in a token; do not, for example, use `@code' -when you are explaining what letters or printable symbols can be used -in the names of functions. (Use `@samp'.) Also, you should not use -`@code' to mark text that is considered input to programs unless the -input is written in a language that is like a programming language. -For example, you should not use `@code' for the keystroke commands of -GNU Emacs (use `@kbd' instead) although you may use `@code' for the -names of the Emacs Lisp functions that the keystroke commands invoke. - - In the printed manual, `@code' causes TeX to typeset the argument in -a typewriter face. In the Info file, it causes the Info formatting -commands to use single quotation marks around the text. - - For example, - - Use @code{diff} to compare two files. - -produces this in the printed manual: - - Use `diff' to compare two files. - - -File: texi.info, Node: kbd, Next: key, Prev: code, Up: Indicating - -`@kbd'{KEYBOARD-CHARACTERS} ---------------------------- - - Use the `@kbd' command for characters of input to be typed by users. -For example, to refer to the characters `M-a', write - - @kbd{M-a} - -and to refer to the characters `M-x shell', write - - @kbd{M-x shell} - - The `@kbd' command has the same effect as `@code' in Info, but may -produce a different font in a printed manual. - - You can embed another @-command inside the braces of an `@kbd' -command. Here, for example, is the way to describe a command that -would be described more verbosely as "press an `r' and then press the -RET key": - - @kbd{r @key{RET}} - -This produces: `r RET' - - You also use the `@kbd' command if you are spelling out the letters -you type; for example: - - To give the @code{logout} command, - type the characters @kbd{l o g o u t @key{RET}}. - -This produces: - - To give the `logout' command, type the characters `l o g o u t - RET'. - - (Also, this example shows that you can add spaces for clarity. If -you really want to mention a space character as one of the characters of -input, write `@key{SPC}' for it.) - - -File: texi.info, Node: key, Next: samp, Prev: kbd, Up: Indicating - -`@key'{KEY-NAME} ----------------- - - Use the `@key' command for the conventional name for a key on a -keyboard, as in: - - @key{RET} - - You can use the `@key' command within the argument of an `@kbd' -command when the sequence of characters to be typed includes one or -more keys that are described by name. - - For example, to produce `C-x ESC' you would type: - - @kbd{C-x @key{ESC}} - - Here is a list of the recommended names for keys; they are all in -upper case: - - SPC - Space - - RET - Return - - LFD - Linefeed - - TAB - Tab - - BS - Backspace - - ESC - Escape - - DEL - Delete - - SFT - Shift - - CTL - Control - - META - Meta - - There are subtleties to handling words like `meta' or `ctl' that are -names of shift keys. When mentioning a character in which the shift -key is used, such as `Meta-a', use the `@kbd' command alone; do not use -the `@key' command; but when you are referring to the shift key in -isolation, use the `@key' command. For example, write `@kbd{Meta-a}' -to produce `Meta-a' and `@key{META}' to produce META. This is because -`Meta-a' refers to keys that you press on a keyboard, but META refers -to a key without implying that you press it. In short, use `@kbd' for -what you do, and use `@key' for what you talk about: "Press `@kbd{M-a}' -to move point to the beginning of the sentence. The `@key{META}' key -is often in the lower left of the keyboard." - - -File: texi.info, Node: samp, Next: var, Prev: key, Up: Indicating - -`@samp'{TEXT} -------------- - - Use the `@samp' command to indicate text that is a literal example -or `sample' of a sequence of characters in a file, string, pattern, etc. -Enclose the text in braces. The argument appears within single -quotation marks in both the Info file and the printed manual; in -addition, it is printed in a fixed-width font. - - To match @samp{foo} at the end of the line, - use the regexp @samp{foo$}. - -produces - - To match `foo' at the end of the line, use the regexp `foo$'. - - Any time you are referring to single characters, you should use -`@samp' unless `@kbd' is more appropriate. Use `@samp' for the names -of command-line options. Also, you may use `@samp' for entire -statements in C and for entire shell commands--in this case, `@samp' -often looks better than `@code'. Basically, `@samp' is a catchall for -whatever is not covered by `@code', `@kbd', or `@key'. - - Only include punctuation marks within braces if they are part of the -string you are specifying. Write punctuation marks outside the braces -if those punctuation marks are part of the English text that surrounds -the string. In the following sentence, for example, the commas and -period are outside of the braces: - - In English, the vowels are @samp{a}, @samp{e}, - @samp{i}, @samp{o}, @samp{u}, and sometimes - @samp{y}. - -This produces: - - In English, the vowels are `a', `e', `i', `o', `u', and sometimes - `y'. - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-5 b/gnu/usr.bin/texinfo/info-files/texi.info-5 deleted file mode 100644 index 84b7295f0194..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-5 +++ /dev/null @@ -1,1433 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: var, Next: file, Prev: samp, Up: Indicating - -`@var'{METASYNTACTIC-VARIABLE} ------------------------------- - - Use the `@var' command to indicate metasyntactic variables. A -"metasyntactic variable" is something that stands for another piece of -text. For example, you should use a metasyntactic variable in the -documentation of a function to describe the arguments that are passed -to that function. - - Do not use `@var' for the names of particular variables in -programming languages. These are specific names from a program, so -`@code' is correct for them. For example, the Lisp variable -`texinfo-tex-command' is not a metasyntactic variable; it is properly -formatted using `@code'. - - The effect of `@var' in the Info file is to change the case of the -argument to all upper case; in the printed manual, to italicize it. - - For example, - - To delete file @var{filename}, - type @code{rm @var{filename}}. - -produces - - To delete file FILENAME, type `rm FILENAME'. - -(Note that `@var' may appear inside `@code', `@samp', `@file', etc.) - - Write a metasyntactic variable all in lower case without spaces, and -use hyphens to make it more readable. Thus, the Texinfo source for the -illustration of how to begin a Texinfo manual looks like this: - - \input texinfo - @@setfilename @var{info-file-name} - @@settitle @var{name-of-manual} - -This produces: - - \input texinfo - @setfilename INFO-FILE-NAME - @settitle NAME-OF-MANUAL - - In some documentation styles, metasyntactic variables are shown with -angle brackets, for example: - - ..., type rm <filename> - -However, that is not the style that Texinfo uses. (You can, of course, -modify the sources to TeX and the Info formatting commands to output -the `<...>' format if you wish.) - - -File: texi.info, Node: file, Next: dfn, Prev: var, Up: Indicating - -`@file'{FILE-NAME} ------------------- - - Use the `@file' command to indicate text that is the name of a file, -buffer, or directory, or is the name of a node in Info. You can also -use the command for file name suffixes. Do not use `@file' for symbols -in a programming language; use `@code'. - - Currently, `@file' is equivalent to `@samp' in its effects. For -example, - - The @file{.el} files are in - the @file{/usr/local/emacs/lisp} directory. - -produces - - The `.el' files are in the `/usr/local/emacs/lisp' directory. - - -File: texi.info, Node: dfn, Next: cite, Prev: file, Up: Indicating - -`@dfn'{TERM} ------------- - - Use the `@dfn' command to identify the introductory or defining use -of a technical term. Use the command only in passages whose purpose is -to introduce a term which will be used again or which the reader ought -to know. Mere passing mention of a term for the first time does not -deserve `@dfn'. The command generates italics in the printed manual, -and double quotation marks in the Info file. For example: - - Getting rid of a file is called @dfn{deleting} it. - -produces - - Getting rid of a file is called "deleting" it. - - As a general rule, a sentence containing the defining occurrence of a -term should be a definition of the term. The sentence does not need to -say explicitly that it is a definition, but it should contain the -information of a definition--it should make the meaning clear. - - -File: texi.info, Node: cite, Prev: dfn, Up: Indicating - -`@cite'{REFERENCE} ------------------- - - Use the `@cite' command for the name of a book that lacks a -companion Info file. The command produces italics in the printed -manual, and quotation marks in the Info file. - - (If a book is written in Texinfo, it is better to use a cross -reference command since a reader can easily follow such a reference in -Info. *Note `@xref': xref.) - - -File: texi.info, Node: Emphasis, Prev: Indicating, Up: Marking Text - -Emphasizing Text -================ - - Usually, Texinfo changes the font to mark words in the text -according to what category the words belong to; an example is the -`@code' command. Most often, this is the best way to mark words. -However, sometimes you will want to emphasize text without indicating a -category. Texinfo has two commands to do this. Also, Texinfo has -several commands that specify the font in which TeX will typeset text. -These commands have no affect on Info and only one of them, the `@r' -command, has any regular use. - -* Menu: - -* emph & strong:: How to emphasize text in Texinfo. -* Smallcaps:: How to use the small caps font. -* Fonts:: Various font commands for printed output. - - -File: texi.info, Node: emph & strong, Next: Smallcaps, Up: Emphasis - -`@emph'{TEXT} and `@strong'{TEXT} ---------------------------------- - - The `@emph' and `@strong' commands are for emphasis; `@strong' is -stronger. In printed output, `@emph' produces *italics* and `@strong' -produces *bold*. - - For example, - - @quotation - @strong{Caution:} @code{rm * .[^.]*} removes @emph{all} - files in the directory. - @end quotation - -produces: - - *Caution*: `rm * .[^.]*' removes *all* - files in the directory. - - The `@strong' command is seldom used except to mark what is, in -effect, a typographical element, such as the word `Caution' in the -preceding example. - - In the Info file, both `@emph' and `@strong' put asterisks around -the text. - - *Caution:* Do not use `@emph' or `@strong' with the word `Note'; - Info will mistake the combination for a cross reference. Use a - phrase such as *Please note* or *Caution* instead. - - -File: texi.info, Node: Smallcaps, Next: Fonts, Prev: emph & strong, Up: Emphasis - -`@sc'{TEXT}: The Small Caps Font --------------------------------- - - Use the `@sc' command to set text in the printed output in a small -caps font and set text in the Info file in upper case letters. - - Write the text between braces in lower case, like this: - - The @sc{acm} and @sc{ieee} are technical societies. - -This produces: - - The ACM and IEEE are technical societies. - - TeX typesets the small caps font in a manner that prevents the -letters from `jumping out at you on the page'. This makes small caps -text easier to read than text in all upper case. The Info formatting -commands set all small caps text in upper case. - - If the text between the braces of an `@sc' command is upper case, -TeX typesets in full-size capitals. Use full-size capitals sparingly. - - You may also use the small caps font for a jargon word such as ATO -(a NASA word meaning `abort to orbit'). - - There are subtleties to using the small caps font with a jargon word -such as CDR, a word used in Lisp programming. In this case, you should -use the small caps font when the word refers to the second and -subsequent elements of a list (the CDR of the list), but you should use -`@code' when the word refers to the Lisp function of the same spelling. - - -File: texi.info, Node: Fonts, Prev: Smallcaps, Up: Emphasis - -Fonts for Printing, Not Info ----------------------------- - - Texinfo provides four font commands that specify font changes in the -printed manual but have no effect in the Info file. `@i' requests -italic font (in some versions of TeX, a slanted font is used), `@b' -requests bold face, `@t' requests the fixed-width, typewriter-style -font used by `@code', and `@r' requests a roman font, which is the -usual font in which text is printed. All four commands apply to an -argument that follows, surrounded by braces. - - Only the `@r' command has much use: in example programs, you can use -the `@r' command to convert code comments from the fixed-width font to -a roman font. This looks better in printed output. - - For example, - - @lisp - (+ 2 2) ; @r{Add two plus two.} - @end lisp - -produces - - (+ 2 2) ; Add two plus two. - - If possible, you should avoid using the other three font commands. -If you need to use one, it probably indicates a gap in the Texinfo -language. - - -File: texi.info, Node: Quotations and Examples, Next: Lists and Tables, Prev: Marking Text, Up: Top - -Quotations and Examples -*********************** - - Quotations and examples are blocks of text consisting of one or more -whole paragraphs that are set off from the bulk of the text and treated -differently. They are usually indented. - - In Texinfo, you always begin a quotation or example by writing an -@-command at the beginning of a line by itself, and end it by writing -an `@end' command that is also at the beginning of a line by itself. -For instance, you begin an example by writing `@example' by itself at -the beginning of a line and end the example by writing `@end example' -on a line by itself, at the beginning of that line. - -* Menu: - -* Block Enclosing Commands:: Use different constructs for - different purposes. -* quotation:: How to write a quotation. -* example:: How to write an example in a fixed-width font. -* noindent:: How to prevent paragraph indentation. -* Lisp Example:: How to illustrate Lisp code. -* smallexample & smalllisp:: Forms for the `@smallbook' option. -* display:: How to write an example in the current font. -* format:: How to write an example that does not narrow - the margins. -* exdent:: How to undo the indentation of a line. -* flushleft & flushright:: How to push text flushleft or flushright. -* cartouche:: How to draw cartouches around examples. - - -File: texi.info, Node: Block Enclosing Commands, Next: quotation, Up: Quotations and Examples - -The Block Enclosing Commands -============================ - - Here are commands for quotations and examples: - -`@quotation' - Indicate text that is quoted. The text is filled, indented, and - printed in a roman font by default. - -`@example' - Illustrate code, commands, and the like. The text is printed in a - fixed-width font, and indented but not filled. - -`@lisp' - Illustrate Lisp code. The text is printed in a fixed-width font, - and indented but not filled. - -`@smallexample' - Illustrate code, commands, and the like. Similar to `@example', - except that in TeX this command typesets text in a smaller font - for the smaller `@smallbook' format than for the 8.5 by 11 inch - format. - -`@smalllisp' - Illustrate Lisp code. Similar to `@lisp', except that in TeX this - command typesets text in a smaller font for the smaller - `@smallbook' format than for the 8.5 by 11 inch format. - -`@display' - Display illustrative text. The text is indented but not filled, - and no font is specified (so, by default, the font is roman). - -`@format' - Print illustrative text. The text is not indented and not filled - and no font is specified (so, by default, the font is roman). - - The `@exdent' command is used within the above constructs to undo -the indentation of a line. - - The `@flushleft' and `@flushright' commands are used to line up the -left or right margins of unfilled text. - - The `@noindent' command may be used after one of the above -constructs to prevent the following text from being indented as a new -paragraph. - - You can use the `@cartouche' command within one of the above -constructs to highlight the example or quotation by drawing a box with -rounded corners around it. (The `@cartouche' command affects only the -printed manual; it has no effect in the Info file; see *Note Drawing -Cartouches Around Examples: cartouche.) - - -File: texi.info, Node: quotation, Next: example, Prev: Block Enclosing Commands, Up: Quotations and Examples - -`@quotation' -============ - - The text of a quotation is processed normally except that: - - * the margins are closer to the center of the page, so the whole of - the quotation is indented; - - * the first lines of paragraphs are indented no more than other - lines; - - * in the printed output, interparagraph spacing is reduced. - - This is an example of text written between an `@quotation' command - and an `@end quotation' command. An `@quotation' command is most - often used to indicate text that is excerpted from another (real - or hypothetical) printed work. - - Write an `@quotation' command as text on a line by itself. This -line will disappear from the output. Mark the end of the quotation -with a line beginning with and containing only `@end quotation'. The -`@end quotation' line will likewise disappear from the output. Thus, -the following, - - @quotation - This is - a foo. - @end quotation - -produces - - This is a foo. - - -File: texi.info, Node: example, Next: noindent, Prev: quotation, Up: Quotations and Examples - -`@example' -========== - - The `@example' command is used to indicate an example that is not -part of the running text, such as computer input or output. - - This is an example of text written between an - `@example' command - and an `@end example' command. - The text is indented but not filled. - - In the printed manual, the text is typeset in a - fixed-width font, and extra spaces and blank lines are - significant. In the Info file, an analogous result is - obtained by indenting each line with five spaces. - - Write an `@example' command at the beginning of a line by itself. -This line will disappear from the output. Mark the end of the example -with an `@end example' command, also written at the beginning of a line -by itself. The `@end example' will disappear from the output. - - For example, - - @example - mv foo bar - @end example - -produces - - mv foo bar - - Since the lines containing `@example' and `@end example' will -disappear, you should put a blank line before the `@example' and -another blank line after the `@end example'. (Remember that blank -lines between the beginning `@example' and the ending `@end example' -will appear in the output.) - - *Caution:* Do not use tabs in the lines of an example (or anywhere - else in Texinfo, for that matter)! TeX treats tabs as single - spaces, and that is not what they look like. This is a problem - with TeX. (If necessary, in Emacs, you can use `M-x untabify' to - convert tabs in a region to multiple spaces.) - - Examples are often, logically speaking, "in the middle" of a -paragraph, and the text continues after an example should not be -indented. The `@noindent' command prevents a piece of text from being -indented as if it were a new paragraph. (*Note noindent::.) - - (The `@code' command is used for examples of code that are embedded -within sentences, not set off from preceding and following text. *Note -`@code': code.) - - -File: texi.info, Node: noindent, Next: Lisp Example, Prev: example, Up: Quotations and Examples - -`@noindent' -=========== - - An example or other inclusion can break a paragraph into segments. -Ordinarily, the formatters indent text that follows an example as a new -paragraph. However, you can prevent this by writing `@noindent' at the -beginning of a line by itself preceding the continuation text. - - For example: - - @example - This is an example - @end example - - @noindent - This line is not indented. As you can see, the - beginning of the line is fully flush left with the line - that follows after it. (This whole example is between - @code{@@display} and @code{@@end display}.) - -produces - - This is an example - - - This line is not indented. As you can see, the - beginning of the line is fully flush left with the line - that follows after it. (This whole example is between - `@display' and `@end display'.) - - To adjust the number of blank lines properly in the Info file output, -remember that the line containing `@noindent' does not generate a blank -line, and neither does the `@end example' line. - - In the Texinfo source file for this manual, each line that says -`produces' is preceded by a line containing `@noindent'. - - Do not put braces after an `@noindent' command; they are not -necessary, since `@noindent' is a command used outside of paragraphs -(*note Command Syntax::.). - - -File: texi.info, Node: Lisp Example, Next: smallexample & smalllisp, Prev: noindent, Up: Quotations and Examples - -`@lisp' -======= - - The `@lisp' command is used for Lisp code. It is synonymous with -the `@example' command. - - This is an example of text written between an - `@lisp' command and an `@end lisp' command. - - Use `@lisp' instead of `@example' so as to preserve information -regarding the nature of the example. This is useful, for example, if -you write a function that evaluates only and all the Lisp code in a -Texinfo file. Then you can use the Texinfo file as a Lisp library.(1) - - Mark the end of `@lisp' with `@end lisp' on a line by itself. - - ---------- Footnotes ---------- - - (1) It would be straightforward to extend Texinfo to work in a -similar fashion for C, FORTRAN, or other languages. - - -File: texi.info, Node: smallexample & smalllisp, Next: display, Prev: Lisp Example, Up: Quotations and Examples - -`@smallexample' and `@smalllisp' -================================ - - In addition to the regular `@example' and `@lisp' commands, Texinfo -has two other "example-style" commands. These are the `@smallexample' -and `@smalllisp' commands. Both these commands are designed for use -with the `@smallbook' command that causes TeX to produce a printed -manual in a 7 by 9.25 inch format rather than the regular 8.5 by 11 -inch format. - - In TeX, the `@smallexample' and `@smalllisp' commands typeset text -in a smaller font for the smaller `@smallbook' format than for the 8.5 -by 11 inch format. Consequently, many examples containing long lines -fit in a narrower, `@smallbook' page without needing to be shortened. -Both commands typeset in the normal font size when you format for the -8.5 by 11 inch size; indeed, in this situation, the `@smallexample' and -`@smalllisp' commands are defined to be the `@example' and `@lisp' -commands. - - In Info, the `@smallexample' and `@smalllisp' commands are -equivalent to the `@example' and `@lisp' commands, and work exactly the -same. - - Mark the end of `@smallexample' or `@smalllisp' with `@end -smallexample' or `@end smalllisp', respectively. - - This is an example of text written between `@smallexample' and - `@end smallexample'. In Info and in an 8.5 by 11 inch manual, - this text appears in its normal size; but in a 7 by 9.25 inch manual, - this text appears in a smaller font. - - The `@smallexample' and `@smalllisp' commands make it easier to -prepare smaller format manuals without forcing you to edit examples by -hand to fit them onto narrower pages. - - As a general rule, a printed document looks better if you write all -the examples in a chapter consistently in `@example' or in -`@smallexample'. Only occasionally should you mix the two formats. - - *Note Printing "Small" Books: smallbook, for more information about -the `@smallbook' command. - - -File: texi.info, Node: display, Next: format, Prev: smallexample & smalllisp, Up: Quotations and Examples - -`@display' -========== - - The `@display' command begins a kind of example. It is like the -`@example' command except that, in a printed manual, `@display' does -not select the fixed-width font. In fact, it does not specify the font -at all, so that the text appears in the same font it would have -appeared in without the `@display' command. - - This is an example of text written between an `@display' command - and an `@end display' command. The `@display' command - indents the text, but does not fill it. - - -File: texi.info, Node: format, Next: exdent, Prev: display, Up: Quotations and Examples - -`@format' -========= - - The `@format' command is similar to `@example' except that, in the -printed manual, `@format' does not select the fixed-width font and does -not narrow the margins. - -This is an example of text written between an `@format' command -and an `@end format' command. As you can see -from this example, -the `@format' command does not fill the text. - - -File: texi.info, Node: exdent, Next: flushleft & flushright, Prev: format, Up: Quotations and Examples - -`@exdent': Undoing a Line's Indentation -======================================= - - The `@exdent' command removes any indentation a line might have. -The command is written at the beginning of a line and applies only to -the text that follows the command that is on the same line. Do not use -braces around the text. In a printed manual, the text on an `@exdent' -line is printed in the roman font. - - `@exdent' is usually used within examples. Thus, - - @example - This line follows an @@example command. - @exdent This line is exdented. - This line follows the exdented line. - The @@end example comes on the next line. - @end group - -produces - - This line follows an @example command. -This line is exdented. - This line follows the exdented line. - The @end example comes on the next line. - - In practice, the `@exdent' command is rarely used. Usually, you -un-indent text by ending the example and returning the page to its -normal width. - - -File: texi.info, Node: flushleft & flushright, Next: cartouche, Prev: exdent, Up: Quotations and Examples - -`@flushleft' and `@flushright' -============================== - - The `@flushleft' and `@flushright' commands line up the ends of -lines on the left and right margins of a page, but do not fill the -text. The commands are written on lines of their own, without braces. -The `@flushleft' and `@flushright' commands are ended by `@end -flushleft' and `@end flushright' commands on lines of their own. - - For example, - - @flushleft - This text is - written flushleft. - @end flushleft - -produces - - This text is - written flushleft. - - Flushright produces the type of indentation often used in the return -address of letters. - -For example, - - @flushright - Here is an example of text written - flushright. The @code{@flushright} command - right justifies every line but leaves the - left end ragged. - @end flushright - -produces - - Here is an example of text written - flushright. The `@flushright' command - right justifies every line but leaves the - left end ragged. - - -File: texi.info, Node: cartouche, Prev: flushleft & flushright, Up: Quotations and Examples - -Drawing Cartouches Around Examples -================================== - - In a printed manual, the `@cartouche' command draws a box with -rounded corners around its contents. You can use this command to -further highlight an example or quotation. For instance, you could -write a manual in which one type of example is surrounded by a cartouche -for emphasis. - - The `@cartouche' command affects only the printed manual; it has no -effect in the Info file. - - For example, - - @example - @cartouche - % pwd - /usr/local/lib/emacs/info - @end cartouche - @end example - -surrounds the two-line example with a box with rounded corners, in the -printed manual. - - -File: texi.info, Node: Lists and Tables, Next: Indices, Prev: Quotations and Examples, Up: Top - -Making Lists and Tables -*********************** - - Texinfo has several ways of making lists and two-column tables. -Lists can be bulleted or numbered, while two-column tables can -highlight the items in the first column. - -* Menu: - -* Introducing Lists:: Texinfo formats lists for you. -* itemize:: How to construct a simple list. -* enumerate:: How to construct a numbered list. -* Two-column Tables:: How to construct a two-column table. - - -File: texi.info, Node: Introducing Lists, Next: itemize, Up: Lists and Tables - -Introducing Lists -================= - - Texinfo automatically indents the text in lists or tables, and -numbers an enumerated list. This last feature is useful if you modify -the list, since you do not need to renumber it yourself. - - Numbered lists and tables begin with the appropriate @-command at the -beginning of a line, and end with the corresponding `@end' command on a -line by itself. The table and itemized-list commands also require that -you write formatting information on the same line as the beginning -@-command. - - Begin an enumerated list, for example, with an `@enumerate' command -and end the list with an `@end enumerate' command. Begin an itemized -list with an `@itemize' command, followed on the same line by a -formatting command such as `@bullet', and end the list with an `@end -itemize' command. - - Precede each element of a list with an `@item' or `@itemx' command. - -Here is an itemized list of the different kinds of table and lists: - - * Itemized lists with and without bullets. - - * Enumerated lists, using numbers or letters. - - * Two-column tables with highlighting. - -Here is an enumerated list with the same items: - - 1. Itemized lists with and without bullets. - - 2. Enumerated lists, using numbers or letters. - - 3. Two-column tables with highlighting. - -And here is a two-column table with the same items and their @-commands: - -`@itemize' - Itemized lists with and without bullets. - -`@enumerate' - Enumerated lists, using numbers or letters. - -`@table' -`@ftable' -`@vtable' - Two-column tables with highlighting. - - -File: texi.info, Node: itemize, Next: enumerate, Prev: Introducing Lists, Up: Lists and Tables - -Making an Itemized List -======================= - - The `@itemize' command produces sequences of indented paragraphs, -with a bullet or other mark inside the left margin at the beginning of -each paragraph for which such a mark is desired. - - Begin an itemized list by writing `@itemize' at the beginning of a -line. Follow the command, on the same line, with a character or a -Texinfo command that generates a mark. Usually, you will write -`@bullet' after `@itemize', but you can use `@minus', or any character -or any special symbol that results in a single character in the Info -file. (When you write `@bullet' or `@minus' after an `@itemize' -command, you may omit the `{}'.) - - Write the text of the indented paragraphs themselves after the -`@itemize', up to another line that says `@end itemize'. - - Before each paragraph for which a mark in the margin is desired, -write a line that says just `@item'. Do not write any other text on -this line. - - Usually, you should put a blank line before an `@item'. This puts a -blank line in the Info file. (TeX inserts the proper interline -whitespace in either case.) Except when the entries are very brief, -these blank lines make the list look better. - - Here is an example of the use of `@itemize', followed by the output -it produces. Note that `@bullet' produces an `*' in Info and a round -dot in TeX. - - @itemize @bullet - @item - Some text for foo. - - @item - Some text - for bar. - @end itemize - -This produces: - - * Some text for foo. - - * Some text for bar. - - Itemized lists may be embedded within other itemized lists. Here is -a list marked with dashes embedded in a list marked with bullets: - - @itemize @bullet - @item - First item. - - @itemize @minus - @item - Inner item. - - @item - Second inner item. - @end itemize - - @item - Second outer item. - @end itemize - -This produces: - - * First item. - - - Inner item. - - - Second inner item. - - * Second outer item. - - -File: texi.info, Node: enumerate, Next: Two-column Tables, Prev: itemize, Up: Lists and Tables - -Making a Numbered or Lettered List -================================== - - `@enumerate' is like `@itemize' except that the marks in the left -margin contain successive integers or letters. (*Note `@itemize': -itemize.) - - Write the `@enumerate' command at the beginning of a line. The -command does not require an argument, but accepts either a number or a -letter as an option. Without an argument, `@enumerate' starts the list -with the number 1. With a numeric argument, such as 3, the command -starts the list with that number. With an upper or lower case letter, -such as `a' or `A', the command starts the list with that letter. - - Write the text of the enumerated list in the same way you write an -itemized list: put `@item' on a line of its own before the start of -each paragraph that you want enumerated. Do not write any other text on -the line beginning with `@item'. - - You should put a blank line between entries in the list. This -generally makes it easier to read the Info file. - - Here is an example of `@enumerate' without an argument: - - @enumerate - @item - Underlying causes. - - @item - Proximate causes. - @end enumerate - -This produces: - - 1. Underlying causes. - - 2. Proximate causes. - - Here is an example with an argument of `3': - - @enumerate 3 - @item - Predisposing causes. - - @item - Precipitating causes. - - @item - Perpetuating causes. - @end enumerate - -This produces: - - 3. Predisposing causes. - - 4. Precipitating causes. - - 5. Perpetuating causes. - - Here is a brief summary of the alternatives. The summary is -constructed using `@enumerate' with an argument of `a'. - - a. `@enumerate' - - Without an argument, produce a numbered list, starting with the - number 1. - - b. `@enumerate POSITIVE-INTEGER' - - With a (positive) numeric argument, start a numbered list with that - number. You can use this to continue a list that you interrupted - with other text. - - c. `@enumerate UPPER-CASE-LETTER' - - With an upper case letter as argument, start a list in which each - item is marked by a letter, beginning with that upper case letter. - - d. `@enumerate LOWER-CASE-LETTER' - - With a lower case letter as argument, start a list in which each - item is marked by a letter, beginning with that lower case letter. - - You can also nest enumerated lists, as in an outline. - - -File: texi.info, Node: Two-column Tables, Prev: enumerate, Up: Lists and Tables - -Making a Two-column Table -========================= - - `@table' is similar to `@itemize', but the command allows you to -specify a name or heading line for each item. (*Note `@itemize': -itemize.) The `@table' command is used to produce two-column tables, -and is especially useful for glossaries and explanatory exhibits. - -* Menu: - -* table:: How to construct a two-column table. -* ftable vtable:: How to construct a two-column table - with automatic indexing. -* itemx:: How to put more entries in the first column. - - -File: texi.info, Node: table, Next: ftable vtable, Up: Two-column Tables - -Using the `@table' Command --------------------------- - - Use the `@table' command to produce two-column tables. - - Write the `@table' command at the beginning of a line and follow it -on the same line with an argument that is a Texinfo command such as -`@code', `@samp', `@var', or `@kbd'. Although these commands are -usually followed by arguments in braces, in this case you use the -command name without an argument because `@item' will supply the -argument. This command will be applied to the text that goes into the -first column of each item and determines how it will be highlighted. -For example, `@samp' will cause the text in the first column to be -highlighted with an `@samp' command. - - You may also choose to use the `@asis' command as an argument to -`@table'. `@asis' is a command that does nothing; if you use this -command after `@table', TeX and the Info formatting commands output the -first column entries without added highlighting (`as is'). - - (The `@table' command may work with other commands besides those -listed here. However, you can only use commands that normally take -arguments in braces.) - - Begin each table entry with an `@item' command at the beginning of a -line. Write the first column text on the same line as the `@item' -command. Write the second column text on the line following the -`@item' line and on subsequent lines. (You do not need to type -anything for an empty second column entry.) You may write as many -lines of supporting text as you wish, even several paragraphs. But -only text on the same line as the `@item' will be placed in the first -column. - - Normally, you should put a blank line before an `@item' line. This -puts a blank like in the Info file. Except when the entries are very -brief, a blank line looks better. - - The following table, for example, highlights the text in the first -column with an `@samp' command: - - @table @samp - @item foo - This is the text for - @samp{foo}. - - @item bar - Text for @samp{bar}. - @end table - -This produces: - -`foo' - This is the text for `foo'. - -`bar' - Text for `bar'. - - If you want to list two or more named items with a single block of -text, use the `@itemx' command. (*Note `@itemx': itemx.) - - -File: texi.info, Node: ftable vtable, Next: itemx, Prev: table, Up: Two-column Tables - -`@ftable' and `@vtable' ------------------------ - - The `@ftable' and `@vtable' commands are the same as the `@table' -command except that `@ftable' automatically enters each of the items in -the first column of the table into the index of functions and `@vtable' -automatically enters each of the items in the first column of the table -into the index of variables. This simplifies the task of creating -indices. Only the items on the same line as the `@item' commands are -indexed, and they are indexed in exactly the form that they appear on -that line. *Note Creating Indices: Indices, for more information about -indices. - - Begin a two-column table using `@ftable' or `@vtable' by writing the -@-command at the beginning of a line, followed on the same line by an -argument that is a Texinfo command such as `@code', exactly as you -would for an `@table' command; and end the table with an `@end ftable' -or `@end vtable' command on a line by itself. - - -File: texi.info, Node: itemx, Prev: ftable vtable, Up: Two-column Tables - -`@itemx' --------- - - Use the `@itemx' command inside a table when you have two or more -first column entries for the same item, each of which should appear on -a line of its own. Use `@itemx' for all but the first entry. The -`@itemx' command works exactly like `@item' except that it does not -generate extra vertical space above the first column text. - - For example, - - @table @code - @item upcase - @itemx downcase - These two functions accept a character or a string as - argument, and return the corresponding upper case (lower - case) character or string. - @end table - -This produces: - -`upcase' -`downcase' - These two functions accept a character or a string as argument, - and return the corresponding upper case (lower case) character or - string. - -(Note also that this example illustrates multi-line supporting text in -a two-column table.) - - -File: texi.info, Node: Indices, Next: Insertions, Prev: Lists and Tables, Up: Top - -Creating Indices -**************** - - Using Texinfo, you can generate indices without having to sort and -collate entries manually. In an index, the entries are listed in -alphabetical order, together with information on how to find the -discussion of each entry. In a printed manual, this information -consists of page numbers. In an Info file, this information is a menu -entry leading to the first node referenced. - - Texinfo provides several predefined kinds of index: an index for -functions, an index for variables, an index for concepts, and so on. -You can combine indices or use them for other than their canonical -purpose. If you wish, you can define your own indices. - -* Menu: - -* Index Entries:: Choose different words for index entries. -* Predefined Indices:: Use different indices for different kinds - of entry. -* Indexing Commands:: How to make an index entry. -* Combining Indices:: How to combine indices. -* New Indices:: How to define your own indices. - - -File: texi.info, Node: Index Entries, Next: Predefined Indices, Up: Indices - -Making Index Entries -==================== - - When you are making index entries, it is good practice to think of -the different ways people may look for something. Different people *do -not* think of the same words when they look something up. A helpful -index will have items indexed under all the different words that people -may use. For example, one reader may think it obvious that the -two-letter names for indices should be listed under "Indices, -two-letter names", since the word "Index" is the general concept. But -another reader may remember the specific concept of two-letter names -and search for the entry listed as "Two letter names for indices". A -good index will have both entries and will help both readers. - - Like typesetting, the construction of an index is a highly skilled, -professional art, the subtleties of which are not appreciated until you -need to do it yourself. - - *Note Printing Indices & Menus::, for information about printing an -index at the end of a book or creating an index menu in an Info file. - - -File: texi.info, Node: Predefined Indices, Next: Indexing Commands, Prev: Index Entries, Up: Indices - -Predefined Indices -================== - - Texinfo provides six predefined indices: - - * A "concept index" listing concepts that are discussed. - - * A "function index" listing functions (such as entry points of - libraries). - - * A "variables index" listing variables (such as global variables of - libraries). - - * A "keystroke index" listing keyboard commands. - - * A "program index" listing names of programs. - - * A "data type index" listing data types (such as structures defined - in header files). - -Not every manual needs all of these, and most manuals use two or three -of them. This manual has two indices: a concept index and an @-command -index (that is actually the function index but is called a command -index in the chapter heading). Two or more indices can be combined -into one using the `@synindex' or `@syncodeindex' commands. *Note -Combining Indices::. - - -File: texi.info, Node: Indexing Commands, Next: Combining Indices, Prev: Predefined Indices, Up: Indices - -Defining the Entries of an Index -================================ - - The data to make an index come from many individual indexing commands -scattered throughout the Texinfo source file. Each command says to add -one entry to a particular index; after formatting, the index will give -the current page number or node name as the reference. - - An index entry consists of an indexing command at the beginning of a -line followed, on the rest of the line, by the entry. - - For example, this section begins with the following five entries for -the concept index: - - @cindex Defining indexing entries - @cindex Index entries - @cindex Entries for an index - @cindex Specifying index entries - @cindex Creating index entries - - Each predefined index has its own indexing command--`@cindex' for -the concept index, `@findex' for the function index, and so on. - - The usual convention is to capitalize the first word of each index -entry, unless that word is the name of a function, variable, or other -such entity that should not be capitalized. Thus, if you are -documenting Emacs Lisp, you should usually capitalize entries in the -concept index, but not those in the function index. However, if your -concept index entries are consistently short (one or two words each) it -may look better for each regular entry to start with a lower case -letter. Whichever convention you adapt, please be consistent! - - By default, entries for a concept index are printed in a small roman -font and entries for the other indices are printed in a small `@code' -font. You may change the way part of an entry is printed with the -usual Texinfo commands, such as `@file' for file names and `@emph' for -emphasis (*note Marking Text::.). - - The six indexing commands for predefined indices are: - -`@cindex CONCEPT' - Make an entry in the concept index for CONCEPT. - -`@findex FUNCTION' - Make an entry in the function index for FUNCTION. - -`@vindex VARIABLE' - Make an entry in the variable index for VARIABLE. - -`@kindex KEYSTROKE' - Make an entry in the key index for KEYSTROKE. - -`@pindex PROGRAM' - Make an entry in the program index for PROGRAM. - -`@tindex DATA TYPE' - Make an entry in the data type index for DATA TYPE. - - *Caution:* Do not use a colon in an index entry. In Info, a colon - separates the menu entry name from the node name. An extra colon - confuses Info. *Note The Parts of a Menu: Menu Parts, for more - information about the structure of a menu entry. - - If you write several identical index entries in different places in a -Texinfo file, the index in the printed manual will list all the pages to -which those entries refer. However, the index in the Info file will -list *only* the node that references the *first* of those index -entries. Therefore, it is best to write indices in which each entry -refers to only one place in the Texinfo file. Fortunately, this -constraint is a feature rather than a loss since it means that the index -will be easy to use. Otherwise, you could create an index that lists -several pages for one entry and your reader would not know to which page -to turn. If you have two identical entries for one topic, change the -topics slightly, or qualify them to indicate the difference. - - You are not actually required to use the predefined indices for their -canonical purposes. For example, suppose you wish to index some C -preprocessor macros. You could put them in the function index along -with actual functions, just by writing `@findex' commands for them; -then, when you print the "Function Index" as an unnumbered chapter, you -could give it the title `Function and Macro Index' and all will be -consistent for the reader. Or you could put the macros in with the -data types by writing `@tindex' commands for them, and give that index -a suitable title so the reader will understand. (*Note Printing -Indices & Menus::.) - - -File: texi.info, Node: Combining Indices, Next: New Indices, Prev: Indexing Commands, Up: Indices - -Combining Indices -================= - - Sometimes you will want to combine two disparate indices such as -functions and concepts, perhaps because you have few enough of one of -them that a separate index for them would look silly. - - You could put functions into the concept index by writing `@cindex' -commands for them instead of `@findex' commands, and produce a -consistent manual by printing the concept index with the title -`Function and Concept Index' and not printing the `Function Index' at -all; but this is not a robust procedure. It works only if your -document is never included as part of another document that is designed -to have a separate function index; if your document were to be included -with such a document, the functions from your document and those from -the other would not end up together. Also, to make your function names -appear in the right font in the concept index, you would need to -enclose every one of them between the braces of `@code'. - -* Menu: - -* syncodeindex:: How to merge two indices, using `@code' - font for the merged-from index. -* synindex:: How to merge two indices, using the - default font of the merged-to index. - - -File: texi.info, Node: syncodeindex, Next: synindex, Up: Combining Indices - -`@syncodeindex' -............... - - When you want to combine functions and concepts into one index, you -should index the functions with `@findex' and index the concepts with -`@cindex', and use the `@syncodeindex' command to redirect the function -index entries into the concept index. - - The `@syncodeindex' command takes two arguments; they are the name -of the index to redirect, and the name of the index to redirect it to. -The template looks like this: - - @syncodeindex FROM TO - - For this purpose, the indices are given two-letter names: - -`cp' - concept index - -`fn' - function index - -`vr' - variable index - -`ky' - key index - -`pg' - program index - -`tp' - data type index - - Write an `@syncodeindex' command before or shortly after the -end-of-header line at the beginning of a Texinfo file. For example, to -merge a function index with a concept index, write the following: - - @syncodeindex fn cp - -This will cause all entries designated for the function index to merge -in with the concept index instead. - - To merge both a variables index and a function index into a concept -index, write the following: - - @syncodeindex vr cp - @syncodeindex fn cp - - The `@syncodeindex' command puts all the entries from the `from' -index (the redirected index) into the `@code' font, overriding whatever -default font is used by the index to which the entries are now -directed. This way, if you direct function names from a function index -into a concept index, all the function names are printed in the `@code' -font as you would expect. - - -File: texi.info, Node: synindex, Prev: syncodeindex, Up: Combining Indices - -`@synindex' -........... - - The `@synindex' command is nearly the same as the `@syncodeindex' -command, except that it does not put the `from' index entries into the -`@code' font; rather it puts them in the roman font. Thus, you use -`@synindex' when you merge a concept index into a function index. - - *Note Printing Indices & Menus::, for information about printing an -index at the end of a book or creating an index menu in an Info file. - - -File: texi.info, Node: New Indices, Prev: Combining Indices, Up: Indices - -Defining New Indices -==================== - - In addition to the predefined indices, you may use the `@defindex' -and `@defcodeindex' commands to define new indices. These commands -create new indexing @-commands with which you mark index entries. The -`@defindex 'command is used like this: - - @defindex NAME - - The name of an index should be a two letter word, such as `au'. For -example: - - @defindex au - - This defines a new index, called the `au' index. At the same time, -it creates a new indexing command, `@auindex', that you can use to make -index entries. Use the new indexing command just as you would use a -predefined indexing command. - - For example, here is a section heading followed by a concept index -entry and two `au' index entries. - - @section Cognitive Semantics - @cindex kinesthetic image schemas - @auindex Johnson, Mark - @auindex Lakoff, George - -(Evidently, `au' serves here as an abbreviation for "author".) Texinfo -constructs the new indexing command by concatenating the name of the -index with `index'; thus, defining an `au' index leads to the automatic -creation of an `@auindex' command. - - Use the `@printindex' command to print the index, as you do with the -predefined indices. For example: - - @node Author Index, Subject Index, , Top - @unnumbered Author Index - - @printindex au - - The `@defcodeindex' is like the `@defindex' command, except that, in -the printed output, it prints entries in an `@code' font instead of a -roman font. Thus, it parallels the `@findex' command rather than the -`@cindex' command. - - You should define new indices within or right after the end-of-header -line of a Texinfo file, before any `@synindex' or `@syncodeindex' -commands (*note Header::.). - - -File: texi.info, Node: Insertions, Next: Glyphs, Prev: Indices, Up: Top - -Special Insertions -****************** - - Texinfo provides several commands for formatting dimensions, for -inserting single characters that have special meaning in Texinfo, such -as braces, and for inserting special graphic symbols that do not -correspond to characters, such as dots and bullets. - -* Menu: - -* Braces Atsigns Periods:: How to insert braces, `@' and periods. -* dmn:: How to format a dimension. -* Dots Bullets:: How to insert dots and bullets. -* TeX and copyright:: How to insert the TeX logo - and the copyright symbol. -* minus:: How to insert a minus sign. - - -File: texi.info, Node: Braces Atsigns Periods, Next: dmn, Up: Insertions - -Inserting `@', Braces, and Periods -================================== - - `@' and curly braces are special characters in Texinfo. To insert -these characters so they appear in text, you must put an `@' in front -of these characters to prevent Texinfo from misinterpreting them. - - Periods are also special. Depending on whether the period is inside -or at the end of a sentence, less or more space is inserted after a -period in a typeset manual. Since it is not always possible for -Texinfo to determine when a period ends a sentence and when it is used -in an abbreviation, special commands are needed in some circumstances. -(Usually, Texinfo can guess how to handle periods, so you do not need -to use the special commands; you just enter a period as you would if -you were using a typewriter, which means you put two spaces after the -period, question mark, or exclamation mark that ends a sentence.) - - Do not put braces after any of these commands; they are not -necessary. - -* Menu: - -* Inserting An Atsign:: -* Inserting Braces:: How to insert `{' and `}' -* Controlling Spacing:: How to insert the right amount of space - after punctuation within a sentence. - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-6 b/gnu/usr.bin/texinfo/info-files/texi.info-6 deleted file mode 100644 index cac7b3ab88dd..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-6 +++ /dev/null @@ -1,1461 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: Inserting An Atsign, Next: Inserting Braces, Up: Braces Atsigns Periods - -Inserting `@' with @@ ---------------------- - - `@@' stands for a single `@' in either printed or Info output. - - Do not put braces after an `@@' command. - - -File: texi.info, Node: Inserting Braces, Next: Controlling Spacing, Prev: Inserting An Atsign, Up: Braces Atsigns Periods - -Inserting `{' and `}'with @{ and @} ------------------------------------ - - `@{' stands for a single `{' in either printed or Info output. - - `@}' stands for a single `}' in either printed or Info output. - - Do not put braces after either an `@{' or an `@}' command. - - -File: texi.info, Node: Controlling Spacing, Prev: Inserting Braces, Up: Braces Atsigns Periods - -Spacing After Colons and Periods --------------------------------- - - Use the `@:' command after a period, question mark, exclamation -mark, or colon that should not be followed by extra space. For -example, use `@:' after periods that end abbreviations which are not at -the ends of sentences. `@:' has no effect on the Info file output. - - For example, - - The s.o.p.@: has three parts ... - The s.o.p. has three parts ... - -produces - - The s.o.p. has three parts ... - The s.o.p. has three parts ... - -`@:' has no effect on the Info output. (`s.o.p' is an acronym for -"Standard Operating Procedure".) - - Use `@.' instead of a period at the end of a sentence that ends with -a single capital letter. Otherwise, TeX will think the letter is an -abbreviation and will not insert the correct end-of-sentence spacing. -Here is an example: - - Give it to M.I.B. and to M.E.W@. Also, give it to R.J.C@. - Give it to M.I.B. and to M.E.W. Also, give it to R.J.C. - -produces - - Give it to M.I.B. and to M.E.W. Also, give it to R.J.C. - Give it to M.I.B. and to M.E.W. Also, give it to R.J.C. - - In the Info file output, `@.' is equivalent to a simple `.'. - - The meanings of `@:' and `@.' in Texinfo are designed to work well -with the Emacs sentence motion commands. This made it necessary for -them to be incompatible with some other formatting systems that use -@-commands. - - Do not put braces after either an `@:' or an `@.' command. - - -File: texi.info, Node: dmn, Next: Dots Bullets, Prev: Braces Atsigns Periods, Up: Insertions - -`@dmn'{DIMENSION}: Format a Dimension -===================================== - - At times, you may want to write `12pt' or `8.5in' with little or no -space between the number and the abbreviation for the dimension. You -can use the `@dmn' command to do this. On seeing the command, TeX -inserts just enough space for proper typesetting; the Info formatting -commands insert no space at all, since the Info file does not require -it. - - To use the `@dmn' command, write the number and then follow it -immediately, with no intervening space, by `@dmn', and then by the -dimension within braces. - -For example, - - A4 paper is 8.27@dmn{in} wide. - -produces - - A4 paper is 8.27in wide. - - Not everyone uses this style. Instead of writing `8.27@dmn{in}' in -the Texinfo file, you may write `8.27 in.' or `8.27 inches'. (In these -cases, the formatters may insert a line break between the number and the -dimension. Also, if you write a period after an abbreviation within a -sentence, you should write `@:' after the period to prevent TeX from -inserting extra whitespace. *Note Spacing After Colons and Periods: -Controlling Spacing.) - - -File: texi.info, Node: Dots Bullets, Next: TeX and copyright, Prev: dmn, Up: Insertions - -Inserting Ellipsis, Dots, and Bullets -===================================== - - An "ellipsis" (a line of dots) is not typeset as a string of -periods, so a special command is used for ellipsis in Texinfo. The -`@bullet' command is special, too. Each of these commands is followed -by a pair of braces, `{}', without any whitespace between the name of -the command and the braces. (You need to use braces with these -commands because you can use them next to other text; without the -braces, the formatters would be confused. *Note @-Command Syntax: -Command Syntax, for further information.) - -* Menu: - -* dots:: How to insert dots ... -* bullet:: How to insert a bullet. - - -File: texi.info, Node: dots, Next: bullet, Up: Dots Bullets - -`@dots'{} ---------- - - Use the `@dots{}' command to generate an ellipsis, which is three -dots in a row, appropriately spaced, like this: `...'. Do not simply -write three periods in the input file; that would work for the Info -file output, but would produce the wrong amount of space between the -periods in the printed manual. - - -File: texi.info, Node: bullet, Prev: dots, Up: Dots Bullets - -`@bullet'{} ------------ - - Use the `@bullet{}' command to generate a large round dot, or the -closest possible thing to one. In Info, an asterisk is used. - - Here is a bullet: * - - When you use `@bullet' in `@itemize', you do not need to type the -braces, because `@itemize' supplies them. *Note itemize::. - - -File: texi.info, Node: TeX and copyright, Next: minus, Prev: Dots Bullets, Up: Insertions - -Inserting TeX and the Copyright Symbol -====================================== - - The logo `TeX' is typeset in a special fashion and it needs an -@-command. The copyright symbol, `(C)', is also special. Each of -these commands is followed by a pair of braces, `{}', without any -whitespace between the name of the command and the braces. - -* Menu: - -* tex:: How to insert the TeX logo. -* copyright symbol:: How to use `@copyright'{}. - - -File: texi.info, Node: tex, Next: copyright symbol, Up: TeX and copyright - -`@TeX'{} --------- - - Use the `@TeX{}' command to generate `TeX'. In a printed manual, -this is a special logo that is different from three ordinary letters. -In Info, it just looks like `TeX'. The `@TeX{}' command is unique -among Texinfo commands in that the T and the X are in upper case. - - -File: texi.info, Node: copyright symbol, Prev: tex, Up: TeX and copyright - -`@copyright'{} --------------- - - Use the `@copyright{}' command to generate `(C)'. In a printed -manual, this is a `c' inside a circle, and in Info, this is `(C)'. - - -File: texi.info, Node: minus, Prev: TeX and copyright, Up: Insertions - -`@minus'{}: Inserting a Minus Sign -================================== - - Use the `@minus{}' command to generate a minus sign. In a -fixed-width font, this is a single hyphen, but in a proportional font, -the symbol is the customary length for a minus sign--a little longer -than a hyphen. - - You can compare the two forms: - - `-' is a minus sign generated with `@minus{}', - - `-' is a hyphen generated with the character `-'. - -In the fixed-width font used by Info, `@minus{}' is the same as a -hyphen. - - You should not use `@minus{}' inside `@code' or `@example' because -the width distinction is not made in the fixed-width font they use. - - When you use `@minus' to specify the mark beginning each entry in an -itemized list, you do not need to type the braces (*note itemize::.). - - -File: texi.info, Node: Glyphs, Next: Breaks, Prev: Insertions, Up: Top - -Glyphs for Examples -******************* - - In Texinfo, code is often illustrated in examples that are delimited -by `@example' and `@end example', or by `@lisp' and `@end lisp'. In -such examples, you can indicate the results of evaluation or an -expansion using `=>' or `==>'. Likewise, there are commands to insert -glyphs to indicate printed output, error messages, equivalence of -expressions, and the location of point. - - The glyph-insertion commands do not need to be used within an -example, but most often they are. Every glyph-insertion command is -followed by a pair of left- and right-hand braces. - -* Menu: - -* Glyphs Summary:: -* result:: How to show the result of expression. -* expansion:: How to indicate an expansion. -* Print Glyph:: How to indicate printed output. -* Error Glyph:: How to indicate an error message. -* Equivalence:: How to indicate equivalence. -* Point Glyph:: How to indicate the location of point. - - -File: texi.info, Node: Glyphs Summary, Next: result, Up: Glyphs - -Glyphs Summary -============== - - Here are the different glyph commands: - -=> - `@result{}' points to the result of an expression. - -==> - `@expansion{}' shows the results of a macro expansion. - --| - `@print{}' indicates printed output. - -error--> - `@error{}' indicates that the following text is an error message. - -== - `@equiv{}' indicates the exact equivalence of two forms. - --!- - `@point{}' shows the location of point. - - -File: texi.info, Node: result, Next: expansion, Prev: Glyphs Summary, Up: Glyphs - -=>: Indicating Evaluation -========================= - - Use the `@result{}' command to indicate the result of evaluating an -expression. - - The `@result{}' command is displayed as `=>' in Info and as a double -stemmed arrow in the printed output. - - Thus, the following, - - (cdr '(1 2 3)) - => (2 3) - -may be read as "`(cdr '(1 2 3))' evaluates to `(2 3)'". - - -File: texi.info, Node: expansion, Next: Print Glyph, Prev: result, Up: Glyphs - -==>: Indicating an Expansion -============================ - - When an expression is a macro call, it expands into a new expression. -You can indicate the result of the expansion with the `@expansion{}' -command. - - The `@expansion{}' command is displayed as `==>' in Info and as a -long arrow with a flat base in the printed output. - - For example, the following - - @lisp - (third '(a b c)) - @expansion{} (car (cdr (cdr '(a b c)))) - @result{} c - @end lisp - -produces - - (third '(a b c)) - ==> (car (cdr (cdr '(a b c)))) - => c - -which may be read as: - - `(third '(a b c))' expands to `(car (cdr (cdr '(a b c))))'; the - result of evaluating the expression is `c'. - -Often, as in this case, an example looks better if the `@expansion{}' -and `@result{}' commands are indented five spaces. - - -File: texi.info, Node: Print Glyph, Next: Error Glyph, Prev: expansion, Up: Glyphs - --|: Indicating Printed Output -============================= - - Sometimes an expression will print output during its execution. You -can indicate the printed output with the `@print{}' command. - - The `@print{}' command is displayed as `-|' in Info and similarly, -as a horizontal dash butting against a vertical bar, in the printed -output. - - In the following example, the printed text is indicated with `-|', -and the value of the expression follows on the last line. - - (progn (print 'foo) (print 'bar)) - -| foo - -| bar - => bar - -In a Texinfo source file, this example is written as follows: - - @lisp - (progn (print 'foo) (print 'bar)) - @print{} foo - @print{} bar - @result{} bar - @end lisp - - -File: texi.info, Node: Error Glyph, Next: Equivalence, Prev: Print Glyph, Up: Glyphs - -error-->: Indicating an Error Message -===================================== - - A piece of code may cause an error when you evaluate it. You can -designate the error message with the `@error{}' command. - - The `@error{}' command is displayed as `error-->' in Info and as the -word `error' in a box in the printed output. - - Thus, - - @lisp - (+ 23 'x) - @error{} Wrong type argument: integer-or-marker-p, x - @end lisp - -produces - - (+ 23 'x) - error--> Wrong type argument: integer-or-marker-p, x - -This indicates that the following error message is printed when you -evaluate the expression: - - Wrong type argument: integer-or-marker-p, x - - Note that `error-->' itself is not part of the error message. - - -File: texi.info, Node: Equivalence, Next: Point Glyph, Prev: Error Glyph, Up: Glyphs - -==: Indicating Equivalence -========================== - - Sometimes two expressions produce identical results. You can -indicate the exact equivalence of two forms with the `@equiv{}' command. - - The `@equiv{}' command is displayed as `==' in Info and as a three -parallel horizontal lines in the printed output. - - Thus, - - @lisp - (make-sparse-keymap) @equiv{} (list 'keymap) - @end lisp - -produces - - (make-sparse-keymap) == (list 'keymap) - -This indicates that evaluating `(make-sparse-keymap)' produces -identical results to evaluating `(list 'keymap)'. - - -File: texi.info, Node: Point Glyph, Prev: Equivalence, Up: Glyphs - -Indicating Point in a Buffer -============================ - - Sometimes you need to show an example of text in an Emacs buffer. In -such examples, the convention is to include the entire contents of the -buffer in question between two lines of dashes containing the buffer -name. - - You can use the `@point{}' command to show the location of point in -the text in the buffer. (The symbol for point, of course, is not part -of the text in the buffer; it indicates the place *between* two -characters where point is located.) - - The `@point{}' command is displayed as `-!-' in Info and as a small -five pointed star in the printed output. - - The following example shows the contents of buffer `foo' before and -after evaluating a Lisp command to insert the word `changed'. - - ---------- Buffer: foo ---------- - This is the -!-contents of foo. - ---------- Buffer: foo ---------- - - (insert "changed ") - => nil - ---------- Buffer: foo ---------- - This is the changed -!-contents of foo. - ---------- Buffer: foo ---------- - - In a Texinfo source file, the example is written like this: - - @example - ---------- Buffer: foo ---------- - This is the @point{}contents of foo. - ---------- Buffer: foo ---------- - - (insert "changed ") - @result{} nil - ---------- Buffer: foo ---------- - This is the changed @point{}contents of foo. - ---------- Buffer: foo ---------- - @end example - - -File: texi.info, Node: Breaks, Next: Definition Commands, Prev: Glyphs, Up: Top - -Making and Preventing Breaks -**************************** - - Usually, a Texinfo file is processed both by TeX and by one of the -Info formatting commands. Line, paragraph, or page breaks sometimes -occur in the `wrong' place in one or other form of output. You must -ensure that text looks right both in the printed manual and in the Info -file. - - For example, in a printed manual, page breaks may occur awkwardly in -the middle of an example; to prevent this, you can hold text together -using a grouping command that keeps the text from being split across -two pages. Conversely, you may want to force a page break where none -would occur normally. Fortunately, problems like these do not often -arise. When they do, use the break, break prevention, or pagination -commands. - -* Menu: - -* Break Commands:: Cause and prevent splits. -* Line Breaks:: How to force a single line to use two lines. -* w:: How to prevent unwanted line breaks. -* sp:: How to insert blank lines. -* page:: How to force the start of a new page. -* group:: How to prevent unwanted page breaks. -* need:: Another way to prevent unwanted page breaks. - - -File: texi.info, Node: Break Commands, Next: Line Breaks, Up: Breaks - -The Break Commands -================== - - The break commands create line and paragraph breaks: - -`@*' - Force a line break. - -`@sp N' - Skip N blank lines. - - The line-break-prevention command holds text together all on one -line: - -`@w{TEXT}' - Prevent TEXT from being split and hyphenated across two lines. - - The pagination commands apply only to printed output, since Info -files do not have pages. - -`@page' - Start a new page in the printed manual. - -`@group' - Hold text together that must appear on one printed page. - -`@need MILS' - Start a new printed page if not enough space on this one. - - -File: texi.info, Node: Line Breaks, Next: w, Prev: Break Commands, Up: Breaks - -`@*': Generate Line Breaks -========================== - - The `@*' command forces a line break in both the printed manual and -in Info. - - For example, - - This line @* is broken @*in two places. - -produces - - This line - is broken - in two places. - -(Note that the space after the first `@*' command is faithfully carried -down to the next line.) - - The `@*' command is often used in a file's copyright page: - - This is edition 2.0 of the Texinfo documentation,@* - and is for ... - -In this case, the `@*' command keeps TeX from stretching the line -across the whole page in an ugly manner. - - *Please note:* Do not write braces after an `@*' command; they are - not needed. - - Do not write an `@refill' command at the end of a paragraph - containing an `@*' command; it will cause the paragraph to be - refilled after the line break occurs, negating the effect of the - line break. - - -File: texi.info, Node: w, Next: sp, Prev: Line Breaks, Up: Breaks - -`@w'{TEXT}: Prevent Line Breaks -=============================== - - `@w{TEXT}' outputs TEXT and prohibits line breaks within TEXT. - - You can use the `@w' command to prevent TeX from automatically -hyphenating a long name or phrase that accidentally falls near the end -of a line. - - You can copy GNU software from @w{@file{prep.ai.mit.edu}}. - -produces - - You can copy GNU software from `prep.ai.mit.edu'. - - In the Texinfo file, you must write the `@w' command and its -argument (all the affected text) all on one line. - - *Caution:* Do not write an `@refill' command at the end of a - paragraph containing an `@w' command; it will cause the paragraph - to be refilled and may thereby negate the effect of the `@w' - command. - - -File: texi.info, Node: sp, Next: page, Prev: w, Up: Breaks - -`@sp' N: Insert Blank Lines -=========================== - - A line beginning with and containing only `@sp N' generates N blank -lines of space in both the printed manual and the Info file. `@sp' -also forces a paragraph break. For example, - - @sp 2 - -generates two blank lines. - - The `@sp' command is most often used in the title page. - - -File: texi.info, Node: page, Next: group, Prev: sp, Up: Breaks - -`@page': Start a New Page -========================= - - A line containing only `@page' starts a new page in a printed -manual. The command has no effect on Info files since they are not -paginated. An `@page' command is often used in the `@titlepage' -section of a Texinfo file to start the copyright page. - - -File: texi.info, Node: group, Next: need, Prev: page, Up: Breaks - -`@group': Prevent Page Breaks -============================= - - The `@group' command (on a line by itself) is used inside an -`@example' or similar construct to begin an unsplittable vertical -group, which will appear entirely on one page in the printed output. -The group is terminated by a line containing only `@end group'. These -two lines produce no output of their own, and in the Info file output -they have no effect at all. - - Although `@group' would make sense conceptually in a wide variety of -contexts, its current implementation works reliably only within -`@example' and variants, and within `@display', `@format', `@flushleft' -and `@flushright'. *Note Quotations and Examples::. (What all these -commands have in common is that each line of input produces a line of -output.) In other contexts, `@group' can cause anomalous vertical -spacing. - - This formatting requirement means that you should write: - - @example - @group - ... - @end group - @end example - -with the `@group' and `@end group' commands inside the `@example' and -`@end example' commands. - - The `@group' command is most often used to hold an example together -on one page. In this Texinfo manual, more than 100 examples contain -text that is enclosed between `@group' and `@end group'. - - If you forget to end a group, you may get strange and unfathomable -error messages when you run TeX. This is because TeX keeps trying to -put the rest of the Texinfo file onto the one page and does not start -to generate error messages until it has processed considerable text. -It is a good rule of thumb to look for a missing `@end group' if you -get incomprehensible error messages in TeX. - - -File: texi.info, Node: need, Prev: group, Up: Breaks - -`@need MILS': Prevent Page Breaks -================================= - - A line containing only `@need N' starts a new page in a printed -manual if fewer than N mils (thousandths of an inch) remain on the -current page. Do not use braces around the argument N. The `@need' -command has no effect on Info files since they are not paginated. - - This paragraph is preceded by an `@need' command that tells TeX to -start a new page if fewer than 800 mils (eight-tenths inch) remain on -the page. It looks like this: - - @need 800 - This paragraph is preceded by ... - - The `@need' command is useful for preventing orphans (single lines -at the bottoms of printed pages). - - -File: texi.info, Node: Definition Commands, Next: Footnotes, Prev: Breaks, Up: Top - -Definition Commands -******************* - - The `@deffn' command and the other "definition commands" enable you -to describe functions, variables, macros, commands, user options, -special forms and other such artifacts in a uniform format. - - In the Info file, a definition causes the entity -category--`Function', `Variable', or whatever--to appear at the -beginning of the first line of the definition, followed by the entity's -name and arguments. In the printed manual, the command causes TeX to -print the entity's name and its arguments on the left margin and print -the category next to the right margin. In both output formats, the -body of the definition is indented. Also, the name of the entity is -entered into the appropriate index: `@deffn' enters the name into the -index of functions, `@defvr' enters it into the index of variables, and -so on. - - A manual need not and should not contain more than one definition for -a given name. An appendix containing a summary should use `@table' -rather than the definition commands. - -* Menu: - -* Def Cmd Template:: How to structure a description using a - definition command. -* Optional Arguments:: How to handle optional and repeated arguments. -* deffnx:: How to group two or more `first' lines. -* Def Cmds in Detail:: All the definition commands. -* Def Cmd Conventions:: Conventions for writing definitions. -* Sample Function Definition:: - - -File: texi.info, Node: Def Cmd Template, Next: Optional Arguments, Up: Definition Commands - -The Template for a Definition -============================= - - The `@deffn' command is used for definitions of entities that -resemble functions. To write a definition using the `@deffn' command, -write the `@deffn' command at the beginning of a line and follow it on -the same line by the category of the entity, the name of the entity -itself, and its arguments (if any). Then write the body of the -definition on succeeding lines. (You may embed examples in the body.) -Finally, end the definition with an `@end deffn' command written on a -line of its own. (The other definition commands follow the same -format.) - - The template for a definition looks like this: - - @deffn CATEGORY NAME ARGUMENTS... - BODY-OF-DEFINITION - @end deffn - -For example, - - @deffn Command forward-word count - This command moves point forward @var{count} words - (or backward if @var{count} is negative). ... - @end deffn - -produces - - - Command: forward-word COUNT - This function moves point forward COUNT words (or backward if - COUNT is negative). ... - - Capitalize the category name like a title. If the name of the -category contains spaces, as in the phrase `Interactive Command', write -braces around it. For example: - - @deffn {Interactive Command} isearch-forward - ... - @end deffn - -Otherwise, the second word will be mistaken for the name of the entity. - - Some of the definition commands are more general than others. The -`@deffn' command, for example, is the general definition command for -functions and the like--for entities that may take arguments. When you -use this command, you specify the category to which the entity belongs. -The `@deffn' command possesses three predefined, specialized -variations, `@defun', `@defmac', and `@defspec', that specify the -category for you: "Function", "Macro", and "Special Form" respectively. -The `@defvr' command also is accompanied by several predefined, -specialized variations for describing particular kinds of variables. - - The template for a specialized definition, such as `@defun', is -similar to the template for a generalized definition, except that you -do not need to specify the category: - - @defun NAME ARGUMENTS... - BODY-OF-DEFINITION - @end defun - -Thus, - - @defun buffer-end flag - This function returns @code{(point-min)} if @var{flag} - is less than 1, @code{(point-max)} otherwise. - ... - @end defun - -produces - - - Function: buffer-end FLAG - This function returns `(point-min)' if FLAG is less than 1, - `(point-max)' otherwise. ... - -*Note Sample Function Definition: Sample Function Definition, for a -more detailed example of a function definition, including the use of -`@example' inside the definition. - - The other specialized commands work like `@defun'. - - -File: texi.info, Node: Optional Arguments, Next: deffnx, Prev: Def Cmd Template, Up: Definition Commands - -Optional and Repeated Arguments -=============================== - - Some entities take optional or repeated arguments, which may be -specified by a distinctive glyph that uses square brackets and -ellipses. For example, a special form often breaks its argument list -into separate arguments in more complicated ways than a straightforward -function. - - An argument enclosed within square brackets is optional. Thus, -[OPTIONAL-ARG] means that OPTIONAL-ARG is optional. An argument -followed by an ellipsis is optional and may be repeated more than once. -Thus, REPEATED-ARGS... stands for zero or more arguments. Parentheses -are used when several arguments are grouped into additional levels of -list structure in Lisp. - - Here is the `@defspec' line of an example of an imaginary special -form: - - - Special Form: foobar (VAR [FROM TO [INC]]) BODY... - -In this example, the arguments FROM and TO are optional, but must both -be present or both absent. If they are present, INC may optionally be -specified as well. These arguments are grouped with the argument VAR -into a list, to distinguish them from BODY, which includes all -remaining elements of the form. - - In a Texinfo source file, this `@defspec' line is written like this -(except it would not be split over two lines, as it is in this example). - - @defspec foobar (@var{var} [@var{from} @var{to} - [@var{inc}]]) @var{body}@dots{} - -The function is listed in the Command and Variable Index under `foobar'. - - -File: texi.info, Node: deffnx, Next: Def Cmds in Detail, Prev: Optional Arguments, Up: Definition Commands - -Two or More `First' Lines -========================= - - To create two or more `first' or header lines for a definition, -follow the first `@deffn' line by a line beginning with `@deffnx'. The -`@deffnx' command works exactly like `@deffn' except that it does not -generate extra vertical white space between it and the preceding line. - - For example, - - @deffn {Interactive Command} isearch-forward - @deffnx {Interactive Command} isearch-backward - These two search commands are similar except ... - @end deffn - -produces - - - Interactive Command: isearch-forward - - Interactive Command: isearch-backward - These two search commands are similar except ... - - Each of the other definition commands has an `x' form: `@defunx', -`@defvrx', `@deftypefunx', etc. - - The `x' forms work just like `@itemx'; see *Note `@itemx': itemx. - - -File: texi.info, Node: Def Cmds in Detail, Next: Def Cmd Conventions, Prev: deffnx, Up: Definition Commands - -The Definition Commands -======================= - - Texinfo provides more than a dozen definition commands, all of which -are described in this section. - - The definition commands automatically enter the name of the entity in -the appropriate index: for example, `@deffn', `@defun', and `@defmac' -enter function names in the index of functions; `@defvr' and `@defvar' -enter variable names in the index of variables. - - Although the examples that follow mostly illustrate Lisp, the -commands can be used for other programming languages. - -* Menu: - -* Functions Commands:: Commands for functions and similar entities. -* Variables Commands:: Commands for variables and similar entities. -* Typed Functions:: Commands for functions in typed languages. -* Typed Variables:: Commands for variables in typed languages. -* Abstract Objects:: Commands for object-oriented programming. -* Data Types:: The definition command for data types. - - -File: texi.info, Node: Functions Commands, Next: Variables Commands, Up: Def Cmds in Detail - -Functions and Similar Entities ------------------------------- - - This section describes the commands for describing functions and -similar entities: - -`@deffn CATEGORY NAME ARGUMENTS...' - The `@deffn' command is the general definition command for - functions, interactive commands, and similar entities that may take - arguments. You must choose a term to describe the category of - entity being defined; for example, "Function" could be used if the - entity is a function. The `@deffn' command is written at the - beginning of a line and is followed on the same line by the - category of entity being described, the name of this particular - entity, and its arguments, if any. Terminate the definition with - `@end deffn' on a line of its own. - - For example, here is a definition: - - @deffn Command forward-char nchars - Move point forward @var{nchars} characters. - @end deffn - - This shows a rather terse definition for a "command" named - `forward-char' with one argument, NCHARS. - - `@deffn' prints argument names such as NCHARS in italics or upper - case, as if `@var' had been used, because we think of these names - as metasyntactic variables--they stand for the actual argument - values. Within the text of the description, write an argument name - explicitly with `@var' to refer to the value of the argument. In - the example above, we used `@var{nchars}' in this way. - - The template for `@deffn' is: - - @deffn CATEGORY NAME ARGUMENTS... - BODY-OF-DEFINITION - @end deffn - -`@defun NAME ARGUMENTS...' - The `@defun' command is the definition command for functions. - `@defun' is equivalent to `@deffn Function ...'. - - For example, - - @defun set symbol new-value - Change the value of the symbol @var{symbol} - to @var{new-value}. - @end defun - - shows a rather terse definition for a function `set' whose - arguments are SYMBOL and NEW-VALUE. The argument names on the - `@defun' line automatically appear in italics or upper case as if - they were enclosed in `@var'. Terminate the definition with `@end - defun' on a line of its own. - - The template is: - - @defun FUNCTION-NAME ARGUMENTS... - BODY-OF-DEFINITION - @end defun - - `@defun' creates an entry in the index of functions. - -`@defmac NAME ARGUMENTS...' - The `@defmac' command is the definition command for macros. - `@defmac' is equivalent to `@deffn Macro ...' and works like - `@defun'. - -`@defspec NAME ARGUMENTS...' - The `@defspec' command is the definition command for special - forms. (In Lisp, a special form is an entity much like a - function.) `@defspec' is equivalent to `@deffn {Special Form} ...' - and works like `@defun'. - - -File: texi.info, Node: Variables Commands, Next: Typed Functions, Prev: Functions Commands, Up: Def Cmds in Detail - -Variables and Similar Entities ------------------------------- - - Here are the commands for defining variables and similar entities: - -`@defvr CATEGORY NAME' - The `@defvr' command is a general definition command for something - like a variable--an entity that records a value. You must choose - a term to describe the category of entity being defined; for - example, "Variable" could be used if the entity is a variable. - Write the `@defvr' command at the beginning of a line and followed - it on the same line by the category of the entity and the name of - the entity. - - Capitalize the category name like a title. If the name of the - category contains spaces, as in the name `User Option', write - braces around it. Otherwise, the second word will be mistaken for - the name of the entity, for example: - - @defvr {User Option} fill-column - This buffer-local variable specifies - the maximum width of filled lines. - ... - @end defvr - - Terminate the definition with `@end defvr' on a line of its own. - - The template is: - - @defvr CATEGORY NAME - BODY-OF-DEFINITION - @end defvr - - `@defvr' creates an entry in the index of variables for NAME. - -`@defvar NAME' - The `@defvar' command is the definition command for variables. - `@defvar' is equivalent to `@defvr Variable ...'. - - For example: - - @defvar kill-ring - ... - @end defvar - - The template is: - - @defvar NAME - BODY-OF-DEFINITION - @end defvar - - `@defvar' creates an entry in the index of variables for NAME. - -`@defopt NAME' - The `@defopt' command is the definition command for user options. - `@defopt' is equivalent to `@defvr {User Option} ...' and works - like `@defvar'. - - -File: texi.info, Node: Typed Functions, Next: Typed Variables, Prev: Variables Commands, Up: Def Cmds in Detail - -Functions in Typed Languages ----------------------------- - - The `@deftypefn' command and its variations are for describing -functions in C or any other language in which you must declare types of -variables and functions. - -`@deftypefn CATEGORY DATA-TYPE NAME ARGUMENTS...' - The `@deftypefn' command is the general definition command for - functions and similar entities that may take arguments and that are - typed. The `@deftypefn' command is written at the beginning of a - line and is followed on the same line by the category of entity - being described, the type of the returned value, the name of this - particular entity, and its arguments, if any. - - For example, - - @deftypefn {Library Function} int foobar - (int @var{foo}, float @var{bar}) - ... - @end deftypefn - - (where the text before the "...", shown above as two lines, would - actually be a single line in a real Texinfo file) produces the - following in Info: - - -- Library Function: int foobar (int FOO, float BAR) - ... - - This means that `foobar' is a "library function" that returns an - `int', and its arguments are FOO (an `int') and BAR (a `float'). - - The argument names that you write in `@deftypefn' are not subject - to an implicit `@var'--since the actual names of the arguments in - `@deftypefn' are typically scattered among data type names and - keywords, Texinfo cannot find them without help. Instead, you - must write `@var' explicitly around the argument names. In the - example above, the argument names are `foo' and `bar'. - - The template for `@deftypefn' is: - - @deftypefn CATEGORY DATA-TYPE NAME ARGUMENTS ... - BODY-OF-DESCRIPTION - @end deftypefn - - Note that if the CATEGORY or DATA TYPE is more than one word then - it must be enclosed in braces to make it a single argument. - - If you are describing a procedure in a language that has packages, - such as Ada, you might consider using `@deftypefn' in a manner - somewhat contrary to the convention described in the preceding - paragraphs. - - For example: - - @deftypefn stacks private push - (@var{s}:in out stack; - @var{n}:in integer) - ... - @end deftypefn - - (The `@deftypefn' arguments are shown split into three lines, but - would be a single line in a real Texinfo file.) - - In this instance, the procedure is classified as belonging to the - package `stacks' rather than classified as a `procedure' and its - data type is described as `private'. (The name of the procedure - is `push', and its arguments are S and N.) - - `@deftypefn' creates an entry in the index of functions for NAME. - -`@deftypefun DATA-TYPE NAME ARGUMENTS...' - The `@deftypefun' command is the specialized definition command - for functions in typed languages. The command is equivalent to - `@deftypefn Function ...'. - - Thus, - - @deftypefun int foobar (int @var{foo}, float @var{bar}) - ... - @end deftypefun - - produces the following in Info: - - -- Function: int foobar (int FOO, float BAR) - ... - - The template is: - - @deftypefun TYPE NAME ARGUMENTS... - BODY-OF-DESCRIPTION - @end deftypefun - - `@deftypefun' creates an entry in the index of functions for NAME. - - -File: texi.info, Node: Typed Variables, Next: Abstract Objects, Prev: Typed Functions, Up: Def Cmds in Detail - -Variables in Typed Languages ----------------------------- - - Variables in typed languages are handled in a manner similar to -functions in typed languages. *Note Typed Functions::. The general -definition command `@deftypevr' corresponds to `@deftypefn' and the -specialized definition command `@deftypevar' corresponds to -`@deftypefun'. - -`@deftypevr CATEGORY DATA-TYPE NAME' - The `@deftypevr' command is the general definition command for - something like a variable in a typed language--an entity that - records a value. You must choose a term to describe the category - of the entity being defined; for example, "Variable" could be used - if the entity is a variable. - - The `@deftypevr' command is written at the beginning of a line and - is followed on the same line by the category of the entity being - described, the data type, and the name of this particular entity. - - For example: - - @deftypevr {Global Flag} int enable - ... - @end deftypevr - - produces the following in Info: - - -- Global Flag: int enable - ... - - The template is: - - @deftypevr CATEGORY DATA-TYPE NAME - BODY-OF-DESCRIPTION - @end deftypevr - - `@deftypevr' creates an entry in the index of variables for NAME. - -`@deftypevar DATA-TYPE NAME' - The `@deftypevar' command is the specialized definition command - for variables in typed languages. `@deftypevar' is equivalent to - `@deftypevr Variable ...'. - - For example: - - @deftypevar int fubar - ... - @end deftypevar - - produces the following in Info: - - -- Variable: int fubar - ... - - The template is: - - @deftypevar DATA-TYPE NAME - BODY-OF-DESCRIPTION - @end deftypevar - - `@deftypevar' creates an entry in the index of variables for NAME. - - -File: texi.info, Node: Abstract Objects, Next: Data Types, Prev: Typed Variables, Up: Def Cmds in Detail - -Object-Oriented Programming ---------------------------- - - Here are the commands for formatting descriptions about abstract -objects, such as are used in object-oriented programming. A class is a -defined type of abstract object. An instance of a class is a -particular object that has the type of the class. An instance variable -is a variable that belongs to the class but for which each instance has -its own value. - - In a definition, if the name of a class is truly a name defined in -the programming system for a class, then you should write an `@code' -around it. Otherwise, it is printed in the usual text font. - -`@defcv CATEGORY CLASS NAME' - The `@defcv' command is the general definition command for - variables associated with classes in object-oriented programming. - The `@defcv' command is followed by three arguments: the category - of thing being defined, the class to which it belongs, and its - name. Thus, - - @defcv {Class Option} Window border-pattern - ... - @end defcv - - illustrates how you would write the first line of a definition of - the `border-pattern' class option of the class `Window'. - - The template is - - @defcv CATEGORY CLASS NAME - ... - @end defcv - - `@defcv' creates an entry in the index of variables. - -`@defivar CLASS NAME' - The `@defivar' command is the definition command for instance - variables in object-oriented programming. `@defivar' is - equivalent to `@defcv {Instance Variable} ...' - - The template is: - - @defivar CLASS INSTANCE-VARIABLE-NAME - BODY-OF-DEFINITION - @end defivar - - `@defivar' creates an entry in the index of variables. - -`@defop CATEGORY CLASS NAME ARGUMENTS...' - The `@defop' command is the general definition command for - entities that may resemble methods in object-oriented programming. - These entities take arguments, as functions do, but are associated - with particular classes of objects. - - For example, some systems have constructs called "wrappers" that - are associated with classes as methods are, but that act more like - macros than like functions. You could use `@defop Wrapper' to - describe one of these. - - Sometimes it is useful to distinguish methods and "operations". - You can think of an operation as the specification for a method. - Thus, a window system might specify that all window classes have a - method named `expose'; we would say that this window system - defines an `expose' operation on windows in general. Typically, - the operation has a name and also specifies the pattern of - arguments; all methods that implement the operation must accept - the same arguments, since applications that use the operation do - so without knowing which method will implement it. - - Often it makes more sense to document operations than methods. For - example, window application developers need to know about the - `expose' operation, but need not be concerned with whether a given - class of windows has its own method to implement this operation. - To describe this operation, you would write: - - @defop Operation windows expose - - The `@defop' command is written at the beginning of a line and is - followed on the same line by the overall name of the category of - operation, the name of the class of the operation, the name of the - operation, and its arguments, if any. - - The template is: - - @defop CATEGORY CLASS NAME ARGUMENTS... - BODY-OF-DEFINITION - @end defop - - `@defop' creates an entry, such as ``expose' on `windows'', in the - index of functions. - -`@defmethod CLASS NAME ARGUMENTS...' - The `@defmethod' command is the definition command for methods in - object-oriented programming. A method is a kind of function that - implements an operation for a particular class of objects and its - subclasses. In the Lisp Machine, methods actually were functions, - but they were usually defined with `defmethod'. - - `@defmethod' is equivalent to `@defop Method ...'. The command is - written at the beginning of a line and is followed by the name of - the class of the method, the name of the method, and its - arguments, if any. - - For example, - - @defmethod `bar-class' bar-method argument - ... - @end defmethod - - illustrates the definition for a method called `bar-method' of the - class `bar-class'. The method takes an argument. - - The template is: - - @defmethod CLASS METHOD-NAME ARGUMENTS... - BODY-OF-DEFINITION - @end defmethod - - `@defmethod' creates an entry in the index of functions, such as - ``bar-method' on `bar-class''. - - -File: texi.info, Node: Data Types, Prev: Abstract Objects, Up: Def Cmds in Detail - -Data Types ----------- - - Here is the command for data types: - -`@deftp CATEGORY NAME ATTRIBUTES...' - The `@deftp' command is the generic definition command for data - types. The command is written at the beginning of a line and is - followed on the same line by the category, by the name of the type - (which is a word like `int' or `float'), and then by names of - attributes of objects of that type. Thus, you could use this - command for describing `int' or `float', in which case you could - use `data type' as the category. (A data type is a category of - certain objects for purposes of deciding which operations can be - performed on them.) - - In Lisp, for example, "pair" names a particular data type, and an - object of that type has two slots called the CAR and the CDR. - Here is how you would write the first line of a definition of - `pair'. - - @deftp {Data type} pair car cdr - ... - @end deftp - - The template is: - - @deftp CATEGORY NAME-OF-TYPE ATTRIBUTES... - BODY-OF-DEFINITION - @end deftp - - `@deftp' creates an entry in the index of data types. - - -File: texi.info, Node: Def Cmd Conventions, Next: Sample Function Definition, Prev: Def Cmds in Detail, Up: Definition Commands - -Conventions for Writing Definitions -=================================== - - When you write a definition using `@deffn', `@defun', or one of the -other definition commands, please take care to use arguments that -indicate the meaning, as with the COUNT argument to the `forward-word' -function. Also, if the name of an argument contains the name of a -type, such as INTEGER, take care that the argument actually is of that -type. - - -File: texi.info, Node: Sample Function Definition, Prev: Def Cmd Conventions, Up: Definition Commands - -A Sample Function Definition -============================ - - A function definition uses the `@defun' and `@end defun' commands. -The name of the function follows immediately after the `@defun' command -and it is followed, on the same line, by the parameter list. - - Here is a definition from `The GNU Emacs Lisp Reference Manual'. -(*Note Calling Functions: (elisp)Calling Functions.) - - - Function: apply FUNCTION &rest ARGUMENTS - `apply' calls FUNCTION with ARGUMENTS, just like `funcall' - but with one difference: the last of ARGUMENTS is a list of - arguments to give to FUNCTION, rather than a single argument. - We also say that this list is "appended" to the other - arguments. - - `apply' returns the result of calling FUNCTION. As with - `funcall', FUNCTION must either be a Lisp function or a - primitive function; special forms and macros do not make - sense in `apply'. - - (setq f 'list) - => list - (apply f 'x 'y 'z) - error--> Wrong type argument: listp, z - (apply '+ 1 2 '(3 4)) - => 10 - (apply '+ '(1 2 3 4)) - => 10 - - (apply 'append '((a b c) nil (x y z) nil)) - => (a b c x y z) - - An interesting example of using `apply' is found in the - description of `mapcar'. - - In the Texinfo source file, this example looks like this: - - @defun apply function &rest arguments - - @code{apply} calls @var{function} with - @var{arguments}, just like @code{funcall} but with one - difference: the last of @var{arguments} is a list of - arguments to give to @var{function}, rather than a single - argument. We also say that this list is @dfn{appended} - to the other arguments. - - @code{apply} returns the result of calling - @var{function}. As with @code{funcall}, - @var{function} must either be a Lisp function or a - primitive function; special forms and macros do not make - sense in @code{apply}. - - @example - (setq f 'list) - @result{} list - (apply f 'x 'y 'z) - @error{} Wrong type argument: listp, z - (apply '+ 1 2 '(3 4)) - @result{} 10 - (apply '+ '(1 2 3 4)) - @result{} 10 - - (apply 'append '((a b c) nil (x y z) nil)) - @result{} (a b c x y z) - @end example - - An interesting example of using @code{apply} is found - in the description of @code{mapcar}.@refill - @end defun - -In this manual, this function is listed in the Command and Variable -Index under `apply'. - - Ordinary variables and user options are described using a format like -that for functions except that variables do not take arguments. - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-7 b/gnu/usr.bin/texinfo/info-files/texi.info-7 deleted file mode 100644 index 3ea85eee31f9..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-7 +++ /dev/null @@ -1,1307 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: Footnotes, Next: Conditionals, Prev: Definition Commands, Up: Top - -Footnotes -********* - - A "footnote" is for a reference that documents or elucidates the -primary text.(1) - - In Texinfo, footnotes are created with the `@footnote' command. -This command is followed immediately by a left brace, then by the text -of the footnote, and then by a terminating right brace. The template -is: - - @footnote{TEXT} - - Footnotes may be of any length, but are usually short. - - For example, this clause is followed by a sample footnote(2); in the -Texinfo source, it looks like this: - - ...a sample footnote @footnote{Here is the sample - footnote.}; in the Texinfo source... - - In a printed manual or book, the reference mark for a footnote is a -small, superscripted number; the text of the footnote is written at the -bottom of the page, below a horizontal line. - - In Info, the reference mark for a footnote is a pair of parentheses -with the footnote number between them, like this: `(1)'. - - Info has two footnote styles, which determine where the text of the -footnote is located: - - * In the `End' node style, all the footnotes for a single node are - placed at the end of that node. The footnotes are separated from - the rest of the node by a line of dashes with the word `Footnotes' - within it. Each footnote begins with an `(N)' reference mark. - - Here is an example of a single footnote in the end of node style: - - --------- Footnotes --------- - - (1) Here is a sample footnote. - - * In the `Separate' node style, all the footnotes for a single node - are placed in an automatically constructed node of their own. In - this style, a "footnote reference" follows each `(N)' reference - mark in the body of the node. The footnote reference is actually - a cross reference which you use to reach the footnote node. - - The name of the node containing the footnotes is constructed by - appending `-Footnotes' to the name of the node that contains the - footnotes. (Consequently, the footnotes' node for the `Footnotes' - node is `Footnotes-Footnotes'!) The footnotes' node has an `Up' - node pointer that leads back to its parent node. - - Here is how the first footnote in this manual looks after being - formatted for Info in the separate node style: - - File: texinfo.info Node: Overview-Footnotes, Up: Overview - - (1) Note that the first syllable of "Texinfo" is - pronounced like "speck", not "hex". ... - - A Texinfo file may be formatted into an Info file with either -footnote style. - - Use the `@footnotestyle' command to specify an Info file's footnote -style. Write this command at the beginning of a line followed by an -argument, either `end' for the end node style or `separate' for the -separate node style. - - For example, - - @footnotestyle end - -or - @footnotestyle separate - - Write an `@footnotestyle' command before or shortly after the -end-of-header line at the beginning of a Texinfo file. (If you include -the `@footnotestyle' command between the start-of-header and -end-of-header lines, the region formatting commands will format -footnotes as specified.) - - If you do not specify a footnote style, the formatting commands use -their default style. Currently, `makeinfo' uses the `end' style, while -`texinfo-format-buffer' and `texinfo-format-region' use the `separate' -style. - - This chapter contains two footnotes. - - ---------- Footnotes ---------- - - (1) A footnote should complement or expand upon the primary text, -but a reader should not need to read a footnote to understand the -primary text. For a thorough discussion of footnotes, see `The Chicago -Manual of Style', which is published by the University of Chicago Press. - - (2) Here is the sample footnote. - - -File: texi.info, Node: Conditionals, Next: Format/Print Hardcopy, Prev: Footnotes, Up: Top - -Conditionally Visible Text -************************** - - Sometimes it is good to use different text for a printed manual and -its corresponding Info file. In this case, you can use the -"conditional commands" to specify which text is for the printed manual -and which is for the Info file. - -* Menu: - -* Conditional Commands:: How to specify text for Info or TeX. -* Using Ordinary TeX Commands:: You can use any and all TeX commands. -* set clear value:: How to designate which text to format (for - both Info and TeX); and how to set a - flag to a string that you can insert. - - -File: texi.info, Node: Conditional Commands, Next: Using Ordinary TeX Commands, Up: Conditionals - -Using `@ifinfo' and `@iftex' -============================ - - `@ifinfo' begins segments of text that should be ignored by TeX when -it typesets the printed manual. The segment of text appears only in -the Info file. The `@ifinfo' command should appear on a line by -itself; end the Info-only text with a line containing `@end ifinfo' by -itself. At the beginning of a Texinfo file, the Info permissions are -contained within a region marked by `@ifinfo' and `@end ifinfo'. (*Note -Info Summary and Permissions::.) - - The `@iftex' and `@end iftex' commands are similar to the `@ifinfo' -and `@end ifinfo' commands, except that they specify text that will -appear in the printed manual but not in the Info file. - - For example, - - @iftex - This text will appear only in the printed manual. - @end iftex - - @ifinfo - However, this text will appear only in Info. - @end ifinfo - -The preceding example produces the following line: - - However, this text will appear only in Info. - -Note how you only see one of the two lines, depending on whether you -are reading the Info version or the printed version of this manual. - - The `@titlepage' command is a special variant of `@iftex' that is -used for making the title and copyright pages of the printed manual. -(*Note `@titlepage': titlepage.) - - -File: texi.info, Node: Using Ordinary TeX Commands, Next: set clear value, Prev: Conditional Commands, Up: Conditionals - -Using Ordinary TeX Commands -=========================== - - Inside a region delineated by `@iftex' and `@end iftex', you can -embed some PlainTeX commands. Info will ignore these commands since -they are only in that part of the file which is seen by TeX. You can -write the TeX commands as you would write them in a normal TeX file, -except that you must replace the `\' used by TeX with an `@'. For -example, in the `@titlepage' section of a Texinfo file, you can use the -TeX command `@vskip' to format the copyright page. (The `@titlepage' -command causes Info to ignore the region automatically, as it does with -the `@iftex' command.) - - However, many features of PlainTeX will not work, as they are -overridden by features of Texinfo. - - You can enter PlainTeX completely, and use `\' in the TeX commands, -by delineating a region with the `@tex' and `@end tex' commands. (The -`@tex' command also causes Info to ignore the region, like the `@iftex' -command.) - - For example, here is a mathematical expression written in PlainTeX: - - @tex - $$ \chi^2 = \sum_{i=1}^N - \left (y_i - (a + b x_i) - \over \sigma_i\right)^2 $$ - @end tex - -The output of this example will appear only in a printed manual. If -you are reading this in Info, you will not see anything after this -paragraph. - - -File: texi.info, Node: set clear value, Prev: Using Ordinary TeX Commands, Up: Conditionals - -`@set', `@clear', and `@value' -============================== - - You can direct the Texinfo formatting commands to format or ignore -parts of a Texinfo file with the `@set', `@clear', `@ifset', and -`@ifclear' commands. - - In addition, you can use the `@set FLAG' command to set the value of -FLAG to a string of characters; and use `@value{FLAG}' to insert that -string. You can use `@set', for example, to set a date and use -`@value' to insert the date in several places in the Texinfo file. - -* Menu: - -* ifset ifclear:: Format a region if a flag is set. -* value:: Replace a flag with a string. -* value Example:: An easy way to update edition information. - - -File: texi.info, Node: ifset ifclear, Next: value, Up: set clear value - -`@ifset' and `@ifclear' ------------------------ - - When a FLAG is set, the Texinfo formatting commands format text -between subsequent pairs of `@ifset FLAG' and `@end ifset' commands. -When the FLAG is cleared, the Texinfo formatting commands do *not* -format the text. - - Use the `@set FLAG' command to turn on, or "set", a FLAG; a "flag" -can be any single word. The format for the command looks like this: - - @set FLAG - - Write the conditionally formatted text between `@ifset FLAG' and -`@end ifset' commands, like this: - - @ifset FLAG - CONDITIONAL-TEXT - @end ifset - - For example, you can create one document that has two variants, such -as a manual for a `large' and `small' model: - - You can use this machine to dig up shrubs - without hurting them. - - @set large - - @ifset large - It can also dig up fully grown trees. - @end ifset - - Remember to replant promptly ... - -In the example, the formatting commands will format the text between -`@ifset large' and `@end ifset' because the `large' flag is set. - - Use the `@clear FLAG' command to turn off, or "clear", a flag. -Clearing a flag is the opposite of setting a flag. The command looks -like this: - - @clear FLAG - -Write the command on a line of its own. - - When FLAG is cleared, the Texinfo formatting commands do *not* -format the text between `@ifset FLAG' and `@end ifset'; that text is -ignored and does not appear in either printed or Info output. - - For example, if you clear the flag of the preceding example by -writing an `@clear large' command after the `@set large' command (but -before the conditional text), then the Texinfo formatting commands -ignore the text between the `@ifset large' and `@end ifset' commands. -In the formatted output, that text does not appear; in both printed and -Info output, you see only the lines that say, "You can use this machine -to dig up shrubs without hurting them. Remember to replant promptly -...". - - If a flag is cleared with an `@clear FLAG' command, then the -formatting commands format text between subsequent pairs of `@ifclear' -and `@end ifclear' commands. But if the flag is set with `@set FLAG', -then the formatting commands do *not* format text between an `@ifclear' -and an `@end ifclear' command; rather, they ignore that text. An -`@ifclear' command looks like this: - - @ifclear FLAG - - In brief, the commands are: - -`@set FLAG' - Tell the Texinfo formatting commands that FLAG is set. - -`@clear FLAG' - Tell the Texinfo formatting commands that FLAG is cleared. - -`@ifset FLAG' - If FLAG is set, tell the Texinfo formatting commands to format the - text up to the following `@end ifset' command. - - If FLAG is cleared, tell the Texinfo formatting commands to ignore - text up to the following `@end ifset' command. - -`@ifclear FLAG' - If FLAG is set, tell the Texinfo formatting commands to ignore the - text up to the following `@end ifclear' command. - - If FLAG is cleared, tell the Texinfo formatting commands to format - the text up to the following `@end ifclear' command. - - -File: texi.info, Node: value, Next: value Example, Prev: ifset ifclear, Up: set clear value - -`@value' --------- - - You can use the `@set' command to specify a value for a flag, which -is expanded by the `@value' command. The value is a string a -characters. - - Write the `@set' command like this: - - @set foo This is a string. - -This sets the value of `foo' to "This is a string." - - The Texinfo formatters replace an `@value{FLAG}' command with the -string to which FLAG is set. - - Thus, when `foo' is set as shown above, the Texinfo formatters -convert - - @value{foo} -to - This is a string. - - You can write an `@value' command within a paragraph; but you must -write an `@set' command on a line of its own. - - If you write the `@set' command like this: - - @set foo - -without specifying a string, the value of `foo' is an empty string. - - If you clear a previously set flag with an `@clear FLAG' command, a -subsequent `@value{flag}' command is invalid and the string is replaced -with an error message that says `{No value for "FLAG"}'. - - For example, if you set `foo' as follows: - - @set how-much very, very, very - -then the formatters transform - - It is a @value{how-much} wet day. -into - It is a very, very, very wet day. - - If you write - - @clear how-much - -then the formatters transform - - It is a @value{how-much} wet day. -into - It is a {No value for "how-much"} wet day. - - -File: texi.info, Node: value Example, Prev: value, Up: set clear value - -`@value' Example ----------------- - - You can use the `@value' command to limit the number of places you -need to change when you record an update to a manual. Here is how it -is done in `The GNU Make Manual': - -Set the flags: - - @set EDITION 0.35 Beta - @set VERSION 3.63 Beta - @set UPDATED 14 August 1992 - @set UPDATE-MONTH August 1992 - -Write text for the first `@ifinfo' section, for people reading the -Texinfo file: - - This is Edition @value{EDITION}, - last updated @value{UPDATED}, - of @cite{The GNU Make Manual}, - for @code{make}, Version @value{VERSION}. - -Write text for the title page, for people reading the printed manual: - - @title GNU Make - @subtitle A Program for Directing Recompilation - @subtitle Edition @value{EDITION}, ... - @subtitle @value{UPDATE-MONTH} - -(On a printed cover, a date listing the month and the year looks less -fussy than a date listing the day as well as the month and year.) - -Write text for the Top node, for people reading the Info file: - - This is Edition @value{EDITION} - of the @cite{GNU Make Manual}, - last updated @value{UPDATED} - for @code{make} Version @value{VERSION}. - - After you format the manual, the text in the first `@ifinfo' section -looks like this: - - This is Edition 0.35 Beta, last updated 14 August 1992, - of `The GNU Make Manual', for `make', Version 3.63 Beta. - - When you update the manual, change only the values of the flags; you -do not need to rewrite the three sections. - - -File: texi.info, Node: Format/Print Hardcopy, Next: Create an Info File, Prev: Conditionals, Up: Top - -Format and Print Hardcopy -************************* - - There are three major shell commands for making a printed manual -from a Texinfo file: one for converting the Texinfo file into a file -that will be printed, a second for sorting indices, and a third for -printing the formatted document. When you use the shell commands, you -can either work directly in the operating system shell or work within a -shell inside GNU Emacs. - - If you are using GNU Emacs, you can use commands provided by Texinfo -mode instead of shell commands. In addition to the three commands to -format a file, sort the indices, and print the result, Texinfo mode -offers key bindings for commands to recenter the output buffer, show the -print queue, and delete a job from the print queue. - -* Menu: - -* Use TeX:: Use TeX to format for hardcopy. -* Shell Format & Print:: How to format and print a hardcopy manual - with shell commands. -* Within Emacs:: How to format and print from an Emacs shell. -* Texinfo Mode Printing:: How to format and print in Texinfo mode. -* Compile-Command:: How to print using Emacs's compile command. -* Requirements Summary:: TeX formatting requirements summary. -* Preparing for TeX:: What you need to do to use TeX. -* Overfull hboxes:: What are and what to do with overfull hboxes. -* smallbook:: How to print small format books and manuals. -* A4 Paper:: How to print on European A4 paper. -* Cropmarks and Magnification:: How to print marks to indicate the size - of pages and how to print scaled up output. - - -File: texi.info, Node: Use TeX, Next: Shell Format & Print, Up: Format/Print Hardcopy - -Use TeX -======= - - The typesetting program called TeX is used for formatting a Texinfo -file. TeX is a very powerful typesetting program and, if used right, -does an exceptionally good job. *Note How to Obtain TeX: Obtaining -TeX, for information on how to obtain TeX. - - The `makeinfo', `texinfo-format-region', and `texinfo-format-buffer' -commands read the very same @-commands in the Texinfo file as does TeX, -but process them differently to make an Info file; see *Note Create an -Info File::. - - -File: texi.info, Node: Shell Format & Print, Next: Within Emacs, Prev: Use TeX, Up: Format/Print Hardcopy - -Format and Print Using Shell Commands -===================================== - - Format the Texinfo file with the shell command `tex' followed by the -name of the Texinfo file. This produces a formatted DVI file as well -as several auxiliary files containing indices, cross references, etc. -The DVI file (for "DeVice Independent" file) can be printed on a wide -variety of printers. - - The `tex' formatting command itself does not sort the indices; it -writes an output file of unsorted index data. This is a misfeature of -TeX. Hence, to generate a printed index, you first need a sorted index -to work from. The `texindex' command sorts indices. (The source file -`texindex.c' comes as part of the standard GNU distribution and is -usually installed when Emacs is installed.) - - The `tex' formatting command outputs unsorted index files under -names that obey a standard convention. These names are the name of -your main input file to the `tex' formatting command, with everything -after the first period thrown away, and the two letter names of indices -added at the end. For example, the raw index output files for the -input file `foo.texinfo' would be `foo.cp', `foo.vr', `foo.fn', -`foo.tp', `foo.pg' and `foo.ky'. Those are exactly the arguments to -give to `texindex'. - - Or else, you can use `??' as "wild-cards" and give the command in -this form: - - texindex foo.?? - -This command will run `texindex' on all the unsorted index files, -including any that you have defined yourself using `@defindex' or -`@defcodeindex'. (You may execute `texindex foo.??' even if there are -similarly named files with two letter extensions that are not index -files, such as `foo.el'. The `texindex' command reports but otherwise -ignores such files.) - - For each file specified, `texindex' generates a sorted index file -whose name is made by appending `s' to the input file name. The -`@printindex' command knows to look for a file of that name. -`texindex' does not alter the raw index output file. - - After you have sorted the indices, you need to rerun the `tex' -formatting command on the Texinfo file. This regenerates a formatted -DVI file with up-to-date index entries.(1) - - To summarize, this is a three step process: - - 1. Run the `tex' formatting command on the Texinfo file. This - generates the formatted DVI file as well as the raw index files - with two letter extensions. - - 2. Run the shell command `texindex' on the raw index files to sort - them. This creates the corresponding sorted index files. - - 3. Rerun the `tex' formatting command on the Texinfo file. This - regenerates a formatted DVI file with the index entries in the - correct order. This second run also corrects the page numbers for - the cross references. (The tables of contents are always correct.) - - You need not run `texindex' each time after you run the `tex' -formatting. If you do not, on the next run, the `tex' formatting -command will use whatever sorted index files happen to exist from the -previous use of `texindex'. This is usually OK while you are debugging. - - Rather than type the `tex' and `texindex' commands yourself, you can -use `texi2dvi'. This shell script is designed to simplify the -`tex'--`texindex'--`tex' sequence by figuring out whether index files -and DVI files are up-to-date. It runs `texindex' and `tex' only when -necessary. - - The syntax for `texi2dvi' is like this (where `%' is the shell -prompt): - - % texi2dvi FILENAME... - - Finally, you can print the DVI file with the DVI print command. The -precise command to use depends on the system; `lpr -d' is common. The -DVI print command may require a file name without any extension or with -a `.dvi' extension. - - The following commands, for example, sort the indices, format, and -print the `Bison Manual' (where `%' is the shell prompt): - - % tex bison.texinfo - % texindex bison.?? - % tex bison.texinfo - % lpr -d bison.dvi - -(Remember that the shell commands may be different at your site; but -these are commonly used versions.) - - ---------- Footnotes ---------- - - (1) If you use more than one index and have cross references to an -index other than the first, you must run `tex' *three times* to get -correct output: once to generate raw index data; again (after -`texindex') to output the text of the indices and determine their true -page numbers; and a third time to output correct page numbers in cross -references to them. However, cross references to indices are rare. - - -File: texi.info, Node: Within Emacs, Next: Texinfo Mode Printing, Prev: Shell Format & Print, Up: Format/Print Hardcopy - -From an Emacs Shell ... -======================= - - You can give formatting and printing commands from a shell within GNU -Emacs. To create a shell within Emacs, type `M-x shell'. In this -shell, you can format and print the document. *Note How to Format and -Print Using Shell Commands: Shell Format & Print, for details. - - You can switch to and from the shell buffer while `tex' is running -and do other editing. If you are formatting a long document on a slow -machine, this can be very convenient. - - You can also use `texi2dvi' from an Emacs shell. For example, here -is how to use `texi2dvi' to format and print `Using and Porting GNU CC' -from a shell within Emacs (where `%' is the shell prompt): - - % texi2dvi gcc.texinfo - % lpr -d gcc.dvi - - *Note Texinfo Mode Printing::, for more information about formatting -and printing in Texinfo mode. - - -File: texi.info, Node: Texinfo Mode Printing, Next: Compile-Command, Prev: Within Emacs, Up: Format/Print Hardcopy - -Formatting and Printing in Texinfo Mode -======================================= - - Texinfo mode provides several predefined key commands for TeX -formatting and printing. These include commands for sorting indices, -looking at the printer queue, killing the formatting job, and -recentering the display of the buffer in which the operations occur. - -`C-c C-t C-r' -`M-x texinfo-tex-region' - Run TeX on the current region. - -`C-c C-t C-b' -`M-x texinfo-tex-buffer' - Run TeX on the current buffer. - -`C-c C-t C-i' -`M-x texinfo-texindex' - Sort the indices of a Texinfo file that have been formatted with - `texinfo-tex-region' or `texinfo-tex-buffer'. - -`C-c C-t C-p' -`M-x texinfo-tex-print' - Print a DVI file that was made with `texinfo-tex-region' or - `texinfo-tex-buffer'. - -`C-c C-t C-q' -`M-x texinfo-show-tex-print-queue' - Show the print queue. - -`C-c C-t C-d' -`M-x texinfo-delete-from-tex-print-queue' - Delete a job from the print queue; you will be prompted for the job - number shown by a preceding `C-c C-t C-q' command - (`texinfo-show-tex-print-queue'). - -`C-c C-t C-k' -`M-x texinfo-kill-tex-job' - Kill either the currently running TeX job that has been started by - `texinfo-tex-region' or `texinfo-tex-buffer', or any other process - running in the Texinfo shell buffer. - -`C-c C-t C-x' -`M-x texinfo-quit-tex-job' - Quit a TeX formatting job that has stopped because of an error by - sending an x to it. When you do this, TeX preserves a record of - what it did in a `.log' file. - -`C-c C-t C-l' -`M-x texinfo-recenter-tex-output-buffer' - Redisplay the shell buffer in which the TeX printing and formatting - commands are run to show its most recent output. - - Thus, the usual sequence of commands for formatting a buffer is as -follows (with comments to the right): - - C-c C-t C-b Run TeX on the buffer. - C-c C-t C-i Sort the indices. - C-c C-t C-b Rerun TeX to regenerate indices. - C-c C-t C-p Print the DVI file. - C-c C-t C-q Display the printer queue. - - The Texinfo mode TeX formatting commands start a subshell in Emacs -called the `*texinfo-tex-shell*'. The `texinfo-tex-command', -`texinfo-texindex-command', and `tex-dvi-print-command' commands are -all run in this shell. - - You can watch the commands operate in the `*texinfo-tex-shell*' -buffer, and you can switch to and from and use the -`*texinfo-tex-shell*' buffer as you would any other shell buffer. - - The formatting and print commands depend on the values of several -variables. The default values are: - - Variable Default value - - texinfo-tex-command "tex" - texinfo-texindex-command "texindex" - texinfo-tex-shell-cd-command "cd" - texinfo-tex-dvi-print-command "lpr -d" - texinfo-show-tex-queue-command "lpq" - texinfo-delete-from-print-queue-command "lprm" - texinfo-start-of-header "%**start" - texinfo-end-of-header "%**end" - texinfo-tex-trailer "@bye" - - The default values of both the `texinfo-tex-command' and the -`texinfo-texindex-command' variables are set in the `texnfo-tex.el' -file. - - You can change the values of these variables with the `M-x -edit-options' command (*note Editing Variable Values: (emacs)Edit -Options.), with the `M-x set-variable' command (*note Examining and -Setting Variables: (emacs)Examining.), or with your `.emacs' -initialization file (*note Init File: (emacs)Init File.). - - -File: texi.info, Node: Compile-Command, Next: Requirements Summary, Prev: Texinfo Mode Printing, Up: Format/Print Hardcopy - -Using the Local Variables List -============================== - - Yet another way to apply the TeX formatting command to a Texinfo -file is to put that command in a "local variables list" at the end of -the Texinfo file. You can then specify the TeX formatting command as a -`compile-command' and have Emacs run the TeX formatting command by -typing `M-x compile'. This creates a special shell called the -`*compilation buffer*' in which Emacs runs the compile command. For -example, at the end of the `gdb.texinfo' file, after the `@bye', you -would put the following: - - @c Local Variables: - @c compile-command: "tex gdb.texinfo" - @c End: - -This technique is most often used by programmers who also compile -programs this way; see *Note Compilation: (emacs)Compilation. - - -File: texi.info, Node: Requirements Summary, Next: Preparing for TeX, Prev: Compile-Command, Up: Format/Print Hardcopy - -TeX Formatting Requirements Summary -=================================== - - Every Texinfo file that is to be input to TeX must begin with a -`\input' command and contain an `@settitle' command: - - \input texinfo - @settitle NAME-OF-MANUAL - -The first command instructs TeX to load the macros it needs to process -a Texinfo file and the second command specifies the title of printed -manual. - - Every Texinfo file must end with a line that terminates TeX -processing and forces out unfinished pages: - - @bye - - Strictly speaking, these three lines are all a Texinfo file needs for -TeX, besides the body. (The `@setfilename' line is the only line that -a Texinfo file needs for Info formatting.) - - Usually, the file's first line contains an `@c -*-texinfo-*-' -comment that causes Emacs to switch to Texinfo mode when you edit the -file. In addition, the beginning usually includes an `@setfilename' -for Info formatting, an `@setchapternewpage' command, a title page, a -copyright page, and permissions. Besides an `@bye', the end of a file -usually includes indices and a table of contents. - -For more information, see -*Note `@setchapternewpage': setchapternewpage, -*Note Page Headings: Headings, -*Note Titlepage & Copyright Page::, -*Note Printing Indices & Menus::, and -*Note Contents::. - - -File: texi.info, Node: Preparing for TeX, Next: Overfull hboxes, Prev: Requirements Summary, Up: Format/Print Hardcopy - -Preparing to Use TeX -==================== - -TeX needs to know where to find the `texinfo.tex' file that you have -told it to input with the `\input texinfo' command at the beginning of -the first line. The `texinfo.tex' file tells TeX how to handle -@-commands. (`texinfo.tex' is included in the standard GNU -distributions.) - - Usually, the `texinfo.tex' file is put in the default directory that -contains TeX macros (the `/usr/lib/tex/macros' directory) when GNU -Emacs or other GNU software is installed. In this case, TeX will find -the file and you do not need to do anything special. Alternatively, -you can put `texinfo.tex' in the directory in which the Texinfo source -file is located, and TeX will find it there. - - However, you may want to specify the location of the `\input' file -yourself. One way to do this is to write the complete path for the file -after the `\input' command. Another way is to set the `TEXINPUTS' -environment variable in your `.cshrc' or `.profile' file. The -`TEXINPUTS' environment variable will tell TeX where to find the -`texinfo.tex' file and any other file that you might want TeX to use. - - Whether you use a `.cshrc' or `.profile' file depends on whether you -use `csh', `sh', or `bash' for your shell command interpreter. When -you use `csh', it looks to the `.cshrc' file for initialization -information, and when you use `sh' or `bash', it looks to the -`.profile' file. - - In a `.cshrc' file, you could use the following `csh' command -sequence: - - setenv TEXINPUTS .:/usr/me/mylib:/usr/lib/tex/macros - - In a `.profile' file, you could use the following `sh' command -sequence: - - TEXINPUTS=.:/usr/me/mylib:/usr/lib/tex/macros - export TEXINPUTS - -This would cause TeX to look for `\input' file first in the current -directory, indicated by the `.', then in a hypothetical user's -`me/mylib' directory, and finally in the system library. - - -File: texi.info, Node: Overfull hboxes, Next: smallbook, Prev: Preparing for TeX, Up: Format/Print Hardcopy - -Overfull "hboxes" -================= - - TeX is sometimes unable to typeset a line without extending it into -the right margin. This can occur when TeX comes upon what it -interprets as a long word that it cannot hyphenate, such as an -electronic mail network address or a very long title. When this -happens, TeX prints an error message like this: - - Overfull \hbox (20.76302pt too wide) - -(In TeX, lines are in "horizontal boxes", hence the term, "hbox". The -backslash, `\', is the TeX equivalent of `@'.) - - TeX also provides the line number in the Texinfo source file and the -text of the offending line, which is marked at all the places that TeX -knows how to hyphenate words. *Note Catching Errors with TeX -Formatting: Debugging with TeX, for more information about typesetting -errors. - - If the Texinfo file has an overfull hbox, you can rewrite the -sentence so the overfull hbox does not occur, or you can decide to -leave it. A small excursion into the right margin often does not -matter and may not even be noticeable. - - However, unless told otherwise, TeX will print a large, ugly, black -rectangle beside the line that contains the overful hbox. This is so -you will notice the location of the problem if you are correcting a -draft. - - To prevent such a monstrosity from marring your final printout, write -the following in the beginning of the Texinfo file on a line of its own, -before the `@titlepage' command: - - @finalout - - -File: texi.info, Node: smallbook, Next: A4 Paper, Prev: Overfull hboxes, Up: Format/Print Hardcopy - -Printing "Small" Books -====================== - - By default, TeX typesets pages for printing in an 8.5 by 11 inch -format. However, you can direct TeX to typeset a document in a 7 by -9.25 inch format that is suitable for bound books by inserting the -following command on a line by itself at the beginning of the Texinfo -file, before the title page: - - @smallbook - -(Since regular sized books are often about 7 by 9.25 inches, this -command might better have been called the `@regularbooksize' command, -but it came to be called the `@smallbook' command by comparison to the -8.5 by 11 inch format.) - - If you write the `@smallbook' command between the start-of-header -and end-of-header lines, the Texinfo mode TeX region formatting -command, `texinfo-tex-region', will format the region in "small" book -size (*note Start of Header::.). - - The Free Software Foundation distributes printed copies of `The GNU -Emacs Manual' and other manuals in the "small" book size. *Note -`@smallexample' and `@smalllisp': smallexample & smalllisp, for -information about commands that make it easier to produce examples for -a smaller manual. - - -File: texi.info, Node: A4 Paper, Next: Cropmarks and Magnification, Prev: smallbook, Up: Format/Print Hardcopy - -Printing on A4 Paper -==================== - - You can tell TeX to typeset a document for printing on European size -A4 paper with the `@afourpaper' command. Write the command on a line -by itself between `@iftex' and `@end iftex' lines near the beginning of -the Texinfo file, before the title page: - - For example, this is how you would write the header for this manual: - - \input texinfo @c -*-texinfo-*- - @c %**start of header - @setfilename texinfo - @settitle Texinfo - @syncodeindex vr fn - @iftex - @afourpaper - @end iftex - @c %**end of header - - -File: texi.info, Node: Cropmarks and Magnification, Prev: A4 Paper, Up: Format/Print Hardcopy - -Cropmarks and Magnification -=========================== - - You can attempt to direct TeX to print cropmarks at the corners of -pages with the `@cropmarks' command. Write the `@cropmarks' command on -a line by itself between `@iftex' and `@end iftex' lines near the -beginning of the Texinfo file, before the title page, like this: - - @iftex - @cropmarks - @end iftex - - This command is mainly for printers that typeset several pages on one -sheet of film; but you can attempt to use it to mark the corners of a -book set to 7 by 9.25 inches with the `@smallbook' command. (Printers -will not produce cropmarks for regular sized output that is printed on -regular sized paper.) Since different printing machines work in -different ways, you should explore the use of this command with a -spirit of adventure. You may have to redefine the command in the -`texinfo.tex' definitions file. - - You can attempt to direct TeX to typeset pages larger or smaller than -usual with the `\mag' TeX command. Everything that is typeset is -scaled proportionally larger or smaller. (`\mag' stands for -"magnification".) This is *not* a Texinfo @-command, but is a PlainTeX -command that is prefixed with a backslash. You have to write this -command between `@tex' and `@end tex' (*note Using Ordinary TeX -Commands: Using Ordinary TeX Commands.). - - Follow the `\mag' command with an `=' and then a number that is 1000 -times the magnification you desire. For example, to print pages at 1.2 -normal size, write the following near the beginning of the Texinfo -file, before the title page: - - @tex - \mag=1200 - @end tex - - With some printing technologies, you can print normal-sized copies -that look better than usual by using a larger-than-normal master. - - Depending on your system, `\mag' may not work or may work only at -certain magnifications. Be prepared to experiment. - - -File: texi.info, Node: Create an Info File, Next: Install an Info File, Prev: Format/Print Hardcopy, Up: Top - -Creating an Info File -********************* - - `makeinfo' is a utility that converts a Texinfo file into an Info -file; `texinfo-format-region' and `texinfo-format-buffer' are GNU Emacs -functions that do the same. - - A Texinfo file must possess an `@setfilename' line near its -beginning, otherwise the Info formatting commands will fail. - - For information on installing the Info file in the Info system, see -*Note Install an Info File::. - -* Menu: - -* makeinfo advantages:: `makeinfo' provides better error checking. -* Invoking makeinfo:: How to run `makeinfo' from a shell. -* makeinfo options:: Specify fill-column and other options. -* Pointer Validation:: How to check that pointers point somewhere. -* makeinfo in Emacs:: How to run `makeinfo' from Emacs. -* texinfo-format commands:: Two Info formatting commands written - in Emacs Lisp are an alternative - to `makeinfo'. -* Batch Formatting:: How to format for Info in Emacs Batch mode. -* Tag and Split Files:: How tagged and split files help Info - to run better. - - -File: texi.info, Node: makeinfo advantages, Next: Invoking makeinfo, Up: Create an Info File - -`makeinfo' Preferred -==================== - - The `makeinfo' utility creates an Info file from a Texinfo source -file more quickly than either of the Emacs formatting commands and -provides better error messages. We recommend it. `makeinfo' is a C -program that is independent of Emacs. You do not need to run Emacs to -use `makeinfo', which means you can use `makeinfo' on machines that are -too small to run Emacs. You can run `makeinfo' in any one of three -ways: from an operating system shell, from a shell inside Emacs, or by -typing a key command in Texinfo mode in Emacs. - - The `texinfo-format-region' and the `texinfo-format-buffer' commands -are useful if you cannot run `makeinfo'. Also, in some circumstances, -they format short regions or buffers more quickly than `makeinfo'. - - -File: texi.info, Node: Invoking makeinfo, Next: makeinfo options, Prev: makeinfo advantages, Up: Create an Info File - -Invoking `makeinfo' from a Shell -================================ - - To create an Info file from a Texinfo file, type `makeinfo' followed -by the name of the Texinfo file. Thus, to create the Info file for -Bison, type the following at the shell prompt (where `%' is the prompt): - - % makeinfo bison.texinfo - - (You can run a shell inside Emacs by typing `M-x shell'.) - - Sometimes you will want to specify options. For example, if you wish -to discover which version of `makeinfo' you are using, type: - - % makeinfo --version - - *Note makeinfo options::, for more information. - - -File: texi.info, Node: makeinfo options, Next: Pointer Validation, Prev: Invoking makeinfo, Up: Create an Info File - -Options for `makeinfo' -====================== - - The `makeinfo' command takes a number of options. Most often, -options are used to set the value of the fill column and specify the -footnote style. Each command line option is a word preceded by `--'(1) -or a letter preceded by `-'. You can use abbreviations for the option -names as long as they are unique. - - For example, you could use the following command to create an Info -file for `bison.texinfo' in which each line is filled to only 68 -columns (where `%' is the prompt): - - % makeinfo --fill-column=68 bison.texinfo - - You can write two or more options in sequence, like this: - - % makeinfo --no-split --fill-column=70 ... - -This would keep the Info file together as one possibly very long file -and would also set the fill column to 70. - - The options are: - -`-D VAR' - Cause VAR to be defined. This is equivalent to `@set VAR' in the - Texinfo file. - -`--error-limit LIMIT' - Set the maximum number of errors that `makeinfo' will report - before exiting (on the assumption that continuing would be - useless). The default number of errors that can be reported before - `makeinfo' gives up is 100. - -`--fill-column WIDTH' - Specify the maximum number of columns in a line; this is the - right-hand edge of a line. Paragraphs that are filled will be - filled to this width. (Filling is the process of breaking up and - connecting lines so that lines are the same length as or shorter - than the number specified as the fill column. Lines are broken - between words.) The default value for `fill-column' is 72. - -`--footnote-style STYLE' - Set the footnote style to STYLE, either `end' for the end node - style or `separate' for the separate node style. The value set by - this option overrides the value set in a Texinfo file by an - `@footnotestyle' command. When the footnote style is `separate', - `makeinfo' makes a new node containing the footnotes found in the - current node. When the footnote style is `end', `makeinfo' places - the footnote references at the end of the current node. - -`-I DIR' - Add `dir' to the directory search list for finding files that are - included using the `@include' command. By default, `makeinfo' - searches only the current directory. - -`--no-headers' - Do not include menus or node lines in the output. This results in - an ASCII file that you cannot read in Info since it does not - contain the requisite nodes or menus; but you can print such a - file in a single, typewriter-like font and produce acceptable - output. - -`--no-split' - Suppress the splitting stage of `makeinfo'. Normally, large - output files (where the size is greater than 70k bytes) are split - into smaller subfiles, each one approximately 50k bytes. If you - specify `--no-split', `makeinfo' will not split up the output file. - -`--no-pointer-validate' -`--no-validate' - Suppress the pointer-validation phase of `makeinfo'. Normally, - after a Texinfo file is processed, some consistency checks are - made to ensure that cross references can be resolved, etc. *Note - Pointer Validation::. - -`--no-warn' - Suppress the output of warning messages. This does *not* suppress - the output of error messages, only warnings. You might want this - if the file you are creating has examples of Texinfo cross - references within it, and the nodes that are referenced do not - actually exist. - -`--no-number-footnotes' - Supress automatic footnote numbering. By default, `makeinfo' - numbers each footnote sequentially in a single node, resetting the - current footnote number to 1 at the start of each node. - -`--output FILE' -`-o FILE' - Specify that the output should be directed to FILE and not to the - file name specified in the `@setfilename' command found in the - Texinfo source. FILE can be the special token `-', which specifies - standard output. - -`--paragraph-indent INDENT' - Set the paragraph indentation style to INDENT. The value set by - this option overrides the value set in a Texinfo file by an - `@paragraphindent' command. The value of INDENT is interpreted as - follows: - - * If the value of INDENT is `asis', do not change the existing - indentation at the starts of paragraphs. - - * If the value of INDENT is zero, delete any existing - indentation. - - * If the value of INDENT is greater than zero, indent each - paragraph by that number of spaces. - -`--reference-limit LIMIT' - Set the value of the number of references to a node that - `makeinfo' will make without reporting a warning. If a node has - more than this number of references in it, `makeinfo' will make the - references but also report a warning. - -`-U VAR' - Cause VAR to be undefined. This is equivalent to `@clear VAR' in - the Texinfo file. - -`--verbose' - Cause `makeinfo' to display messages saying what it is doing. - Normally, `makeinfo' only outputs messages if there are errors or - warnings. - -`--version' - Report the version number of this copy of `makeinfo'. - - ---------- Footnotes ---------- - - (1) `--' has replaced `+', the old introductory character, to -maintain POSIX.2 compatibility without losing long-named options. - - -File: texi.info, Node: Pointer Validation, Next: makeinfo in Emacs, Prev: makeinfo options, Up: Create an Info File - -Pointer Validation -================== - - `makeinfo' will check the validity of the final Info file unless you -suppress pointer-validation by using the `--no-pointer-validation' -option. Mostly, this means ensuring that nodes you have referenced -really exist. Here is a complete list of what is checked: - - 1. If a `Next', `Previous', or `Up' node reference is a reference to a - node in the current file and is not an external reference such as - to `(dir)', then the referenced node must exist. - - 2. In every node, if the `Previous' node is different from the `Up' - node, then the `Previous' node must also be pointed to by a `Next' - node. - - 3. Every node except the `Top' node must have an `Up' pointer. - - 4. The node referenced by an `Up' pointer must contain a reference to - the current node in some manner other than through a `Next' - reference. This includes menu entries and cross references. - - 5. If the `Next' reference of a node is not the same as the `Next' - reference of the `Up' reference, then the node referenced by the - `Next' pointer must have a `Previous' pointer that points back to - the current node. This rule allows the last node in a section to - point to the first node of the next chapter. - - -File: texi.info, Node: makeinfo in Emacs, Next: texinfo-format commands, Prev: Pointer Validation, Up: Create an Info File - -Running `makeinfo' inside Emacs -=============================== - - You can run `makeinfo' in GNU Emacs Texinfo mode by using either the -`makeinfo-region' or the `makeinfo-buffer' commands. In Texinfo mode, -the commands are bound to `C-c C-m C-r' and `C-c C-m C-b' by default. - -`C-c C-m C-r' -`M-x makeinfo-region' - Format the current region for Info. - -`C-c C-m C-b' -`M-x makeinfo-buffer' - Format the current buffer for Info. - - When you invoke either `makeinfo-region' or `makeinfo-buffer', Emacs -prompts for a file name, offering the name of the visited file as the -default. You can edit the default file name in the minibuffer if you -wish, before typing RET to start the `makeinfo' process. - - The Emacs `makeinfo-region' and `makeinfo-buffer' commands run the -`makeinfo' program in a temporary shell buffer. If `makeinfo' finds -any errors, Emacs displays the error messages in the temporary buffer. - - You can parse the error messages by typing `C-x `' (`next-error'). -This causes Emacs to go to and position the cursor on the line in the -Texinfo source that `makeinfo' thinks caused the error. *Note Running -`make' or Compilers Generally: (emacs)Compilation, for more information -about using the `next-error' command. - - In addition, you can kill the shell in which the `makeinfo' command -is running or make the shell buffer display its most recent output. - -`C-c C-m C-k' -`M-x makeinfo-kill-job' - Kill the currently running job created by `makeinfo-region' or - `makeinfo-buffer'. - -`C-c C-m C-l' -`M-x makeinfo-recenter-output-buffer' - Redisplay the `makeinfo' shell buffer to display its most recent - output. - -(Note that the parallel commands for killing and recentering a TeX job -are `C-c C-t C-k' and `C-c C-t C-l'. *Note Texinfo Mode Printing::.) - - You can specify options for `makeinfo' by setting the -`makeinfo-options' variable with either the `M-x edit-options' or the -`M-x set-variable' command, or by setting the variable in your `.emacs' -initialization file. - - For example, you could write the following in your `.emacs' file: - - (setq makeinfo-options - "--paragraph-indent=0 --no-split - --fill-column=70 --verbose") - -For more information, see -*Note Editing Variable Values: (emacs)Edit Options, -*Note Examining and Setting Variables: (emacs)Examining, -*Note Init File: (emacs)Init File, and -*Note Options for `makeinfo': makeinfo options. - - -File: texi.info, Node: texinfo-format commands, Next: Batch Formatting, Prev: makeinfo in Emacs, Up: Create an Info File - -The `texinfo-format...' Commands -================================ - -In GNU Emacs in Texinfo mode, you can format part or all of a Texinfo -file with the `texinfo-format-region' command. This formats the -current region and displays the formatted text in a temporary buffer -called `*Info Region*'. - - Similarly, you can format a buffer with the `texinfo-format-buffer' -command. This command creates a new buffer and generates the Info file -in it. Typing `C-x C-s' will save the Info file under the name -specified by the `@setfilename' line which must be near the beginning -of the Texinfo file. - -`C-c C-e C-r' -``texinfo-format-region'' - Format the current region for Info. - -`C-c C-e C-b' -``texinfo-format-buffer'' - Format the current buffer for Info. - - The `texinfo-format-region' and `texinfo-format-buffer' commands -provide you with some error checking, and other functions can provide -you with further help in finding formatting errors. These procedures -are described in an appendix; see *Note Catching Mistakes::. However, -the `makeinfo' program is often faster and provides better error -checking (*note makeinfo in Emacs::.). - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-8 b/gnu/usr.bin/texinfo/info-files/texi.info-8 deleted file mode 100644 index ba35e6eddf38..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-8 +++ /dev/null @@ -1,1056 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: Batch Formatting, Next: Tag and Split Files, Prev: texinfo-format commands, Up: Create an Info File - -Batch Formatting -================ - - You can format Texinfo files for Info using `batch-texinfo-format' -and Emacs Batch mode. You can run Emacs in Batch mode from any shell, -including a shell inside of Emacs. (*Note Command Line Switches and -Arguments: (emacs)Command Switches.) - - Here is the command to format all the files that end in `.texinfo' -in the current directory (where `%' is the shell prompt): - - % emacs -batch -funcall batch-texinfo-format *.texinfo - -Emacs processes all the files listed on the command line, even if an -error occurs while attempting to format some of them. - - Run `batch-texinfo-format' only with Emacs in Batch mode as shown; -it is not interactive. It kills the Batch mode Emacs on completion. - - `batch-texinfo-format' is convenient if you lack `makeinfo' and want -to format several Texinfo files at once. When you use Batch mode, you -create a new Emacs process. This frees your current Emacs, so you can -continue working in it. (When you run `texinfo-format-region' or -`texinfo-format-buffer', you cannot use that Emacs for anything else -until the command finishes.) - - -File: texi.info, Node: Tag and Split Files, Prev: Batch Formatting, Up: Create an Info File - -Tag Files and Split Files -========================= - - If a Texinfo file has more than 30,000 bytes, -`texinfo-format-buffer' automatically creates a tag table for its Info -file; `makeinfo' always creates a tag table. With a "tag table", Info -can jump to new nodes more quickly than it can otherwise. - - In addition, if the Texinfo file contains more than about 70,000 -bytes, `texinfo-format-buffer' and `makeinfo' split the large Info file -into shorter "indirect" subfiles of about 50,000 bytes each. Big files -are split into smaller files so that Emacs does not need to make a -large buffer to hold the whole of a large Info file; instead, Emacs -allocates just enough memory for the small, split off file that is -needed at the time. This way, Emacs avoids wasting memory when you run -Info. (Before splitting was implemented, Info files were always kept -short and "include files" were designed as a way to create a single, -large printed manual out of the smaller Info files. *Note Include -Files::, for more information. Include files are still used for very -large documents, such as `The Emacs Lisp Reference Manual', in which -each chapter is a separate file.) - - When a file is split, Info itself makes use of a shortened version of -the original file that contains just the tag table and references to -the files that were split off. The split off files are called -"indirect" files. - - The split off files have names that are created by appending `-1', -`-2', `-3' and so on to the file name specified by the `@setfilename' -command. The shortened version of the original file continues to have -the name specified by `@setfilename'. - - At one stage in writing this document, for example, the Info file -was saved as `test-texinfo' and that file looked like this: - - Info file: test-texinfo, -*-Text-*- - produced by texinfo-format-buffer - from file: new-texinfo-manual.texinfo - - ^_ - Indirect: - test-texinfo-1: 102 - test-texinfo-2: 50422 - test-texinfo-3: 101300 - ^_^L - Tag table: - (Indirect) - Node: overview^?104 - Node: info file^?1271 - Node: printed manual^?4853 - Node: conventions^?6855 - ... - -(But `test-texinfo' had far more nodes than are shown here.) Each of -the split off, indirect files, `test-texinfo-1', `test-texinfo-2', and -`test-texinfo-3', is listed in this file after the line that says -`Indirect:'. The tag table is listed after the line that says `Tag -table:'. - - In the list of indirect files, the number following the file name -records the cumulative number of bytes in the preceding indirect files, -not counting the file list itself, the tag table, or the permissions -text in each file. In the tag table, the number following the node name -records the location of the beginning of the node, in bytes from the -beginning. - - If you are using `texinfo-format-buffer' to create Info files, you -may want to run the `Info-validate' command. (The `makeinfo' command -does such a good job on its own, you do not need `Info-validate'.) -However, you cannot run the `M-x Info-validate' node-checking command -on indirect files. For information on how to prevent files from being -split and how to validate the structure of the nodes, see *Note Using -Info-validate::. - - -File: texi.info, Node: Install an Info File, Next: Command List, Prev: Create an Info File, Up: Top - -Installing an Info File -*********************** - - Info files are usually kept in the `info' directory. (You can find -the location of this directory within Emacs by typing `C-h i' to enter -Info and then typing `C-x C-f' to see the full pathname to the `info' -directory.) - -* Menu: - -* Directory file:: The top level menu for all Info files. -* New Info File:: Listing a new info file. -* Other Info Directories:: How to specify Info files that are - located in other directories. - - -File: texi.info, Node: Directory file, Next: New Info File, Up: Install an Info File - -The `dir' File -============== - - For Info to work, the `info' directory must contain a file that -serves as a top level directory for the Info system. By convention, -this file is called `dir'. The `dir' file is itself an Info file. It -contains the top level menu for all the Info files in the system. The -menu looks like this: - - * Menu: - - * Info: (info). Documentation browsing system. - * Emacs: (emacs). The extensible, self-documenting - text editor. - * Texinfo: (texinfo). With one source file, make - either a printed manual using - TeX or an Info file. - ... - - Each of these menu entries points to the `Top' node of the Info file -that is named in parentheses. (The menu entry does not need to specify -the `Top' node, since Info goes to the `Top' node if no node name is -mentioned. *Note Nodes in Other Info Files: Other Info Files.) - - Thus, the `Info' entry points to the `Top' node of the `info' file -and the `Emacs' entry points to the `Top' node of the `emacs' file. - - In each of the Info files, the `Up' pointer of the `Top' node refers -back to the `dir' file. For example, the line for the `Top' node of -the Emacs manual looks like this in Info: - - File: emacs Node: Top, Up: (DIR), Next: Distrib - -(Note that in this case, the `dir' file name is written in upper case -letters--it can be written in either upper or lower case. Info has a -feature that it will change the case of the file name to lower case if -it cannot find the name as written.) - - -File: texi.info, Node: New Info File, Next: Other Info Directories, Prev: Directory file, Up: Install an Info File - -Listing a New Info File -======================= - - To add a new Info file to your system, write a menu entry for it in -the menu in the `dir' file in the `info' directory. Also, move the new -Info file itself to the `info' directory. For example, if you were -adding documentation for GDB, you would write the following new entry: - - * GDB: (gdb). The source-level C debugger. - -The first part of the menu entry is the menu entry name, followed by a -colon. The second part is the name of the Info file, in parentheses, -followed by a period. The third part is the description. - - Conventionally, the name of an Info file has a `.info' extension. -Thus, you might list the name of the file like this: - - * GDB: (gdb.info). The source-level C debugger. - -However, Info will look for a file with a `.info' extension if it does -not find the file under the name given in the menu. This means that -you can refer to the file `gdb.info' as `gdb', as shown in the first -example. This looks better. - - -File: texi.info, Node: Other Info Directories, Prev: New Info File, Up: Install an Info File - -Info Files in Other Directories -=============================== - - If an Info file is not in the `info' directory, there are two ways -to specify its location: - - * Write the pathname as the menu's second part, or; - - * Specify the `info' directory name in an environment variable in - your `.profile' or `.cshrc' initialization file. (Only you and - others with the same environment variable will be able to find Info - files whose location is specified this way.) - - For example, to reach a test file in the `~bob/manuals' directory, -you could add an entry like this to the menu in the `dir' file: - - * Test: (~bob/manuals/info-test). Bob's own test file. - -In this case, the absolute file name of the `info-test' file is written -as the second part of the menu entry. - - Alternatively, you can tell Info where to look by setting the -`INFOPATH' environment variable in your `.cshrc' or `.profile' file. - - If you use `sh' or `bash' for your shell command interpreter, you -must set the `INFOPATH' environment variable in the `.profile' -initialization file; but if you use `csh', you must set the variable in -the `.cshrc' initialization file. The two files require slightly -different command formats. - - * In a `.cshrc' file, you could set the `INFOPATH' variable as - follows: - - setenv INFOPATH .:~bob/manuals:/usr/local/emacs/info - - * In a `.profile' file, you would achieve the same effect by writing: - - INFOPATH=.:~bob/manuals:/usr/local/emacs/info - export INFOPATH - -Either form would cause Info to look first in the current directory, -indicated by the `.', then in the `~bob/manuals' directory, and finally -in the `/usr/local/emacs/info' directory (which is a common location -for the standard Info directory). - - -File: texi.info, Node: Command List, Next: Tips, Prev: Install an Info File, Up: Top - -@-Command List -************** - - Here is an alphabetical list of the @-commands in Texinfo. Square -brackets, [ ], indicate optional arguments; an ellipsis, `...', -indicates repeated text. - -`@*' - Force a line break. Do not end a paragraph that uses `@*' with an - `@refill' command. *Note Line Breaks::. - -`@.' - Stands for a period that really does end a sentence (usually after - an end-of-sentence capital letter). *Note Controlling Spacing::. - -`@:' - Indicate to TeX that an immediately preceding period, question - mark, exclamation mark, or colon does not end a sentence. Prevent - TeX from inserting extra whitespace as it does at the end of a - sentence. The command has no effect on the Info file output. - *Note Controlling Spacing::. - -`@@' - Stands for `@'. *Note Inserting `@': Braces Atsigns Periods. - -`@{' - Stands for a left-hand brace, `{'. *Note Inserting @ braces and - periods: Braces Atsigns Periods. - -`@}' - Stands for a right-hand brace, `}'. *Note Inserting @ braces and - periods: Braces Atsigns Periods. - -`@appendix TITLE' - Begin an appendix. The title appears in the table of contents of - a printed manual. In Info, the title is underlined with - asterisks. *Note The `@unnumbered' and `@appendix' Commands: - unnumbered & appendix. - -`@appendixsec TITLE' -`@appendixsection TITLE' - Begin an appendix section within an appendix. The section title - appears in the table of contents of a printed manual. In Info, - the title is underlined with equal signs. `@appendixsection' is a - longer spelling of the `@appendixsec' command. *Note Section - Commands: unnumberedsec appendixsec heading. - -`@appendixsubsec TITLE' - Begin an appendix subsection within an appendix. The title appears - in the table of contents of a printed manual. In Info, the title - is underlined with hyphens. *Note Subsection Commands: - unnumberedsubsec appendixsubsec subheading. - -`@appendixsubsubsec TITLE' - Begin an appendix subsubsection within a subappendix. The title - appears in the table of contents of a printed manual. In Info, the - title is underlined with periods. *Note The `subsub' Commands: - subsubsection. - -`@asis' - Used following `@table', `@ftable', and `@vtable' to print the - table's first column without highlighting ("as is"). *Note Making - a Two-column Table: Two-column Tables. - -`@author AUTHOR' - Typeset AUTHOR flushleft and underline it. *Note The `@title' and - `@author' Commands: title subtitle author. - -`@b{TEXT}' - Print TEXT in bold font. No effect in Info. *Note Fonts::. - -`@bullet{}' - Generate a large round dot, or the closest possible thing to one. - *Note `@bullet': bullet. - -`@bye' - Stop formatting a file. The formatters do not see the contents of - a file following an `@bye' command. *Note Ending a File::. - -`@c COMMENT' - Begin a comment in Texinfo. The rest of the line does not appear - in either the Info file or the printed manual. A synonym for - `@comment'. *Note General Syntactic Conventions: Conventions. - -`@cartouche' - Highlight an example or quotation by drawing a box with rounded - corners around it. Pair with `@end cartouche'. No effect in - Info. *Note Drawing Cartouches Around Examples: cartouche.) - -`@center LINE-OF-TEXT' - Center the line of text following the command. *Note `@center': - titlefont center sp. - -`@chapheading TITLE' - Print a chapter-like heading in the text, but not in the table of - contents of a printed manual. In Info, the title is underlined - with asterisks. *Note `@majorheading' and `@chapheading': - majorheading & chapheading. - -`@chapter TITLE' - Begin a chapter. The chapter title appears in the table of - contents of a printed manual. In Info, the title is underlined - with asterisks. *Note `@chapter': chapter. - -`@cindex ENTRY' - Add ENTRY to the index of concepts. *Note Defining the Entries of - an Index: Index Entries. - -`@cite{REFERENCE}' - Highlight the name of a book or other reference that lacks a - companion Info file. *Note `@cite': cite. - -`@clear FLAG' - Unset FLAG, preventing the Texinfo formatting commands from - formatting text between subsequent pairs of `@ifset FLAG' and - `@end ifset' commands, and preventing `@value{FLAG}' from - expanding to the value to which FLAG is set. *Note `@set' - `@clear' `@value': set clear value. - -`@code{SAMPLE-CODE}' - Highlight text that is an expression, a syntactically complete - token of a program, or a program name. *Note `@code': code. - -`@comment COMMENT' - Begin a comment in Texinfo. The rest of the line does not appear - in either the Info file or the printed manual. A synonym for `@c'. - *Note General Syntactic Conventions: Conventions. - -`@contents' - Print a complete table of contents. Has no effect in Info, which - uses menus instead. *Note Generating a Table of Contents: - Contents. - -`@copyright{}' - Generate a copyright symbol. *Note `@copyright': copyright symbol. - -`@defcodeindex INDEX-NAME' - Define a new index and its indexing command. Print entries in an - `@code' font. *Note Defining New Indices: New Indices. - -`@defcv CATEGORY CLASS NAME' - Format a description for a variable associated with a class in - object-oriented programming. Takes three arguments: the category - of thing being defined, the class to which it belongs, and its - name. *Note Definition Commands::. - -`@deffn CATEGORY NAME ARGUMENTS...' - Format a description for a function, interactive command, or - similar entity that may take arguments. `@deffn' takes as - arguments the category of entity being described, the name of this - particular entity, and its arguments, if any. *Note Definition - Commands::. - -`@defindex INDEX-NAME' - Define a new index and its indexing command. Print entries in a - roman font. *Note Defining New Indices: New Indices. - -`@defivar CLASS INSTANCE-VARIABLE-NAME' - Format a description for an instance variable in object-oriented - programming. The command is equivalent to `@defcv {Instance - Variable} ...'. *Note Definition Commands::. - -`@defmac MACRO-NAME ARGUMENTS...' - Format a description for a macro. The command is equivalent to - `@deffn Macro ...'. *Note Definition Commands::. - -`@defmethod CLASS METHOD-NAME ARGUMENTS...' - Format a description for a method in object-oriented programming. - The command is equivalent to `@defop Method ...'. Takes as - arguments the name of the class of the method, the name of the - method, and its arguments, if any. *Note Definition Commands::. - -`@defop CATEGORY CLASS NAME ARGUMENTS...' - Format a description for an operation in object-oriented - programming. `@defop' takes as arguments the overall name of the - category of operation, the name of the class of the operation, the - name of the operation, and its arguments, if any. *Note - Definition Commands::. - -`@defopt OPTION-NAME' - Format a description for a user option. The command is equivalent - to `@defvr {User Option} ...'. *Note Definition Commands::. - -`@defspec SPECIAL-FORM-NAME ARGUMENTS...' - Format a description for a special form. The command is - equivalent to `@deffn {Special Form} ...'. *Note Definition - Commands::. - -`@deftp CATEGORY NAME-OF-TYPE ATTRIBUTES...' - Format a description for a data type. `@deftp' takes as arguments - the category, the name of the type (which is a word like `int' or - `float'), and then the names of attributes of objects of that - type. *Note Definition Commands::. - -`@deftypefn CLASSIFICATION DATA-TYPE NAME ARGUMENTS...' - Format a description for a function or similar entity that may take - arguments and that is typed. `@deftypefn' takes as arguments the - classification of entity being described, the type, the name of - the entity, and its arguments, if any. *Note Definition - Commands::. - -`@deftypefun DATA-TYPE FUNCTION-NAME ARGUMENTS...' - Format a description for a function in a typed language. The - command is equivalent to `@deftypefn Function ...'. *Note - Definition Commands::. - -`@deftypevr CLASSIFICATION DATA-TYPE NAME' - Format a description for something like a variable in a typed - language--an entity that records a value. Takes as arguments the - classification of entity being described, the type, and the name of - the entity. *Note Definition Commands::. - -`@deftypevar DATA-TYPE VARIABLE-NAME' - Format a description for a variable in a typed language. The - command is equivalent to `@deftypevr Variable ...'. *Note - Definition Commands::. - -`@defun FUNCTION-NAME ARGUMENTS...' - Format a description for functions. The command is equivalent to - `@deffn Function ...'. *Note Definition Commands::. - -`@defvar VARIABLE-NAME' - Format a description for variables. The command is equivalent to - `@defvr Variable ...'. *Note Definition Commands::. - -`@defvr CATEGORY NAME' - Format a description for any kind of variable. `@defvr' takes as - arguments the category of the entity and the name of the entity. - *Note Definition Commands::. - -`@dfn{TERM}' - Highlight the introductory or defining use of a term. *Note - `@dfn': dfn. - -`@display' - Begin a kind of example. Indent text, do not fill, do not select a - new font. Pair with `@end display'. *Note `@display': display. - -`@dmn{DIMENSION}' - Format a dimension. Cause TeX to insert a narrow space before - DIMENSION. No effect in Info. Use for writing a number followed - by an abbreviation of a dimension name, such as `12pt', written as - `12@dmn{pt}', with no space between the number and the `@dmn' - command. *Note `@dmn': dmn. - -`@dots{}' - Insert an ellipsis: `...'. *Note `@dots': dots. - -`@emph{TEXT}' - Highlight TEXT; text is displayed in *italics* in printed output, - and surrounded by asterisks in Info. *Note Emphasizing Text: - Emphasis. - -`@enumerate [NUMBER-OR-LETTER]' - Begin a numbered list, using `@item' for each entry. Optionally, - start list with NUMBER-OR-LETTER. Pair with `@end enumerate'. - *Note `@enumerate': enumerate. - -`@equiv{}' - Indicate to the reader the exact equivalence of two forms with a - glyph: `=='. *Note Equivalence::. - -`@error{}' - Indicate to the reader with a glyph that the following text is an - error message: `error-->'. *Note Error Glyph::. - -`@evenfooting [LEFT] @| [CENTER] @| [RIGHT]' - Specify page footings for even-numbered (left-hand) pages. Not - relevant to Info. *Note How to Make Your Own Headings: Custom - Headings. - -`@evenheading [LEFT] @| [CENTER] @| [RIGHT]' - Specify page headings for even-numbered (left-hand) pages. Not - relevant to Info. *Note How to Make Your Own Headings: Custom - Headings. - -`@everyfooting [LEFT] @| [CENTER] @| [RIGHT]' - Specify page footings for every page. Not relevant to Info. - *Note How to Make Your Own Headings: Custom Headings. - -`@everyheading [LEFT] @| [CENTER] @| [RIGHT]' - Specify page headings for every page. Not relevant to Info. - *Note How to Make Your Own Headings: Custom Headings. - -`@example' - Begin an example. Indent text, do not fill, and select - fixed-width font. Pair with `@end example'. *Note `@example': - example. - -`@exdent LINE-OF-TEXT' - Remove any indentation a line might have. *Note Undoing the - Indentation of a Line: exdent. - -`@expansion{}' - Indicate the result of a macro expansion to the reader with a - special glyph: `==>'. *Note ==> Indicating an Expansion: - expansion. - -`@file{FILENAME}' - Highlight the name of a file, buffer, node, or directory. *Note - `@file': file. - -`@finalout' - Prevent TeX from printing large black warning rectangles beside - over-wide lines. *Note Overfull hboxes::. - -`@findex ENTRY' - Add ENTRY to the index of functions. *Note Defining the Entries - of an Index: Index Entries. - -`@flushleft' - Left justify every line but leave the right end ragged. Leave - font as is. Pair with `@end flushleft'. *Note `@flushleft' and - `@flushright': flushleft & flushright. - -`@flushright' - Right justify every line but leave the left end ragged. Leave - font as is. Pair with `@end flushright'. *Note `@flushleft' and - `@flushright': flushleft & flushright. - -`@footnote{TEXT-OF-FOOTNOTE}' - Enter a footnote. Footnote text is printed at the bottom of the - page by TeX; Info may format in either `End' node or `Separate' - node style. *Note Footnotes::. - -`@footnotestyle STYLE' - Specify an Info file's footnote style, either `end' for the end - node style or `separate' for the separate node style. *Note - Footnotes::. - -`@format' - Begin a kind of example. Like `@example' or `@display', but do - not narrow the margins and do not select the fixed-width font. - Pair with `@end format'. *Note `@example': example. - -`@ftable FORMATTING-COMMAND' - Begin a two-column table, using `@item' for each entry. - Automatically enter each of the items in the first column into the - index of functions. Pair with `@end ftable'. The same as - `@table', except for indexing. *Note `@ftable' and `@vtable': - ftable vtable. - -`@group' - Hold text together that must appear on one printed page. Pair with - `@end group'. Not relevant to Info. *Note `@group': group. - -`@heading TITLE' - Print an unnumbered section-like heading in the text, but not in - the table of contents of a printed manual. In Info, the title is - underlined with equal signs. *Note Section Commands: - unnumberedsec appendixsec heading. - -`@headings ON-OFF-SINGLE-DOUBLE' - Turn page headings on or off, or specify single-sided or - double-sided page headings for printing. `@headings on' is - synonymous with `@headings double'. *Note The `@headings' - Command: headings on off. - -`@i{TEXT}' - Print TEXT in italic font. No effect in Info. *Note Fonts::. - -`@ifclear FLAG' - If FLAG is cleared, the Texinfo formatting commands format text - between `@ifclear FLAG' and the following `@end ifclear' command. - *Note `@set' `@clear' `@value': set clear value. - -`@ifinfo' - Begin a stretch of text that will be ignored by TeX when it - typesets the printed manual. The text appears only in the Info - file. Pair with `@end ifinfo'. *Note Conditionally Visible Text: - Conditionals. - -`@ifset FLAG' - If FLAG is set, the Texinfo formatting commands format text - between `@ifset FLAG' and the following `@end ifset' command. - *Note `@set' `@clear' `@value': set clear value. - -`@iftex' - Begin a stretch of text that will not appear in the Info file, but - will be processed only by TeX. Pair with `@end iftex'. *Note - Conditionally Visible Text: Conditionals. - -`@ignore' - Begin a stretch of text that will not appear in either the Info - file or the printed output. Pair with `@end ignore'. *Note - Comments and Ignored Text: Comments. - -`@include FILENAME' - Incorporate the contents of the file FILENAME into the Info file - or printed document. *Note Include Files::. - -`@inforef{NODE-NAME, [ENTRY-NAME], INFO-FILE-NAME}' - Make a cross reference to an Info file for which there is no - printed manual. *Note Cross references using `@inforef': inforef. - -`\input MACRO-DEFINITIONS-FILE' - Use the specified macro definitions file. This command is used - only in the first line of a Texinfo file to cause TeX to make use - of the `texinfo' macro definitions file. The backslash in `\input' - is used instead of an `@' because TeX does not properly recognize - `@' until after it has read the definitions file. *Note The - Texinfo File Header: Header. - -`@item' - Indicate the beginning of a marked paragraph for `@itemize' and - `@enumerate'; indicate the beginning of the text of a first column - entry for `@table', `@ftable', and `@vtable'. *Note Lists and - Tables::. - -`@itemize MARK-GENERATING-CHARACTER-OR-COMMAND' - Produce a sequence of indented paragraphs, with a mark inside the - left margin at the beginning of each paragraph. Pair with `@end - itemize'. *Note `@itemize': itemize. - -`@itemx' - Like `@item' but do not generate extra vertical space above the - item text. *Note `@itemx': itemx. - -`@kbd{KEYBOARD-CHARACTERS}' - Indicate text that consists of characters of input to be typed by - users. *Note `@kbd': kbd. - -`@key{KEY-NAME}' - Highlight KEY-NAME, a conventional name for a key on a keyboard. - *Note `@key': key. - -`@kindex ENTRY' - Add ENTRY to the index of keys. *Note Defining the Entries of an - Index: Index Entries. - -`@lisp' - Begin an example of Lisp code. Indent text, do not fill, and - select fixed-width font. Pair with `@end lisp'. *Note `@lisp': - Lisp Example. - -`@majorheading TITLE' - Print a chapter-like heading in the text, but not in the table of - contents of a printed manual. Generate more vertical whitespace - before the heading than the `@chapheading' command. In Info, the - chapter heading line is underlined with asterisks. *Note - `@majorheading' and `@chapheading': majorheading & chapheading. - -`@menu' - Mark the beginning of a menu of nodes in Info. No effect in a - printed manual. Pair with `@end menu'. *Note Menus::. - -`@minus{}' - Generate a minus sign. *Note `@minus': minus. - -`@need N' - Start a new page in a printed manual if fewer than N mils - (thousandths of an inch) remain on the current page. *Note - `@need': need. - -`@node NAME, NEXT, PREVIOUS, UP' - Define the beginning of a new node in Info, and serve as a locator - for references for TeX. *Note `@node': node. - -`@noindent' - Prevent text from being indented as if it were a new paragraph. - *Note `@noindent': noindent. - -`@oddfooting [LEFT] @| [CENTER] @| [RIGHT]' - Specify page footings for odd-numbered (right-hand) pages. Not - relevant to Info. *Note How to Make Your Own Headings: Custom - Headings. - -`@oddheading [LEFT] @| [CENTER] @| [RIGHT]' - Specify page headings for odd-numbered (right-hand) pages. Not - relevant to Info. *Note How to Make Your Own Headings: Custom - Headings. - -`@page' - Start a new page in a printed manual. No effect in Info. *Note - `@page': page. - -`@paragraphindent INDENT' - Indent paragraphs by INDENT number of spaces; delete indentation - if the value of INDENT is 0; and do not change indentation if - INDENT is `asis'. *Note Paragraph Indenting: paragraphindent. - -`@pindex ENTRY' - Add ENTRY to the index of programs. *Note Defining the Entries of - an Index: Index Entries. - -`@point{}' - Indicate the position of point in a buffer to the reader with a - glyph: `-!-'. *Note Indicating Point in a Buffer: Point Glyph. - -`@print{}' - Indicate printed output to the reader with a glyph: `-|'. *Note - Print Glyph::. - -`@printindex INDEX-NAME' - Print an alphabetized two-column index in a printed manual or - generate an alphabetized menu of index entries for Info. *Note - Printing Indices & Menus::. - -`@pxref{NODE-NAME, [ENTRY], [TOPIC-OR-TITLE], [INFO-FILE], [MANUAL]}' - Make a reference that starts with a lower case `see' in a printed - manual. Use within parentheses only. Do not follow command with a - punctuation mark. The Info formatting commands automatically - insert terminating punctuation as needed, which is why you do not - need to insert punctuation. Only the first argument is mandatory. - *Note `@pxref': pxref. - -`@quotation' - Narrow the margins to indicate text that is quoted from another - real or imaginary work. Write command on a line of its own. Pair - with `@end quotation'. *Note `@quotation': quotation. - -`@r{TEXT}' - Print TEXT in roman font. No effect in Info. *Note Fonts::. - -`@ref{NODE-NAME, [ENTRY], [TOPIC-OR-TITLE], [INFO-FILE], [MANUAL]}' - Make a reference. In a printed manual, the reference does not - start with a `See'. Follow command with a punctuation mark. Only - the first argument is mandatory. *Note `@ref': ref. - -`@refill' - In Info, refill and indent the paragraph after all the other - processing has been done. No effect on TeX, which always refills. - This command is no longer needed, since all formatters now - automatically refill. *Note Refilling Paragraphs::. - -`@result{}' - Indicate the result of an expression to the reader with a special - glyph: `=>'. *Note `@result': result. - -`@samp{TEXT}' - Highlight TEXT that is a literal example of a sequence of - characters. Used for single characters, for statements, and often - for entire shell commands. *Note `@samp': samp. - -`@sc{TEXT}' - Set TEXT in a printed output in THE SMALL CAPS FONT and set text - in the Info file in uppercase letters. *Note Smallcaps::. - -`@section TITLE' - Begin a section within a chapter. In a printed manual, the section - title is numbered and appears in the table of contents. In Info, - the title is underlined with equal signs. *Note `@section': - section. - -`@set FLAG [STRING]' - Make FLAG active, causing the Texinfo formatting commands to - format text between subsequent pairs of `@ifset FLAG' and `@end - ifset' commands. Optionally, set value of FLAG to STRING. *Note - `@set' `@clear' `@value': set clear value. - -`@setchapternewpage ON-OFF-ODD' - Specify whether chapters start on new pages, and if so, whether on - odd-numbered (right-hand) new pages. *Note `@setchapternewpage': - setchapternewpage. - -`@setfilename INFO-FILE-NAME' - Provide a name for the Info file. *Note General Syntactic - Conventions: Conventions. - -`@settitle TITLE' - Provide a title for page headers in a printed manual. *Note - General Syntactic Conventions: Conventions. - -`@shortcontents' - Print a short table of contents. Not relevant to Info, which uses - menus rather than tables of contents. A synonym for - `@summarycontents'. *Note Generating a Table of Contents: - Contents. - -`@smallbook' - Cause TeX to produce a printed manual in a 7 by 9.25 inch format - rather than the regular 8.5 by 11 inch format. *Note Printing - Small Books: smallbook. Also, see *Note `@smallexample' and - `@smalllisp': smallexample & smalllisp. - -`@smallexample' - Indent text to indicate an example. Do not fill, select - fixed-width font. In `@smallbook' format, print text in a smaller - font than with `@example'. Pair with `@end smallexample'. *Note - `@smallexample' and `@smalllisp': smallexample & smalllisp. - -`@smalllisp' - Begin an example of Lisp code. Indent text, do not fill, select - fixed-width font. In `@smallbook' format, print text in a smaller - font. Pair with `@end smalllisp'. *Note `@smallexample' and - `@smalllisp': smallexample & smalllisp. - -`@sp N' - Skip N blank lines. *Note `@sp': sp. - -`@strong TEXT' - Emphasize TEXT by typesetting it in a *bold* font for the printed - manual and by surrounding it with asterisks for Info. *Note - Emphasizing Text: emph & strong. - -`@subheading TITLE' - Print an unnumbered subsection-like heading in the text, but not in - the table of contents of a printed manual. In Info, the title is - underlined with hyphens. *Note `@unnumberedsubsec' - `@appendixsubsec' `@subheading': unnumberedsubsec appendixsubsec - subheading. - -`@subsection TITLE' - Begin a subsection within a section. In a printed manual, the - subsection title is numbered and appears in the table of contents. - In Info, the title is underlined with hyphens. *Note - `@subsection': subsection. - -`@subsubheading TITLE' - Print an unnumbered subsubsection-like heading in the text, but - not in the table of contents of a printed manual. In Info, the - title is underlined with periods. *Note The `subsub' Commands: - subsubsection. - -`@subsubsection TITLE' - Begin a subsubsection within a subsection. In a printed manual, - the subsubsection title is numbered and appears in the table of - contents. In Info, the title is underlined with periods. *Note - The `subsub' Commands: subsubsection. - -`@subtitle TITLE' - In a printed manual, set a subtitle in a normal sized font flush to - the right-hand side of the page. Not relevant to Info, which does - not have title pages. *Note `@title' `@subtitle' and `@author' - Commands: title subtitle author. - -`@summarycontents' - Print a short table of contents. Not relevant to Info, which uses - menus rather than tables of contents. A synonym for - `@shortcontents'. *Note Generating a Table of Contents: Contents. - -`@syncodeindex FROM-INDEX INTO-INDEX' - Merge the index named in the first argument into the index named in - the second argument, printing the entries from the first index in - `@code' font. *Note Combining Indices::. - -`@synindex FROM-INDEX INTO-INDEX' - Merge the index named in the first argument into the index named in - the second argument. Do not change the font of FROM-INDEX - entries. *Note Combining Indices::. - -`@t{TEXT}' - Print TEXT in a fixed-width, typewriter-like font. No effect in - Info. *Note Fonts::. - -`@table FORMATTING-COMMAND' - Begin a two-column table, using `@item' for each entry. Write - each first column entry on the same line as `@item'. First column - entries are printed in the font resulting from FORMATTING-COMMAND. - Pair with `@end table'. *Note Making a Two-column Table: - Two-column Tables. Also see *Note `@ftable' and `@vtable': ftable - vtable, and *Note `@itemx': itemx. - -`@TeX{}' - Insert the logo TeX. *Note Inserting TeX and (C): TeX and - copyright. - -`@tex' - Enter TeX completely. Pair with `@end tex'. *Note Using Ordinary - TeX Commands: Using Ordinary TeX Commands. - -`@thischapter' - In a heading or footing, stands for the number and name of the - current chapter, in the format `Chapter 1: Title'. *Note How to - Make Your Own Headings: Custom Headings. - -`@thischaptername' - In a heading or footing, stands for the name of the current - chapter. *Note How to Make Your Own Headings: Custom Headings. - -`@thisfile' - In a heading or footing, stands for the name of the current - `@include' file. Does not insert anything if not within an - `@include' file. *Note How to Make Your Own Headings: Custom - Headings. - -`@thispage' - In a heading or footing, stands for the current page number. - *Note How to Make Your Own Headings: Custom Headings. - -`@thistitle' - In a heading or footing, stands for the name of the document, as - specified by the `@settitle' command. *Note How to Make Your Own - Headings: Custom Headings. - -`@tindex ENTRY' - Add ENTRY to the index of data types. *Note Defining the Entries - of an Index: Index Entries. - -`@title TITLE' - In a printed manual, set a title flush to the left-hand side of the - page in a larger than normal font and underline it with a black - rule. Not relevant to Info, which does not have title pages. - *Note The `@title' `@subtitle' and `@author' Commands: title - subtitle author. - -`@titlefont{TEXT}' - In a printed manual, print TEXT in a larger than normal font. Not - relevant to Info, which does not have title pages. *Note The - `@titlefont' `@center' and `@sp' Commands: titlefont center sp. - -`@titlepage' - Indicate to Texinfo the beginning of the title page. Write - command on a line of its own. Pair with `@end titlepage'. - Nothing between `@titlepage' and `@end titlepage' appears in Info. - *Note `@titlepage': titlepage. - -`@today{}' - Insert the current date, in `1 Jan 1900' style. *Note How to Make - Your Own Headings: Custom Headings. - -`@top TITLE' - In a Texinfo file to be formatted with `makeinfo', identify the - topmost `@node' line in the file, which must be written on the line - immediately preceding the `@top' command. Used for `makeinfo''s - node pointer insertion feature. The title is underlined with - asterisks. Both the `@node' line and the `@top' line normally - should be enclosed by `@ifinfo' and `@end ifinfo'. In TeX and - `texinfo-format-buffer', the `@top' command is merely a synonym - for `@unnumbered'. *Note Creating Pointers with `makeinfo': - makeinfo Pointer Creation. - -`@unnumbered TITLE' - In a printed manual, begin a chapter that appears without chapter - numbers of any kind. The title appears in the table of contents - of a printed manual. In Info, the title is underlined with - asterisks. *Note `@unnumbered' and `@appendix': unnumbered & - appendix. - -`@unnumberedsec TITLE' - In a printed manual, begin a section that appears without section - numbers of any kind. The title appears in the table of contents - of a printed manual. In Info, the title is underlined with equal - signs. *Note Section Commands: unnumberedsec appendixsec heading. - -`@unnumberedsubsec TITLE' - In a printed manual, begin an unnumbered subsection within a - chapter. The title appears in the table of contents of a printed - manual. In Info, the title is underlined with hyphens. *Note - `@unnumberedsubsec' `@appendixsubsec' `@subheading': - unnumberedsubsec appendixsubsec subheading. - -`@unnumberedsubsubsec TITLE' - In a printed manual, begin an unnumbered subsubsection within a - chapter. The title appears in the table of contents of a printed - manual. In Info, the title is underlined with periods. *Note The - `subsub' Commands: subsubsection. - -`@value{FLAG}' - Replace FLAG with the value to which it is set by `@set FLAG'. - *Note `@set' `@clear' `@value': set clear value. - -`@var{METASYNTACTIC-VARIABLE}' - Highlight a metasyntactic variable, which is something that stands - for another piece of text. *Note Indicating Metasyntactic - Variables: var. - -`@vindex ENTRY' - Add ENTRY to the index of variables. *Note Defining the Entries - of an Index: Index Entries. - -`@vskip AMOUNT' - In a printed manual, insert whitespace so as to push text on the - remainder of the page towards the bottom of the page. Used in - formatting the copyright page with the argument `0pt plus 1filll'. - (Note spelling of `filll'.) `@vskip' may be used only in - contexts ignored for Info. *Note The Copyright Page and Printed - Permissions: Copyright & Permissions. - -`@vtable FORMATTING-COMMAND' - Begin a two-column table, using `@item' for each entry. - Automatically enter each of the items in the first column into the - index of variables. Pair with `@end vtable'. The same as - `@table', except for indexing. *Note `@ftable' and `@vtable': - ftable vtable. - -`@w{TEXT}' - Prevent TEXT from being split across two lines. Do not end a - paragraph that uses `@w' with an `@refill' command. In the - Texinfo file, keep TEXT on one line. *Note `@w': w. - -`@xref{NODE-NAME, [ENTRY], [TOPIC-OR-TITLE], [INFO-FILE], [MANUAL]}' - Make a reference that starts with `See' in a printed manual. - Follow command with a punctuation mark. Only the first argument is - mandatory. *Note `@xref': xref. - diff --git a/gnu/usr.bin/texinfo/info-files/texi.info-9 b/gnu/usr.bin/texinfo/info-files/texi.info-9 deleted file mode 100644 index b128db5725df..000000000000 --- a/gnu/usr.bin/texinfo/info-files/texi.info-9 +++ /dev/null @@ -1,1210 +0,0 @@ -This is Info file texi.info, produced by Makeinfo-1.55 from the input -file texi.texi. - - This file documents Texinfo, a documentation system that uses a -single source file to produce both on-line information and a printed -manual. - - Copyright (C) 1988, 1990, 1991, 1992, 1993 Free Software Foundation, -Inc. - - This is the second edition of the Texinfo documentation, -and is consistent with version 2 of `texinfo.tex'. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: texi.info, Node: Tips, Next: Sample Texinfo File, Prev: Command List, Up: Top - -Tips and Hints -************** - - Here are some tips for writing Texinfo documentation: - - * Write in the present tense, not in the past or the future. - - * Write actively! For example, write "We recommend that ..." rather - than "It is recommended that ...". - - * Use 70 or 72 as your fill column. Longer lines are hard to read. - - * Include a copyright notice and copying permissions. - -Index, index, index! -.................... - - Write many index entries, in different ways. Readers like indices; -they are helpful and convenient. - - Although it is easiest to write index entries as you write the body -of the text, some people prefer to write entries afterwards. In either -case, write an entry before the paragraph to which it applies. This -way, an index entry points to the first page of a paragraph that is -split across pages. - - Here are more hints we have found valuable: - - * Write each index entry differently, so each entry refers to a - different place in the document. The index of an Info file lists - only one location for each entry. - - * Write index entries only where a topic is discussed significantly. - For example, it is not useful to index "debugging information" in - a chapter on reporting bugs. Someone who wants to know about - debugging information will certainly not find it in that chapter. - - * Consistently capitalize the first word of every index entry, or - else use lower case. According to convention, you should - capitalize the first word of an index entry. However, this - practice may make an index look crowded. Some writers prefer - lower case. Regardless of which you prefer, choose one style and - stick to it. Mixing the two styles looks bad. - - * Always capitalize or use upper case for those words in an index for - which this is proper, such as names of countries or acronyms. - - * Write the indexing commands that refer to a whole section - immediately after the section command, and write the indexing - commands that refer to the paragraph before the paragraph. - - In the example that follows, a blank line comes after the index - entry for "Leaping": - - @section The Dog and the Fox - @cindex Jumping, in general - @cindex Leaping - - @cindex Dog, lazy, jumped over - @cindex Lazy dog jumped over - @cindex Fox, jumps over dog - @cindex Quick fox jumps over dog - The quick brown fox jumps over the lazy dog. - - (Note that the example shows entries for the same concept that are - written in different ways--`Lazy dog', and `Dog, lazy'--so readers - can look up the concept in different ways.) - -Blank lines -........... - - * Insert a blank line between a sectioning command and the first - following sentence or paragraph, or between the indexing commands - associated with the sectioning command and the first following - sentence or paragraph, as shown in the tip on indexing. - Otherwise, a formatter may fold title and paragraph together. - - * Always insert a blank line before an `@table' command and after an - `@end table' command; but never insert a blank line after an - `@table' command or before an `@end table' command. - - For example, - - Types of fox: - - @table @samp - @item Quick - Jump over lazy dogs. - - @item Brown - Also jump over lazy dogs. - @end table - @noindent - On the other hand, ... - - Insert blank lines before and after `@itemize' ... `@end itemize' - and `@enumerate' ... `@end enumerate' in the same way. - -Complete phrases -................ - - Complete phrases are easier to read than ... - - * Write entries in an itemized list as complete sentences; or at - least, as complete phrases. Incomplete expressions ... awkward - ... like this. - - * Write the prefatory sentence or phrase for a multi-item list or - table as a complete expression. Do not write "You can set:"; - instead, write "You can set these variables:". The former - expression sounds cut off. - -Editions, dates and versions -............................ - - Write the edition and version numbers and date in three places in -every manual: - - 1. In the first `@ifinfo' section, for people reading the Texinfo - file. - - 2. In the `@titlepage' section, for people reading the printed manual. - - 3. In the `Top' node, for people reading the Info file. - -Also, it helps to write a note before the first `@ifinfo' section to -explain what you are doing. - -For example: - - @c ===> NOTE! <== - @c Specify the edition and version numbers and date - @c in *three* places: - @c 1. First ifinfo section 2. title page 3. top node - @c To find the locations, search for !!set - - @ifinfo - @c !!set edition, date, version - This is Edition 4.03, January 1992, - of the @cite{GDB Manual} for GDB Version 4.3. - ... - ---or use `@set' and `@value' (*note `@value' Example: value Example.). - -Definition Commands -................... - - Definition commands are `@deffn', `@defun', `@defmac', and the like, -and enable you to write descriptions in a uniform format. - - * Write just one definition command for each entity you define with a - definition command. The automatic indexing feature creates an - index entry that leads the reader to the definition. - - * Use `@table' ... `@end table' in an appendix that contains a - summary of functions, not `@deffn' or other definition commands. - -Capitalization -.............. - - * Capitalize `Texinfo'; it is a name. Do not write the `x' or `i' - in upper case. - - * Capitalize `Info'; it is a name. - - * Write TeX using the `@TeX{}' command. Note the uppercase `T' and - `X'. This command causes the formatters to typeset the name - according to the wishes of Donald Knuth, who wrote TeX. - -Spaces -...... - - Do not use spaces to format a Texinfo file, except inside of -`@example' ... `@end example' and similar commands. - - For example, TeX fills the following: - - @kbd{C-x v} - @kbd{M-x vc-next-action} - Perform the next logical operation - on the version-controlled file - corresponding to the current buffer. - -so it looks like this: - - `C-x v' `M-x vc-next-action' Perform the next logical operation on - the version-controlled file corresponding to the current buffer. - -In this case, the text should be formatted with `@table', `@item', and -`@itemx', to create a table. - -@code, @samp, @var, and `---' -............................. - - * Use `@code' around Lisp symbols, including command names. For - example, - - The main function is @code{vc-next-action}, ... - - * Avoid putting letters such as `s' immediately after an `@code'. - Such letters look bad. - - * Use `@var' around meta-variables. Do not write angle brackets - around them. - - * Use three hyphens in a row, `---', to indicate a long dash. TeX - typesets these as a long dash and the Info formatters reduce three - hyphens to two. - -Periods Outside of Quotes -......................... - - Place periods and other punctuation marks *outside* of quotations, -unless the punctuation is part of the quotation. This practice goes -against convention, but enables the reader to distinguish between the -contents of the quotation and the whole passage. - - For example, you should write the following sentence with the period -outside the end quotation marks: - - Evidently, `au' is an abbreviation for ``author''. - -since `au' does *not* serve as an abbreviation for `author.' (with a -period following the word). - -Introducing New Terms -..................... - - * Introduce new terms so that a user who does not know them can - understand them from context; or write a definition for the term. - - For example, in the following, the terms "check in", "register" and - "delta" are all appearing for the first time; the example sentence - should be rewritten so they are understandable. - - The major function assists you in checking in a file to your - version control system and registering successive sets of - changes to it as deltas. - - * Use the `@dfn' command around a word being introduced, to indicate - that the user should not expect to know the meaning already, and - should expect to learn the meaning from this passage. - -@pxref -...... - - Absolutely never use `@pxref' except in the special context for -which it is designed: inside parentheses, with the closing parenthesis -following immediately after the closing brace. One formatter -automatically inserts closing punctuation and the other does not. This -means that the output looks right both in printed output and in an Info -file, but only when the command is used inside parentheses. - -Invoking from a Shell -..................... - - You can invoke programs such as Emacs, GCC, and GAWK from a shell. -The documentation for each program should contain a section that -describes this. Unfortunately, if the node names and titles for these -sections are all different, readers find it hard to search for the -section. - - Name such sections with a phrase beginning with the word -`Invoking ...', as in `Invoking Emacs'; this way users can find the -section easily. - -ANSI C Syntax -............. - - When you use `@example' to describe a C function's calling -conventions, use the ANSI C syntax, like this: - - void dld_init (char *@var{path}); - -And in the subsequent discussion, refer to the argument values by -writing the same argument names, again highlighted with `@var'. - - Avoid the obsolete style that looks like this: - - #include <dld.h> - - dld_init (path) - char *path; - - Also, it is best to avoid writing `#include' above the declaration -just to indicate that the function is declared in a header file. The -practice may give the misimpression that the `#include' belongs near -the declaration of the function. Either state explicitly which header -file holds the declaration or, better yet, name the header file used -for a group of functions at the beginning of the section that describes -the functions. - -Bad Examples -............ - - Here are several examples of bad writing to avoid: - - In this example, say, " ... you must `@dfn'{check in} the new -version." That flows better. - - When you are done editing the file, you must perform a - `@dfn'{check in}. - - In the following example, say, "... makes a unified interface such -as VC mode possible." - - SCCS, RCS and other version-control systems all perform similar - functions in broadly similar ways (it is this resemblance which - makes a unified control mode like this possible). - - And in this example, you should specify what `it' refers to: - - If you are working with other people, it assists in coordinating - everyone's changes so they do not step on each other. - -And Finally ... -............... - - * Pronounce TeX as if the `X' were a Greek `chi', as the last sound - in the name `Bach'. But pronounce Texinfo as in `speck': - `teckinfo'. - - * Write notes for yourself at the very end of a Texinfo file after - the `@bye'. None of the formatters process text after the `@bye'; - it is as if the text were within `@ignore' ... `@end ignore'. - - -File: texi.info, Node: Sample Texinfo File, Next: Sample Permissions, Prev: Tips, Up: Top - -A Sample Texinfo File -********************* - - Here is a complete, short sample Texinfo file, without any -commentary. You can see this file, with comments, in the first chapter. -*Note A Short Sample Texinfo File: Short Sample. - - \input texinfo @c -*-texinfo-*- - @c %**start of header - @setfilename sample.info - @settitle Sample Document - @c %**end of header - - @setchapternewpage odd - - @ifinfo - This is a short example of a complete Texinfo file. - - Copyright 1990 Free Software Foundation, Inc. - @end ifinfo - - @titlepage - @sp 10 - @comment The title is printed in a large font. - @center @titlefont{Sample Title} - - @c The following two commands start the copyright page. - @page - @vskip 0pt plus 1filll - Copyright @copyright{} 1990 Free Software Foundation, Inc. - @end titlepage - - @node Top, First Chapter, (dir), (dir) - @comment node-name, next, previous, up - - @menu - * First Chapter:: The first chapter is the - only chapter in this sample. - * Concept Index:: This index has two entries. - @end menu - - @node First Chapter, Concept Index, Top, Top - @comment node-name, next, previous, up - @chapter First Chapter - @cindex Sample index entry - - This is the contents of the first chapter. - @cindex Another sample index entry - - Here is a numbered list. - - @enumerate - @item - This is the first item. - - @item - This is the second item. - @end enumerate - - The @code{makeinfo} and @code{texinfo-format-buffer} - commands transform a Texinfo file such as this into - an Info file; and @TeX{} typesets it for a printed - manual. - - @node Concept Index, , First Chapter, Top - @comment node-name, next, previous, up - @unnumbered Concept Index - - @printindex cp - - @contents - @bye - - -File: texi.info, Node: Sample Permissions, Next: Include Files, Prev: Sample Texinfo File, Up: Top - -Sample Permissions -****************** - - Texinfo files should contain sections that tell the readers that they -have the right to copy and distribute the Texinfo file, the Info file, -and the printed manual. - - Also, if you are writing a manual about software, you should explain -that the software is free and either include the GNU General Public -License (GPL) or provide a reference to it. *Note Distribution: -(emacs)Distrib, for an example of the text that could be used in the -software "Distribution", "General Public License", and "NO WARRANTY" -sections of a document. *Note Texinfo Copying Conditions: Copying, for -an example of a brief explanation of how the copying conditions provide -you with rights. - -* Menu: - -* Inserting Permissions:: How to put permissions in your document. -* ifinfo Permissions:: Sample `ifinfo' copying permissions. -* Titlepage Permissions:: Sample Titlepage copying permissions. - - -File: texi.info, Node: Inserting Permissions, Next: ifinfo Permissions, Up: Sample Permissions - -Inserting Permissions -===================== - - In a Texinfo file, the first `@ifinfo' section usually begins with a -line that says what the file documents. This is what a person reading -the unprocessed Texinfo file or using the advanced Info command `g *' -sees first. *note Advanced Info commands: (info)Expert, for more -information. (A reader using the regular Info commands usually starts -reading at the first node and skips this first section, which is not in -a node.) - - In the `@ifinfo' section, the summary sentence is followed by a -copyright notice and then by the copying permission notice. One of the -copying permission paragraphs is enclosed in `@ignore' and `@end -ignore' commands. This paragraph states that the Texinfo file can be -processed through TeX and printed, provided the printed manual carries -the proper copying permission notice. This paragraph is not made part -of the Info file since it is not relevant to the Info file; but it is a -mandatory part of the Texinfo file since it permits people to process -the Texinfo file in TeX and print the results. - - In the printed manual, the Free Software Foundation copying -permission notice follows the copyright notice and publishing -information and is located within the region delineated by the -`@titlepage' and `@end titlepage' commands. The copying permission -notice is exactly the same as the notice in the `@ifinfo' section -except that the paragraph enclosed in `@ignore' and `@end ignore' -commands is not part of the notice. - - To make it simple to insert a permission notice into each section of -the Texinfo file, sample permission notices for each section are -reproduced in full below. - - Note that you may need to specify the correct name of a section -mentioned in the permission notice. For example, in `The GDB Manual', -the name of the section referring to the General Public License is -called the "GDB General Public License", but in the sample shown below, -that section is referred to generically as the "GNU General Public -License". If the Texinfo file does not carry a copy of the General -Public License, leave out the reference to it, but be sure to include -the rest of the sentence. - - -File: texi.info, Node: ifinfo Permissions, Next: Titlepage Permissions, Prev: Inserting Permissions, Up: Sample Permissions - -`ifinfo' Copying Permissions -============================ - - In the `@ifinfo' section of a Texinfo file, the standard Free -Software Foundation permission notice reads as follows: - - This file documents ... - - Copyright 1992 Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim - copies of this manual provided the copyright notice and - this permission notice are preserved on all copies. - - @ignore - Permission is granted to process this file through TeX - and print the results, provided the printed document - carries a copying permission notice identical to this - one except for the removal of this paragraph (this - paragraph not being relevant to the printed manual). - - @end ignore - Permission is granted to copy and distribute modified - versions of this manual under the conditions for - verbatim copying, provided also that the sections - entitled ``Copying'' and ``GNU General Public License'' - are included exactly as in the original, and provided - that the entire resulting derived work is distributed - under the terms of a permission notice identical to this - one. - - Permission is granted to copy and distribute - translations of this manual into another language, - under the above conditions for modified versions, - except that this permission notice may be stated in a - translation approved by the Free Software Foundation. - - -File: texi.info, Node: Titlepage Permissions, Prev: ifinfo Permissions, Up: Sample Permissions - -Titlepage Copying Permissions -============================= - - In the `@titlepage' section of a Texinfo file, the standard Free -Software Foundation copying permission notice follows the copyright -notice and publishing information. The standard phrasing is as follows: - - Permission is granted to make and distribute verbatim - copies of this manual provided the copyright notice and - this permission notice are preserved on all copies. - - Permission is granted to copy and distribute modified - versions of this manual under the conditions for - verbatim copying, provided also that the sections - entitled ``Copying'' and ``GNU General Public License'' - are included exactly as in the original, and provided - that the entire resulting derived work is distributed - under the terms of a permission notice identical to this - one. - - Permission is granted to copy and distribute - translations of this manual into another language, - under the above conditions for modified versions, - except that this permission notice may be stated in a - translation approved by the Free Software Foundation. - - -File: texi.info, Node: Include Files, Next: Headings, Prev: Sample Permissions, Up: Top - -Include Files -************* - - When TeX or an Info formatting command sees an `@include' command in -a Texinfo file, it processes the contents of the file named by the -command and incorporates them into the DVI or Info file being created. -Index entries from the included file are incorporated into the indices -of the output file. - - Include files let you keep a single large document as a collection of -conveniently small parts. - -* Menu: - -* Using Include Files:: How to use the `@include' command. -* texinfo-multiple-files-update:: How to create and update nodes and - menus when using included files. -* Include File Requirements:: What `texinfo-multiple-files-update' expects. -* Sample Include File:: A sample outer file with included files - within it; and a sample included file. -* Include Files Evolution:: How use of the `@include' command - has changed over time. - - -File: texi.info, Node: Using Include Files, Next: texinfo-multiple-files-update, Up: Include Files - -How to Use Include Files -======================== - - To include another file within a Texinfo file, write the `@include' -command at the beginning of a line and follow it on the same line by -the name of a file to be included. For example: - - @include buffers.texi - - An included file should simply be a segment of text that you expect -to be included as is into the overall or "outer" Texinfo file; it -should not contain the standard beginning and end parts of a Texinfo -file. In particular, you should not start an included file with a line -saying `\input texinfo'; if you do, that phrase is inserted into the -output file as is. Likewise, you should not end an included file with -an `@bye' command; nothing after `@bye' is formatted. - - In the past, you were required to write an `@setfilename' line at the -beginning of an included file, but no longer. Now, it does not matter -whether you write such a line. If an `@setfilename' line exists in an -included file, it is ignored. - - Conventionally, an included file begins with an `@node' line that is -followed by an `@chapter' line. Each included file is one chapter. -This makes it easy to use the regular node and menu creating and -updating commands to create the node pointers and menus within the -included file. However, the simple Emacs node and menu creating and -updating commands do not work with multiple Texinfo files. Thus you -cannot use these commands to fill in the `Next', `Previous', and `Up' -pointers of the `@node' line that begins the included file. Also, you -cannot use the regular commands to create a master menu for the whole -file. Either you must insert the menus and the `Next', `Previous', and -`Up' pointers by hand, or you must use the GNU Emacs Texinfo mode -command, `texinfo-multiple-files-update', that is designed for -`@include' files. - - -File: texi.info, Node: texinfo-multiple-files-update, Next: Include File Requirements, Prev: Using Include Files, Up: Include Files - -`texinfo-multiple-files-update' -=============================== - - GNU Emacs Texinfo mode provides a command to handle included files -called `texinfo-multiple-files-update'. This command creates or -updates `Next', `Previous', and `Up' pointers of included files as well -as those in the outer or overall Texinfo file, and it creates or -updates a main menu in the outer file. Depending whether you call it -with optional arguments, the command updates only the pointers in the -first `@node' line of the included files or all of them: - -`M-x texinfo-multiple-files-update' - Called without any arguments: - - - Create or update the `Next', `Previous', and `Up' pointers of - the first `@node' line in each file included in an outer or - overall Texinfo file. - - - Create or update the `Top' level node pointers of the outer or - overall file. - - - Create or update a main menu in the outer file. - -`C-u M-x texinfo-multiple-files-update' - Called with `C-u' as a prefix argument: - - - Create or update pointers in the first `@node' line in each - included file. - - - Create or update the `Top' level node pointers of the outer - file. - - - Create and insert a master menu in the outer file. The - master menu is made from all the menus in all the included - files. - -`C-u 8 M-x texinfo-multiple-files-update' - Called with a numeric prefix argument, such as `C-u 8': - - - Create or update *all* the `Next', `Previous', and `Up' - pointers of all the included files. - - - Create or update *all* the menus of all the included files. - - - Create or update the `Top' level node pointers of the outer or - overall file. - - - And then create a master menu in the outer file. This is - similar to invoking `texinfo-master-menu' with an argument - when you are working with just one file. - - Note the use of the prefix argument in interactive use: with a -regular prefix argument, just `C-u', the -`texinfo-multiple-files-update' command inserts a master menu; with a -numeric prefix argument, such as `C-u 8', the command updates *every* -pointer and menu in *all* the files and then inserts a master menu. - - -File: texi.info, Node: Include File Requirements, Next: Sample Include File, Prev: texinfo-multiple-files-update, Up: Include Files - -Include File Requirements -========================= - - If you plan to use the `texinfo-multiple-files-update' command, the -outer Texinfo file that lists included files within it should contain -nothing but the beginning and end parts of a Texinfo file, and a number -of `@include' commands listing the included files. It should not even -include indices, which should be listed in an included file of their -own. - - Moreover, each of the included files must contain exactly one highest -level node (conventionally, `@chapter' or equivalent), and this node -must be the first node in the included file. Furthermore, each of -these highest level nodes in each included file must be at the same -hierarchical level in the file structure. Usually, each is an -`@chapter', an `@appendix', or an `@unnumbered' node. Thus, normally, -each included file contains one, and only one, chapter or -equivalent-level node. - - The outer file should contain only *one* node, the `Top' node. It -should *not* contain any nodes besides the single `Top' node. The -`texinfo-multiple-files-update' command will not process them. - - -File: texi.info, Node: Sample Include File, Next: Include Files Evolution, Prev: Include File Requirements, Up: Include Files - -Sample File with `@include' -=========================== - - Here is an example of a complete outer Texinfo file with `@include' -files within it before running `texinfo-multiple-files-update', which -would insert a main or master menu: - - \input texinfo @c -*-texinfo-*- - @setfilename include-example.info - @settitle Include Example - - @setchapternewpage odd - @titlepage - @sp 12 - @center @titlefont{Include Example} - @sp 2 - @center by Whom Ever - - @page - @vskip 0pt plus 1filll - Copyright @copyright{} 1990 Free Software Foundation, Inc. - @end titlepage - - @ifinfo - @node Top, First, (dir), (dir) - @top Master Menu - @end ifinfo - - @include foo.texinfo - @include bar.texinfo - @include concept-index.texinfo - - @summarycontents - @contents - - @bye - - An included file, such as `foo.texinfo', might look like this: - - @node First, Second, , Top - @chapter First Chapter - - Contents of first chapter ... - - The full contents of `concept-index.texinfo' might be as simple as -this: - - @node Concept Index, , Second, Top - @unnumbered Concept Index - - @printindex cp - - The outer Texinfo source file for `The GNU Emacs Lisp Reference -Manual' is named `elisp.texi'. This outer file contains a master menu -with 417 entries and a list of 41 `@include' files. - - -File: texi.info, Node: Include Files Evolution, Prev: Sample Include File, Up: Include Files - -Evolution of Include Files -========================== - - When Info was first created, it was customary to create many small -Info files on one subject. Each Info file was formatted from its own -Texinfo source file. This custom meant that Emacs did not need to make -a large buffer to hold the whole of a large Info file when someone -wanted information; instead, Emacs allocated just enough memory for the -small Info file that contained the particular information sought. This -way, Emacs could avoid wasting memory. - - References from one file to another were made by referring to the -file name as well as the node name. (*Note Referring to Other Info -Files: Other Info Files. Also, see *Note `@xref' with Four and Five -Arguments: Four and Five Arguments.) - - Include files were designed primarily as a way to create a single, -large printed manual out of several smaller Info files. In a printed -manual, all the references were within the same document, so TeX could -automatically determine the references' page numbers. The Info -formatting commands used include files only for creating joint indices; -each of the individual Texinfo files had to be formatted for Info -individually. (Each, therefore, required its own `@setfilename' line.) - - However, because large Info files are now split automatically, it is -no longer necessary to keep them small. - - Nowadays, multiple Texinfo files are used mostly for large documents, -such as `The GNU Emacs Lisp Reference Manual', and for projects in -which several different people write different sections of a document -simultaneously. - - In addition, the Info formatting commands have been extended to work -with the `@include' command so as to create a single large Info file -that is split into smaller files if necessary. This means that you can -write menus and cross references without naming the different Texinfo -files. - - -File: texi.info, Node: Headings, Next: Catching Mistakes, Prev: Include Files, Up: Top - -Page Headings -************* - - Most printed manuals contain headings along the top of every page -except the title and copyright pages. Some manuals also contain -footings. (Headings and footings have no meaning to Info, which is not -paginated.) - -* Menu: - -* Headings Introduced:: Conventions for using page headings. -* Heading Format:: Standard page heading formats. -* Heading Choice:: How to specify the type of page heading. -* Custom Headings:: How to create your own headings and footings. - - -File: texi.info, Node: Headings Introduced, Next: Heading Format, Up: Headings - -Headings Introduced -=================== - - Texinfo provides standard page heading formats for manuals that are -printed on one side of each sheet of paper and for manuals that are -printed on both sides of the paper. Usually, you will use one or other -of these formats, but you can specify your own format, if you wish. - - In addition, you can specify whether chapters should begin on a new -page, or merely continue the same page as the previous chapter; and if -chapters begin on new pages, you can specify whether they must be -odd-numbered pages. - - By convention, a book is printed on both sides of each sheet of -paper. When you open a book, the right-hand page is odd-numbered, and -chapters begin on right-hand pages--a preceding left-hand page is left -blank if necessary. Reports, however, are often printed on just one -side of paper, and chapters begin on a fresh page immediately following -the end of the preceding chapter. In short or informal reports, -chapters often do not begin on a new page at all, but are separated -from the preceding text by a small amount of whitespace. - - The `@setchapternewpage' command controls whether chapters begin on -new pages, and whether one of the standard heading formats is used. In -addition, Texinfo has several heading and footing commands that you can -use to generate your own heading and footing formats. - - In Texinfo, headings and footings are single lines at the tops and -bottoms of pages; you cannot create multiline headings or footings. -Each header or footer line is divided into three parts: a left part, a -middle part, and a right part. Any part, or a whole line, may be left -blank. Text for the left part of a header or footer line is set -flushleft; text for the middle part is centered; and, text for the -right part is set flushright. - - -File: texi.info, Node: Heading Format, Next: Heading Choice, Prev: Headings Introduced, Up: Headings - -Standard Heading Formats -======================== - - Texinfo provides two standard heading formats, one for manuals -printed on one side of each sheet of paper, and the other for manuals -printed on both sides of the paper. - - By default, nothing is specified for the footing of a Texinfo file, -so the footing remains blank. - - The standard format for single-sided printing consists of a header -line in which the left-hand part contains the name of the chapter, the -central part is blank, and the right-hand part contains the page number. - - A single-sided page looks like this: - - _______________________ - | | - | chapter page number | - | | - | Start of text ... | - | ... | - | | - - The standard format for two-sided printing depends on whether the -page number is even or odd. By convention, even-numbered pages are on -the left- and odd-numbered pages are on the right. (TeX will adjust the -widths of the left- and right-hand margins. Usually, widths are -correct, but during double-sided printing, it is wise to check that -pages will bind properly--sometimes a printer will produce output in -which the even-numbered pages have a larger right-hand margin than the -odd-numbered pages.) - - In the standard double-sided format, the left part of the left-hand -(even-numbered) page contains the page number, the central part is -blank, and the right part contains the title (specified by the -`@settitle' command). The left part of the right-hand (odd-numbered) -page contains the name of the chapter, the central part is blank, and -the right part contains the page number. - - Two pages, side by side as in an open book, look like this: - - _______________________ _______________________ - | | | | - | page number title | | chapter page number | - | | | | - | Start of text ... | | More text ... | - | ... | | ... | - | | | | - -The chapter name is preceded by the word `Chapter', the chapter number -and a colon. This makes it easier to keep track of where you are in -the manual. - - -File: texi.info, Node: Heading Choice, Next: Custom Headings, Prev: Heading Format, Up: Headings - -Specifying the Type of Heading -============================== - - TeX does not begin to generate page headings for a standard Texinfo -file until it reaches the `@end titlepage' command. Thus, the title -and copyright pages are not numbered. The `@end titlepage' command -causes TeX to begin to generate page headings according to a standard -format specified by the `@setchapternewpage' command that precedes the -`@titlepage' section. - - There are four possibilities: - -No `@setchapternewpage' command - Cause TeX to specify the single-sided heading format, with chapters - on new pages. This is the same as `@setchapternewpage on'. - -`@setchapternewpage on' - Specify the single-sided heading format, with chapters on new - pages. - -`@setchapternewpage off' - Cause TeX to start a new chapter on the same page as the last page - of the preceding chapter, after skipping some vertical whitespace. - Also cause TeX to typeset for single-sided printing. (You can - override the headers format with the `@headings double' command; - see *Note The `@headings' Command: headings on off.) - -`@setchapternewpage odd' - Specify the double-sided heading format, with chapters on new - pages. - -Texinfo lacks an `@setchapternewpage even' command. - - -File: texi.info, Node: Custom Headings, Prev: Heading Choice, Up: Headings - -How to Make Your Own Headings -============================= - - You can use the standard headings provided with Texinfo or specify -your own. - - Texinfo provides six commands for specifying headings and footings. -The `@everyheading' command and `@everyfooting' command generate page -headers and footers that are the same for both even- and odd-numbered -pages. The `@evenheading' command and `@evenfooting' command generate -headers and footers for even-numbered (left-hand) pages; and the -`@oddheading' command and `@oddfooting' command generate headers and -footers for odd-numbered (right-hand) pages. - - Write custom heading specifications in the Texinfo file immediately -after the `@end titlepage' command. Enclose your specifications -between `@iftex' and `@end iftex' commands since the -`texinfo-format-buffer' command may not recognize them. Also, you must -cancel the predefined heading commands with the `@headings off' command -before defining your own specifications. - - Here is how to tell TeX to place the chapter name at the left, the -page number in the center, and the date at the right of every header -for both even- and odd-numbered pages: - - @iftex - @headings off - @everyheading @thischapter @| @thispage @| @today{} - @end iftex - -You need to divide the left part from the central part and the central -part from the right had part by inserting `@|' between parts. -Otherwise, the specification command will not be able to tell where the -text for one part ends and the next part begins. - - Each part can contain text or @-commands. The text is printed as if -the part were within an ordinary paragraph in the body of the page. -The @-commands replace themselves with the page number, date, chapter -name, or whatever. - - Here are the six heading and footing commands: - -`@everyheading LEFT @| CENTER @| RIGHT' -`@everyfooting LEFT @| CENTER @| RIGHT' - The `every' commands specify the format for both even- and - odd-numbered pages. These commands are for documents that are - printed on one side of each sheet of paper, or for documents in - which you want symmetrical headers or footers. - -`@evenheading LEFT @| CENTER @| RIGHT' -`@oddheading LEFT @| CENTER @| RIGHT' -`@evenfooting LEFT @| CENTER @| RIGHT' -`@oddfooting LEFT @| CENTER @| RIGHT' - The `even' and `odd' commands specify the format for even-numbered - pages and odd-numbered pages. These commands are for books and - manuals that are printed on both sides of each sheet of paper. - - Use the `@this...' series of @-commands to provide the names of -chapters and sections and the page number. You can use the `@this...' -commands in the left, center, or right portions of headers and footers, -or anywhere else in a Texinfo file so long as they are between `@iftex' -and `@end iftex' commands. - - Here are the `@this...' commands: - -`@thispage' - Expands to the current page number. - -`@thischaptername' - Expands to the name of the current chapter. - -`@thischapter' - Expands to the number and name of the current chapter, in the - format `Chapter 1: Title'. - -`@thistitle' - Expands to the name of the document, as specified by the - `@settitle' command. - -`@thisfile' - For `@include' files only: expands to the name of the current - `@include' file. If the current Texinfo source file is not an - `@include' file, this command has no effect. This command does - *not* provide the name of the current Texinfo source file unless - it is an `@include' file. (*Note Include Files::, for more - information about `@include' files.) - -You can also use the `@today{}' command, which expands to the current -date, in `1 Jan 1900' format. - - Other @-commands and text are printed in a header or footer just as -if they were in the body of a page. It is useful to incorporate text, -particularly when you are writing drafts: - - @iftex - @headings off - @everyheading @emph{Draft!} @| @thispage @| @thischapter - @everyfooting @| @| Version: 0.27: @today{} - @end iftex - - Beware of overlong titles: they may overlap another part of the -header or footer and blot it out. - - -File: texi.info, Node: Catching Mistakes, Next: Refilling Paragraphs, Prev: Headings, Up: Top - -Formatting Mistakes -******************* - - Besides mistakes in the content of your documentation, there are two -kinds of mistake you can make with Texinfo: you can make mistakes with -@-commands, and you can make mistakes with the structure of the nodes -and chapters. - - Emacs has two tools for catching the @-command mistakes and two for -catching structuring mistakes. - - For finding problems with @-commands, you can run TeX or a region -formatting command on the region that has a problem; indeed, you can -run these commands on each region as you write it. - - For finding problems with the structure of nodes and chapters, you -can use `C-c C-s' (`texinfo-show-structure') and the related `occur' -command and you can use the `M-x Info-validate' command. - -* Menu: - -* makeinfo preferred:: `makeinfo' finds errors. -* Debugging with Info:: How to catch errors with Info formatting. -* Debugging with TeX:: How to catch errors with TeX formatting. -* Using texinfo-show-structure:: How to use `texinfo-show-structure'. -* Using occur:: How to list all lines containing a pattern. -* Running Info-Validate:: How to find badly referenced nodes. - - -File: texi.info, Node: makeinfo preferred, Next: Debugging with Info, Up: Catching Mistakes - -`makeinfo' Find Errors -====================== - - The `makeinfo' program does an excellent job of catching errors and -reporting them--far better than either the `texinfo-format-region' or -the `texinfo-format-buffer' command. In addition, the various -functions for automatically creating and updating node pointers and -menus remove many opportunities for human error. - - If you can, use the updating commands to create and insert pointers -and menus. These prevent many errors. Then use `makeinfo' (or its -Texinfo mode manifestations, `makeinfo-region' and `makeinfo-buffer') -to format your file and check for other errors. This is the best way -to work with Texinfo. But if you cannot use `makeinfo', or your -problem is very puzzling, then you may want to use the tools described -in this appendix. - - -File: texi.info, Node: Debugging with Info, Next: Debugging with TeX, Prev: makeinfo preferred, Up: Catching Mistakes - -Catching Errors with Info Formatting -==================================== - - After you have written part of a Texinfo file, you can use the -`texinfo-format-region' or the `makeinfo-region' command to see whether -the region formats properly. - - Most likely, however, you are reading this section because for some -reason you cannot use the `makeinfo-region' command; therefore, the -rest of this section presumes that you are using -`texinfo-format-region'. - - If you make a mistake with an @-command, `texinfo-format-region' -will stop processing at or after the error and display an error -message. To see where in the buffer the error occurred, switch to the -`*Info Region*' buffer; the cursor will be in a position that is after -the location of the error. Also, the text will not be formatted after -the place where the error occurred (or more precisely, where it was -detected). - - For example, if you accidentally end a menu with the command `@end -menus' with an `s' on the end, instead of with `@end menu', you will -see an error message that says: - - @end menus is not handled by texinfo - -The cursor will stop at the point in the buffer where the error occurs, -or not long after it. The buffer will look like this: - - ---------- Buffer: *Info Region* ---------- - * Menu: - - * Using texinfo-show-structure:: How to use - `texinfo-show-structure' - to catch mistakes. - * Running Info-Validate:: How to check for - unreferenced nodes. - @end menus - -!- - ---------- Buffer: *Info Region* ---------- - - The `texinfo-format-region' command sometimes provides slightly odd -error messages. For example, the following cross reference fails to -format: - - (@xref{Catching Mistakes, for more info.) - -In this case, `texinfo-format-region' detects the missing closing brace -but displays a message that says `Unbalanced parentheses' rather than -`Unbalanced braces'. This is because the formatting command looks for -mismatches between braces as if they were parentheses. - - Sometimes `texinfo-format-region' fails to detect mistakes. For -example, in the following, the closing brace is swapped with the -closing parenthesis: - - (@xref{Catching Mistakes), for more info.} - -Formatting produces: - (*Note for more info.: Catching Mistakes) - - The only way for you to detect this error is to realize that the -reference should have looked like this: - - (*Note Catching Mistakes::, for more info.) - - Incidentally, if you are reading this node in Info and type `f RET' -(`Info-follow-reference'), you will generate an error message that says: - - No such node: "Catching Mistakes) The only way ... - -This is because Info perceives the example of the error as the first -cross reference in this node and if you type a RET immediately after -typing the Info `f' command, Info will attempt to go to the referenced -node. If you type `f catch TAB RET', Info will complete the node name -of the correctly written example and take you to the `Catching -Mistakes' node. (If you try this, you can return from the `Catching -Mistakes' node by typing `l' (`Info-last').) - diff --git a/gnu/usr.bin/texinfo/info/info-stnd.info b/gnu/usr.bin/texinfo/info/info-stnd.info deleted file mode 100644 index 31f486a45cb4..000000000000 --- a/gnu/usr.bin/texinfo/info/info-stnd.info +++ /dev/null @@ -1,1259 +0,0 @@ -This is Info file info-stnd.info, produced by Makeinfo-1.55 from the -input file info-stnd.texi. - -This file documents GNU Info, a program for viewing the on-line -formatted versions of Texinfo files. This documentation is different -from the documentation for the Info reader that is part of GNU Emacs. -If you do not know how to use Info, but have a working Info reader, you -should read that documentation first. - -Copyright (C) 1992, 1993 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -sections entitled "Copying" and "GNU General Public License" are -included exactly as in the original, and provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation -approved by the Free Software Foundation. - - -File: info-stnd.info, Node: Top, Next: What is Info, Prev: (dir), Up: (dir) - -The GNU Info Program -******************** - -This file documents GNU Info, a program for viewing the on-line -formatted versions of Texinfo files, version 2.9. This documentation -is different from the documentation for the Info reader that is part of -GNU Emacs. - -* Menu: - -* What is Info:: -* Options:: Options you can pass on the command line. -* Cursor Commands:: Commands which move the cursor within a node. -* Scrolling Commands:: Commands for moving the node around - in a window. -* Node Commands:: Commands for selecting a new node. -* Searching Commands:: Commands for searching an Info file. -* Xref Commands:: Commands for selecting cross references. -* Window Commands:: Commands which manipulate multiple windows. -* Printing Nodes:: How to print out the contents of a node. -* Miscellaneous Commands:: A few commands that defy categories. -* Variables:: How to change the default behavior of Info. -* GNU Info Global Index:: Global index containing keystrokes, - command names, variable names, - and general concepts. - - -File: info-stnd.info, Node: What is Info, Next: Options, Prev: Top, Up: Top - -What is Info? -************* - -"Info" is a program which is used to view Info files on an ASCII -terminal. "Info files" are the result of processing Texinfo files with -the program `makeinfo' or with one of the Emacs commands, such as `M-x -texinfo-format-buffer'. Texinfo itself is a documentation system that -uses a single source file to produce both on-line information and -printed output. You can typeset and print the files that you read in -Info. - - -File: info-stnd.info, Node: Options, Next: Cursor Commands, Prev: What is Info, Up: Top - -Command Line Options -******************** - -GNU Info accepts several options to control the initial node being -viewed, and to specify which directories to search for Info files. Here -is a template showing an invocation of GNU Info from the shell: - - info [--OPTION-NAME OPTION-VALUE] MENU-ITEM... - -The following OPTION-NAMES are available when invoking Info from the -shell: - -`--directory DIRECTORY-PATH' -`-d DIRECTORY-PATH' - Add DIRECTORY-PATH to the list of directory paths searched when - Info needs to find a file. You may issue `--directory' multiple - times; once for each directory which contains Info files. - Alternatively, you may specify a value for the environment variable - `INFOPATH'; if `--directory' is not given, the value of `INFOPATH' - is used. The value of `INFOPATH' is a colon separated list of - directory names. If you do not supply `INFOPATH' or - `--directory-path', Info uses a default path. - -`--file FILENAME' -`-f FILENAME' - Specify a particular Info file to visit. By default, Info visits - the file `dir'; if you use this option, Info will start with - `(FILENAME)Top' as the first file and node. - -`--node NODENAME' -`-n NODENAME' - Specify a particular node to visit in the initial file that Info - loads. This is especially useful in conjunction with `--file'(1) - (*note Options-Footnotes::). You may specify `--node' multiple - times; for an interactive Info, each NODENAME is visited in its - own window, for a non-interactive Info (such as when `--output' is - given) each NODENAME is processed sequentially. - -`--output FILENAME' -`-o FILENAME' - Specify FILENAME as the name of a file to which to direct output. - Each node that Info visits will be output to FILENAME instead of - interactively viewed. A value of `-' for FILENAME specifies the - standard output. - -`--subnodes' - This option only has meaning when given in conjunction with - `--output'. It means to recursively output the nodes appearing in - the menus of each node being output. Menu items which resolve to - external Info files are not output, and neither are menu items - which are members of an index. Each node is only output once. - -`--help' -`-h' - Produces a relatively brief description of the available Info - options. - -`--version' - Prints the version information of Info and exits. - -`MENU-ITEM' - Info treats its remaining arguments as the names of menu items. - The first argument is a menu item in the initial node visited, - while the second argument is a menu item in the first argument's - node. You can easily move to the node of your choice by - specifying the menu names which describe the path to that node. - For example, - - info emacs buffers - - first selects the menu item `Emacs' in the node `(dir)Top', and - then selects the menu item `Buffers' in the node `(emacs)Top'. - - -File: info-stnd.info, Node: Options-Footnotes, Up: Options - -(1) Of course, you can specify both the file and node in a `--node' -command; but don't forget to escape the open and close parentheses from -the shell as in: `info --node '(emacs)Buffers'' - - -File: info-stnd.info, Node: Cursor Commands, Next: Scrolling Commands, Prev: Options, Up: Top - -Moving the Cursor -***************** - -Many people find that reading screens of text page by page is made -easier when one is able to indicate particular pieces of text with some -kind of pointing device. Since this is the case, GNU Info (both the -Emacs and standalone versions) have several commands which allow you to -move the cursor about the screen. The notation used in this manual to -describe keystrokes is identical to the notation used within the Emacs -manual, and the GNU Readline manual. *Note Character Conventions: -(emacs)Characters, if you are unfamiliar with the notation. - -The following table lists the basic cursor movement commands in Info. -Each entry consists of the key sequence you should type to execute the -cursor movement, the `M-x'(1) (*note Cursor Commands-Footnotes::) -command name (displayed in parentheses), and a short description of -what the command does. All of the cursor motion commands can take an -"numeric" argument (*note `universal-argument': Miscellaneous -Commands.), to find out how to supply them. With a numeric argument, -the motion commands are simply executed that many times; for example, a -numeric argument of 4 given to `next-line' causes the cursor to move -down 4 lines. With a negative numeric argument, the motion is -reversed; an argument of -4 given to the `next-line' command would -cause the cursor to move *up* 4 lines. - -`C-n' (`next-line') - Move the cursor down to the next line. - -`C-p' (`prev-line') - Move the cursor up to the previous line. - -`C-a' (`beginning-of-line') - Move the cursor to the start of the current line. - -`C-e' (`end-of-line') - Move the cursor to the end of the current line. - -`C-f' (`forward-char') - Move the cursor forward a character. - -`C-b' (`backward-char') - Move the cursor backward a character. - -`M-f' (`forward-word') - Move the cursor forward a word. - -`M-b' (`backward-word') - Move the cursor backward a word. - -`M-<' (`beginning-of-node') -`b' - Move the cursor to the start of the current node. - -`M->' (`end-of-node') - Move the cursor to the end of the current node. - -`M-r' (`move-to-window-line') - Move the cursor to a specific line of the window. Without a - numeric argument, `M-r' moves the cursor to the start of the line - in the center of the window. With a numeric argument of N, `M-r' - moves the cursor to the start of the Nth line in the window. - - -File: info-stnd.info, Node: Cursor Commands-Footnotes, Up: Cursor Commands - -(1) `M-x' is also a command; it invokes `execute-extended-command'. -*Note Executing an extended command: (emacs)M-x, for more detailed -information. - - -File: info-stnd.info, Node: Scrolling Commands, Next: Node Commands, Prev: Cursor Commands, Up: Top - -Moving Text Within a Window -*************************** - -Sometimes you are looking at a screenful of text, and only part of the -current paragraph you are reading is visible on the screen. The -commands detailed in this section are used to shift which part of the -current node is visible on the screen. - -`SPC' (`scroll-forward') -`C-v' - Shift the text in this window up. That is, show more of the node - which is currently below the bottom of the window. With a numeric - argument, show that many more lines at the bottom of the window; a - numeric argument of 4 would shift all of the text in the window up - 4 lines (discarding the top 4 lines), and show you four new lines - at the bottom of the window. Without a numeric argument, SPC - takes the bottom two lines of the window and places them at the - top of the window, redisplaying almost a completely new screenful - of lines. - -`DEL' (`scroll-backward') -`M-v' - Shift the text in this window down. The inverse of - `scroll-forward'. - -The `scroll-forward' and `scroll-backward' commands can also move -forward and backward through the node structure of the file. If you -press SPC while viewing the end of a node, or DEL while viewing the -beginning of a node, what happens is controlled by the variable -`scroll-behavior'. *Note `scroll-behavior': Variables, for more -information. - -`C-l' (`redraw-display') - Redraw the display from scratch, or shift the line containing the - cursor to a specified location. With no numeric argument, `C-l' - clears the screen, and then redraws its entire contents. Given a - numeric argument of N, the line containing the cursor is shifted - so that it is on the Nth line of the window. - -`C-x w' (`toggle-wrap') - Toggles the state of line wrapping in the current window. - Normally, lines which are longer than the screen width "wrap", - i.e., they are continued on the next line. Lines which wrap have - a `\' appearing in the rightmost column of the screen. You can - cause such lines to be terminated at the rightmost column by - changing the state of line wrapping in the window with `C-x w'. - When a line which needs more space than one screen width to - display is displayed, a `$' appears in the rightmost column of the - screen, and the remainder of the line is invisible. - - -File: info-stnd.info, Node: Node Commands, Next: Searching Commands, Prev: Scrolling Commands, Up: Top - -Selecting a New Node -******************** - -This section details the numerous Info commands which select a new node -to view in the current window. - -The most basic node commands are `n', `p', `u', and `l'. - -When you are viewing a node, the top line of the node contains some Info -"pointers" which describe where the next, previous, and up nodes are. -Info uses this line to move about the node structure of the file when -you use the following commands: - -`n' (`next-node') - Select the `Next' node. - -`p' (`prev-node') - Select the `Prev' node. - -`u' (`up-node') - Select the `Up' node. - -You can easily select a node that you have already viewed in this window -by using the `l' command - this name stands for "last", and actually -moves through the list of already visited nodes for this window. `l' -with a negative numeric argument moves forward through the history of -nodes for this window, so you can quickly step between two adjacent (in -viewing history) nodes. - -`l' (`history-node') - Select the most recently selected node in this window. - -Two additional commands make it easy to select the most commonly -selected nodes; they are `t' and `d'. - -`t' (`top-node') - Select the node `Top' in the current Info file. - -`d' (`dir-node') - Select the directory node (i.e., the node `(dir)'). - -Here are some other commands which immediately result in the selection -of a different node in the current window: - -`<' (`first-node') - Selects the first node which appears in this file. This node is - most often `Top', but it does not have to be. - -`>' (`last-node') - Select the last node which appears in this file. - -`]' (`global-next-node') - Move forward or down through node structure. If the node that you - are currently viewing has a `Next' pointer, that node is selected. - Otherwise, if this node has a menu, the first menu item is - selected. If there is no `Next' and no menu, the same process is - tried with the `Up' node of this node. - -`[' (`global-prev-node') - Move backward or up through node structure. If the node that you - are currently viewing has a `Prev' pointer, that node is selected. - Otherwise, if the node has an `Up' pointer, that node is selected, - and if it has a menu, the last item in the menu is selected. - -You can get the same behavior as `global-next-node' and -`global-prev-node' while simply scrolling through the file with SPC and -DEL; *Note `scroll-behavior': Variables, for more information. - -`g' (`goto-node') - Read the name of a node and select it. No completion is done while - reading the node name, since the desired node may reside in a - separate file. The node must be typed exactly as it appears in - the Info file. A file name may be included as with any node - specification, for example - - `g(emacs)Buffers' - - finds the node `Buffers' in the Info file `emacs'. - -`C-x k' (`kill-node') - Kill a node. The node name is prompted for in the echo area, with - a default of the current node. "Killing" a node means that Info - tries hard to forget about it, removing it from the list of - history nodes kept for the window where that node is found. - Another node is selected in the window which contained the killed - node. - -`C-x C-f' (`view-file') - Read the name of a file and selects the entire file. The command - `C-x C-f FILENAME' - is equivalent to typing - `g(FILENAME)*' - -`C-x C-b' (`list-visited-nodes') - Make a window containing a menu of all of the currently visited - nodes. This window becomes the selected window, and you may use - the standard Info commands within it. - -`C-x b' (`select-visited-node') - Select a node which has been previously visited in a visible - window. This is similar to `C-x C-b' followed by `m', but no - window is created. - - -File: info-stnd.info, Node: Searching Commands, Next: Xref Commands, Prev: Node Commands, Up: Top - -Searching an Info File -********************** - -GNU Info allows you to search for a sequence of characters throughout an -entire Info file, search through the indices of an Info file, or find -areas within an Info file which discuss a particular topic. - -`s' (`search') - Read a string in the echo area and search for it. - -`C-s' (`isearch-forward') - Interactively search forward through the Info file for a string as - you type it. - -`C-r' (`isearch-backward') - Interactively search backward through the Info file for a string as - you type it. - -`i' (`index-search') - Look up a string in the indices for this Info file, and select a - node where the found index entry points to. - -`,' (`next-index-match') - Move to the node containing the next matching index item from the - last `i' command. - -The most basic searching command is `s' (`search'). The `s' command -prompts you for a string in the echo area, and then searches the -remainder of the Info file for an occurrence of that string. If the -string is found, the node containing it is selected, and the cursor is -left positioned at the start of the found string. Subsequent `s' -commands show you the default search string within `[' and `]'; -pressing RET instead of typing a new string will use the default search -string. - -"Incremental searching" is similar to basic searching, but the string -is looked up while you are typing it, instead of waiting until the -entire search string has been specified. - - -File: info-stnd.info, Node: Xref Commands, Next: Window Commands, Prev: Searching Commands, Up: Top - -Selecting Cross References -************************** - -We have already discussed the `Next', `Prev', and `Up' pointers which -appear at the top of a node. In addition to these pointers, a node may -contain other pointers which refer you to a different node, perhaps in -another Info file. Such pointers are called "cross references", or -"xrefs" for short. - -* Menu: - -* Parts of an Xref:: What a cross reference is made of. -* Selecting Xrefs:: Commands for selecting menu or note items. - - -File: info-stnd.info, Node: Parts of an Xref, Next: Selecting Xrefs, Up: Xref Commands - -Parts of an Xref -================ - -Cross references have two major parts: the first part is called the -"label"; it is the name that you can use to refer to the cross -reference, and the second is the "target"; it is the full name of the -node that the cross reference points to. - -The target is separated from the label by a colon `:'; first the label -appears, and then the target. For example, in the sample menu cross -reference below, the single colon separates the label from the target. - - * Foo Label: Foo Target. More information about Foo. - -Note the `.' which ends the name of the target. The `.' is not part of -the target; it serves only to let Info know where the target name ends. - -A shorthand way of specifying references allows two adjacent colons to -stand for a target name which is the same as the label name: - - * Foo Commands:: Commands pertaining to Foo. - -In the above example, the name of the target is the same as the name of -the label, in this case `Foo Commands'. - -You will normally see two types of cross reference while viewing nodes: -"menu" references, and "note" references. Menu references appear -within a node's menu; they begin with a `*' at the beginning of a line, -and continue with a label, a target, and a comment which describes what -the contents of the node pointed to contains. - -Note references appear within the body of the node text; they begin with -`*Note', and continue with a label and a target. - -Like `Next', `Prev', and `Up' pointers, cross references can point to -any valid node. They are used to refer you to a place where more -detailed information can be found on a particular subject. Here is a -cross reference which points to a node within the Texinfo -documentation: *Note Writing an Xref: (texinfo)xref, for more -information on creating your own texinfo cross references. - - -File: info-stnd.info, Node: Selecting Xrefs, Prev: Parts of an Xref, Up: Xref Commands - -Selecting Xrefs -=============== - -The following table lists the Info commands which operate on menu items. - -`1' (`menu-digit') -`2' ... `9' - Within an Info window, pressing a single digit, (such as `1'), - selects that menu item, and places its node in the current window. - For convenience, there is one exception; pressing `0' selects the - *last* item in the node's menu. - -`0' (`last-menu-item') - Select the last item in the current node's menu. - -`m' (`menu-item') - Reads the name of a menu item in the echo area and selects its - node. Completion is available while reading the menu label. - -`M-x find-menu' - Move the cursor to the start of this node's menu. - -This table lists the Info commands which operate on note cross -references. - -`f' (`xref-item') -`r' - Reads the name of a note cross reference in the echo area and - selects its node. Completion is available while reading the cross - reference label. - -Finally, the next few commands operate on menu or note references alike: - -`TAB' (`move-to-next-xref') - Move the cursor to the start of the next nearest menu item or note - reference in this node. You can then use RET - (`select-reference-this-line') to select the menu or note - reference. - -`M-TAB' (`move-to-prev-xref') - Move the cursor the start of the nearest previous menu item or note - reference in this node. - -`RET' (`select-reference-this-line') - Select the menu item or note reference appearing on this line. - - -File: info-stnd.info, Node: Window Commands, Next: Printing Nodes, Prev: Xref Commands, Up: Top - -Manipulating Multiple Windows -***************************** - -A "window" is a place to show the text of a node. Windows have a view -area where the text of the node is displayed, and an associated "mode -line", which briefly describes the node being viewed. - -GNU Info supports multiple windows appearing in a single screen; each -window is separated from the next by its modeline. At any time, there -is only one "active" window, that is, the window in which the cursor -appears. There are commands available for creating windows, changing -the size of windows, selecting which window is active, and for deleting -windows. - -* Menu: - -* The Mode Line:: What appears in the mode line? -* Basic Windows:: Manipulating windows in Info. -* The Echo Area:: Used for displaying errors and reading input. - - -File: info-stnd.info, Node: The Mode Line, Next: Basic Windows, Up: Window Commands - -The Mode Line -============= - -A "mode line" is a line of inverse video which appears at the bottom of -an Info window. It describes the contents of the window just above it; -this information includes the name of the file and node appearing in -that window, the number of screen lines it takes to display the node, -and the percentage of text that is above the top of the window. It can -also tell you if the indirect tags table for this Info file needs to be -updated, and whether or not the Info file was compressed when stored on -disk. - -Here is a sample mode line for a window containing an uncompressed file -named `dir', showing the node `Top'. - - -----Info: (dir)Top, 40 lines --Top--------------------------------------- - ^^ ^ ^^^ ^^ - (file)Node #lines where - -When a node comes from a file which is compressed on disk, this is -indicated in the mode line with two small `z''s. In addition, if the -Info file containing the node has been split into subfiles, the name of -the subfile containing the node appears in the modeline as well: - - --zz-Info: (emacs)Top, 291 lines --Top-- Subfile: emacs-1.Z--------------- - -When Info makes a node internally, such that there is no corresponding -info file on disk, the name of the node is surrounded by asterisks -(`*'). The name itself tells you what the contents of the window are; -the sample mode line below shows an internally constructed node showing -possible completions: - - -----Info: *Completions*, 7 lines --All----------------------------------- - - -File: info-stnd.info, Node: Basic Windows, Next: The Echo Area, Prev: The Mode Line, Up: Window Commands - -Window Commands -=============== - -It can be convenient to view more than one node at a time. To allow -this, Info can display more than one "window". Each window has its own -mode line (*note The Mode Line::.) and history of nodes viewed in that -window (*note `history-node': Node Commands.). - -`C-x o' (`next-window') - Select the next window on the screen. Note that the echo area can - only be selected if it is already in use, and you have left it - temporarily. Normally, `C-x o' simply moves the cursor into the - next window on the screen, or if you are already within the last - window, into the first window on the screen. Given a numeric - argument, `C-x o' moves over that many windows. A negative - argument causes `C-x o' to select the previous window on the - screen. - -`M-x prev-window' - Select the previous window on the screen. This is identical to - `C-x o' with a negative argument. - -`C-x 2' (`split-window') - Split the current window into two windows, both showing the same - node. Each window is one half the size of the original window, - and the cursor remains in the original window. The variable - `automatic-tiling' can cause all of the windows on the screen to - be resized for you automatically, please *note automatic-tiling: - Variables. for more information. - -`C-x 0' (`delete-window') - Delete the current window from the screen. If you have made too - many windows and your screen appears cluttered, this is the way to - get rid of some of them. - -`C-x 1' (`keep-one-window') - Delete all of the windows excepting the current one. - -`ESC C-v' (`scroll-other-window') - Scroll the other window, in the same fashion that `C-v' might - scroll the current window. Given a negative argument, scroll the - "other" window backward. - -`C-x ^' (`grow-window') - Grow (or shrink) the current window. Given a numeric argument, - grow the current window that many lines; with a negative numeric - argument, shrink the window instead. - -`C-x t' (`tile-windows') - Divide the available screen space among all of the visible windows. - Each window is given an equal portion of the screen in which to - display its contents. The variable `automatic-tiling' can cause - `tile-windows' to be called when a window is created or deleted. - *Note `automatic-tiling': Variables. - - -File: info-stnd.info, Node: The Echo Area, Prev: Basic Windows, Up: Window Commands - -The Echo Area -============= - -The "echo area" is a one line window which appears at the bottom of the -screen. It is used to display informative or error messages, and to -read lines of input from you when that is necessary. Almost all of the -commands available in the echo area are identical to their Emacs -counterparts, so please refer to that documentation for greater depth of -discussion on the concepts of editing a line of text. The following -table briefly lists the commands that are available while input is being -read in the echo area: - -`C-f' (`echo-area-forward') - Move forward a character. - -`C-b' (`echo-area-backward') - Move backward a character. - -`C-a' (`echo-area-beg-of-line') - Move to the start of the input line. - -`C-e' (`echo-area-end-of-line') - Move to the end of the input line. - -`M-f' (`echo-area-forward-word') - Move forward a word. - -`M-b' (`echo-area-backward-word') - Move backward a word. - -`C-d' (`echo-area-delete') - Delete the character under the cursor. - -`DEL' (`echo-area-rubout') - Delete the character behind the cursor. - -`C-g' (`echo-area-abort') - Cancel or quit the current operation. If completion is being read, - `C-g' discards the text of the input line which does not match any - completion. If the input line is empty, `C-g' aborts the calling - function. - -`RET' (`echo-area-newline') - Accept (or forces completion of) the current input line. - -`C-q' (`echo-area-quoted-insert') - Insert the next character verbatim. This is how you can insert - control characters into a search string, for example. - -PRINTING CHARACTER (`echo-area-insert') - Insert the character. - -`M-TAB' (`echo-area-tab-insert') - Insert a TAB character. - -`C-t' (`echo-area-transpose-chars') - Transpose the characters at the cursor. - -The next group of commands deal with "killing", and "yanking" text. -For an in depth discussion of killing and yanking, *note Killing and -Deleting: (emacs)Killing. - -`M-d' (`echo-area-kill-word') - Kill the word following the cursor. - -`M-DEL' (`echo-area-backward-kill-word') - Kill the word preceding the cursor. - -`C-k' (`echo-area-kill-line') - Kill the text from the cursor to the end of the line. - -`C-x DEL' (`echo-area-backward-kill-line') - Kill the text from the cursor to the beginning of the line. - -`C-y' (`echo-area-yank') - Yank back the contents of the last kill. - -`M-y' (`echo-area-yank-pop') - Yank back a previous kill, removing the last yanked text first. - -Sometimes when reading input in the echo area, the command that needed -input will only accept one of a list of several choices. The choices -represent the "possible completions", and you must respond with one of -them. Since there are a limited number of responses you can make, Info -allows you to abbreviate what you type, only typing as much of the -response as is necessary to uniquely identify it. In addition, you can -request Info to fill in as much of the response as is possible; this is -called "completion". - -The following commands are available when completing in the echo area: - -`TAB' (`echo-area-complete') -`SPC' - Insert as much of a completion as is possible. - -`?' (`echo-area-possible-completions') - Display a window containing a list of the possible completions of - what you have typed so far. For example, if the available choices - are: - - bar - foliate - food - forget - - and you have typed an `f', followed by `?', the possible - completions would contain: - - foliate - food - forget - - i.e., all of the choices which begin with `f'. Pressing SPC or - TAB would result in `fo' appearing in the echo area, since all of - the choices which begin with `f' continue with `o'. Now, typing - `l' followed by `TAB' results in `foliate' appearing in the echo - area, since that is the only choice which begins with `fol'. - -`ESC C-v' (`echo-area-scroll-completions-window') - Scroll the completions window, if that is visible, or the "other" - window if not. - - -File: info-stnd.info, Node: Printing Nodes, Next: Miscellaneous Commands, Prev: Window Commands, Up: Top - -Printing Out Nodes -****************** - -You may wish to print out the contents of a node as a quick reference -document for later use. Info provides you with a command for doing -this. In general, we recommend that you use TeX to format the document -and print sections of it, by running `tex' on the Texinfo source file. - -`M-x print-node' - Pipe the contents of the current node through the command in the - environment variable `INFO_PRINT_COMMAND'. If the variable does - not exist, the node is simply piped to `lpr'. - - -File: info-stnd.info, Node: Miscellaneous Commands, Next: Variables, Prev: Printing Nodes, Up: Top - -Miscellaneous Commands -********************** - -GNU Info contains several commands which self-document GNU Info: - -`M-x describe-command' - Read the name of an Info command in the echo area and then display - a brief description of what that command does. - -`M-x describe-key' - Read a key sequence in the echo area, and then display the name and - documentation of the Info command that the key sequence invokes. - -`M-x describe-variable' - Read the name of a variable in the echo area and then display a - brief description of what the variable affects. - -`M-x where-is' - Read the name of an Info command in the echo area, and then display - a key sequence which can be typed in order to invoke that command. - -`C-h' (`get-help-window') -`?' - Create (or Move into) the window displaying `*Help*', and place a - node containing a quick reference card into it. This window - displays the most concise information about GNU Info available. - -`h' (`get-info-help-node') - Try hard to visit the node `(info)Help'. The Info file - `info.texi' distributed with GNU Info contains this node. Of - course, the file must first be processed with `makeinfo', and then - placed into the location of your Info directory. - -Here are the commands for creating a numeric argument: - -`C-u' (`universal-argument') - Start (or multiply by 4) the current numeric argument. `C-u' is a - good way to give a small numeric argument to cursor movement or - scrolling commands; `C-u C-v' scrolls the screen 4 lines, while - `C-u C-u C-n' moves the cursor down 16 lines. - -`M-1' (`add-digit-to-numeric-arg') -`M-2' ... `M-9' - Add the digit value of the invoking key to the current numeric - argument. Once Info is reading a numeric argument, you may just - type the digits of the argument, without the Meta prefix. For - example, you might give `C-l' a numeric argument of 32 by typing: - - `C-u 3 2 C-l' - - or - - `M-3 2 C-l' - -`C-g' is used to abort the reading of a multi-character key sequence, -to cancel lengthy operations (such as multi-file searches) and to -cancel reading input in the echo area. - -`C-g' (`abort-key') - Cancel current operation. - -The `q' command of Info simply quits running Info. - -`q' (`quit') - Exit GNU Info. - -If the operating system tells GNU Info that the screen is 60 lines tall, -and it is actually only 40 lines tall, here is a way to tell Info that -the operating system is correct. - -`M-x set-screen-height' - Read a height value in the echo area and set the height of the - displayed screen to that value. - -Finally, Info provides a convenient way to display footnotes which might -be associated with the current node that you are viewing: - -`ESC C-f' (`show-footnotes') - Show the footnotes (if any) associated with the current node in - another window. You can have Info automatically display the - footnotes associated with a node when the node is selected by - setting the variable `automatic-footnotes'. *Note - `automatic-footnotes': Variables. - - -File: info-stnd.info, Node: Variables, Next: GNU Info Global Index, Prev: Miscellaneous Commands, Up: Top - -Manipulating Variables -********************** - -GNU Info contains several "variables" whose values are looked at by -various Info commands. You can change the values of these variables, -and thus change the behavior of Info to more closely match your -environment and Info file reading manner. - -`M-x set-variable' - Read the name of a variable, and the value for it, in the echo - area and then set the variable to that value. Completion is - available when reading the variable name; often, completion is - available when reading the value to give to the variable, but that - depends on the variable itself. If a variable does *not* supply - multiple choices to complete over, it expects a numeric value. - -`M-x describe-variable' - Read the name of a variable in the echo area and then display a - brief description of what the variable affects. - -Here is a list of the variables that you can set in Info. - -`automatic-footnotes' - When set to `On', footnotes appear and disappear automatically. - This variable is `On' by default. When a node is selected, a - window containing the footnotes which appear in that node is - created, and the footnotes are displayed within the new window. - The window that Info creates to contain the footnotes is called - `*Footnotes*'. If a node is selected which contains no footnotes, - and a `*Footnotes*' window is on the screen, the `*Footnotes*' - window is deleted. Footnote windows created in this fashion are - not automatically tiled so that they can use as little of the - display as is possible. - -`automatic-tiling' - When set to `On', creating or deleting a window resizes other - windows. This variable is `Off' by default. Normally, typing - `C-x 2' divides the current window into two equal parts. When - `automatic-tiling' is set to `On', all of the windows are resized - automatically, keeping an equal number of lines visible in each - window. There are exceptions to the automatic tiling; - specifically, the windows `*Completions*' and `*Footnotes*' are - *not* resized through automatic tiling; they remain their original - size. - -`visible-bell' - When set to `On', GNU Info attempts to flash the screen instead of - ringing the bell. This variable is `Off' by default. Of course, - Info can only flash the screen if the terminal allows it; in the - case that the terminal does not allow it, the setting of this - variable has no effect. However, you can make Info perform - quietly by setting the `errors-ring-bell' variable to `Off'. - -`errors-ring-bell' - When set to `On', errors cause the bell to ring. The default - setting of this variable is `On'. - -`gc-compressed-files' - When set to `On', Info garbage collects files which had to be - uncompressed. The default value of this variable is `Off'. - Whenever a node is visited in Info, the Info file containing that - node is read into core, and Info reads information about the tags - and nodes contained in that file. Once the tags information is - read by Info, it is never forgotten. However, the actual text of - the nodes does not need to remain in core unless a particular Info - window needs it. For non-compressed files, the text of the nodes - does not remain in core when it is no longer in use. But - de-compressing a file can be a time consuming operation, and so - Info tries hard not to do it twice. `gc-compressed-files' tells - Info it is okay to garbage collect the text of the nodes of a file - which was compressed on disk. - -`show-index-match' - When set to `On', the portion of the matched search string is - highlighted in the message which explains where the matched search - string was found. The default value of this variable is `On'. - When Info displays the location where an index match was found, - (*note `next-index-match': Searching Commands.), the portion of the - string that you had typed is highlighted by displaying it in the - inverse case from its surrounding characters. - -`scroll-behavior' - Control what happens when forward scrolling is requested at the - end of a node, or when backward scrolling is requested at the - beginning of a node. The default value for this variable is - `Continuous'. There are three possible values for this variable: - - `Continuous' - Try to get the first item in this node's menu, or failing - that, the `Next' node, or failing that, the `Next' of the - `Up'. This behavior is identical to using the `]' - (`global-next-node') and `[' (`global-prev-node') commands. - - `Next Only' - Only try to get the `Next' node. - - `Page Only' - Simply give up, changing nothing. If `scroll-behavior' is - `Page Only', no scrolling command can change the node that is - being viewed. - -`scroll-step' - The number of lines to scroll when the cursor moves out of the - window. Scrolling happens automatically if the cursor has moved - out of the visible portion of the node text when it is time to - display. Usually the scrolling is done so as to put the cursor on - the center line of the current window. However, if the variable - `scroll-step' has a nonzero value, Info attempts to scroll the - node text by that many lines; if that is enough to bring the - cursor back into the window, that is what is done. The default - value of this variable is 0, thus placing the cursor (and the text - it is attached to) in the center of the window. Setting this - variable to 1 causes a kind of "smooth scrolling" which some - people prefer. - -`ISO-Latin' - When set to `On', Info accepts and displays ISO Latin characters. - By default, Info assumes an ASCII character set. `ISO-Latin' tells - Info that it is running in an environment where the European - standard character set is in use, and allows you to input such - characters to Info, as well as display them. - - -File: info-stnd.info, Node: GNU Info Global Index, Prev: Variables, Up: Top - -Global Index -************ - -* Menu: - -* ,: Searching Commands. -* 0, in Info windows: Selecting Xrefs. -* 1 ... 9, in Info windows: Selecting Xrefs. -* 1 ... 9, in Info windows: Selecting Xrefs. -* <: Node Commands. -* >: Node Commands. -* ?, in Info windows: Miscellaneous Commands. -* ?, in the echo area: The Echo Area. -* -subnodes, command line option: Options. -* abort-key: Miscellaneous Commands. -* add-digit-to-numeric-arg: Miscellaneous Commands. -* arguments, command line: Options. -* automatic-footnotes: Variables. -* automatic-tiling: Variables. -* b, in Info windows: Cursor Commands. -* backward-char: Cursor Commands. -* backward-word: Cursor Commands. -* beginning-of-line: Cursor Commands. -* beginning-of-node: Cursor Commands. -* C-a, in Info windows: Cursor Commands. -* C-a, in the echo area: The Echo Area. -* C-b, in Info windows: Cursor Commands. -* C-b, in the echo area: The Echo Area. -* C-d, in the echo area: The Echo Area. -* C-e, in Info windows: Cursor Commands. -* C-e, in the echo area: The Echo Area. -* C-f, in Info windows: Cursor Commands. -* C-f, in the echo area: The Echo Area. -* C-g, in Info windows: Miscellaneous Commands. -* C-g, in the echo area: The Echo Area. -* C-h: Miscellaneous Commands. -* C-k, in the echo area: The Echo Area. -* C-l: Scrolling Commands. -* C-n: Cursor Commands. -* C-p: Cursor Commands. -* C-q, in the echo area: The Echo Area. -* C-r: Searching Commands. -* C-s: Searching Commands. -* C-t, in the echo area: The Echo Area. -* C-u: Miscellaneous Commands. -* C-v: Scrolling Commands. -* C-w: Scrolling Commands. -* C-x 0: Basic Windows. -* C-x 1: Basic Windows. -* C-x 2: Basic Windows. -* C-x b: Node Commands. -* C-x C-b: Node Commands. -* C-x C-f: Node Commands. -* C-x DEL, in the echo area: The Echo Area. -* C-x k: Node Commands. -* C-x o: Basic Windows. -* C-x t: Basic Windows. -* C-x ^: Basic Windows. -* C-y, in the echo area: The Echo Area. -* cancelling the current operation: Miscellaneous Commands. -* cancelling typeahead: Miscellaneous Commands. -* command line options: Options. -* commands, describing: Miscellaneous Commands. -* cursor, moving: Cursor Commands. -* d: Node Commands. -* DEL, in Info windows: Scrolling Commands. -* DEL, in the echo area: The Echo Area. -* delete-window: Basic Windows. -* describe-command: Miscellaneous Commands. -* describe-key: Miscellaneous Commands. -* describe-variable: Variables. -* dir-node: Node Commands. -* directory path: Options. -* echo area: The Echo Area. -* echo-area-abort: The Echo Area. -* echo-area-backward: The Echo Area. -* echo-area-backward-kill-line: The Echo Area. -* echo-area-backward-kill-word: The Echo Area. -* echo-area-backward-word: The Echo Area. -* echo-area-beg-of-line: The Echo Area. -* echo-area-complete: The Echo Area. -* echo-area-delete: The Echo Area. -* echo-area-end-of-line: The Echo Area. -* echo-area-forward: The Echo Area. -* echo-area-forward-word: The Echo Area. -* echo-area-insert: The Echo Area. -* echo-area-kill-line: The Echo Area. -* echo-area-kill-word: The Echo Area. -* echo-area-newline: The Echo Area. -* echo-area-possible-completions: The Echo Area. -* echo-area-quoted-insert: The Echo Area. -* echo-area-rubout: The Echo Area. -* echo-area-scroll-completions-window: The Echo Area. -* echo-area-tab-insert: The Echo Area. -* echo-area-transpose-chars: The Echo Area. -* echo-area-yank: The Echo Area. -* echo-area-yank-pop: The Echo Area. -* end-of-line: Cursor Commands. -* end-of-node: Cursor Commands. -* errors-ring-bell: Variables. -* ESC C-f: Miscellaneous Commands. -* ESC C-v, in Info windows: Basic Windows. -* ESC C-v, in the echo area: The Echo Area. -* f: Selecting Xrefs. -* file, outputting to: Options. -* find-menu: Selecting Xrefs. -* first-node: Node Commands. -* footnotes, displaying: Miscellaneous Commands. -* forward-char: Cursor Commands. -* forward-word: Cursor Commands. -* functions, describing: Miscellaneous Commands. -* g: Node Commands. -* gc-compressed-files: Variables. -* get-help-window: Miscellaneous Commands. -* get-info-help-node: Miscellaneous Commands. -* global-next-node: Node Commands. -* global-prev-node: Node Commands. -* goto-node: Node Commands. -* grow-window: Basic Windows. -* h: Miscellaneous Commands. -* history-node: Node Commands. -* i: Searching Commands. -* index-search: Searching Commands. -* Info file, selecting: Options. -* INFO_PRINT_COMMAND, environment variable: Printing Nodes. -* isearch-backward: Searching Commands. -* isearch-forward: Searching Commands. -* ISO Latin characters: Variables. -* ISO-Latin: Variables. -* keep-one-window: Basic Windows. -* keys, describing: Miscellaneous Commands. -* kill-node: Node Commands. -* l: Node Commands. -* last-menu-item: Selecting Xrefs. -* last-node: Node Commands. -* list-visited-nodes: Node Commands. -* m: Selecting Xrefs. -* M-1 ... M-9: Miscellaneous Commands. -* M-<: Cursor Commands. -* M->: Cursor Commands. -* M-b, in Info windows: Cursor Commands. -* M-b, in the echo area: The Echo Area. -* M-d, in the echo area: The Echo Area. -* M-DEL, in the echo area: The Echo Area. -* M-f, in Info windows: Cursor Commands. -* M-f, in the echo area: The Echo Area. -* M-r: Cursor Commands. -* M-TAB, in Info windows: Selecting Xrefs. -* M-TAB, in the echo area: The Echo Area. -* M-v: Scrolling Commands. -* M-y, in the echo area: The Echo Area. -* menu, following: Options. -* menu-digit: Selecting Xrefs. -* menu-item: Selecting Xrefs. -* move-to-next-xref: Selecting Xrefs. -* move-to-prev-xref: Selecting Xrefs. -* move-to-window-line: Cursor Commands. -* n: Node Commands. -* next-index-match: Searching Commands. -* next-line: Cursor Commands. -* next-node: Node Commands. -* next-window: Basic Windows. -* node, selecting: Options. -* nodes, selection of: Node Commands. -* numeric arguments: Miscellaneous Commands. -* outputting to a file: Options. -* p: Node Commands. -* prev-line: Cursor Commands. -* prev-node: Node Commands. -* prev-window: Basic Windows. -* print-node: Printing Nodes. -* printing: Printing Nodes. -* printing characters, in the echo area: The Echo Area. -* q: Miscellaneous Commands. -* quit: Miscellaneous Commands. -* quitting: Miscellaneous Commands. -* r: Selecting Xrefs. -* redraw-display: Scrolling Commands. -* RET, in Info windows: Selecting Xrefs. -* RET, in the echo area: The Echo Area. -* s: Searching Commands. -* screen, changing the height of: Miscellaneous Commands. -* scroll-backward: Scrolling Commands. -* scroll-behavior: Variables. -* scroll-forward: Scrolling Commands. -* scroll-other-window: Basic Windows. -* scroll-step: Variables. -* scrolling: Scrolling Commands. -* scrolling through node structure: Scrolling Commands. -* search: Searching Commands. -* searching: Searching Commands. -* select-reference-this-line: Selecting Xrefs. -* select-visited-node: Node Commands. -* set-screen-height: Miscellaneous Commands. -* set-variable: Variables. -* show-footnotes: Miscellaneous Commands. -* show-index-match: Variables. -* SPC, in Info windows: Scrolling Commands. -* SPC, in the echo area: The Echo Area. -* split-window: Basic Windows. -* t: Node Commands. -* TAB, in Info windows: Selecting Xrefs. -* TAB, in the echo area: The Echo Area. -* tile-windows: Basic Windows. -* tiling: Basic Windows. -* toggle-wrap: Scrolling Commands. -* top-node: Node Commands. -* u: Node Commands. -* universal-argument: Miscellaneous Commands. -* up-node: Node Commands. -* variables, describing: Variables. -* variables, setting: Variables. -* version information: Options. -* view-file: Node Commands. -* visible-bell: Variables. -* where-is: Miscellaneous Commands. -* windows, creating: Basic Windows. -* windows, deleting: Basic Windows. -* windows, manipulating: Window Commands. -* windows, selecting: Basic Windows. -* xref-item: Selecting Xrefs. -* [: Node Commands. -* ]: Node Commands. - - - -Tag Table: -Node: Top1263 -Node: What is Info2593 -Node: Options3127 -Node: Options-Footnotes6157 -Node: Cursor Commands6411 -Node: Cursor Commands-Footnotes8906 -Node: Scrolling Commands9136 -Node: Node Commands11600 -Node: Searching Commands15563 -Node: Xref Commands17151 -Node: Parts of an Xref17766 -Node: Selecting Xrefs19711 -Node: Window Commands21298 -Node: The Mode Line22233 -Node: Basic Windows23872 -Node: The Echo Area26374 -Node: Printing Nodes30531 -Node: Miscellaneous Commands31174 -Node: Variables34345 -Node: GNU Info Global Index40515 - -End Tag Table diff --git a/gnu/usr.bin/texinfo/info/info.info b/gnu/usr.bin/texinfo/info/info.info deleted file mode 100644 index b6fd8508b832..000000000000 --- a/gnu/usr.bin/texinfo/info/info.info +++ /dev/null @@ -1,777 +0,0 @@ -This is Info file info.info, produced by Makeinfo-1.55 from the input -file info.texi. - - This file describes how to use Info, the on-line, menu-driven GNU -documentation system. - - Copyright (C) 1989, 1992 Free Software Foundation, Inc. - - Permission is granted to make and distribute verbatim copies of this -manual provided the copyright notice and this permission notice are -preserved on all copies. - - Permission is granted to copy and distribute modified versions of -this manual under the conditions for verbatim copying, provided that -the entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - - Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be stated in a -translation approved by the Free Software Foundation. - - -File: info.info, Node: Top, Next: Getting Started, Prev: (dir), Up: (dir) - -Info: An Introduction -********************* - - Info is a program for reading documentation, which you are using now. - - To learn how to use Info, type the command `h'. It brings you to a -programmed instruction sequence. - - To learn advanced Info commands, type `n' twice. This brings you to -`Info for Experts', skipping over the . `Getting Started' chapter. - -* Menu: - -* Getting Started:: -* Advanced Info:: -* Create an Info File:: - - -File: info.info, Node: Getting Started, Next: Advanced Info, Prev: Top, Up: Top - -Getting Started -*************** - - This first part of the Info manual describes how to get around inside -of Info. The second part of the manual describes various advanced Info -commands, and how to write an Info as distinct from a Texinfo file. -The third part is about how to generate Info files from Texinfo files. - -* Menu: - -* Help-Small-Screen:: Starting Info on a Small Screen -* Help:: How to use Info -* Help-P:: Returning to the Previous node -* Help-^L:: The Space, Rubout, B and ^L commands. -* Help-M:: Menus -* Help-Adv:: Some advanced Info commands -* Help-Q:: Quitting Info - - -File: info.info, Node: Help-Small-Screen, Next: Help, Up: Getting Started - -Starting Info on a Small Screen -=============================== - - Since your terminal has an unusually small number of lines on its -screen, it is necessary to give you special advice at the beginning. - - If you see the text `--All----' at near the bottom right corner of -the screen, it means the entire text you are looking at fits on the -screen. If you see `--Top----' instead, it means that there is more -text below that does not fit. To move forward through the text and see -another screen full, press the Space bar, SPC. To move back up, press -the key labeled `Rubout' or `Delete' or DEL. - - Here are 40 lines of junk, so you can try SPC and DEL and see what -they do. At the end are instructions of what you should do next. - - This is line 17 -This is line 18 -This is line 19 -This is line 20 -This is line 21 -This is line 22 -This is line 23 -This is line 24 -This is line 25 -This is line 26 -This is line 27 -This is line 28 -This is line 29 -This is line 30 -This is line 31 -This is line 32 -This is line 33 -This is line 34 -This is line 35 -This is line 36 -This is line 37 -This is line 38 -This is line 39 -This is line 40 -This is line 41 -This is line 42 -This is line 43 -This is line 44 -This is line 45 -This is line 46 -This is line 47 -This is line 48 -This is line 49 -This is line 50 -This is line 51 -This is line 52 -This is line 53 -This is line 54 -This is line 55 -This is line 56 -If you have managed to get here, go back to the beginning with DEL, and -come back here again, then you understand SPC and DEL. So now type an -`n'--just one character; do not type the quotes and do not type the -Return key, RET, afterward--to get to the normal start of the course. - - -File: info.info, Node: Help, Next: Help-P, Prev: Help-Small-Screen, Up: Getting Started - -How to use Info -=============== - - You are talking to the program Info, for reading documentation. - - Right now you are looking at one "Node" of Information. A node -contains text describing a specific topic at a specific level of -detail. This node's topic is "how to use Info". - - The top line of a node is its "header". This node's header (look at -it now) says that it is the node named `Help' in the file `info'. It -says that the `Next' node after this one is the node called `Help-P'. -An advanced Info command lets you go to any node whose name you know. - - Besides a `Next', a node can have a `Previous' or an `Up'. This -node has a `Previous' but no `Up', as you can see. - - Now it is time to move on to the `Next' node, named `Help-P'. - - >> Type `n' to move there. Type just one character; do not type -the quotes and do not type a RET afterward. - - `>>' in the margin means it is really time to try a command. - - -File: info.info, Node: Help-P, Next: Help-^L, Prev: Help, Up: Getting Started - -Returning to the Previous node -============================== - - This node is called `Help-P'. The `Previous' node, as you see, is -`Help', which is the one you just came from using the `n' command. -Another `n' command now would take you to the next node, `Help-^L'. - - >> But do not do that yet. First, try the `p' command, which takes - you to the `Previous' node. When you get there, you can do an `n' -again to return here. - - This all probably seems insultingly simple so far, but *do not* be -led into skimming. Things will get more complicated soon. Also, do -not try a new command until you are told it is time to. Otherwise, you -may make Info skip past an important warning that was coming up. - - >> Now do an `n' to get to the node `Help-^L' and learn more. - - -File: info.info, Node: Help-^L, Next: Help-M, Prev: Help-P, Up: Getting Started - -The Space, Rubout, B and ^L commands. -===================================== - - This node's header tells you that you are now at node `Help-^L', and -that `p' would get you back to `Help-P'. The node's title is -underlined; it says what the node is about (most nodes have titles). - - This is a big node and it does not all fit on your display screen. -You can tell that there is more that is not visible because you can see -the string `--Top-----' rather than `--All----' near the bottom right -corner of the screen. - - The SPC, DEL and `b' commands exist to allow you to "move around" in -a node that does not all fit on the screen at once. SPC moves forward, -to show what was below the bottom of the screen. DEL moves backward, -to show what was above the top of the screen (there is not anything -above the top until you have typed some spaces). - - >> Now try typing a SPC (afterward, type a DEL to return here). - - When you type the SPC, the two lines that were at the bottom of the -screen appear at the top, followed by more lines. DEL takes the two -lines from the top and moves them to the bottom, *usually*, but if -there are not a full screen's worth of lines above them they may not -make it all the way to the bottom. - - If you type a SPC when there is no more to see, it rings the bell -and otherwise does nothing. The same goes for a DEL when the header of -the node is visible. - - If your screen is ever garbaged, you can tell Info to print it out -again by typing `C-l' (`Control-L', that is--hold down "Control" and -type an L or `l'). - - >> Type `C-l' now. - - To move back to the beginning of the node you are on, you can type a -lot of DELs. You can also type simply `b' for beginning. - - >> Try that now. (I have put in enough verbiage to make sure you are - not on the first screenful now). Then come back, typing SPC -several times. - - You have just learned a considerable number of commands. If you -want to use one but have trouble remembering which, you should type a ? -which prints out a brief list of commands. When you are finished -looking at the list, make it go away by typing a SPC. - - >> Type a ? now. After it finishes, type a SPC. - - (If you are using the standalone Info reader, type `l' to return -here.) - - From now on, you will encounter large nodes without warning, and -will be expected to know how to use SPC and DEL to move around in them -without being told. Since not all terminals have the same size screen, -it would be impossible to warn you anyway. - - >> Now type `n' to see the description of the `m' command. - - -File: info.info, Node: Help-M, Next: Help-Adv, Prev: Help-^L, Up: Getting Started - -Menus -===== - - Menus and the `m' command - - With only the `n' and `p' commands for moving between nodes, nodes -are restricted to a linear sequence. Menus allow a branching -structure. A menu is a list of other nodes you can move to. It is -actually just part of the text of the node formatted specially so that -Info can interpret it. The beginning of a menu is always identified by -a line which starts with `* Menu:'. A node contains a menu if and only -if it has a line in it which starts that way. The only menu you can -use at any moment is the one in the node you are in. To use a menu in -any other node, you must move to that node first. - - After the start of the menu, each line that starts with a `*' -identifies one subtopic. The line usually contains a brief name for -the subtopic (followed by a `:'), the name of the node that talks about -that subtopic, and optionally some further description of the subtopic. -Lines in the menu that do not start with a `*' have no special -meaning--they are only for the human reader's benefit and do not define -additional subtopics. Here is an example: - - * Foo: FOO's Node This tells about FOO - - The subtopic name is Foo, and the node describing it is `FOO's Node'. -The rest of the line is just for the reader's Information. [[ But this -line is not a real menu item, simply because there is no line above it -which starts with `* Menu:'.]] - - When you use a menu to go to another node (in a way that will be -described soon), what you specify is the subtopic name, the first thing -in the menu line. Info uses it to find the menu line, extracts the -node name from it, and goes to that node. The reason that there is -both a subtopic name and a node name is that the node name must be -meaningful to the computer and may therefore have to be ugly looking. -The subtopic name can be chosen just to be convenient for the user to -specify. Often the node name is convenient for the user to specify and -so both it and the subtopic name are the same. There is an -abbreviation for this: - - * Foo:: This tells about FOO - -This means that the subtopic name and node name are the same; they are -both `Foo'. - - >> Now use SPCs to find the menu in this node, then come back to -the front with a `b'. As you see, a menu is actually visible in its -node. If you cannot find a menu in a node by looking at it, then -the node does not have a menu and the `m' command is not available. - - The command to go to one of the subnodes is `m'--but *do not do it -yet!* Before you use `m', you must understand the difference between -commands and arguments. So far, you have learned several commands that -do not need arguments. When you type one, Info processes it and is -instantly ready for another command. The `m' command is different: it -is incomplete without the "name of the subtopic". Once you have typed -`m', Info tries to read the subtopic name. - - Now look for the line containing many dashes near the bottom of the -screen. There is one more line beneath that one, but usually it is -blank If it is empty, Info is ready for a command, such as `n' or `b' -or SPC or `m'. If that line contains text ending in a colon, it mean -Info is trying to read the "argument" to a command. At such times, -commands do not work, because Info tries to use them as the argument. -You must either type the argument and finish the command you started, -or type `Control-g' to cancel the command. When you have done one of -those things, the line becomes blank again. - - The command to go to a subnode via a menu is `m'. After you type -the `m', the line at the bottom of the screen says `Menu item: '. You -must then type the name of the subtopic you want, and end it with a RET. - - You can abbreviate the subtopic name. If the abbreviation is not -unique, the first matching subtopic is chosen. Some menus put the -shortest possible abbreviation for each subtopic name in capital -letters, so you can see how much you need to type. It does not matter -whether you use upper case or lower case when you type the subtopic. -You should not put any spaces at the end, or inside of the item name, -except for one space where a space appears in the item in the menu. - - Here is a menu to give you a chance to practice. - - * Menu: The menu starts here. - - This menu givs you three ways of going to one place, Help-FOO. - - * Foo: Help-FOO. A node you can visit for fun. -* Bar: Help-FOO. Strange! two ways to get to the same place. -* Help-FOO:: And yet another! ->> Now type just an `m' and see what happens: - - Now you are "inside" an `m' command. Commands cannot be used now; -the next thing you will type must be the name of a subtopic. - - You can change your mind about doing the `m' by typing Control-g. - - >> Try that now; notice the bottom line clear. - - >> Then type another `m'. - - >> Now type `BAR' item name. Do not type RET yet. - - While you are typing the item name, you can use the DEL character to -cancel one character at a time if you make a mistake. - - >> Type one to cancel the `R'. You could type another `R' to -replace it. You do not have to, since `BA' is a valid abbreviation. - - >> Now you are ready to go. Type a RET. - - After visiting Help-FOO, you should return here. - - >> Type `n' to see more commands. - - Here is another way to get to Help-FOO, a menu. You can ignore this -if you want, or else try it (but then please come back to here). - -* Menu: - -* Help-FOO:: - - -File: info.info, Node: Help-FOO, Up: Help-M - -The `u' command ---------------- - - Congratulations! This is the node `Help-FOO'. Unlike the other -nodes you have seen, this one has an `Up': `Help-M', the node you just -came from via the `m' command. This is the usual convention--the nodes -you reach from a menu have `Up' nodes that lead back to the menu. -Menus move Down in the tree, and `Up' moves Up. `Previous', on the -other hand, is usually used to "stay on the same level but go backwards" - - You can go back to the node `Help-M' by typing the command `u' for -"Up". That puts you at the *front* of the node--to get back to where -you were reading you have to type some SPCs. - - >> Now type `u' to move back up to `Help-M'. - - -File: info.info, Node: Help-Adv, Next: Help-Q, Prev: Help-M, Up: Getting Started - -Some advanced Info commands -=========================== - - The course is almost over, so please stick with it to the end. - - If you have been moving around to different nodes and wish to -retrace your steps, the `l' command (`l' for "last") will do that, one -node at a time. If you have been following directions, an `l' command -now will get you back to `Help-M'. Another `l' command would undo the -`u' and get you back to `Help-FOO'. Another `l' would undo the `m' and -get you back to `Help-M'. - - >> Try typing three `l''s, pausing in between to see what each -`l' does. - - Then follow directions again and you will end up back here. - - Note the difference between `l' and `p': `l' moves to where *you* -last were, whereas `p' always moves to the node which the header says -is the `Previous' node (from this node, to `Help-M'). - - The `d' command gets you instantly to the Directory node. This -node, which is the first one you saw when you entered Info, has a menu -which leads (directly, or indirectly through other menus), to all the -nodes that exist. - - >> Try doing a `d', then do an `l' to return here (yes, *do* -return). - - Sometimes, in Info documentation, you will see a cross reference. -Cross references look like this: *Note Cross: Help-Cross. That is a -real, live cross reference which is named `Cross' and points at the -node named `Help-Cross'. - - If you wish to follow a cross reference, you must use the `f' -command. The `f' must be followed by the cross reference name (in this -case, `Cross'). You can use DEL to edit the name, and if you change -your mind about following any reference you can use `Control-g' to -cancel the command. - - Completion is available in the `f' command; you can complete among -all the cross reference names in the current node. - - >> Type `f', followed by `Cross', and a RET. - - To get a list of all the cross references in the current node, you -can type `?' after an `f'. The `f' continues to await a cross -reference name even after printing the list, so if you do not actually -want to follow a reference you should type a `Control-g' to cancel the -`f'. - - >> Type "f?" to get a list of the footnotes in this node. Then type -a `Control-g' and see how the `f' gives up. - - >> Now type `n' to see the last node of the course. - - -File: info.info, Node: Help-Cross, Up: Help-Adv - -The node reached by the cross reference in Info ------------------------------------------------ - - This is the node reached by the cross reference named `Cross'. - - While this node is specifically intended to be reached by a cross -reference, most cross references lead to nodes that "belong" someplace -else far away in the structure of Info. So you cannot expect the -footnote to have a `Next', `Previous' or `Up' pointing back to where -you came from. In general, the `l' (el) command is the only way to get -back there. - - >> Type `l' to return to the node where the cross reference was. - - -File: info.info, Node: Help-Q, Prev: Help-Adv, Up: Getting Started - -Quitting Info -============= - - To get out of Info, back to what you were doing before, type `q' for -"Quit". - - This is the end of the course on using Info. There are some other -commands that are not essential or are meant for experienced users; -they are useful, and you can find them by looking in the directory for -documentation on Info. Finding them will be a good exercise in using -Info in the usual manner. - - >> Type `d' to go to the Info directory node; then type `mInfo' -and RET, to get to the node about Info and see what other help is -available. - - -File: info.info, Node: Advanced Info, Next: Create an Info File, Prev: Getting Started, Up: Top - -Info for Experts -**************** - - This chapter describes various advanced Info commands, and how to -write an Info as distinct from a Texinfo file. (However, in most -cases, writing a Texinfo file is better, since you can use it *both* to -generate an Info file and to make a printed manual. *Note Overview of -Texinfo: (texinfo)Top.) - -* Menu: - -* Expert:: Advanced Info commands: g, s, e, and 1 - 5. -* Add:: Describes how to add new nodes to the hierarchy. - Also tells what nodes look like. -* Menus:: How to add to or create menus in Info nodes. -* Cross-refs:: How to add cross-references to Info nodes. -* Tags:: How to make tag tables for Info files. -* Checking:: Checking an Info File - - -File: info.info, Node: Expert, Next: Add, Up: Advanced Info - -Advanced Info Commands -====================== - - `g', `s', `1', - `5', and `e' - - If you know a node's name, you can go there by typing `g', the name, -and RET. Thus, `gTopRET' would go to the node called `Top' in this -file (its directory node). `gExpertRET' would come back here. - - Unlike `m', `g' does not allow the use of abbreviations. - - To go to a node in another file, you can include the filename in the -node name by putting it at the front, in parentheses. Thus, -`g(dir)TopRET' would go to the Info Directory node, which is node `Top' -in the file `dir'. - - The node name `*' specifies the whole file. So you can look at all -of the current file by typing `g*RET' or all of any other file with -`g(FILENAME)RET'. - - The `s' command allows you to search a whole file for a string. It -switches to the next node if and when that is necessary. You type `s' -followed by the string to search for, terminated by RET. To search for -the same string again, just `s' followed by RET will do. The file's -nodes are scanned in the order they are in in the file, which has no -necessary relationship to the order that they may be in in the tree -structure of menus and `next' pointers. But normally the two orders -are not very different. In any case, you can always do a `b' to find -out what node you have reached, if the header is not visible (this can -happen, because `s' puts your cursor at the occurrence of the string, -not at the beginning of the node). - - If you grudge the system each character of type-in it requires, you -might like to use the commands `1', `2', `3', `4', and `5'. They are -short for the `m' command together with an argument. "1", "2", "3", -"4", and "5". `1' goes through the first item in the current node's -menu; `2' goes through the second item, etc. Note that numbers larger -than 5 are not allowed. If the item you want is that far down, you are -better off using an abbreviation for its name than counting. - - The Info command `e' changes from Info mode to an ordinary Emacs -editing mode, so that you can edit the text of the current node. Type -`C-c C-c' to switch back to Info. The `e' command is allowed only if -the variable `Info-enable-edit' is non-`nil'. - - -File: info.info, Node: Add, Next: Menus, Prev: Expert, Up: Advanced Info - -Adding a new node to Info -========================= - - To add a new topic to the list in the directory, you must: - - 1. Create a node, in some file, to document that topic. - - 2. Put that topic in the menu in the directory. *Note Menu: Menus. - - The new node can live in an existing documentation file, or in a new -one. It must have a ^_ character before it (invisible to the user; -this node has one but you cannot see it), and it ends with either a ^_, -a ^L, or the end of file. Note: If you put in a ^L to end a new node, -be sure that there is a ^_ after it to start the next one, since ^L -cannot *start* a node. Also, a nicer way to make a node boundary be a -page boundary as well is to put a ^L *right after* the ^_. - - The ^_ starting a node must be followed by a newline or a ^L -newline, after which comes the node's header line. The header line -must give the node's name (by which Info finds it), and state the names -of the `Next', `Previous', and `Up' nodes (if there are any). As you -can see, this node's `Up' node is the node `Top', which points at all -the documentation for Info. The `Next' node is `Menus'. - - The keywords "Node", "Previous", "Up" and "Next", may appear in any -order, anywhere in the header line, but the recommended order is the -one in this sentence. Each keyword must be followed by a colon, spaces -and tabs, and then the appropriate name. The name may be terminated -with a tab, a comma, or a newline. A space does not end it; node names -may contain spaces. The case of letters in the names is insignificant. - - A node name has two forms. A node in the current file is named by -what appears after the `Node: ' in that node's first line. For -example, this node's name is `Add'. A node in another file is named by -`(FILENAME)NODE-WITHIN-FILE', as in `(info)Add' for this node. If the -file name is relative, it is taken starting from the standard Info file -directory of your site. The name `(FILENAME)Top' can be abbreviated to -just `(FILENAME)'. By convention, the name `Top' is used for the -"highest" node in any single file--the node whose `Up' points out of -the file. The Directory node is `(dir)'. The `Top' node of a document -file listed in the Directory should have an `Up: (dir)' in it. - - The node name `*' is special: it refers to the entire file. Thus, -`g*' shows you the whole current file. The use of the node `*' is to -make it possible to make old-fashioned, unstructured files into nodes -of the tree. - - The `Node:' name, in which a node states its own name, must not -contain a filename, since Info when searching for a node does not -expect one to be there. The `Next', `Previous' and `Up' names may -contain them. In this node, since the `Up' node is in the same file, -it was not necessary to use one. - - Note that the nodes in this file have a file name in the header -line. The file names are ignored by Info, but they serve as comments -to help identify the node for the user. - - -File: info.info, Node: Menus, Next: Cross-refs, Prev: Add, Up: Advanced Info - -How to Create Menus -=================== - - Any node in the Info hierarchy may have a "menu"--a list of subnodes. -The `m' command searches the current node's menu for the topic which it -reads from the terminal. - - A menu begins with a line starting with `* Menu:'. The rest of the -line is a comment. After the starting line, every line that begins -with a `* ' lists a single topic. The name of the topic-the argument -that the user must give to the `m' command to select this topic--comes -right after the star and space, and is followed by a colon, spaces and -tabs, and the name of the node which discusses that topic. The node -name, like node names following `Next', `Previous' and `Up', may be -terminated with a tab, comma, or newline; it may also be terminated -with a period. - - If the node name and topic name are the same, than rather than -giving the name twice, the abbreviation `* NAME::' may be used (and -should be used, whenever possible, as it reduces the visual clutter in -the menu). - - It is considerate to choose the topic names so that they differ from -each other very near the beginning--this allows the user to type short -abbreviations. In a long menu, it is a good idea to capitalize the -beginning of each item name which is the minimum acceptable -abbreviation for it (a long menu is more than 5 or so entries). - - The nodes listed in a node's menu are called its "subnodes", and it -is their "superior". They should each have an `Up:' pointing at the -superior. It is often useful to arrange all or most of the subnodes in -a sequence of `Next' and `Previous' pointers so that someone who wants -to see them all need not keep revisiting the Menu. - - The Info Directory is simply the menu of the node `(dir)Top'--that -is, node `Top' in file `.../info/dir'. You can put new entries in that -menu just like any other menu. The Info Directory is *not* the same as -the file directory called `info'. It happens that many of Info's files -live on that file directory, but they do not have to; and files on that -directory are not automatically listed in the Info Directory node. - - Also, although the Info node graph is claimed to be a "hierarchy", -in fact it can be *any* directed graph. Shared structures and pointer -cycles are perfectly possible, and can be used if they are appropriate -to the meaning to be expressed. There is no need for all the nodes in -a file to form a connected structure. In fact, this file has two -connected components. You are in one of them, which is under the node -`Top'; the other contains the node `Help' which the `h' command goes -to. In fact, since there is no garbage collector, nothing terrible -happens if a substructure is not pointed to, but such a substructure is -rather useless since nobody can ever find out that it exists. - - -File: info.info, Node: Cross-refs, Next: Tags, Prev: Menus, Up: Advanced Info - -Creating Cross References -========================= - - A cross reference can be placed anywhere in the text, unlike a menu -item which must go at the front of a line. A cross reference looks -like a menu item except that it has `*note' instead of `*'. It -*cannot* be terminated by a `)', because `)''s are so often part of -node names. If you wish to enclose a cross reference in parentheses, -terminate it with a period first. Here are two examples of cross -references pointers: - - *Note details: commands. (See *note 3: Full Proof.) - - They are just examples. The places they "lead to" do not really -exist! - - -File: info.info, Node: Tags, Next: Checking, Prev: Cross-refs, Up: Advanced Info - -Tag Tables for Info Files -========================= - - You can speed up the access to nodes of a large Info file by giving -it a tag table. Unlike the tag table for a program, the tag table for -an Info file lives inside the file itself and is used automatically -whenever Info reads in the file. - - To make a tag table, go to a node in the file using Emacs Info mode -and type `M-x Info-tagify'. Then you must use `C-x C-s' to save the -file. - - Once the Info file has a tag table, you must make certain it is up -to date. If, as a result of deletion of text, any node moves back more -than a thousand characters in the file from the position recorded in -the tag table, Info will no longer be able to find that node. To -update the tag table, use the `Info-tagify' command again. - - An Info file tag table appears at the end of the file and looks like -this: - - ^_ - Tag Table: - File: info, Node: Cross-refs^?21419 - File: info, Node: Tags^?22145 - ^_ - End Tag Table - -Note that it contains one line per node, and this line contains the -beginning of the node's header (ending just after the node name), a DEL -character, and the character position in the file of the beginning of -the node. - - -File: info.info, Node: Checking, Prev: Tags, Up: Advanced Info - -Checking an Info File -===================== - - When creating an Info file, it is easy to forget the name of a node -when you are making a pointer to it from another node. If you put in -the wrong name for a node, this is not detected until someone tries to -go through the pointer using Info. Verification of the Info file is an -automatic process which checks all pointers to nodes and reports any -pointers which are invalid. Every `Next', `Previous', and `Up' is -checked, as is every menu item and every cross reference. In addition, -any `Next' which does not have a `Previous' pointing back is reported. -Only pointers within the file are checked, because checking pointers to -other files would be terribly slow. But those are usually few. - - To check an Info file, do `M-x Info-validate' while looking at any -node of the file with Emacs Info mode. - - -File: info.info, Node: Create an Info File, Prev: Advanced Info, Up: Top - -Creating an Info File from a Makeinfo file -****************************************** - - `makeinfo' is a utility that converts a Texinfo file into an Info -file; `texinfo-format-region' and `texinfo-format-buffer' are GNU Emacs -functions that do the same. - - *Note Creating an Info File: (texinfo)Create an Info File, to learn -how to create an Info file from a Texinfo file. - - *Note Overview of Texinfo: (texinfo)Top, to learn how to write a -Texinfo file. - - - -Tag Table: -Node: Top913 -Node: Getting Started1431 -Node: Help-Small-Screen2179 -Node: Help3921 -Node: Help-P4949 -Node: Help-^L5811 -Node: Help-M8462 -Node: Help-FOO14030 -Node: Help-Adv14766 -Node: Help-Cross17148 -Node: Help-Q17794 -Node: Advanced Info18434 -Node: Expert19330 -Node: Add21601 -Node: Menus24635 -Node: Cross-refs27509 -Node: Tags28211 -Node: Checking29510 -Node: Create an Info File30434 - -End Tag Table diff --git a/gnu/usr.bin/texinfo/misc/texindex.c b/gnu/usr.bin/texinfo/misc/texindex.c deleted file mode 100644 index a88d51696919..000000000000 --- a/gnu/usr.bin/texinfo/misc/texindex.c +++ /dev/null @@ -1,1700 +0,0 @@ -/* Prepare TeX index dribble output into an actual index. - - Version 1.45 - - Copyright (C) 1987, 1991, 1992 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - - -#include <stdio.h> -#include <ctype.h> -#include <errno.h> -#include "getopt.h" - -#if defined (STDC_HEADERS) -# include <string.h> -# include <stdlib.h> -# if !defined (bzero) -# define bzero(p, n) memset((p), '\0', (n)) -# endif /* !bzero */ -#else /* !STDC_HEADERS */ -extern int errno; -char *getenv (), *malloc (), *realloc (); -void bzero (); -#endif /* !STDC_HEADERS */ - -#if defined (HAVE_UNISTD_H) -# include <unistd.h> -#else /* !HAVE_UNISTD_H */ -long lseek (); -#endif /* !HAVE_UNISTD_H */ - -char *mktemp (); - -#if defined (VMS) -# if !defined (VAX11C) -# define noshare -# endif /* !VAX11C */ -# include <perror.h> -extern noshare int sys_nerr; -extern noshare char *sys_errlist[]; - -# include <file.h> - -# define TI_NO_ERROR ((1 << 28) | 1) -# define TI_FATAL_ERROR ((1 << 28) | 4) -# define unlink delete - -#else /* !VMS */ - -extern int sys_nerr; -extern char *sys_errlist[]; - -# if defined (HAVE_SYS_FCNTL_H) -# include <sys/types.h> -# include <sys/fcntl.h> -# endif /* HAVE_SYS_FCNTL_H */ - -# if defined (_AIX) || !defined (_POSIX_VERSION) -# include <sys/file.h> -# else /* !AIX && _POSIX_VERSION */ -# if !defined (HAVE_SYS_FCNTL_H) -# include <fcntl.h> -# endif /* !HAVE_FCNTL_H */ -# endif /* !_AIX && _POSIX_VERSION */ -# define TI_NO_ERROR 0 -# define TI_FATAL_ERROR 1 -#endif /* !VMS */ - -#if !defined (SEEK_SET) -# define SEEK_SET 0 -# define SEEK_CUR 1 -# define SEEK_END 2 -#endif /* !SEEK_SET */ - -/* When sorting in core, this structure describes one line - and the position and length of its first keyfield. */ -struct lineinfo -{ - char *text; /* The actual text of the line. */ - union { - char *text; /* The start of the key (for textual comparison). */ - long number; /* The numeric value (for numeric comparison). */ - } key; - long keylen; /* Length of KEY field. */ -}; - -/* This structure describes a field to use as a sort key. */ -struct keyfield -{ - int startwords; /* Number of words to skip. */ - int startchars; /* Number of additional chars to skip. */ - int endwords; /* Number of words to ignore at end. */ - int endchars; /* Ditto for characters of last word. */ - char ignore_blanks; /* Non-zero means ignore spaces and tabs. */ - char fold_case; /* Non-zero means case doesn't matter. */ - char reverse; /* Non-zero means compare in reverse order. */ - char numeric; /* Non-zeros means field is ASCII numeric. */ - char positional; /* Sort according to file position. */ - char braced; /* Count balanced-braced groupings as fields. */ -}; - -/* Vector of keyfields to use. */ -struct keyfield keyfields[3]; - -/* Number of keyfields stored in that vector. */ -int num_keyfields = 3; - -/* Vector of input file names, terminated with a null pointer. */ -char **infiles; - -/* Vector of corresponding output file names, or NULL, meaning default it - (add an `s' to the end). */ -char **outfiles; - -/* Length of `infiles'. */ -int num_infiles; - -/* Pointer to the array of pointers to lines being sorted. */ -char **linearray; - -/* The allocated length of `linearray'. */ -long nlines; - -/* Directory to use for temporary files. On Unix, it ends with a slash. */ -char *tempdir; - -/* Start of filename to use for temporary files. */ -char *tempbase; - -/* Number of last temporary file. */ -int tempcount; - -/* Number of last temporary file already deleted. - Temporary files are deleted by `flush_tempfiles' in order of creation. */ -int last_deleted_tempcount; - -/* During in-core sort, this points to the base of the data block - which contains all the lines of data. */ -char *text_base; - -/* Additional command switches .*/ - -/* Nonzero means do not delete tempfiles -- for debugging. */ -int keep_tempfiles; - -/* The name this program was run with. */ -char *program_name; - -/* Forward declarations of functions in this file. */ - -void decode_command (); -void sort_in_core (); -void sort_offline (); -char **parsefile (); -char *find_field (); -char *find_pos (); -long find_value (); -char *find_braced_pos (); -char *find_braced_end (); -void writelines (); -int compare_field (); -int compare_full (); -long readline (); -int merge_files (); -int merge_direct (); -void pfatal_with_name (); -void fatal (); -void error (); -void *xmalloc (), *xrealloc (); -char *concat (); -char *maketempname (); -void flush_tempfiles (); -char *tempcopy (); - -#define MAX_IN_CORE_SORT 500000 - -void -main (argc, argv) - int argc; - char **argv; -{ - int i; - - tempcount = 0; - last_deleted_tempcount = 0; - program_name = argv[0]; - - /* Describe the kind of sorting to do. */ - /* The first keyfield uses the first braced field and folds case. */ - keyfields[0].braced = 1; - keyfields[0].fold_case = 1; - keyfields[0].endwords = -1; - keyfields[0].endchars = -1; - - /* The second keyfield uses the second braced field, numerically. */ - keyfields[1].braced = 1; - keyfields[1].numeric = 1; - keyfields[1].startwords = 1; - keyfields[1].endwords = -1; - keyfields[1].endchars = -1; - - /* The third keyfield (which is ignored while discarding duplicates) - compares the whole line. */ - keyfields[2].endwords = -1; - keyfields[2].endchars = -1; - - decode_command (argc, argv); - - tempbase = mktemp (concat ("txiXXXXXX", "", "")); - - /* Process input files completely, one by one. */ - - for (i = 0; i < num_infiles; i++) - { - int desc; - long ptr; - char *outfile; - - desc = open (infiles[i], O_RDONLY, 0); - if (desc < 0) - pfatal_with_name (infiles[i]); - lseek (desc, 0L, SEEK_END); - ptr = lseek (desc, 0L, SEEK_CUR); - - close (desc); - - outfile = outfiles[i]; - if (!outfile) - { - outfile = concat (infiles[i], "s", ""); - } - - if (ptr < MAX_IN_CORE_SORT) - /* Sort a small amount of data. */ - sort_in_core (infiles[i], ptr, outfile); - else - sort_offline (infiles[i], ptr, outfile); - } - - flush_tempfiles (tempcount); - exit (TI_NO_ERROR); -} - -void -usage () -{ - fprintf (stderr, "\ -Usage: %s [-k] infile [-o outfile] ...\n", program_name); - exit (1); -} - -/* Decode the command line arguments to set the parameter variables - and set up the vector of keyfields and the vector of input files. */ - -void -decode_command (argc, argv) - int argc; - char **argv; -{ - int optc; - char **ip; - char **op; - - /* Store default values into parameter variables. */ - - tempdir = getenv ("TMPDIR"); -#ifdef VMS - if (tempdir == NULL) - tempdir = "sys$scratch:"; -#else - if (tempdir == NULL) - tempdir = "/tmp/"; - else - tempdir = concat (tempdir, "/", ""); -#endif - - keep_tempfiles = 0; - - /* Allocate ARGC input files, which must be enough. */ - - infiles = (char **) xmalloc (argc * sizeof (char *)); - outfiles = (char **) xmalloc (argc * sizeof (char *)); - ip = infiles; - op = outfiles; - - while ((optc = getopt (argc, argv, "-ko:")) != EOF) - { - switch (optc) - { - case 1: /* Non-option filename. */ - *ip++ = optarg; - *op++ = NULL; - break; - - case 'k': - keep_tempfiles = 1; - break; - - case 'o': - if (op > outfiles) - *(op - 1) = optarg; - break; - - default: - usage (); - } - } - - /* Record number of keyfields and terminate list of filenames. */ - num_infiles = ip - infiles; - *ip = 0; - if (num_infiles == 0) - usage (); -} - -/* Return a name for a temporary file. */ - -char * -maketempname (count) - int count; -{ - char tempsuffix[10]; - sprintf (tempsuffix, "%d", count); - return concat (tempdir, tempbase, tempsuffix); -} - -/* Delete all temporary files up to TO_COUNT. */ - -void -flush_tempfiles (to_count) - int to_count; -{ - if (keep_tempfiles) - return; - while (last_deleted_tempcount < to_count) - unlink (maketempname (++last_deleted_tempcount)); -} - -/* Copy the input file open on IDESC into a temporary file - and return the temporary file name. */ - -#define BUFSIZE 1024 - -char * -tempcopy (idesc) - int idesc; -{ - char *outfile = maketempname (++tempcount); - int odesc; - char buffer[BUFSIZE]; - - odesc = open (outfile, O_WRONLY | O_CREAT, 0666); - - if (odesc < 0) - pfatal_with_name (outfile); - - while (1) - { - int nread = read (idesc, buffer, BUFSIZE); - write (odesc, buffer, nread); - if (!nread) - break; - } - - close (odesc); - - return outfile; -} - -/* Compare LINE1 and LINE2 according to the specified set of keyfields. */ - -int -compare_full (line1, line2) - char **line1, **line2; -{ - int i; - - /* Compare using the first keyfield; - if that does not distinguish the lines, try the second keyfield; - and so on. */ - - for (i = 0; i < num_keyfields; i++) - { - long length1, length2; - char *start1 = find_field (&keyfields[i], *line1, &length1); - char *start2 = find_field (&keyfields[i], *line2, &length2); - int tem = compare_field (&keyfields[i], start1, length1, *line1 - text_base, - start2, length2, *line2 - text_base); - if (tem) - { - if (keyfields[i].reverse) - return -tem; - return tem; - } - } - - return 0; /* Lines match exactly. */ -} - -/* Compare LINE1 and LINE2, described by structures - in which the first keyfield is identified in advance. - For positional sorting, assumes that the order of the lines in core - reflects their nominal order. */ - -int -compare_prepared (line1, line2) - struct lineinfo *line1, *line2; -{ - int i; - int tem; - char *text1, *text2; - - /* Compare using the first keyfield, which has been found for us already. */ - if (keyfields->positional) - { - if (line1->text - text_base > line2->text - text_base) - tem = 1; - else - tem = -1; - } - else if (keyfields->numeric) - tem = line1->key.number - line2->key.number; - else - tem = compare_field (keyfields, line1->key.text, line1->keylen, 0, - line2->key.text, line2->keylen, 0); - if (tem) - { - if (keyfields->reverse) - return -tem; - return tem; - } - - text1 = line1->text; - text2 = line2->text; - - /* Compare using the second keyfield; - if that does not distinguish the lines, try the third keyfield; - and so on. */ - - for (i = 1; i < num_keyfields; i++) - { - long length1, length2; - char *start1 = find_field (&keyfields[i], text1, &length1); - char *start2 = find_field (&keyfields[i], text2, &length2); - int tem = compare_field (&keyfields[i], start1, length1, text1 - text_base, - start2, length2, text2 - text_base); - if (tem) - { - if (keyfields[i].reverse) - return -tem; - return tem; - } - } - - return 0; /* Lines match exactly. */ -} - -/* Like compare_full but more general. - You can pass any strings, and you can say how many keyfields to use. - POS1 and POS2 should indicate the nominal positional ordering of - the two lines in the input. */ - -int -compare_general (str1, str2, pos1, pos2, use_keyfields) - char *str1, *str2; - long pos1, pos2; - int use_keyfields; -{ - int i; - - /* Compare using the first keyfield; - if that does not distinguish the lines, try the second keyfield; - and so on. */ - - for (i = 0; i < use_keyfields; i++) - { - long length1, length2; - char *start1 = find_field (&keyfields[i], str1, &length1); - char *start2 = find_field (&keyfields[i], str2, &length2); - int tem = compare_field (&keyfields[i], start1, length1, pos1, - start2, length2, pos2); - if (tem) - { - if (keyfields[i].reverse) - return -tem; - return tem; - } - } - - return 0; /* Lines match exactly. */ -} - -/* Find the start and length of a field in STR according to KEYFIELD. - A pointer to the starting character is returned, and the length - is stored into the int that LENGTHPTR points to. */ - -char * -find_field (keyfield, str, lengthptr) - struct keyfield *keyfield; - char *str; - long *lengthptr; -{ - char *start; - char *end; - char *(*fun) (); - - if (keyfield->braced) - fun = find_braced_pos; - else - fun = find_pos; - - start = (*fun) (str, keyfield->startwords, keyfield->startchars, - keyfield->ignore_blanks); - if (keyfield->endwords < 0) - { - if (keyfield->braced) - end = find_braced_end (start); - else - { - end = start; - while (*end && *end != '\n') - end++; - } - } - else - { - end = (*fun) (str, keyfield->endwords, keyfield->endchars, 0); - if (end - str < start - str) - end = start; - } - *lengthptr = end - start; - return start; -} - -/* Return a pointer to a specified place within STR, - skipping (from the beginning) WORDS words and then CHARS chars. - If IGNORE_BLANKS is nonzero, we skip all blanks - after finding the specified word. */ - -char * -find_pos (str, words, chars, ignore_blanks) - char *str; - int words, chars; - int ignore_blanks; -{ - int i; - char *p = str; - - for (i = 0; i < words; i++) - { - char c; - /* Find next bunch of nonblanks and skip them. */ - while ((c = *p) == ' ' || c == '\t') - p++; - while ((c = *p) && c != '\n' && !(c == ' ' || c == '\t')) - p++; - if (!*p || *p == '\n') - return p; - } - - while (*p == ' ' || *p == '\t') - p++; - - for (i = 0; i < chars; i++) - { - if (!*p || *p == '\n') - break; - p++; - } - return p; -} - -/* Like find_pos but assumes that each field is surrounded by braces - and that braces within fields are balanced. */ - -char * -find_braced_pos (str, words, chars, ignore_blanks) - char *str; - int words, chars; - int ignore_blanks; -{ - int i; - int bracelevel; - char *p = str; - char c; - - for (i = 0; i < words; i++) - { - bracelevel = 1; - while ((c = *p++) != '{' && c != '\n' && c) - /* Do nothing. */ ; - if (c != '{') - return p - 1; - while (bracelevel) - { - c = *p++; - if (c == '{') - bracelevel++; - if (c == '}') - bracelevel--; - if (c == 0 || c == '\n') - return p - 1; - } - } - - while ((c = *p++) != '{' && c != '\n' && c) - /* Do nothing. */ ; - - if (c != '{') - return p - 1; - - if (ignore_blanks) - while ((c = *p) == ' ' || c == '\t') - p++; - - for (i = 0; i < chars; i++) - { - if (!*p || *p == '\n') - break; - p++; - } - return p; -} - -/* Find the end of the balanced-brace field which starts at STR. - The position returned is just before the closing brace. */ - -char * -find_braced_end (str) - char *str; -{ - int bracelevel; - char *p = str; - char c; - - bracelevel = 1; - while (bracelevel) - { - c = *p++; - if (c == '{') - bracelevel++; - if (c == '}') - bracelevel--; - if (c == 0 || c == '\n') - return p - 1; - } - return p - 1; -} - -long -find_value (start, length) - char *start; - long length; -{ - while (length != 0L) - { - if (isdigit (*start)) - return atol (start); - length--; - start++; - } - return 0l; -} - -/* Vector used to translate characters for comparison. - This is how we make all alphanumerics follow all else, - and ignore case in the first sorting. */ -int char_order[256]; - -void -init_char_order () -{ - int i; - for (i = 1; i < 256; i++) - char_order[i] = i; - - for (i = '0'; i <= '9'; i++) - char_order[i] += 512; - - for (i = 'a'; i <= 'z'; i++) - { - char_order[i] = 512 + i; - char_order[i + 'A' - 'a'] = 512 + i; - } -} - -/* Compare two fields (each specified as a start pointer and a character count) - according to KEYFIELD. - The sign of the value reports the relation between the fields. */ - -int -compare_field (keyfield, start1, length1, pos1, start2, length2, pos2) - struct keyfield *keyfield; - char *start1; - long length1; - long pos1; - char *start2; - long length2; - long pos2; -{ - if (keyfields->positional) - { - if (pos1 > pos2) - return 1; - else - return -1; - } - if (keyfield->numeric) - { - long value = find_value (start1, length1) - find_value (start2, length2); - if (value > 0) - return 1; - if (value < 0) - return -1; - return 0; - } - else - { - char *p1 = start1; - char *p2 = start2; - char *e1 = start1 + length1; - char *e2 = start2 + length2; - - while (1) - { - int c1, c2; - - if (p1 == e1) - c1 = 0; - else - c1 = *p1++; - if (p2 == e2) - c2 = 0; - else - c2 = *p2++; - - if (char_order[c1] != char_order[c2]) - return char_order[c1] - char_order[c2]; - if (!c1) - break; - } - - /* Strings are equal except possibly for case. */ - p1 = start1; - p2 = start2; - while (1) - { - int c1, c2; - - if (p1 == e1) - c1 = 0; - else - c1 = *p1++; - if (p2 == e2) - c2 = 0; - else - c2 = *p2++; - - if (c1 != c2) - /* Reverse sign here so upper case comes out last. */ - return c2 - c1; - if (!c1) - break; - } - - return 0; - } -} - -/* A `struct linebuffer' is a structure which holds a line of text. - `readline' reads a line from a stream into a linebuffer - and works regardless of the length of the line. */ - -struct linebuffer -{ - long size; - char *buffer; -}; - -/* Initialize LINEBUFFER for use. */ - -void -initbuffer (linebuffer) - struct linebuffer *linebuffer; -{ - linebuffer->size = 200; - linebuffer->buffer = (char *) xmalloc (200); -} - -/* Read a line of text from STREAM into LINEBUFFER. - Return the length of the line. */ - -long -readline (linebuffer, stream) - struct linebuffer *linebuffer; - FILE *stream; -{ - char *buffer = linebuffer->buffer; - char *p = linebuffer->buffer; - char *end = p + linebuffer->size; - - while (1) - { - int c = getc (stream); - if (p == end) - { - buffer = (char *) xrealloc (buffer, linebuffer->size *= 2); - p += buffer - linebuffer->buffer; - end += buffer - linebuffer->buffer; - linebuffer->buffer = buffer; - } - if (c < 0 || c == '\n') - { - *p = 0; - break; - } - *p++ = c; - } - - return p - buffer; -} - -/* Sort an input file too big to sort in core. */ - -void -sort_offline (infile, nfiles, total, outfile) - char *infile; - int nfiles; - long total; - char *outfile; -{ - /* More than enough. */ - int ntemps = 2 * (total + MAX_IN_CORE_SORT - 1) / MAX_IN_CORE_SORT; - char **tempfiles = (char **) xmalloc (ntemps * sizeof (char *)); - FILE *istream = fopen (infile, "r"); - int i; - struct linebuffer lb; - long linelength; - int failure = 0; - - initbuffer (&lb); - - /* Read in one line of input data. */ - - linelength = readline (&lb, istream); - - if (lb.buffer[0] != '\\' && lb.buffer[0] != '@') - { - error ("%s: not a texinfo index file", infile); - return; - } - - /* Split up the input into `ntemps' temporary files, or maybe fewer, - and put the new files' names into `tempfiles' */ - - for (i = 0; i < ntemps; i++) - { - char *outname = maketempname (++tempcount); - FILE *ostream = fopen (outname, "w"); - long tempsize = 0; - - if (!ostream) - pfatal_with_name (outname); - tempfiles[i] = outname; - - /* Copy lines into this temp file as long as it does not make file - "too big" or until there are no more lines. */ - - while (tempsize + linelength + 1 <= MAX_IN_CORE_SORT) - { - tempsize += linelength + 1; - fputs (lb.buffer, ostream); - putc ('\n', ostream); - - /* Read another line of input data. */ - - linelength = readline (&lb, istream); - if (!linelength && feof (istream)) - break; - - if (lb.buffer[0] != '\\' && lb.buffer[0] != '@') - { - error ("%s: not a texinfo index file", infile); - failure = 1; - goto fail; - } - } - fclose (ostream); - if (feof (istream)) - break; - } - - free (lb.buffer); - -fail: - /* Record number of temp files we actually needed. */ - - ntemps = i; - - /* Sort each tempfile into another tempfile. - Delete the first set of tempfiles and put the names of the second - into `tempfiles'. */ - - for (i = 0; i < ntemps; i++) - { - char *newtemp = maketempname (++tempcount); - sort_in_core (&tempfiles[i], MAX_IN_CORE_SORT, newtemp); - if (!keep_tempfiles) - unlink (tempfiles[i]); - tempfiles[i] = newtemp; - } - - if (failure) - return; - - /* Merge the tempfiles together and indexify. */ - - merge_files (tempfiles, ntemps, outfile); -} - -/* Sort INFILE, whose size is TOTAL, - assuming that is small enough to be done in-core, - then indexify it and send the output to OUTFILE (or to stdout). */ - -void -sort_in_core (infile, total, outfile) - char *infile; - long total; - char *outfile; -{ - char **nextline; - char *data = (char *) xmalloc (total + 1); - char *file_data; - long file_size; - int i; - FILE *ostream = stdout; - struct lineinfo *lineinfo; - - /* Read the contents of the file into the moby array `data'. */ - - int desc = open (infile, O_RDONLY, 0); - - if (desc < 0) - fatal ("failure reopening %s", infile); - for (file_size = 0;;) - { - i = read (desc, data + file_size, total - file_size); - if (i <= 0) - break; - file_size += i; - } - file_data = data; - data[file_size] = 0; - - close (desc); - - if (file_size > 0 && data[0] != '\\' && data[0] != '@') - { - error ("%s: not a texinfo index file", infile); - return; - } - - init_char_order (); - - /* Sort routines want to know this address. */ - - text_base = data; - - /* Create the array of pointers to lines, with a default size - frequently enough. */ - - nlines = total / 50; - if (!nlines) - nlines = 2; - linearray = (char **) xmalloc (nlines * sizeof (char *)); - - /* `nextline' points to the next free slot in this array. - `nlines' is the allocated size. */ - - nextline = linearray; - - /* Parse the input file's data, and make entries for the lines. */ - - nextline = parsefile (infile, nextline, file_data, file_size); - if (nextline == 0) - { - error ("%s: not a texinfo index file", infile); - return; - } - - /* Sort the lines. */ - - /* If we have enough space, find the first keyfield of each line in advance. - Make a `struct lineinfo' for each line, which records the keyfield - as well as the line, and sort them. */ - - lineinfo = (struct lineinfo *) malloc ((nextline - linearray) * sizeof (struct lineinfo)); - - if (lineinfo) - { - struct lineinfo *lp; - char **p; - - for (lp = lineinfo, p = linearray; p != nextline; lp++, p++) - { - lp->text = *p; - lp->key.text = find_field (keyfields, *p, &lp->keylen); - if (keyfields->numeric) - lp->key.number = find_value (lp->key.text, lp->keylen); - } - - qsort (lineinfo, nextline - linearray, sizeof (struct lineinfo), compare_prepared); - - for (lp = lineinfo, p = linearray; p != nextline; lp++, p++) - *p = lp->text; - - free (lineinfo); - } - else - qsort (linearray, nextline - linearray, sizeof (char *), compare_full); - - /* Open the output file. */ - - if (outfile) - { - ostream = fopen (outfile, "w"); - if (!ostream) - pfatal_with_name (outfile); - } - - writelines (linearray, nextline - linearray, ostream); - if (outfile) - fclose (ostream); - - free (linearray); - free (data); -} - -/* Parse an input string in core into lines. - DATA is the input string, and SIZE is its length. - Data goes in LINEARRAY starting at NEXTLINE. - The value returned is the first entry in LINEARRAY still unused. - Value 0 means input file contents are invalid. */ - -char ** -parsefile (filename, nextline, data, size) - char *filename; - char **nextline; - char *data; - long size; -{ - char *p, *end; - char **line = nextline; - - p = data; - end = p + size; - *end = 0; - - while (p != end) - { - if (p[0] != '\\' && p[0] != '@') - return 0; - - *line = p; - while (*p && *p != '\n') - p++; - if (p != end) - p++; - - line++; - if (line == linearray + nlines) - { - char **old = linearray; - linearray = (char **) xrealloc (linearray, sizeof (char *) * (nlines *= 4)); - line += linearray - old; - } - } - - return line; -} - -/* Indexification is a filter applied to the sorted lines - as they are being written to the output file. - Multiple entries for the same name, with different page numbers, - get combined into a single entry with multiple page numbers. - The first braced field, which is used for sorting, is discarded. - However, its first character is examined, folded to lower case, - and if it is different from that in the previous line fed to us - a \initial line is written with one argument, the new initial. - - If an entry has four braced fields, then the second and third - constitute primary and secondary names. - In this case, each change of primary name - generates a \primary line which contains only the primary name, - and in between these are \secondary lines which contain - just a secondary name and page numbers. */ - -/* The last primary name we wrote a \primary entry for. - If only one level of indexing is being done, this is the last name seen. */ -char *lastprimary; -/* Length of storage allocated for lastprimary. */ -int lastprimarylength; - -/* Similar, for the secondary name. */ -char *lastsecondary; -int lastsecondarylength; - -/* Zero if we are not in the middle of writing an entry. - One if we have written the beginning of an entry but have not - yet written any page numbers into it. - Greater than one if we have written the beginning of an entry - plus at least one page number. */ -int pending; - -/* The initial (for sorting purposes) of the last primary entry written. - When this changes, a \initial {c} line is written */ - -char *lastinitial; - -int lastinitiallength; - -/* When we need a string of length 1 for the value of lastinitial, - store it here. */ - -char lastinitial1[2]; - -/* Initialize static storage for writing an index. */ - -void -init_index () -{ - pending = 0; - lastinitial = lastinitial1; - lastinitial1[0] = 0; - lastinitial1[1] = 0; - lastinitiallength = 0; - lastprimarylength = 100; - lastprimary = (char *) xmalloc (lastprimarylength + 1); - bzero (lastprimary, lastprimarylength + 1); - lastsecondarylength = 100; - lastsecondary = (char *) xmalloc (lastsecondarylength + 1); - bzero (lastsecondary, lastsecondarylength + 1); -} - -/* Indexify. Merge entries for the same name, - insert headers for each initial character, etc. */ - -void -indexify (line, ostream) - char *line; - FILE *ostream; -{ - char *primary, *secondary, *pagenumber; - int primarylength, secondarylength = 0, pagelength; - int nosecondary; - int initiallength; - char *initial; - char initial1[2]; - register char *p; - - /* First, analyze the parts of the entry fed to us this time. */ - - p = find_braced_pos (line, 0, 0, 0); - if (*p == '{') - { - initial = p; - /* Get length of inner pair of braces starting at `p', - including that inner pair of braces. */ - initiallength = find_braced_end (p + 1) + 1 - p; - } - else - { - initial = initial1; - initial1[0] = *p; - initial1[1] = 0; - initiallength = 1; - - if (initial1[0] >= 'a' && initial1[0] <= 'z') - initial1[0] -= 040; - } - - pagenumber = find_braced_pos (line, 1, 0, 0); - pagelength = find_braced_end (pagenumber) - pagenumber; - if (pagelength == 0) - abort (); - - primary = find_braced_pos (line, 2, 0, 0); - primarylength = find_braced_end (primary) - primary; - - secondary = find_braced_pos (line, 3, 0, 0); - nosecondary = !*secondary; - if (!nosecondary) - secondarylength = find_braced_end (secondary) - secondary; - - /* If the primary is different from before, make a new primary entry. */ - if (strncmp (primary, lastprimary, primarylength)) - { - /* Close off current secondary entry first, if one is open. */ - if (pending) - { - fputs ("}\n", ostream); - pending = 0; - } - - /* If this primary has a different initial, include an entry for - the initial. */ - if (initiallength != lastinitiallength || - strncmp (initial, lastinitial, initiallength)) - { - fprintf (ostream, "\\initial {"); - fwrite (initial, 1, initiallength, ostream); - fprintf (ostream, "}\n", initial); - if (initial == initial1) - { - lastinitial = lastinitial1; - *lastinitial1 = *initial1; - } - else - { - lastinitial = initial; - } - lastinitiallength = initiallength; - } - - /* Make the entry for the primary. */ - if (nosecondary) - fputs ("\\entry {", ostream); - else - fputs ("\\primary {", ostream); - fwrite (primary, primarylength, 1, ostream); - if (nosecondary) - { - fputs ("}{", ostream); - pending = 1; - } - else - fputs ("}\n", ostream); - - /* Record name of most recent primary. */ - if (lastprimarylength < primarylength) - { - lastprimarylength = primarylength + 100; - lastprimary = (char *) xrealloc (lastprimary, - 1 + lastprimarylength); - } - strncpy (lastprimary, primary, primarylength); - lastprimary[primarylength] = 0; - - /* There is no current secondary within this primary, now. */ - lastsecondary[0] = 0; - } - - /* Should not have an entry with no subtopic following one with a subtopic. */ - - if (nosecondary && *lastsecondary) - error ("entry %s follows an entry with a secondary name", line); - - /* Start a new secondary entry if necessary. */ - if (!nosecondary && strncmp (secondary, lastsecondary, secondarylength)) - { - if (pending) - { - fputs ("}\n", ostream); - pending = 0; - } - - /* Write the entry for the secondary. */ - fputs ("\\secondary {", ostream); - fwrite (secondary, secondarylength, 1, ostream); - fputs ("}{", ostream); - pending = 1; - - /* Record name of most recent secondary. */ - if (lastsecondarylength < secondarylength) - { - lastsecondarylength = secondarylength + 100; - lastsecondary = (char *) xrealloc (lastsecondary, - 1 + lastsecondarylength); - } - strncpy (lastsecondary, secondary, secondarylength); - lastsecondary[secondarylength] = 0; - } - - /* Here to add one more page number to the current entry. */ - if (pending++ != 1) - fputs (", ", ostream); /* Punctuate first, if this is not the first. */ - fwrite (pagenumber, pagelength, 1, ostream); -} - -/* Close out any unfinished output entry. */ - -void -finish_index (ostream) - FILE *ostream; -{ - if (pending) - fputs ("}\n", ostream); - free (lastprimary); - free (lastsecondary); -} - -/* Copy the lines in the sorted order. - Each line is copied out of the input file it was found in. */ - -void -writelines (linearray, nlines, ostream) - char **linearray; - int nlines; - FILE *ostream; -{ - char **stop_line = linearray + nlines; - char **next_line; - - init_index (); - - /* Output the text of the lines, and free the buffer space. */ - - for (next_line = linearray; next_line != stop_line; next_line++) - { - /* If -u was specified, output the line only if distinct from previous one. */ - if (next_line == linearray - /* Compare previous line with this one, using only the - explicitly specd keyfields. */ - || compare_general (*(next_line - 1), *next_line, 0L, 0L, num_keyfields - 1)) - { - char *p = *next_line; - char c; - - while ((c = *p++) && c != '\n') - /* Do nothing. */ ; - *(p - 1) = 0; - indexify (*next_line, ostream); - } - } - - finish_index (ostream); -} - -/* Assume (and optionally verify) that each input file is sorted; - merge them and output the result. - Returns nonzero if any input file fails to be sorted. - - This is the high-level interface that can handle an unlimited - number of files. */ - -#define MAX_DIRECT_MERGE 10 - -int -merge_files (infiles, nfiles, outfile) - char **infiles; - int nfiles; - char *outfile; -{ - char **tempfiles; - int ntemps; - int i; - int value = 0; - int start_tempcount = tempcount; - - if (nfiles <= MAX_DIRECT_MERGE) - return merge_direct (infiles, nfiles, outfile); - - /* Merge groups of MAX_DIRECT_MERGE input files at a time, - making a temporary file to hold each group's result. */ - - ntemps = (nfiles + MAX_DIRECT_MERGE - 1) / MAX_DIRECT_MERGE; - tempfiles = (char **) xmalloc (ntemps * sizeof (char *)); - for (i = 0; i < ntemps; i++) - { - int nf = MAX_DIRECT_MERGE; - if (i + 1 == ntemps) - nf = nfiles - i * MAX_DIRECT_MERGE; - tempfiles[i] = maketempname (++tempcount); - value |= merge_direct (&infiles[i * MAX_DIRECT_MERGE], nf, tempfiles[i]); - } - - /* All temporary files that existed before are no longer needed - since their contents have been merged into our new tempfiles. - So delete them. */ - flush_tempfiles (start_tempcount); - - /* Now merge the temporary files we created. */ - - merge_files (tempfiles, ntemps, outfile); - - free (tempfiles); - - return value; -} - -/* Assume (and optionally verify) that each input file is sorted; - merge them and output the result. - Returns nonzero if any input file fails to be sorted. - - This version of merging will not work if the number of - input files gets too high. Higher level functions - use it only with a bounded number of input files. */ - -int -merge_direct (infiles, nfiles, outfile) - char **infiles; - int nfiles; - char *outfile; -{ - struct linebuffer *lb1, *lb2; - struct linebuffer **thisline, **prevline; - FILE **streams; - int i; - int nleft; - int lossage = 0; - int *file_lossage; - struct linebuffer *prev_out = 0; - FILE *ostream = stdout; - - if (outfile) - { - ostream = fopen (outfile, "w"); - } - if (!ostream) - pfatal_with_name (outfile); - - init_index (); - - if (nfiles == 0) - { - if (outfile) - fclose (ostream); - return 0; - } - - /* For each file, make two line buffers. - Also, for each file, there is an element of `thisline' - which points at any time to one of the file's two buffers, - and an element of `prevline' which points to the other buffer. - `thisline' is supposed to point to the next available line from the file, - while `prevline' holds the last file line used, - which is remembered so that we can verify that the file is properly sorted. */ - - /* lb1 and lb2 contain one buffer each per file. */ - lb1 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer)); - lb2 = (struct linebuffer *) xmalloc (nfiles * sizeof (struct linebuffer)); - - /* thisline[i] points to the linebuffer holding the next available line in file i, - or is zero if there are no lines left in that file. */ - thisline = (struct linebuffer **) - xmalloc (nfiles * sizeof (struct linebuffer *)); - /* prevline[i] points to the linebuffer holding the last used line - from file i. This is just for verifying that file i is properly - sorted. */ - prevline = (struct linebuffer **) - xmalloc (nfiles * sizeof (struct linebuffer *)); - /* streams[i] holds the input stream for file i. */ - streams = (FILE **) xmalloc (nfiles * sizeof (FILE *)); - /* file_lossage[i] is nonzero if we already know file i is not - properly sorted. */ - file_lossage = (int *) xmalloc (nfiles * sizeof (int)); - - /* Allocate and initialize all that storage. */ - - for (i = 0; i < nfiles; i++) - { - initbuffer (&lb1[i]); - initbuffer (&lb2[i]); - thisline[i] = &lb1[i]; - prevline[i] = &lb2[i]; - file_lossage[i] = 0; - streams[i] = fopen (infiles[i], "r"); - if (!streams[i]) - pfatal_with_name (infiles[i]); - - readline (thisline[i], streams[i]); - } - - /* Keep count of number of files not at eof. */ - nleft = nfiles; - - while (nleft) - { - struct linebuffer *best = 0; - struct linebuffer *exch; - int bestfile = -1; - int i; - - /* Look at the next avail line of each file; choose the least one. */ - - for (i = 0; i < nfiles; i++) - { - if (thisline[i] && - (!best || - 0 < compare_general (best->buffer, thisline[i]->buffer, - (long) bestfile, (long) i, num_keyfields))) - { - best = thisline[i]; - bestfile = i; - } - } - - /* Output that line, unless it matches the previous one and we - don't want duplicates. */ - - if (!(prev_out && - !compare_general (prev_out->buffer, - best->buffer, 0L, 1L, num_keyfields - 1))) - indexify (best->buffer, ostream); - prev_out = best; - - /* Now make the line the previous of its file, and fetch a new - line from that file. */ - - exch = prevline[bestfile]; - prevline[bestfile] = thisline[bestfile]; - thisline[bestfile] = exch; - - while (1) - { - /* If the file has no more, mark it empty. */ - - if (feof (streams[bestfile])) - { - thisline[bestfile] = 0; - /* Update the number of files still not empty. */ - nleft--; - break; - } - readline (thisline[bestfile], streams[bestfile]); - if (thisline[bestfile]->buffer[0] || !feof (streams[bestfile])) - break; - } - } - - finish_index (ostream); - - /* Free all storage and close all input streams. */ - - for (i = 0; i < nfiles; i++) - { - fclose (streams[i]); - free (lb1[i].buffer); - free (lb2[i].buffer); - } - free (file_lossage); - free (lb1); - free (lb2); - free (thisline); - free (prevline); - free (streams); - - if (outfile) - fclose (ostream); - - return lossage; -} - -/* Print error message and exit. */ - -void -fatal (s1, s2) - char *s1, *s2; -{ - error (s1, s2); - exit (TI_FATAL_ERROR); -} - -/* Print error message. S1 is printf control string, S2 is arg for it. */ - -void -error (s1, s2) - char *s1, *s2; -{ - printf ("%s: ", program_name); - printf (s1, s2); - printf ("\n"); -} - -void -perror_with_name (name) - char *name; -{ - char *s; - - if (errno < sys_nerr) - s = concat ("", sys_errlist[errno], " for %s"); - else - s = "cannot open %s"; - error (s, name); -} - -void -pfatal_with_name (name) - char *name; -{ - char *s; - - if (errno < sys_nerr) - s = concat ("", sys_errlist[errno], " for %s"); - else - s = "cannot open %s"; - fatal (s, name); -} - -/* Return a newly-allocated string whose contents concatenate those of - S1, S2, S3. */ - -char * -concat (s1, s2, s3) - char *s1, *s2, *s3; -{ - int len1 = strlen (s1), len2 = strlen (s2), len3 = strlen (s3); - char *result = (char *) xmalloc (len1 + len2 + len3 + 1); - - strcpy (result, s1); - strcpy (result + len1, s2); - strcpy (result + len1 + len2, s3); - *(result + len1 + len2 + len3) = 0; - - return result; -} - -/* Just like malloc, but kills the program in case of fatal error. */ -void * -xmalloc (nbytes) - int nbytes; -{ - void *temp = (void *) malloc (nbytes); - - if (nbytes && temp == (void *)NULL) - memory_error ("xmalloc", nbytes); - - return (temp); -} - -/* Like realloc (), but barfs if there isn't enough memory. */ -void * -xrealloc (pointer, nbytes) - void *pointer; - int nbytes; -{ - void *temp; - - if (!pointer) - temp = (void *)xmalloc (nbytes); - else - temp = (void *)realloc (pointer, nbytes); - - if (nbytes && !temp) - memory_error ("xrealloc", nbytes); - - return (temp); -} - -memory_error (callers_name, bytes_wanted) - char *callers_name; - int bytes_wanted; -{ - char printable_string[80]; - - sprintf (printable_string, - "Virtual memory exhausted in %s ()! Needed %d bytes.", - callers_name, bytes_wanted); - - error (printable_string); - abort (); -} - -#ifndef STDC_HEADERS -void -bzero (b, length) - register char *b; - register int length; -{ -#ifdef VMS - short zero = 0; - long max_str = 65535; - - while (length > max_str) - { - (void) LIB$MOVC5 (&zero, &zero, &zero, &max_str, b); - length -= max_str; - b += max_str; - } - (void) LIB$MOVC5 (&zero, &zero, &zero, &length, b); -#else - while (length-- > 0) - *b++ = 0; -#endif /* not VMS */ -} -#endif /* not STDC_HEADERS */ |
